小提示:transform的快捷方式与高效的替代方法,通常来说,你想要在某个数据集上fit一个模型,然后再将其transform。这是一个非常常见的任务,可以比先调用fit再调用transform更搞笑的方法来计算。对于这种使用场景,所有具有transform方法的模型也都具有fit_transform。代码如下:
fromsklearn.preprocessingimportStandardScaler
scaler=StandardScaler()
#使用方法链依次调用fit和transform
x_scale=scaler.fit(x).transform(x)
print(x_scale=,x_scale)
#直接使用fit_transform
x_scaled=scaler.fit_transform(x)
print(x_scaled=,x_scaled)
运行结果如下:
x_scale=[[0.-1.]
x_scaled=[[0.-1.]
可以看出,运行结果相同,但是快捷方式更加简洁,尽管fit_transform不一定对所有模型都更加有效,但在尝试变换训练集时,该方法不失为一种很好的方法。
现在我们回到cancer数据集,观察使用MinMaxScaler对学习SVC的作用,这是一种不同的方法,我们再次在原始数据上拟合SVC,对应代码如下:
fromsklearn.svmimportSVC
x_train,x_test,y_train,y_test=train_test_split(cancer.data,cancer.target,random_state=0)
svm=SVC(C=)
svm.fit(x_train,y_train)
print(testsetaccuracy:{:.2f}.format(svm.score(x_test,y_test)))
#使用0-1缩放进行预处理
scaler=MinMaxScaler()
x_train_scaled=scaler.fit_transform(x_train)
x_test_scaled=scaler.fit_transform(x_test)
#在缩放后的数据上学习SVM
svm.fit(x_train_scaled,y_train)
#然后再看输出的分数
print(Scaledtestsetaccuracy:{:.2f}.format(svm.score(x_test_scaled,y_test)))
#下面我们利用零均值和零方差的缩放方法来进行预处理
fromsklearn.preprocessingimportStandardScaler
scaler=StandardScaler()
x_train_scaled=scaler.fit_transform(x_train)
x_test_scaled=scaler.fit_transform(x_test)
#在缩放后的数据上学习SVM
svm.fit(x_train_scaled,y_train)
#然后再看输出的分数
print(Scaledtestsetaccuracy:{:.2f}.format(svm.score(x_test_scaled,y_test)))
运行结果如下:
testsetaccuracy:0.63
Scaledtestsetaccuracy:0.86
Scaledtestsetaccuracy:0.95
由上述运行结果我们可以看到,没用经过缩放的数据的测试精度很低,而经过所放置后测试精度都得到大幅提升,只是使用的缩放方法不一样,预测精度提升效果不一样而已。
降维特征提出与流行学习:前面讨论过,利用无监督学习进行数据变换可能有很多目的。最常见的是可视化,压缩数据,以及寻找信息量更大的数据表示以用于进一步处理。
为了实现这些目的,最简单也是最常用的一种算法就是主成分分析,另外还有非负矩阵分解(NMF)和t-SNE,前者用于特征提取,后者常用于二维散点图的可视化。
主成分分析:主成分分析是一种旋转数据集的方法,旋转后的特征在统计上不相关。在做完这种旋转后,通常是根据数据新特征对解释数据的重要性来选择它的一个子集。如下图是一PCA对一个模拟二维数据集的作用:
mglearn.plots.plot_pca_illustration()
利用PCA做数据变换
第一张图显示的是原始数据点,不同颜色区分对应的数据,算法首先找到方差最大的方向,将其标记为成分1,这也是数据中心包含最多信息的方向,也就是沿着这个方向的特征量最为相关。然后,算法找到与第一个方向正交(成直角)且包含最多信息的方法作为成分2(这里一定要朝着最多信息的方向)。
第二张图显示的是同样的数据,不过将其进行了翻转,使得第一主成分和X轴平行。在旋转之前,从数据中减去平均值,使得变换之后以0位中心。在PCA找到的旋转表示中,两个坐标轴是不相关的,也就是说,对于这种数据表示,除了对角线,相关矩阵全部为0。
我们可以通过仅仅保留一个主要成分来使用PCA进行降维,这样可以分别得到图3和图4的降维结果,这种处理方式有利于去除数据中的噪声影响,将数据中的主成分信息可视化。