机器学习训练营——机器学习爱好者的自由交流空间(qq 群号:696721295)
众所周知,主成分(PCA)是一种无监督的降维方法,而Logistic回归则做预测问题。本例的目的是将二者结合起来,使用函数GridSearchCV
设置主成分的维度。这里要用到scikit-learn自带数据集——“手写数字数据集”。
数据集介绍
“手写数字数据集”在datasets
里,由1,797个手写数字的数据组成。每个数据点样本代表一个0 ~ 9
之间的手写数字,该数字由
大小的像素矩阵表示,矩阵中的元素是0~16的数值,代表颜色深度。例如,下面是数字0的样本
下面是前100个样本的手写数字图形
现在,我们了解一个这个数据集的结构。
from sklearn import datasets
digits = datasets.load_digits()
print(type(digits))
digits是加载的手写数字的数据集,它是一个bunch
类型的对象。bunch类是一种继承自字典型的类。由于这个类直接继承dict类,所以我们可以获得dict类的大量功能,比如对“键/值”的遍历,或者简单查询一个属性是否存在。
print('digits.keys() = ',digits.keys())
结果显示,digits所包含的数据分为data, target, target_names, images, DESCR.
我们再来看一看images
print('digits.images.shape = ',digits.images.shape)
print('digits.images = ',digits.images)
结果显示images是一个
的三维矩阵,即由1797张
的数字图像组成。第一个样本是数字0, 我们看看它的图像。
import matplotlib.pyplot as plt
import numpy as np
plt.gray()
plt.matshow(digits.images[0])
plt.show()
将images的每个数字图像按行展开成一行,共1797行,得到data
.
print('digits.data.shape = ',digits.data.shape)
print('digits.data = ',digits.data)
target
表示每个图像的标签,也就是每张图片代表哪个数字。
print('digits.target.shape = ',digits.target.shape)
print('digits.target = ',digits.target)
target_names
汇总数据集里的所有标签值,即,0~9
print('digits.target_names.shape = ',digits.target_names.shape)
print('digits.target_names = ',digits.target_names)
DESCR
则是一些关于作者的描述性信息。
print('digits.DESCR = ', digits.DESCR)
实例详解
首先,从scikit-learn
里导入必需的模块和函数。
print(__doc__)
# Code source: Gaël Varoquaux
# Modified for documentation by Jaques Grobler
# License: BSD 3 clause
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model, decomposition, datasets
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
第一行print(__doc__)
的作用是输出文件开头注释的内容。
第一步:加载数据集
加载digits
数据集,分别建立data和target对象。
digits = datasets.load_digits()
X_digits = digits.data
y_digits = digits.target
第二步:建立管道
在建立pca和logit回归对象后,由它们组成管道(pipeline)。sklean提供的pipeline
将多个学习器组成流水线。通常,流水线的形式为:数据标准化的学习器–>特征提取的学习器–>执行预测的学习器。除了最后一个学习器之外,前面所有的学习器都必须提供transform
方法,该方法用于数据转化(例如:归一化、正则化、特征提取等)。
pca = decomposition.PCA()
logistic = linear_model.LogisticRegression()
pipe = Pipeline(steps=[('pca', pca), ('logistic', logistic)])
第三步:可视化PCA谱
pca.fit(X_digits)
plt.figure(1, figsize=(4, 3))
plt.clf()
plt.axes([.2, .2, .7, .7])
plt.plot(pca.explained_variance_, linewidth=2)
plt.axis('tight')
plt.xlabel('n_components')
plt.ylabel('explained_variance_')
plt.show()
X_digits
是表示全部像素数据的
数组型矩阵,pca.fit
调用主成分对象pca的fit方法拟合X_digits. 由于没有指定主成分数,该方法拟合全部的主成分。此时,这成分数 n_components
n_components == min(n_samples, n_features)
上图中的横坐标是主成分数,纵坐标是主成分可以解释的原始数据(X_digits)的方差大小。我们知道,第一主成分可解释的方差最大,第二主成分次大,以此类推,越往后的主成分,可解释的方差越小。
第四步:预测
取3个特别的主成分数20, 40, 64; 来自 等比数列的3个值。
n_components = [20, 40, 64]
Cs = np.logspace(-4, 4, 3)
print(Cs)
函数GridSearchCV
在管道的指定参数上穷尽地搜索,找到最优的流水线组合,在这里即为pca, logistic的最优组合。然后,在最优的管道估计量上做拟合。
estimator = GridSearchCV(pipe,
dict(pca__n_components=n_components,
logistic__C=Cs))
estimator.fit(X_digits, y_digits)
plt.axvline(estimator.best_estimator_.named_steps['pca'].n_components,
linestyle=':', label='n_components chosen')
plt.legend(prop=dict(size=12))
plt.show()
阅读更多精彩内容,请关注微信公众号:统计学习与大数据