Menu
CoddyTech

网格搜索

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

手动调参意味着要在循环中嵌套循环。GridSearchCV 会对每种设置组合进行交叉验证,并保留最佳结果。对于 300 趟有轨电车行程,判断是否晚点:

一个 3 乘 3 的平均准确率网格:纵向是树深度 2、4、6,横向是每个叶节点的最少样本数 1、5、20。最佳单元格的树深度为 4、叶节点样本数为 5,得分为 0.876,并带有边框

字典将每个设置映射到要尝试的值。min_samples_leaf 是叶节点可以包含的最少行数:

from sklearn.model_selection import GridSearchCV

grid = {"max_depth": [2, 4, 6], "min_samples_leaf": [1, 5, 20]}
search = GridSearchCV(DecisionTreeClassifier(random_state=0), grid, cv=5)
search.fit(X_train, y_train)
print(search.best_params_)
print(f"{search.best_score_:.3f}")
print(f"{search.score(X_test, y_test):.3f}")

这会打印:

{'max_depth': 4, 'min_samples_leaf': 5}
0.876
0.813

搜索会用所有训练行重新拟合最佳模型,因此 search.score 只会测试它一次。网格要保持较小:每个单元格需要拟合 5 次。

challenge icon

挑战

中等

卫星团队使用 k-NN 将像素标记为云或晴空。程序会读取要尝试的最大 k;初始代码会拆分数据。

  1. 对从 1 到该数字的所有奇数 k 进行网格搜索,使用 weights "uniform" 或 "distance"(距离更近的邻居权重更高),并设置 cv=5。
  2. 打印最佳设置、交叉验证准确率和测试准确率,保留 3 位小数。

对于其他像素以及 7:

Best k: 7, weights: distance
Cross-validated accuracy: 0.885
Test accuracy: 0.800

亲手试试

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier

max_k = int(input())

# 不要修改下面的代码:360 个卫星图像像素,每个像素有 4 个光照读数;标签 1 表示云。
X, y = make_classification(n_samples=360, n_features=4, n_informative=3, n_redundant=0,
                           flip_y=0.08, class_sep=0.7, random_state=1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

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

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

监督学习中的所有课

自己练习: Python 在线编译器