Menu
CoddyTech

模型训练前的 PCA

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 32 课,共 51 课。

特征越少,模型运行越快,也越不容易追逐噪声。PCA 可以放在流水线中,紧挨着模型之前:

for n in [2, 5, 10, 20, 40, 64]:
    model = make_pipeline(PCA(n_components=n), KNeighborsClassifier())
    print(n, f"{cross_val_score(model, X, y, cv=5).mean():.3f}")

在数字数据集上:

数字数据集上保留的成分数量与 k-NN 准确率的曲线:保留 2 个时为 0.595,保留 5 个时为 0.884,保留 10 个时为 0.940,之后几乎持平,保留 20 个时为 0.958,保留全部 64 个时达到 0.963

准确率在接近 20 时趋于平稳:其他 44 个方向几乎没有增加任何效果。每一折都只用自己的训练行拟合 PCA,因此不会发生数据泄漏。

单位不统一?一如既往,先放置 StandardScaler()。

challenge icon

挑战

中等

一家橄榄油实验室根据油在 36 个波长下吸收的光以及 4 项实验室测试为橄榄油评级。最少需要多少个特征?程序会读取一个容差值。

  1. 对 sizes 中的每个 n,对一个流水线进行 5 折交叉验证:标准化器、包含 n 个成分的 PCA,以及 LogisticRegression(max_iter=1000)。打印每个分数。
  2. 打印分数在最佳分数的容差范围内时,所需的最少成分数。

对于另一家实验室,将容差设为 0.05:

2 components: 0.817
3 components: 0.833
4 components: 0.889
5 components: 0.928
10 components: 0.928
20 components: 0.917
40 components: 0.922
Fewest within 0.05 of the best: 4 components

亲手试试

import pandas as pd
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

# 180 份橄榄油样本:在 36 个波长下的光吸收量、4 项实验室检测结果和等级
oils = pd.read_csv("oils.csv")
X = oils.drop(columns=["oil", "grade"])
y = oils["grade"]
sizes = [2, 3, 4, 5, 10, 20, 40]
slack = float(input())

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无监督学习中的所有课

自己练习: Python 在线编译器