Menu
CoddyTech

森林为何有效

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

森林中的树木经过有意的差异化处理。每棵树都使用一个自助采样样本进行训练:从数据行中随机有放回地抽取,因此有些数据行会重复出现,有些则不会被选中。

每次提问也会随机选取几个特征。各棵树会犯不同的错误,而投票会抵消这些错误。两种萤火虫:

两张图表展示了 150 只萤火虫,横轴为闪光时长,纵轴为停顿时长,蓝色圆圈代表一个物种,红色三角形代表另一个物种。左图是一棵树:边界有细长的条带延伸到单只萤火虫所在的位置。右图是由 100 棵树组成的森林:两组之间有一条平滑的边界

只有在大多数树木意见一致的地方,森林才会保留一条带状区域。

这些树位于 forest.estimators_ 中:

third = forest.estimators_[2]
print(round(third.score(X_test, y_test), 3))

这会输出 0.737。整个森林的得分是 0.895。

challenge icon

挑战

中等

随机森林能胜过自己的树吗?起始代码使用 riders.csv 中的数据,将 forest 拟合到这些数据上,数据记录了哪些骑手在 6 小时内完成了 160 km 骑行,哪些没有,并设置好了图表。

  1. 计算随机森林中每棵树在测试数据行上的得分。
  2. 绘制得分直方图,使用 bins=10,并用红色竖线标出 forest_acc。
  3. 打印随机森林胜过了多少棵树。

另一次骑行打印了 The forest beats 88 of its 100 trees,并绘制了下面的图:

标题为“随机森林及其树”的直方图:树在测试数据上的准确率约为 0.53 到 0.85,大多数接近 0.70,一条红色竖线位于约 0.77 处,在大多数柱子的右侧

接下来,Coddy 会描述你的图表。

亲手试试

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

# 参加 160 km 慈善骑行的骑手:是否在 6 小时内完赛(1 表示是,0 表示否)
riders = pd.read_csv("riders.csv")
features = ["weekly_km", "long_ride_km", "age", "years_riding", "rest_days", "sleep_hours"]
X = riders[features].to_numpy()  # 普通数组,符合随机森林中各棵树预期的格式
y = riders["under_6h"].to_numpy()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

forest = RandomForestClassifier(n_estimators=100, random_state=0)
forest.fit(X_train, y_train)
forest_acc = forest.score(X_test, y_test)

fig, ax = plt.subplots()
ax.set_title("The Forest and Its Trees")
ax.set_xlabel("Test accuracy")
ax.set_ylabel("Trees")

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

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

监督学习中的所有课

自己练习: Python 在线编译器