共计 2313 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
集成学习通过组合多个弱学习器来构建一个强学习器,能够显著提升模型的泛化能力和鲁棒性。在实际的分类任务中,单一模型往往难以兼顾准确性和稳定性,而集成方法通过不同策略整合多个模型的优势,成为解决这一痛点的有效手段。鸢尾花数据集作为经典的分类数据集,非常适合用来演示不同集成方法的特性。

技术选型对比
- 随机森林
- 优点:并行训练效率高、抗过拟合能力强、能处理高维特征
- 缺点:解释性较差、对噪声敏感
-
适用场景:特征维度高、需要快速 baseline 的场景
-
AdaBoost
- 优点:对异常值敏感度低、可逐步优化模型
- 缺点:对噪声数据敏感、训练时间较长
-
适用场景:分类边界清晰、数据质量较好的情况
-
Stacking
- 优点:模型组合灵活、通常能获得最佳性能
- 缺点:实现复杂、计算成本高
- 适用场景:追求最高准确率且计算资源充足的场景
核心实现细节
随机森林配置
- 设置 n_estimators=100 保证足够多的决策树参与投票
- bootstrap=True 启用放回抽样(Bagging)
- 采用默认的 Gini 不纯度作为分裂标准
AdaBoost 调参
- n_estimators=100 控制迭代次数
- learning_rate=0.1 防止过拟合的保守学习率
- 使用决策树桩(max_depth=1)作为基分类器
Stacking 架构
- 第一层基分类器:决策树(max_depth=3)和 KNN(n_neighbors=5)
- 元学习器:逻辑回归(C=1.0)
- 采用 5 折交叉验证生成元特征
代码实现
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn.ensemble import StackingClassifier
# 数据加载与分割
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)
# 随机森林
rf = RandomForestClassifier(n_estimators=100, bootstrap=True)
rf.fit(X_train, y_train)
# AdaBoost
ada = AdaBoostClassifier(n_estimators=100, learning_rate=0.1)
ada.fit(X_train, y_train)
# Stacking
base_models = [('dt', DecisionTreeClassifier(max_depth=3)),
('knn', KNeighborsClassifier(n_neighbors=5))
]
stack = StackingClassifier(
estimators=base_models,
final_estimator=LogisticRegression())
stack.fit(X_train, y_train)
# 评估函数
def evaluate(model, name):
y_pred = model.predict(X_test)
print(f"{name} 评估结果:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# 执行评估
evaluate(rf, "随机森林")
evaluate(ada, "AdaBoost")
evaluate(stack, "Stacking")
性能评估
通过对比测试集上的评估指标,我们发现:
- 准确率对比
- Stacking > 随机森林 > AdaBoost
-
Stacking 的准确率达到 96.7%
-
类别细分表现
- 随机森林在 setosa 类别上表现完美(precision=1.0)
- AdaBoost 在 virginica 类别上召回率最高
-
Stacking 在各个类别上表现均衡
-
计算效率
- 随机森林训练速度最快(0.08s)
- Stacking 由于需要训练多层模型,耗时最长(0.15s)
避坑指南
- 数据标准化问题
- KNN 对特征尺度敏感,实际应用中应先做标准化
-
示例代码为简化流程未包含此步骤
-
类别不平衡处理
- 当各类别样本量差异大时,建议设置 class_weight=’balanced’
-
鸢尾花数据集本身是平衡的故未使用
-
Stacking 过拟合
- 发现验证集表现远差于训练集时:
- 减少基分类器数量
- 使用更简单的元学习器
- 增加交叉验证折数
总结与拓展
通过本次实验,我们可以得出以下实践建议:
- 当需要快速获得不错的结果时,优先选择随机森林
- 当数据质量较好且愿意花时间调参时,AdaBoost 是不错的选择
- 当追求最高准确率且资源允许时,应该尝试 Stacking
这些方法可以轻松迁移到其他分类任务,例如:
– 使用相同的流程处理葡萄酒分类数据集
– 将基分类器替换为 SVM 处理文本分类
– 增加 XGBoost 作为新的基学习器
最终选择哪种方法,需要根据具体场景在准确率和计算成本之间做出权衡。
正文完
发表至: 未分类
近两天内
