Menu
CoddyTech

公平比较模型

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

只用一次数据划分来比较模型,就像抛硬币一样:某个模型可能碰巧遇到一个有利的测试集。让每个模型都使用相同的 5 个折叠来比较。对于 150 张纸币,判断真假:

每个模型在 5 个折叠上的得分以点表示,黑线标出各自的平均值。k-NN 的得分点聚集在 0.867 附近;逻辑回归的得分分布在 0.73 到 0.93 之间,平均值约为 0.873;决策树的得分较低,为 0.807

k-NN 和 logistic 在波动范围内不分上下,而且 k-NN 更稳定。决策树表现较差。

KFold 分割器会将各行打乱一次,并为每个模型提供相同的折:

from sklearn.model_selection import KFold

folds = KFold(n_splits=5, shuffle=True, random_state=0)
for model in [knn, logistic, tree]:
    scores = cross_val_score(model, X, y, cv=folds)
    print(f"{scores.mean():.3f} {scores.std():.3f}")

它会打印图表中的数字:

0.867 0.042
0.873 0.074
0.807 0.077

选择均值最高的;如果均值接近,则选择标准差较小的。

challenge icon

挑战

中等

一个烹饪网站会预测打开菜谱的访客是否会烹饪这道菜。初始代码在一次划分上评估了三个模型,结果树模型获胜。公平地评估一下;程序会读取折数。

  1. 创建一个 KFold,使用指定的划分数、shuffle=True 和 random_state=0。
  2. 使用这些折对每个模型进行交叉验证;打印其均值和标准差,保留 3 位小数。
  3. 打印均值最高的模型。

对于其他访客和 5:

One split picks: k-NN
k-NN: mean 0.833, std 0.045
logistic: mean 0.860, std 0.044
tree: mean 0.787, std 0.029
Cross-validation picks: logistic

亲手试试

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

n_folds = int(input())

# 不要修改下面的代码:300 位访客,6 种浏览习惯;标签 1 表示他们做过这道菜
X, y = make_classification(n_samples=300, n_features=6, n_informative=4, n_redundant=0,
                           flip_y=0.06, class_sep=0.8, random_state=0)
names = ["k-NN", "logistic", "tree"]
models = [KNeighborsClassifier(), LogisticRegression(max_iter=1000),
          DecisionTreeClassifier(max_depth=4, random_state=0)]

# 一次数据划分就选出了赢家
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
single = []
for model in models:
    model.fit(X_train, y_train)
    single.append(model.score(X_test, y_test))
print(f"One split picks: {names[np.argmax(single)]}")

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

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

监督学习中的所有课

自己练习: Python 在线编译器