【Python实例第3讲】管道:连接主成分和Logistic回归

机器学习训练营——机器学习爱好者的自由交流空间(qq 群号:696721295)

众所周知,主成分(PCA)是一种无监督的降维方法,而Logistic回归则做预测问题。本例的目的是将二者结合起来,使用函数GridSearchCV设置主成分的维度。这里要用到scikit-learn自带数据集——“手写数字数据集”。

数据集介绍

“手写数字数据集”在datasets里,由1,797个手写数字的数据组成。每个数据点样本代表一个0 ~ 9
之间的手写数字,该数字由 8 × 8 大小的像素矩阵表示,矩阵中的元素是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 × 8 × 8 的三维矩阵,即由1797张 8 × 8 的数字图像组成。第一个样本是数字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是表示全部像素数据的 1797 × 64 数组型矩阵,pca.fit调用主成分对象pca的fit方法拟合X_digits. 由于没有指定主成分数,该方法拟合全部的主成分。此时,这成分数 n_components

n_components == min(n_samples, n_features)

上图中的横坐标是主成分数,纵坐标是主成分可以解释的原始数据(X_digits)的方差大小。我们知道,第一主成分可解释的方差最大,第二主成分次大,以此类推,越往后的主成分,可解释的方差越小。

第四步:预测

取3个特别的主成分数20, 40, 64; 来自 10 4 , 10 4 等比数列的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()

这里写图片描述

阅读更多精彩内容,请关注微信公众号:统计学习与大数据

猜你喜欢

转载自blog.csdn.net/wong2016/article/details/82588450
今日推荐