共计 2698 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点
鸢尾花数据集是机器学习领域的经典分类问题,包含三种鸢尾花(Setosa、Versicolor、Virginica)的四个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)。虽然数据量不大,但非常适合演示不同算法的特性。

在实际应用中,我们常常面临以下挑战:
– 单一分类器容易过拟合或欠拟合
– 不同特征对分类的贡献度差异较大
– 需要平衡模型的准确性和泛化能力
集成学习方法通过组合多个弱学习器,能够有效提升模型性能,这正是我们选择随机森林、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")
避坑指南
- 随机森林参数调优:
n_estimators不是越大越好,通常 100-500 足够max_depth控制树深度防止过拟合-
min_samples_split和min_samples_leaf可以进一步防止过拟合 -
AdaBoost 调优技巧:
- 学习率 (
learning_rate) 通常设为 0.1-1 - 基分类器 (
base_estimator) 越简单越好 -
迭代次数 (
n_estimators) 需要和学习率平衡 -
Stacking 注意事项:
- 基分类器多样性很重要
- 元学习器不要太复杂
- 交叉验证 (
cv) 通常设为 5 或 10
总结与思考
通过本次实验,我们可以得出以下结论:
- 模型选择:
- 对于简单数据集,随机森林通常足够
- 需要更高精度时考虑 AdaBoost
-
Stacking 计算成本高但可能获得最佳性能
-
参数调优:
- 不要盲目增加树的数量或迭代次数
- 学习率对 AdaBoost 影响显著
-
Stacking 的基分类器选择很关键
-
实际应用建议:
- 优先尝试随机森林
- 数据量大时考虑 AdaBoost
- 计算资源充足再尝试 Stacking
希望这篇实战指南能帮助你在实际项目中更好地应用这些集成学习方法。不同的场景需要不同的解决方案,理解每种方法的特性才能做出最佳选择。
正文完
发表至: 未分类
近三天内
