回归分类等问题中数据预处理方法总结及相关代码实现
------------------------------------(总结及概括)
在进行训练和拟合模型的过程中,由于某些数据特征差别较大,其最终拟合出的效果并不是很好,比如通过一个人的身高体重等特征因素去预测某个人的特性。因为身高和体重是不同的衡量单位,所以我们在进行相关模型的拟合或者回归的时候,其结果并不是很好。那么我们如何能进一步的提升模型的准确率呢。今天,我们从数据预处理的角度进行阐述一些现实项目中的处理方法。
1、线性归一化(Min-Max scaling)
该方法通过线性变化对原始数据进行等比例缩放映射到[0,1]之间,其中X*为归一化后的数据,X为原始数据,Xmin和Xmax分别为X向量的最小值和最大值。
Python代码实现:
def MaxMinNormalization(x,Max,Min):
x = (x - Min) / (Max - Min);
return x
2、0均值标准化(Z-score standardization)
该方法将原始数据归一化为均值为0、方差为1的数据集,且该数据集符合标准的高斯分布,其中X*为归一化后的数据,X为原始数据,μ为X向量的均值,σ为X向量的标准差。
Python代码实现:
def Z_ScoreNormalization(x,x_ave,sigma):
x = (x - x_ave) / sigma;
return x
3、Sigmoid函数(当然也可以使用其的函数进行预处理特征值较大的数据值)
Sigmoid函数是一个具有S形曲线的函数,是良好的阈值函数,在(0, 0.5)处中心对称,在(0, 0.5)附近有比较大的斜率,而当数据趋向于正无穷和负无穷的时候,映射出来的值就会无限趋向于1和0,是个人非常喜欢的“归一化方法”,之所以打引号是因为我觉得Sigmoid函数在阈值分割上也有很不错的表现,根据公式的改变,就可以改变分割阈值,这里作为归一化方法,我们只考虑(0, 0.5)作为分割阈值的点的情况:
Python代码实现:
def sigmoid(X,useStatus):
if useStatus:
return 1.0 / (1 + np.exp(-float(X)));
else:
return float(X)
4、特征二值化(Binarization)
给定阈值,将特征转换为0/1,调用sklearn库进行库函数的应用。
binarizer = sklearn.preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)
数据进行归一化和特征化的好处:使得预处理的数据被限定在一定的范围 消除奇异样本数据导致的不良影响 同时,针对归一化的特征数据进行训练模型时可以加快梯度下降的求解速度。
数据处理说明:
SVM、线性回归之类的最优化问题需要归一化,是否归一化主要在于是否关心变量取值;而在进行神经网络模型进行训练的时候需要标准化处理,一般变量的取值在-1到1之间,这样做是为了弱化某些变量的值较大而对模型产生影响。一般神经网络中的隐藏层采用tanh激活函数比sigmod激活函数要好些,因为tanh双曲正切函数的取值[-1,1]之间,均值为0;在K近邻算法中,如果不对解释变量进行标准化,那么具有小数量级的解释变量的影响就会微乎其微。
注意:没有一种数据标准化的方法,放在每一个问题,放在每一个模型,都能提高算法精度和加快算法的收敛速度。所以对于不同的问题可能会有不同的归一化方法。在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,Z-score standardization表现更好。