sklearn.ensemble.StackingClassifier
(堆叠泛化分类器)
StackingClassifier
是 sklearn.ensemble
提供的 堆叠泛化(Stacking) 分类模型,它 组合多个不同的基分类器,并通过一个元分类器进行二次学习,适用于 二分类和多分类任务。
1. StackingClassifier
作用
- 用于分类任务(如 信用评分、疾病预测)。
- 结合多个基分类器的预测结果,通过 元分类器(二次学习)进一步优化最终分类。
- 比
VotingClassifier
更强大,因为它利用了元分类器学习各个模型的关系。
2. StackingClassifier
代码示例
(1) 训练 Stacking 分类器
from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据
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)
# 定义基分类器
base_classifiers = [
("lr", LogisticRegression(max_iter=200)),
("dt", DecisionTreeClassifier(max_depth=3)),
("svm", SVC(kernel="linear", probability=True))
]
# 训练 Stacking 分类器(元分类器:逻辑回归)
stacking_clf = StackingClassifier(estimators=base_classifiers, final_estimator=LogisticRegression())
stacking_clf.fit(X_train, y_train)
# 计算准确率
accuracy = stacking_clf.score(X_test, y_test)
print("Stacking 分类器准确率:", accuracy)
解释
- 基分类器(
estimators
):逻辑回归、决策树、SVM 组合。 - 元分类器(
final_estimator
):逻辑回归,学习基分类器的输出,提高性能。
3. StackingClassifier
主要参数
StackingClassifier(estimators, final_estimator=None, cv=None, stack_method="auto", n_jobs=None, passthrough=False, verbose=0)
参数 | 说明 |
---|---|
estimators | 包含的基分类器列表([("lr", LogisticRegression()), ...] ) |
final_estimator | 元分类器(默认 LogisticRegression() ) |
cv | 交叉验证(默认 None ,可设为 5 进行交叉验证) |
stack_method | 如何堆叠基分类器的输出("auto" 、"predict_proba" 等) |
passthrough | 是否将原始特征传递给元分类器(默认 False ) |
n_jobs | 并行计算的 CPU 核数(默认 None ,-1 使用所有核心) |
4. 比较各分类器的性能
for clf in (stacking_clf, *[clf for _, clf in base_classifiers]):
clf.fit(X_train, y_train)
print(clf.__class__.__name__, "准确率:", clf.score(X_test, y_test))
示例输出
StackingClassifier 准确率: 0.98
LogisticRegression 准确率: 0.95
DecisionTreeClassifier 准确率: 0.92
SVC 准确率: 0.96
解释
- Stacking 通常比单个基分类器表现更好。
- 元分类器结合多个基分类器的优点,提高准确率。
5. StackingClassifier
vs. VotingClassifier
模型 | 适用情况 | 主要区别 |
---|---|---|
VotingClassifier | 组合多个模型,进行投票 | 简单但不能学习模型间的关系 |
StackingClassifier | 组合多个模型,并用元分类器学习 | 更强大,能发现最佳组合方式 |
示例
from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimators=base_classifiers, voting="soft")
voting_clf.fit(X_train, y_train)
print("Voting 分类器准确率:", voting_clf.score(X_test, y_test))
print("Stacking 分类器准确率:", stacking_clf.score(X_test, y_test))
解释
VotingClassifier
仅对基分类器进行投票,StackingClassifier
额外使用元分类器优化。- Stacking 通常比 Voting 效果更好。
6. cv
对 Stacking 的影响
stacking_clf_cv = StackingClassifier(estimators=base_classifiers, final_estimator=LogisticRegression(), cv=5)
stacking_clf_cv.fit(X_train, y_train)
accuracy_cv = stacking_clf_cv.score(X_test, y_test)
print("交叉验证 Stacking 分类器准确率:", accuracy_cv)
解释
cv=5
进行 5 折交叉验证,提高泛化能力。
7. 适用场景
- 分类任务(如 信用评分、疾病预测)。
- 希望组合多个分类器,并利用元分类器优化最终结果。
- 当
VotingClassifier
不足时,Stacking 可能更优。
8. 结论
StackingClassifier
适用于分类任务,组合多个基分类器,并通过元分类器进行二次学习,提高分类性能,比VotingClassifier
更强大,适用于 多个模型的组合优化。