Adaboost与随机森林算法流程全解析:从理论到Python实战

1次阅读
没有评论

共计 2012 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点

集成学习通过组合多个弱学习器来提升模型性能,在实际应用中(如金融风控、医疗诊断)能有效降低过拟合风险。但初学者常面临两个核心问题:

Adaboost 与随机森林算法流程全解析:从理论到 Python 实战

  1. 算法选择困境 :Adaboost 通过逐步修正错误提升性能(低偏差),而随机森林通过特征 / 样本扰动降低方差,如何权衡?
  2. 参数调优复杂 :Adaboost 的学习率与迭代次数如何配合?随机森林的树深度与特征子集大小怎样影响 OOB 误差?

技术对比

对比维度 Adaboost 随机森林
基学习器类型 浅层决策树(通常 max_depth=1) 完全生长决策树
样本采样策略 迭代时增加错分样本权重 Bootstrap 采样(有放回)
特征采样策略 使用全部特征 每棵树随机选择特征子集
权重更新机制 $\alpha_t = \frac{1}{2}\ln(\frac{1-err_t}{err_t})$ 平等投票
并行化能力 不支持 支持多线程 / 分布式

代码实战

Adaboost 权重迭代实现

import numpy as np
from sklearn.tree import DecisionTreeClassifier

class AdaBoost:
    def __init__(self, n_estimators=50):
        self.n_estimators = n_estimators

    def fit(self, X, y):
        n_samples = X.shape[0]
        sample_weights = np.ones(n_samples) / n_samples  # 初始等权重
        self.alphas = []
        self.models = []

        for _ in range(self.n_estimators):
            # 训练弱分类器(决策树桩)tree = DecisionTreeClassifier(max_depth=1)
            tree.fit(X, y, sample_weight=sample_weights)
            pred = tree.predict(X)

            # 计算加权错误率
            err = np.sum(sample_weights * (pred != y)) / np.sum(sample_weights)
            alpha = 0.5 * np.log((1 - err) / max(err, 1e-10))  # 避免除零

            # 更新样本权重
            sample_weights *= np.exp(-alpha * y * pred)
            sample_weights /= np.sum(sample_weights)  # 归一化

            self.models.append(tree)
            self.alphas.append(alpha)

随机森林 OOB 误差可视化

from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt

rf = RandomForestClassifier(n_estimators=100, oob_score=True)
rf.fit(X_train, y_train)

oob_error = 1 - rf.oob_score_
print(f"OOB Error: {oob_error:.4f}")

# 特征重要性可视化
plt.barh(range(X.shape[1]), rf.feature_importances_)
plt.yticks(range(X.shape[1]), feature_names)
plt.title("Random Forest Feature Importance")

生产建议

  1. Adaboost 类别不平衡处理 :初始化权重时建议对少数类样本赋予更高权重,避免早期迭代就被完全忽略
  2. 随机森林特征相关性 :当特征高度相关时,考虑使用 ExtraTrees(更激进的随机特征选择)
  3. 超参数调优顺序 :Adaboost 优先调整 learning_rate 和 n_estimators,随机森林优先关注 max_features 和 min_samples_leaf

性能考量

在 10 万条数据(100 维特征)上的测试结果:

from time import time

# Adaboost 计时
start = time()
ab = AdaBoost(n_estimators=100)
ab.fit(X_large, y_large)
print(f"Adaboost 耗时: {time() - start:.2f}s")

# 随机森林计时
start = time()
rf = RandomForestClassifier(n_estimators=100, n_jobs=-1)
rf.fit(X_large, y_large)
print(f"随机森林耗时: {time() - start:.2f}s")

典型结果:
– Adaboost:约 120 秒(串行执行)
– 随机森林:约 35 秒(启用并行)

互动思考

问题 :当特征维度(如 1000 维)远大于样本量(如 500 个)时,哪种算法更可能表现优异?为什么?

提示 :考虑随机森林的列采样机制对高维稀疏数据的适应性,以及 Adaboost 在特征选择上的局限性。

正文完
 0
评论(没有评论)