机器学习树模型保姆级笔记:决策树与随机森林原理 + 极简实战代码
·
一、决策树
1. 核心概念
决策树通过逐层特征划分实现分类或回归,结构包含根节点、内部节点、叶子节点,本质是不断切分数据集,让每个子集的纯度越来越高。
- 分类树:输出离散标签,划分标准常用基尼系数(衡量节点纯度,值越小代表节点内类别越统一),对应
DecisionTreeClassifier - 回归树:输出连续数值,划分标准常用均方误差 MSE,对应
DecisionTreeRegressor
2. 核心超参数(控制过拟合)
决策树天生易过拟合,以下是最关键的约束参数:
max_depth:树的最大深度,最核心的过拟合控制参数min_samples_leaf:叶子节点最少样本数,低于该值则停止拆分min_samples_split:内部节点最少样本数,低于该值则不再分裂
3. 分类树核心代码
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn import metrics
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
# 模型初始化与训练
dtr = tree.DecisionTreeClassifier(
criterion='gini',
max_depth=5,
min_samples_leaf=3,
random_state=0
)
dtr.fit(x_train, y_train)
# 预测与评估
y_pred = dtr.predict(x_test)
print(metrics.classification_report(y_test, y_pred))
4. 回归树核心代码
from sklearn.tree import DecisionTreeRegressor
reg = DecisionTreeRegressor(random_state=0)
reg.fit(x, y)
y_pred = reg.predict(x)
print("R²得分:", reg.score(x, y))
二、样本不平衡处理(实操必用)
正负样本数量差距较大时,单一准确率会失效。所有采样操作仅作用于训练集,测试集必须保持原始分布。
1. SMOTE 过采样(中小数据集优先)
通过插值人工生成少数类样本,不丢失多数类信息。
from imblearn.over_sampling import SMOTE
oversample = SMOTE(random_state=0)
os_x_train, os_y_train = oversample.fit_resample(x_train, y_train)
2. 下采样(大数据集、多数类冗余场景)
随机抽取多数类样本与少数类数量对齐,训练速度快,但会丢失部分多数类信息。
三、随机森林
1. 是什么
随机森林是 Bagging 集成学习 的代表算法,由多棵相互独立的决策树组成,分类任务通过多棵树投票输出结果,回归任务通过多棵树取平均值输出结果。
它的核心是通过两个 “随机” 保证树与树之间的差异性,从而抵消单棵树的误差与过拟合风险:
- 样本随机:每棵树通过有放回抽样(Bootstrap)获得不同的训练子集
- 特征随机:每棵树分裂节点时,仅从随机抽取的部分特征中选择最优划分
2. 优缺点
✅ 优点
- 泛化能力强,天然抗过拟合,整体效果显著优于单棵决策树
- 稳定性高,对噪声和异常值不敏感
- 可输出特征重要性,具备业务可解释性
- 支持多线程并行训练,工程落地效率高
❌ 缺点
- 相比单棵决策树,整体可解释性下降,无法直观看到完整判断逻辑
- 树数量较多时,训练与预测速度会变慢
- 对高维稀疏数据(如文本特征),效果通常弱于线性模型
3. 核心超参数
在决策树参数基础上新增:
n_estimators:森林中树的数量,100-200 通常是性价比最高的区间max_features:每棵树随机选取的特征比例,用于增加树的差异性
4. 核心代码
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
# 模型初始化
rf = RandomForestClassifier(
n_estimators=100,
max_depth=15,
min_samples_leaf=20,
max_features=0.8,
random_state=0,
n_jobs=-1 # 调用全部CPU核心并行训练
)
# 交叉验证调参
score = cross_val_score(rf, os_x_train, os_y_train, cv=8, scoring='accuracy')
print("交叉验证平均准确率:", score.mean())
# 训练与评估
rf.fit(x_train, y_train)
y_pred = rf.predict(x_test)
# 输出特征重要性
importances = rf.feature_importances_
更多推荐


所有评论(0)