Menu
CoddyTech

K 折交叉验证

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

本章将让你的评分结果更可靠。学完后,你将使用这样的图表来调整模型:

k 从 1 到 41 时,5 折的平均准确率柱状图。柱状图从 k = 1 时的 0.85 上升到 k = 15 时突出显示的最佳值 0.91,随后下降

一次测试划分可能只是运气好。K 折交叉验证会将行分成若干折,这里分成 5 折,然后依次在每一折上进行测试,并用其余部分训练:

5 行,每行有 5 个单元格。每次划分时,一个单元格作为测试折,每次选取的都不同;其余 4 个用于训练。旁边是 Iris 决策树的得分:0.967、0.967、0.900、0.967、1.000

一次调用即可运行全部 5 次交叉验证,这里使用鸢尾花数据集训练决策树:

from sklearn.model_selection import cross_val_score

tree = DecisionTreeClassifier(random_state=0)
scores = cross_val_score(tree, X, y, cv=5)
print(np.round(scores, 3))
print(f"{scores.mean():.3f} {scores.std():.3f}")

这会打印:

[0.967 0.967 0.9   0.967 1.   ]
0.960 0.033

将均值作为分数,将标准差作为波动程度。

challenge icon

挑战

中等

一家康普茶酿造厂根据 5 项实验室读数预测批次是否变质。它的模型有多稳定?程序会读取折数,起始代码会生成数据和模型。

  1. 用指定的折数对模型进行交叉验证。
  2. 打印每一折的准确率,然后打印平均值和标准差,所有数值都保留 3 位小数。
  3. 打印最弱一折的编号,从 1 开始计数。

对于其他批次和 4:

Fold 1: 0.917
Fold 2: 0.933
Fold 3: 0.883
Fold 4: 0.917
Mean 0.912, std 0.018
Weakest fold: 3

亲手试试

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression

n_folds = int(input())

# 不要修改下面的代码:共有 240 批康普茶,每批有 5 项实验室检测数据;标签 1 表示已变质。
X, y = make_classification(n_samples=240, n_features=5, n_informative=3, n_redundant=0,
                           flip_y=0.08, class_sep=0.9, random_state=2)
model = LogisticRegression(max_iter=1000)

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

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

监督学习中的所有课

自己练习: Python 在线编译器