绘制数字管道

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,我们将使用主成分分析(PCA)和逻辑回归构建一个用于降维和分类的管道。我们将使用 scikit-learn 库对数字数据集使用 PCA 进行无监督降维。然后,我们将使用逻辑回归模型进行分类。我们将使用 GridSearchCV 来设置 PCA 的维度,并找到 PCA 截断和分类器正则化的最佳组合。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作的验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入所需库

我们将首先导入实现该管道所需的库。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler

定义管道组件

我们将定义管道组件,包括主成分分析(PCA)、标准化缩放器(Standard Scaler)和逻辑回归。为了使示例运行得更快,我们将容差设置为一个较大的值。

## 定义一个管道,用于搜索主成分分析(PCA)截断和分类器正则化的最佳组合。
pca = PCA()
## 定义一个标准化缩放器,用于标准化输入
scaler = StandardScaler()

logistic = LogisticRegression(max_iter=10000, tol=0.1)

pipe = Pipeline(steps=[("scaler", scaler), ("pca", pca), ("logistic", logistic)])

加载数据集并为 GridSearchCV 定义参数

我们将加载数字数据集,并为 GridSearchCV 定义参数。我们将设置主成分分析(PCA)截断和分类器正则化的参数。

X_digits, y_digits = datasets.load_digits(return_X_y=True)

param_grid = {
    "pca__n_components": [5, 15, 30, 45, 60],
    "logistic__C": np.logspace(-4, 4, 4),
}

执行 GridSearchCV

我们将执行 GridSearchCV,以找到主成分分析(PCA)截断和分类器正则化的最佳组合。

search = GridSearchCV(pipe, param_grid, n_jobs=2)
search.fit(X_digits, y_digits)

打印最佳参数和分数

我们将打印从 GridSearchCV 获得的最佳参数和分数。

print("Best parameter (CV score=%0.3f):" % search.best_score_)
print(search.best_params_)

绘制主成分分析(PCA)频谱

我们将绘制主成分分析(PCA)频谱,以直观显示每个主成分的解释方差比。

pca.fit(X_digits)

fig, (ax0, ax1) = plt.subplots(nrows=2, sharex=True, figsize=(6, 6))
ax0.plot(
    np.arange(1, pca.n_components_ + 1), pca.explained_variance_ratio_, "+", linewidth=2
)
ax0.set_ylabel("PCA 解释方差比")

ax0.axvline(
    search.best_estimator_.named_steps["pca"].n_components,
    linestyle=":",
    label="所选的 n_components",
)
ax0.legend(prop=dict(size=12))

找到最佳分类器结果

对于每个成分数量,我们将找到最佳分类器结果。

results = pd.DataFrame(search.cv_results_)
components_col = "param_pca__n_components"
best_clfs = results.groupby(components_col).apply(
    lambda g: g.nlargest(1, "mean_test_score")
)

绘制分类准确率

我们将绘制每个成分数量下的分类准确率。

best_clfs.plot(
    x=components_col, y="mean_test_score", yerr="std_test_score", legend=False, ax=ax1
)
ax1.set_ylabel("分类准确率 (验证集)")
ax1.set_xlabel("成分数量")

plt.xlim(-1, 70)

plt.tight_layout()
plt.show()

总结

在本实验中,我们学习了如何使用主成分分析(PCA)和逻辑回归构建用于降维和分类的管道。我们使用 scikit-learn 库对数字数据集使用 PCA 进行无监督降维。然后我们使用逻辑回归模型进行分类。我们使用 GridSearchCV 来设置 PCA 的维度,并找到 PCA 截断和分类器正则化的最佳组合。我们绘制了每个成分数量下的 PCA 频谱和分类准确率。