python科学计算基础教程(用Python做科学计算工具篇)
python科学计算基础教程(用Python做科学计算工具篇)plt.imshow(pca.mean_.reshape(faces.images[0].shape) cmap=plt.cm.bone) 主成分测量沿正交轴的平均值的偏差。from sklearn import decomposition pca = decomposition.PCA(n_components=150 whiten=True) pca.fit(X_train) PCA 的一个有趣部分是它计算“平均”面,这可能很有趣:from matplotlib import pyplot as plt fig = plt.figure(figsize=(8 6)) # plot several images for i in range(15): ax = fig.add_subplot(3 5 i 1 xticks=[] yticks
所需基本库
- NumPy
- scipy
- matplotlib
- 简介:问题设置
- 使用 scikit-learn 进行机器学习的基本原理
- 监督学习:手写数字的分类
- 监督学习:住房数据的回归
- 测量预测性能
- 无监督学习:降维和可视化
- 特征脸示例:链接 PCA 和 SVM
- 参数选择、验证和测试
6.7. 特征脸示例:链接 PCA 和 SVM
这个例子的目的是展示如何将无监督方法和有监督方法链接起来以获得更好的预测。它以一种说教但冗长的做事方式开始,并以 scikit-learn 中流水线的惯用方法结束。
在这里,我们将看一个简单的面部识别示例。理想情况下,我们将使用一个数据集,该数据集由可用于sklearn.datasets.fetch_lfw_people(). 然而,这是一个相对较大的下载(~200MB),所以我们将在一个更简单、不那么丰富的数据集上完成本教程。随意探索 LFW 数据集。
from sklearn import datasets
faces = datasets.fetch_olivetti_faces()
faces.data.shape
让我们可视化这些面孔,看看我们正在处理什么
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(8 6))
# plot several images
for i in range(15):
ax = fig.add_subplot(3 5 i 1 xticks=[] yticks=[])
ax.imshow(faces.images[i] cmap=plt.cm.bone)
请注意,这些面已经被本地化并缩放到一个共同的大小。这是面部识别的重要预处理部分,并且是一个可能需要大量训练数据集合的过程。这可以在 scikit-learn 中完成,但挑战在于收集足够数量的训练数据以使算法正常工作。幸运的是,这件作品很常见,以至于它已经完成了。一个很好的资源是 OpenCV,即开放计算机视觉库。
我们将对图像执行支持向量分类。我们将对图像进行典型的训练测试拆分:
from sklearn.model_selection import train_test_split
X_train X_test y_train y_test = train_test_split(faces.data
faces.target random_state=0)
print(X_train.shape X_test.shape)
(300 4096) (100 4096)
6.7.1. 预处理:主成分分析
1850 维对于 svm 来说已经很多了。我们可以使用 PCA 将这 1850 个特征减少到可管理的大小,同时保留数据集中的大部分信息。
from sklearn import decomposition
pca = decomposition.PCA(n_components=150 whiten=True)
pca.fit(X_train)
PCA 的一个有趣部分是它计算“平均”面,这可能很有趣:
plt.imshow(pca.mean_.reshape(faces.images[0].shape)
cmap=plt.cm.bone)
主成分测量沿正交轴的平均值的偏差。
print(pca.components_.shape)
(150 4096)
可视化这些主要组件也很有趣:
fig = plt.figure(figsize=(16 6))
for i in range(30):
ax = fig.add_subplot(3 10 i 1 xticks=[] yticks=[])
ax.imshow(pca.components_[i].reshape(faces.images[0].shape)
cmap=plt.cm.bone)
组件(“特征面”)按其重要性从左上到右下排序。我们看到前几个组件似乎主要负责照明条件。其余的组件提取某些识别特征:鼻子、眼睛、眉毛等。
计算出这个投影后,我们现在可以将原始训练和测试数据投影到 PCA 基础上:
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
print(X_train_pca.shape)
(300 150)
print(X_test_pca.shape)
(100 150)
这些投影分量对应于分量图像的线性组合中的因子,使得组合接近原始面部。
6.7.2. 进行学习:支持向量机现在我们将对这个简化的数据集执行支持向量机分类:
from sklearn import svm
clf = svm.SVC(C=5. gamma=0.001)
clf.fit(X_train_pca y_train)
最后,我们可以评估这种分类的效果。首先,我们可能会用从训练集中学习到的标签来绘制一些测试用例:
import numpy as np
fig = plt.figure(figsize=(8 6))
for i in range(15):
ax = fig.add_subplot(3 5 i 1 xticks=[] yticks=[])
ax.imshow(X_test[i].reshape(faces.images[0].shape)
cmap=plt.cm.bone)
y_pred = clf.predict(X_test_pca[i np.newaxis])[0]
color = ('black' if y_pred == y_test[i] else 'red')
ax.set_title(y_pred fontsize='small' color=color)
鉴于其学习模型的简单性,分类器在大量图像上是正确的!该算法使用从像素级数据派生的 150 个特征上的线性分类器,正确识别图像中的大量人物。
同样,我们可以使用来自的几个度量之一来量化这种有效性sklearn.metrics。首先我们可以做分类报告,它显示分类“好”的准确率、召回率和其他度量:
from sklearn import metrics
y_pred = clf.predict(X_test_pca)
print(metrics.classification_report(y_test y_pred))
precision recall f1-score support
0 1.00 0.67 0.80 6
1 1.00 1.00 1.00 4
2 0.50 1.00 0.67 2
3 1.00 1.00 1.00 1
4 0.50 1.00 0.67 1
5 1.00 1.00 1.00 5
6 1.00 1.00 1.00 4
7 1.00 0.67 0.80 3
9 1.00 1.00 1.00 1
10 1.00 1.00 1.00 4
11 1.00 1.00 1.00 1
12 1.00 1.00 1.00 2
13 1.00 1.00 1.00 3
14 1.00 1.00 1.00 5
15 0.75 1.00 0.86 3
17 1.00 1.00 1.00 6
19 1.00 1.00 1.00 4
20 1.00 1.00 1.00 1
21 1.00 1.00 1.00 1
22 1.00 1.00 1.00 2
23 1.00 1.00 1.00 1
24 1.00 1.00 1.00 2
25 1.00 0.50 0.67 2
26 1.00 0.75 0.86 4
27 1.00 1.00 1.00 1
28 0.67 1.00 0.80 2
29 1.00 1.00 1.00 3
30 1.00 1.00 1.00 4
31 1.00 1.00 1.00 3
32 1.00 1.00 1.00 3
33 1.00 1.00 1.00 2
34 1.00 1.00 1.00 3
35 1.00 1.00 1.00 1
36 1.00 1.00 1.00 3
37 1.00 1.00 1.00 3
38 1.00 1.00 1.00 1
39 1.00 1.00 1.00 3
avg / total 0.97 0.95 0.95 100
另一个有趣的指标是混淆矩阵,它表示任意两个项目混淆的频率。完美分类器的混淆矩阵在对角线上只有非零条目,在非对角线上有零:
print(metrics.confusion_matrix(y_test y_pred))
[[4 0 0 ... 0 0 0]
[0 4 0 ... 0 0 0]
[0 0 2 ... 0 0 0]
...
[0 0 0 ... 3 0 0]
[0 0 0 ... 0 1 0]
[0 0 0 ... 0 0 3]]
6.7.3. 流水线
上面我们在应用支持向量机分类器之前使用 PCA 作为预处理步骤。将一个估计器的输出直接插入第二个估计器的输入是一种常用的模式。出于这个原因,scikit-learn 提供了一个Pipeline自动化这个过程的对象。上述问题可以重新表述为管道如下:
from sklearn.pipeline import Pipeline
clf = Pipeline([('pca' decomposition.PCA(n_components=150 whiten=True))
('svm' svm.LinearSVC(C=1.0))])
clf.fit(X_train y_train)
y_pred = clf.predict(X_test)
print(metrics.confusion_matrix(y_pred y_test))
- 相关文章:
- 用Python做科学计算(工具篇)——scikit-learn(机器学习)6
- 用Python做科学计算(工具篇)——scikit-learn(机器学习)5
- 用Python做科学计算(工具篇)——scikit-learn(机器学习)4
- 用Python做科学计算(工具篇)——scikit-learn(机器学习)3
- 用Python做科学计算(工具篇)——scikit-learn(机器学习)2
- 用Python做科学计算(工具篇)——scikit-learn(机器学习)1
- 用Python做科学计算(工具篇)——1.1. NumPy 数组对象
- 用Python做科学计算(工具篇)——numpy1.2.数组的数值运算
- 用Python做科学计算(工具篇)——numpy1.3 更精细的数组
- 用Python做科学计算(工具篇)——numpy1.4 高级操作
- 用Python做科学计算——matplotlib绘图实例
- 用Python做科学计算(工具篇)——scipy 使用指南
- 用Python做科学计算(工具篇)——sympy使用指南(符号运算)
- Python 数据处理 panda 可视化