Menu
CoddyTech

回顾:滑板维修

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

challenge icon

挑战

中等

滑板公园的租赁柜台需要一个模型,用来识别归还后需要维修的滑板。程序会读取要尝试的最大 k 值。

  1. 划分出 25% 的数据行作为测试集(random_state=0)。
  2. 对于 ks 中的每个 k 值,在训练数据行上进行 k-NN 交叉验证(cv=5)。将平均值绘制为柱形图,并打印最佳 k 值。
  3. 对树模型的 max_depth 在 depths 范围内进行网格搜索(cv=5,random_state=0),并打印最佳结果。
  4. 平均值较高的模型获胜:打印 Winner: k-NN 或 Winner: tree,并显示其测试准确率。

换一个公园,并输入 13:

Best k: 13 (mean 0.785)
Best depth: 5 (mean 0.763)
Winner: k-NN, test accuracy 0.822

Coddy 随后会描述你的图表。他们的图表如下:

柱形图标题为“滑板维修:不同 k 值的准确率”,每个 k 值(从 1 到 13)对应一根柱子,坐标轴范围为 0.6 到 0.9。较小的 k 值对应的准确率在 0.72 附近波动,随后逐渐上升,在 k = 13 时达到 0.785

亲手试试

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier

# 要尝试的最大 k 值,比如 15
max_k = int(input())

# 每块归还的滑板占一行:记录上次保养后的租用次数,以及 0 到 10 的磨损评分
# 还有板面的裂纹;repair 中的 1 表示它被送去维修了
boards = pd.read_csv("skateboards.csv")
features = ["rentals", "wheel_wear", "bearing_noise", "grip_wear", "truck_wobble", "deck_cracks"]
X = boards[features]
y = boards["repair"]
# 每个特征都是较小的计数或评分,所以这里的 k-NN 不需要缩放器
ks = list(range(1, max_k + 1, 2))
depths = [2, 3, 4, 5, 6, 7, 8]

fig, ax = plt.subplots()
ax.set_title("Skateboard Repairs: Accuracy by k")
ax.set_xlabel("k (neighbors)")
ax.set_ylabel("Mean CV accuracy")
ax.set_xticks(ks)
ax.set_ylim(0.6, 0.9)  # 从 0.6 开始,方便看出细微差异

# 在下方编写你的代码

监督学习中的所有课

自己练习: Python 在线编译器