决策树深度
本课属于 Coddy Machine Learning 学习旅程的“监督学习”单元。第 29 课,共 58 课。
树可以不断提问,直到每一行训练数据都有自己的答案。这样它只是记住了数据,而不是学会了规律:
较深的树会记住训练数据中的噪声,因此测试准确率会先达到峰值,然后下降。试试不同的深度:
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 开始,决策树在它记住的数据行上表现完美,但在其余数据行上的表现更差。
挑战
中等望远镜巡天会将天体分为恒星和星系。起始代码会拆分数据并设置图表。
- 对于
depths中的每个深度,训练一棵树(random_state=0),并记录两种准确率。 - 按如下格式打印测试准确率最高时的深度。
- 绘制两条线,分别标记为
train和test,用虚线ax.axvline标出最佳深度,添加图例并显示图表。
对于芒果分拣器:
Best depth: 5, test accuracy 0.867然后 Coddy 会描述你的图表。它们看起来是这样的:
亲手试试
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")
# 在下方编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
监督学习中的所有课
自己练习: Python 在线编译器