Python - 机器学习算法库Scikit-Leran使用详解11(数据归一化、标准化处理)
作者:hangge | 2022-10-09 08:10
十二、数据归一化、标准化处理
1,基本介绍
(1)在机器学习领域中,不同评价指标(即特征向量中的不同特征就是所述的不同评价指标)往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进⾏数据归一化或标准化处理,以解决数据指标之间的可⽐性。
⼀般涉及到梯度下降和距离的计算需要进⾏归一化或标准化:
在大多数的机器学习算法和优化算法中,将特征值缩放到相同区间可以使得获取性能更好的模型。就梯度下降算法而言,例如有两个不同的特征,第一个特征的取值范围为 1~10 ,第二个特征的取值范围为 1~10000。在梯度下降算法中,代价函数为最小平方误差函数,所以在使用梯度下降算法的时候,算法会明显的偏向于第二个特征,因为它的取值范围更大。在比如,k 近邻算法,它使用的是欧式距离,也会导致其偏向于第二个特征。对于决策树和随机森林以及 XGboost 算法而言,特征缩放对于它们没有什么影响。
(2)数据归一化是先把数据 x 按照最小值中心化后,再按照(最大值减去最小值)进行缩放到了 [0,1] 的范围。其特点是:
- 改变原始数据的分布,使得各个特征维度对目标函数的影响权重归于一致。
- 但最大值与最小值非常容易受异常点影响,鲁棒性较差。
(3)数据标准化按照均值中心化,再按照标准差缩放,即将数据集中某一列数值特征的值缩放成平均值为 0,标准差为 1 的状态。这样的数据特征分布会服从于标准正态分布。其特点是:
- 对不同特征维度的伸缩变换使其不同度量之间的特征具有可比性;
- 不改变原始数据的分布,保持各个特征维度对目标函数的影响权重;
- 对目标函数的影响体现在几何分布上。
(4)大部分时候我们会选择标准化,因为归一化对异常值处理不是很合理:
- 对于归于化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变。
- 对于标准化来说:如果出现异常点,由于具有一定数据量,因此方差的改变较小,少量的异常点对于平均值的影响并不大。
(5)scikit-learn 为我们提供了一些实现归一化、标准化的 API,具体如下:
- StandardScaler: 实现标准化,将所有数据缩放至 0 均值,1 标准差。
- MinMaxScaler: 最大最小值归一化,将所有数据缩放至 [0,1] 之间,也可以指定范围 feature_range。
- MaxAbsScaler: 这种方式没有中心化,只是用最大值进行缩放,范围是 [-1, 1]。
- RobustScaler:缩放有异常值的特征,既能保留异常值,又能防止异常值对整体的影响
2,使用样例
(1)这里以 Sklearn 自带的葡萄酒数据集进行 KNN 算法分类预测进行演示,如果我们不对数据进行处理,可以看到准确率比较低,只有 0.7777777777777778:
#导入 sklearn 提供的葡萄酒数据 from sklearn.datasets import load_wine #导入 sklearn 提供的KNN分类算法 from sklearn.neighbors import KNeighborsClassifier #导入skleran 提供的分割数据集的方法 from sklearn.model_selection import train_test_split #导入pandas import pandas as pd #加载数据集 wine = load_wine() #分割数据集训练集,测试集 x_train,x_test,y_train,y_test=train_test_split(wine['data'],wine['target'],random_state=0) #构建knn分类模型,并指定 k 值 model=KNeighborsClassifier(n_neighbors=4) #训练模型 model.fit(x_train,y_train) #训练后用测试集对模型进行评分 print("模型评分:",model.score(x_test,y_test)) print('-----------------------------------------------------') print('测试集前5条数据特征值:') print(pd.DataFrame(x_test).head(5)) print('-----------------------------------------------------') print('测试集前5条数据目标值:') print(pd.DataFrame(y_test).head(5)) print('-----------------------------------------------------') #使用模型预测 y_predict=model.predict(x_test) print('使用模型预测测试集前5条数据的目标值:') print(pd.DataFrame(y_predict).head(5))
(2)如果我们训练前先将数据进行归一化,可以看到训练后的准确率提升至 0.9555555555555556:
注意:当我们用归一化或者标准化以后的训练集来训练机器算法之后,我们在预测的时候,测试数据集必须同样进行归一化或者标准化。即使用训练数据的均值和方差对测试数据进行均值方差归一化或标准化,对数据的归一化或标准化也是算法的一部分。
#导入 sklearn 提供的葡萄酒数据 from sklearn.datasets import load_wine #导入 sklearn 提供的KNN分类算法 from sklearn.neighbors import KNeighborsClassifier #导入skleran 提供的分割数据集的方法 from sklearn.model_selection import train_test_split #导入skleran 提供的最大最小值缩放器 from sklearn.preprocessing import MinMaxScaler #导入pandas import pandas as pd #加载数据集 wine = load_wine() #分割数据集训练集,测试集 x_train,x_test,y_train,y_test=train_test_split(wine['data'],wine['target'],random_state=0) #创建最大最小值缩放器 minmaxscaler = MinMaxScaler() #训练最大最小值缩放器 minmaxscaler.fit(x_train) #缩放训练集 x_train = minmaxscaler.transform(x_train) #缩放测试集 x_test = minmaxscaler.transform(x_test) #构建knn分类模型,并指定 k 值 model=KNeighborsClassifier(n_neighbors=4) #训练模型 model.fit(x_train,y_train) #训练后用测试集对模型进行评分 print("模型评分:",model.score(x_test,y_test)) print('-----------------------------------------------------') print('测试集前5条数据特征值(归一化后):') print(pd.DataFrame(x_test).head(5)) print('-----------------------------------------------------') print('测试集前5条数据目标值:') print(pd.DataFrame(y_test).head(5)) print('-----------------------------------------------------') #使用模型预测 y_predict=model.predict(x_test) print('使用模型预测测试集前5条数据的目标值:') print(pd.DataFrame(y_predict).head(5))
(3)而如果我们训练前先将数据进行标准化,可以看到训练后的准确率则提升至 0.9777777777777777:
#导入 sklearn 提供的葡萄酒数据 from sklearn.datasets import load_wine #导入 sklearn 提供的KNN分类算法 from sklearn.neighbors import KNeighborsClassifier #导入skleran 提供的分割数据集的方法 from sklearn.model_selection import train_test_split #导入skleran 提供的标准化缩放器 from sklearn.preprocessing import StandardScaler #导入pandas import pandas as pd #加载数据集 wine = load_wine() #分割数据集训练集,测试集 x_train,x_test,y_train,y_test=train_test_split(wine['data'],wine['target'],random_state=0) #创建标准化缩放器 standardscaler = StandardScaler() #训练标准化缩放器 standardscaler.fit(x_train) #缩放训练集 x_train = standardscaler.transform(x_train) #缩放测试集 x_test = standardscaler.transform(x_test) #构建knn分类模型,并指定 k 值 model=KNeighborsClassifier(n_neighbors=4) #训练模型 model.fit(x_train,y_train) #训练后用测试集对模型进行评分 print("模型评分:",model.score(x_test,y_test)) print('-----------------------------------------------------') print('测试集前5条数据特征值(归一化后):') print(pd.DataFrame(x_test).head(5)) print('-----------------------------------------------------') print('测试集前5条数据目标值:') print(pd.DataFrame(y_test).head(5)) print('-----------------------------------------------------') #使用模型预测 y_predict=model.predict(x_test) print('使用模型预测测试集前5条数据的目标值:') print(pd.DataFrame(y_predict).head(5))
全部评论(0)