共计 1940 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
集成学习通过组合多个基础模型来提高预测性能,是机器学习中非常实用的技术。它特别适用于:

- 数据集存在噪声或异常值
- 单个模型容易过拟合
- 需要提高模型泛化能力
鸢尾花数据集是经典的分类问题,包含 3 种鸢尾花的特征数据,非常适合用来演示集成学习方法。
技术选型对比
随机森林
- 基于 bagging 的集成方法
- 通过构建多棵决策树降低方差
- 天然支持并行训练
- 对异常值不敏感
AdaBoost
- 基于 boosting 的集成方法
- 通过迭代调整样本权重
- 更关注难分类样本
- 容易受到噪声数据影响
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, # 100 棵树
bootstrap=True, # 放回抽样
random_state=42
)
# 训练模型
rf.fit(X_train, y_train)
3. AdaBoost 实现
from sklearn.ensemble import AdaBoostClassifier
# 初始化 AdaBoost
ada = AdaBoostClassifier(
n_estimators=100, # 100 次迭代
learning_rate=0.1, # 学习率
random_state=42
)
# 训练模型
ada.fit(X_train, y_train)
4. Stacking 实现
from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
# 定义基分类器
base_models = [('dt', DecisionTreeClassifier(random_state=42)),
('knn', KNeighborsClassifier())
]
# 初始化 Stacking
stack = StackingClassifier(
estimators=base_models,
final_estimator=LogisticRegression(), # 元学习器
cv=5
)
# 训练模型
stack.fit(X_train, y_train)
性能评估
from sklearn.metrics import classification_report
# 定义评估函数
def evaluate_model(model, X_test, y_test):
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
# 评估随机森林
print("随机森林性能:")
evaluate_model(rf, X_test, y_test)
# 评估 AdaBoost
print("\nAdaBoost 性能:")
evaluate_model(ada, X_test, y_test)
# 评估 Stacking
print("\nStacking 性能:")
evaluate_model(stack, X_test, y_test)
避坑指南
- 数据不平衡问题
-
解决方案:使用 class_weight 参数或重采样技术
-
过拟合问题
- 随机森林:调整 max_depth
- AdaBoost:降低学习率
-
Stacking:减少基分类器数量
-
计算资源不足
- 减小 n_estimators
- 使用更简单的基分类器
总结与扩展
通过本实验可以看出,Stacking 在鸢尾花数据集上表现最好,但计算成本也最高。随机森林在保持较好性能的同时训练速度更快。
可以进一步尝试:
- 在其他数据集上测试这些方法
- 调整模型超参数
- 尝试不同的基分类器组合
- 使用更复杂的元学习器
集成学习是提升模型性能的有力工具,掌握这些基础方法后,可以继续探索更高级的集成技术。
正文完
发表至: 未分类
近一天内
