决策树:原理与实现
基尼不纯度、信息增益、树深度和过拟合——使用 sklearn DecisionTreeClassifier
决策树:原理与实现 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
什么是决策树
决策树根据特征值将数据分成多个分支,不断提出是/否问题,直到在叶节点得出预测结果。
每个内部节点测试一个特征,每条分支代表一个结果,每个叶节点分配一个类别。树易于解释,因为您可以沿着决策路径逐步查看。
基尼不纯度
基尼不纯度用于衡量节点中的类别混杂程度。纯节点(全部属于同一类别)的基尼值为 0。
公式为 Gini = 1 - sum(p_i^2),其中 p_i 表示类别 i 所占的比例。树会选择能最大程度降低不纯度的分裂方式。
import numpy as np
def gini(labels):
classes, counts = np.unique(labels, return_counts=True)
probs = counts / counts.sum()
return 1 - np.sum(probs ** 2)
print(gini([0, 0, 1, 1])) # 0.5 (max mix)
print(gini([0, 0, 0, 0])) # 0.0 (pure)信息增益与熵
另一种分裂标准是基于熵的信息增益。熵为 -sum(p_i * log2(p_i))。
信息增益 = 父节点熵 - 子节点的加权熵。基尼不纯度和熵通常会生成相似的树;基尼不纯度的计算速度略快。
import numpy as np
def entropy(labels):
_, counts = np.unique(labels, return_counts=True)
p = counts / counts.sum()
return -np.sum(p * np.log2(p))
print(entropy([0, 0, 1, 1])) # 1.0
print(entropy([0, 0, 0, 1])) # ~0.81训练 DecisionTreeClassifier
Scikit-learn 提供了 DecisionTreeClassifier。您可以通过 criterion 参数选择分裂标准(gini 或 entropy)。
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
Xtr, Xte, ytr, yte = train_test_split(X, y, random_state=0)
clf = DecisionTreeClassifier(criterion="gini", random_state=0)
clf.fit(Xtr, ytr)
print("Accuracy:", clf.score(Xte, yte))过拟合与 max_depth
不受约束的树会不断生长,直到每个叶节点都纯净,并将噪声也记住。这会导致过拟合。
max_depth 参数限制树的最大深度,迫使其进行泛化。深度越小 = 模型越简单 = 过拟合越少。
from sklearn.tree import DecisionTreeClassifier
shallow = DecisionTreeClassifier(max_depth=3, random_state=0)
deep = DecisionTreeClassifier(max_depth=None, random_state=0)
# shallow generalizes better on unseen data;
# deep often overfits the training set其他预剪枝参数
除了 max_depth 之外,您还可以通过以下参数控制生长:
min_samples_split拆分节点所需的最少样本数min_samples_leaf叶节点中的最少样本数max_leaf_nodes叶节点总数上限
这些设置都会降低方差并遏制过拟合。
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(
max_depth=5,
min_samples_split=10,
min_samples_leaf=5,
random_state=0,
)使用 plot_tree 可视化
plot_tree 会绘制完整的树,以便您查看每次分裂、基尼值以及每个节点的类别分布。
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
clf = DecisionTreeClassifier(max_depth=3).fit(X, y)
plt.figure(figsize=(12, 6))
plot_tree(clf, filled=True, feature_names=load_iris().feature_names)
plt.show()特征重要性
拟合后,feature_importances_ 会告诉您每个特征在所有分裂中降低了多少不纯度。各值之和为 1.0。
这是快速排列哪些输入对模型最重要的一种方法。
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
data = load_iris()
clf = DecisionTreeClassifier(max_depth=3).fit(data.data, data.target)
for name, imp in zip(data.feature_names, clf.feature_importances_):
print(f"{name}: {imp:.3f}")代价复杂度剪枝(ccp_alpha)
后剪枝会先让树完整生长,然后修剪较弱的分支。ccp_alpha 参数控制剪枝的力度:更大的 α 会移除更多节点。
请使用 cost_complexity_pruning_path 查找候选 α 值。
from sklearn.tree import DecisionTreeClassifier
base = DecisionTreeClassifier(random_state=0)
path = base.cost_complexity_pruning_path(Xtr, ytr)
alphas = path.ccp_alphas
pruned = DecisionTreeClassifier(ccp_alpha=0.01, random_state=0)
pruned.fit(Xtr, ytr)选择最佳 α 值
要选择 ccp_alpha,请针对每个候选 α 值训练一棵树,并比较验证准确率。最佳 α 值需要在准确率和简洁性之间取得平衡。
from sklearn.tree import DecisionTreeClassifier
scores = []
for a in alphas:
t = DecisionTreeClassifier(ccp_alpha=a, random_state=0)
t.fit(Xtr, ytr)
scores.append((a, t.score(Xte, yte)))
best = max(scores, key=lambda s: s[1])
print("Best alpha:", best[0])优势与不足
优点:易于解释、无需缩放、能够处理非线性边界和混合数据类型。
缺点:方差高(数据稍有变化就可能改变树)、容易过拟合,并且只支持轴对齐分裂。这些不足促使人们采用随机森林等集成方法。
快速检查
请检验您对决策树概念的理解。
回顾
回顾:决策树使用基尼不纯度或信息增益拆分数据。请通过预剪枝(max_depth、min_samples_leaf)或后剪枝(ccp_alpha)控制过拟合。使用 plot_tree 和 feature_importances_ 检查模型。它们的高方差促使人们采用集成方法。
常见问题解答
「决策树:原理与实现」课时是免费的吗?
是的 — 「决策树:原理与实现」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「决策树:原理与实现」这节课中我会学到什么?
基尼不纯度、信息增益、树深度和过拟合——使用 sklearn DecisionTreeClassifier 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「决策树:原理与实现」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。