Menu
CoddyTech

决策树深度

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

树可以不断提问,直到每一行训练数据都有自己的答案。这样它只是记住了数据,而不是学会了规律:

在带噪声的半月形数据上,深度为 1 到 12 的树的训练准确率和测试准确率。训练准确率在深度为 8 时升至 1.0,标注为记住了数据。测试准确率在深度为 6 时达到峰值 0.907,并用虚线标出,之后降至约 0.87

较深的树会记住训练数据中的噪声,因此测试准确率会先达到峰值,然后下降。试试不同的深度:

train = []
test = []
for d in range(1, 13):
    tree = DecisionTreeClassifier(max_depth=d, random_state=0)
    tree.fit(X_train, y_train)
    train.append(tree.score(X_train, y_train))
    test.append(tree.score(X_test, y_test))

在这些卫星上,深度 6 在新数据行上的表现最好:暂时保留它。从深度 8 开始,决策树在它记住的数据行上表现完美,但在其余数据行上的表现更差。

challenge icon

挑战

中等

望远镜巡天会将天体分为恒星和星系。起始代码会拆分数据并设置图表。

  1. 对于 depths 中的每个深度,训练一棵树(random_state=0),并记录两种准确率。
  2. 按如下格式打印测试准确率最高时的深度。
  3. 绘制两条线,分别标记为 train 和 test,用虚线 ax.axvline 标出最佳深度,添加图例并显示图表。

对于芒果分拣器:

Best depth: 5, test accuracy 0.867

然后 Coddy 会描述你的图表。它们看起来是这样的:

标题为“成熟了吗?”的图表,横轴为树深度 1 到 10:蓝色的 train 线逐渐上升到约 0.98,橙色的 test 线在深度 5 附近达到峰值,约为 0.87,那里有一条虚线,并带有图例

亲手试试

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

# 望远镜巡天数据中,每个天体占一行:galaxy 为 1 表示星系,为 0 表示恒星
sky = pd.read_csv("sky.csv")
features = ["brightness_mag", "size_arcsec", "roundness", "color_index"]
X_train, X_test, y_train, y_test = train_test_split(sky[features], sky["galaxy"], test_size=0.25, random_state=0)
depths = range(1, 11)

fig, ax = plt.subplots()
ax.set_title("Star or Galaxy?")
ax.set_xlabel("Tree depth")
ax.set_ylabel("Accuracy")

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

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

监督学习中的所有课

自己练习: Python 在线编译器