鸢尾花分类实战:随机森林、AdaBoost与Stacking模型性能对比与优化

1次阅读
没有评论

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

image.webp

背景与痛点

鸢尾花数据集是机器学习领域的经典分类问题,包含三种鸢尾花(Setosa、Versicolor、Virginica)的四个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)。虽然数据量不大,但非常适合演示不同算法的特性。

鸢尾花分类实战:随机森林、AdaBoost 与 Stacking 模型性能对比与优化

在实际应用中,我们常常面临以下挑战:
– 单一分类器容易过拟合或欠拟合
– 不同特征对分类的贡献度差异较大
– 需要平衡模型的准确性和泛化能力

集成学习方法通过组合多个弱学习器,能够有效提升模型性能,这正是我们选择随机森林、AdaBoost 和 Stacking 的原因。

技术选型对比

随机森林

  • 优点:
  • 天然抗过拟合
  • 能处理高维数据
  • 提供特征重要性评估
  • 缺点:
  • 训练时间随树的数量增加
  • 解释性较差

AdaBoost

  • 优点:
  • 对异常值敏感
  • 能处理各种数据类型
  • 通常比随机森林更精确
  • 缺点:
  • 容易过拟合
  • 对噪声数据敏感

Stacking

  • 优点:
  • 可以组合不同类型的基分类器
  • 通常能获得最佳性能
  • 缺点:
  • 实现复杂
  • 计算成本高

实现细节

1. 数据准备

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

2. 随机森林实现

from sklearn.ensemble import RandomForestClassifier

# 创建随机森林模型
rf = RandomForestClassifier(n_estimators=100, bootstrap=True, random_state=42)

# 训练模型
rf.fit(X_train, y_train)

# 预测
rf_pred = rf.predict(X_test)

3. AdaBoost 实现

from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

# 创建 AdaBoost 模型
base_estimator = DecisionTreeClassifier(max_depth=1)
ab = AdaBoostClassifier(base_estimator=base_estimator, 
                       n_estimators=100, 
                       learning_rate=0.1,
                       random_state=42)

# 训练模型
ab.fit(X_train, y_train)

# 预测
ab_pred = ab.predict(X_test)

4. Stacking 实现

from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier

# 定义基分类器
base_learners = [('dt', DecisionTreeClassifier(random_state=42)),
    ('knn', KNeighborsClassifier())
]

# 创建 Stacking 模型
stacking = StackingClassifier(estimators=base_learners,
                             final_estimator=LogisticRegression(),
                             cv=5)

# 训练模型
stacking.fit(X_train, y_train)

# 预测
stacking_pred = stacking.predict(X_test)

性能评估

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

def evaluate_model(y_true, y_pred, model_name):
    acc = accuracy_score(y_true, y_pred)
    pre = precision_score(y_true, y_pred, average='weighted')
    rec = recall_score(y_true, y_pred, average='weighted')
    f1 = f1_score(y_true, y_pred, average='weighted')

    print(f"{model_name}性能评估:")
    print(f"准确率(Acc): {acc:.4f}")
    print(f"精准率(Pre): {pre:.4f}")
    print(f"召回率(Rec): {rec:.4f}")
    print(f"F1 分数(F1): {f1:.4f}")
    print("-" * 50)

# 评估各模型
evaluate_model(y_test, rf_pred, "随机森林")
evaluate_model(y_test, ab_pred, "AdaBoost")
evaluate_model(y_test, stacking_pred, "Stacking")

避坑指南

  1. 随机森林参数调优:
  2. n_estimators不是越大越好,通常 100-500 足够
  3. max_depth控制树深度防止过拟合
  4. min_samples_split和 min_samples_leaf 可以进一步防止过拟合

  5. AdaBoost 调优技巧:

  6. 学习率 (learning_rate) 通常设为 0.1-1
  7. 基分类器 (base_estimator) 越简单越好
  8. 迭代次数 (n_estimators) 需要和学习率平衡

  9. Stacking 注意事项:

  10. 基分类器多样性很重要
  11. 元学习器不要太复杂
  12. 交叉验证 (cv) 通常设为 5 或 10

总结与思考

通过本次实验,我们可以得出以下结论:

  1. 模型选择:
  2. 对于简单数据集,随机森林通常足够
  3. 需要更高精度时考虑 AdaBoost
  4. Stacking 计算成本高但可能获得最佳性能

  5. 参数调优:

  6. 不要盲目增加树的数量或迭代次数
  7. 学习率对 AdaBoost 影响显著
  8. Stacking 的基分类器选择很关键

  9. 实际应用建议:

  10. 优先尝试随机森林
  11. 数据量大时考虑 AdaBoost
  12. 计算资源充足再尝试 Stacking

希望这篇实战指南能帮助你在实际项目中更好地应用这些集成学习方法。不同的场景需要不同的解决方案,理解每种方法的特性才能做出最佳选择。

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