📘 :一棵树的自我修养:从“杠精”到“专家”的决策指南

1. 决策树核心思想 —— 就是一台“是非题问答机”
- 本质:通过一连串 是/否 的二元判断,把数据层层划分,最终在叶子节点给出结论(类别或数值)。
- 生活类比:相亲决策树(年龄→长相→收入→是否公务员 → 见/不见)。
- 核心三步走:
- 特征选择:选当前最“有用”的特征。
- 树的生成:递归分裂,直到停止条件。
- 剪枝:防止模型“死记硬背”(过拟合)。
2. CART树 —— 所有主流树模型的“老祖宗”
| 任务类型 | 分类 + 回归 | 仅分类 |
| 分裂方式 | 强制二分(只问是非题) | 二分/多分混用 |
| 过拟合处理 | 内置剪枝机制 | 较弱 |
| 江湖地位 | 随机森林、XGBoost、LightGBM 的基石 | 已淡出工业界 |
CART 的核心原则(4条铁律):
3. 分类案例 · 泰坦尼克号生存预测(代码骨架)
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
# 1. 读数据
df = pd.read_csv("titanic_train.csv")
# 2. 特征工程(核心:处理缺失 + 编码)
x = df[['Pclass', 'Age', 'Sex']]
y = df['Survived']
x['Age'].fillna(x['Age'].mean(), inplace=True)
x = pd.get_dummies(x) # Sex 转为 one-hot
# 3. 切分 & 训练
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
clf = DecisionTreeClassifier(criterion='gini', max_depth=5) # 关键参数
clf.fit(x_train, y_train)
# 4. 评估
print(clf.score(x_test, y_test))
关键 API 参数:
- criterion='gini'(CART标准)或 'entropy'(ID3标准)
- max_depth:树的最大深度(预剪枝常用)
- min_samples_split / min_samples_leaf:控制分裂门槛
4. 回归案例 · 波士顿房价预测(代码骨架)
from sklearn.tree import DecisionTreeRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
# 数据加载(略)
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2)
# 特征标准化(树模型对尺度不敏感,但做无害)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
# 训练回归树
reg = DecisionTreeRegressor(max_depth=4)
reg.fit(x_train, y_train)
# 评估(MSE越小越好)
y_pred = reg.predict(x_test)
print("MSE:", mean_squared_error(y_test, y_pred))
注意:回归树叶子节点输出的是该叶子的平均房价,非分类标签。
5. 剪枝 —— 防止“背题式学习”的正则化手段
| 预剪枝 | 树生成过程中 | 若当前分裂不能提升验证集精度,立即停止 | 省时,但容易欠拟合(贪心短视) |
| 后剪枝 | 树完全生成后 | 自底向上尝试删除子树,若精度提升则替换为叶子 | 泛化更强,但训练开销大 |
通俗理解:
- 预剪枝 = 边写作业边检查,不对就停笔 → 快但可能想不深。
- 后剪枝 = 先写完一整篇,再回头删废话 → 全面但耗时间。
6. 优缺点一句话总结
| 解释性强,画图即说人话 | 单棵树容易过拟合(需剪枝) |
| 分类回归通吃 | 对数据扰动敏感(换个样本树结构大变) |
| 工业界集成算法的基石 | 贪心分裂,不保证全局最优 |
7. 终极记忆口诀(考试/面试用)
二分问,选最纯,递归分,均值归;预剪快,后剪稳,集成树下它称神。




