1.使用StandardScaler进行数据预处理
1.使用sklearn的make_blobs函数手工生成数据集:
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
X,y = make_blobs(n_samples=40,centers=2,random_state=50,cluster_std=2)
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.cool)
plt.show()
运行代码,得到如下图所示:
结果分析:
我们使用make_blobs函数时,指定了样本数n_samples为40,分类2,随机状态random_State=50,标准差cluster_std=2。从图中可以看到,数据集中有2个特征,分别对应x轴和y轴,特征1的数值大约在-8到7之间,而特征2的数值大约在-10到0之间。
接下来,我们要使用sklearn的preporcessing模块来对这个手工生成的数据集进行预处理操作。首先来看第一个方法:StandardScaler。
from sklearn.preprocessing import StandardScaler
X_1 = StandardScaler().fit_transform(X)
plt.scatter(X_1[:,0],X_1[:,1],c=y,cmap=plt.cm.cool)
plt.show()
运行代码,如下图所示:
结果分析:
对比上面两张图,发现数据点的分布情况没有什么不同,但是图像的X轴和y轴发生了变化。
StandardScaler的原理是:将所有数据的特征值转换为均值0,而方差为1的状态,这样就可以确保数据的“大小”都是一致的,这样更有利于模型的训练。
2.使用MinMaxScaler进行数据预处理
下面我们来看第二个方法:MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
X_2 = MinMaxScaler().fit_transform(X)
plt.scatter(X_2[:,0], X_2[:,1],c=y, cmap=plt.cm.cool)
plt.show()
运行代码,如下图所示:
结果分析:对比前两张图,可以看到这次所有数据的两个特征值都被转换到0到1之间。对于我们使用make_blobs生成的二维数据集,你也可以想象成我们通过MinMaxScaler把所有的数据压进了一个长和宽都是1的方格子当中了,这样会让模型训练的速度更快切精确率也会提高。
3.使用RobustScaler进行数据预处理
还有一种数据转换方法,和StandardScaler比较近似,但是它并不是用均值和方差来进行转换,而是使用中位数和四分位数。这种方法称为RobustScaler。这种方法可以把它理解为“简单粗暴”,因为它会把一些异常值踢出去,有点类似体育节目中经常说的“去掉一个最高分,去掉一个最低分”这样的情况。下面看看RobustScaler的效果:
from sklearn.preprocessing import RobustScaler
X_3 = RobustScaler().fit_transform(X)
plt.scatter(X_3[:,0],X_3[:,1],c=y, cmap=plt.cm.cool)
plt.show()
运行代码,如下图所示:
结果分析:RobustScaler将数据的特征1控制在了-1.5到2之间,而特征2控制在了-2到1.5之间。和StandardScaler非常类似,但因为其原理不同,所得到的结果也不相同。
4.使用Normalizer进行数据预处理
这种方法将所有样本的特征向量转化为欧几里得距离为1。也就是说,它把数据的分布变成一个半径为1的圆,或者是一个球。Normalizer通常是在我们只想保留数据特征向量的方向,而忽略其数值的时候使用。下面我们还是用图像来展示Normalizer的工作方式:
from sklearn.preprocessing import Normalizer
X_4 = Normalizer().fit_transform(X)
plt.scatter(X_4[:,0], X_4[:,1], c=y, cmap=plt.cm.cool)
plt.show()
运行代码,如下图所示:
结果分析:Normalizer把原始数据变得“面目全非”了,可以说在以上预处理方面,Normalizer是表现最差的一个方法
5.通过数据预处理提高模型准确率
用红酒数据集来测试数据预处理的效果:
from sklearn.datasets import load_wine
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
wine = load_wine()
X_train, X_test, y_train, y_test = train_test_split(wine.data, wine.target,
random_state=62)
print(X_train.shape, X_test.shape)
运行结果如下:
(133, 13) (45, 13)
下面用训练集来训练一个MLP神经网络,再看下该神经网络在测试集中的得分:
mlp = MLPClassifier(hidden_layer_sizes=[100,100],max_iter=400,
random_state=62)
mlp.fit(X_train, y_train)
print('模型得分:{:.2f}'.format(mlp.score(X_test, y_test)))
运行代码,得到如下结果:
模型得分:0.24
结果分析:在没有经过预处理的情况下,模型得分只有0.24,可以用惨不忍睹来形容。
下面试着对数据进行预处理操作:
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_pp = scaler.transform(X_train)
X_test_pp = scaler.transform(X_test)
mlp.fit(X_train_pp, y_train)
print('数据预处理后的模型得分:{:.2f}'.format(mlp.score(X_test_pp,y_test)))
运行代码,得到如结果:
数据预处理后的模型得分:1.00
结果分析:可以看到,经过预处理后的数据集,大大提升了神经网络的准确率。在经过数据预处理后,MLP神经网络在测试数据集中进行了完美的分类!