一、决策树

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_

更多推荐