堆叠算法 - Stacking
Stacking 就是堆叠模型,在 N 个类别的建模中,可能先建立 K<N 个类别的模型,然后根据前一模型输出叠加多层解决其他类别,类似分层解决 “易分 -> 难分” 的问题
什么是堆叠算法 (Stacking)?
- Stacking 将前一轮学习之后的输出 / 标签组织变换后作为下一轮学习的输入 / 特征,然后再次训练
- 叠加概括是一种结合估计器以减少其偏差的方法 [W1992] [HTF]。更确切地说,每个单独的估计器的预测被堆叠在一起,并作为最终估计器的输入来计算预测值。这个最终估计器是通过交叉验证训练出来的
在 sklearn 中,堆叠泛化如何应用于分类任务?
- 叠加归纳包括叠加单个估计器的输出,并使用分类器来计算最终预测。叠加允许利用每个单独的估计器的力量,将其输出作为最终估计器的输入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22>>> from sklearn.datasets import load_iris
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.svm import LinearSVC
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.preprocessing import StandardScaler
>>> from sklearn.pipeline import make_pipeline
>>> from sklearn.ensemble import StackingClassifier
>>> X, y = load_iris(return_X_y=True)
>>> estimators = [
... ('rf', RandomForestClassifier(n_estimators=10, random_state=42)),
... ('svr', make_pipeline(StandardScaler(),
... LinearSVC(random_state=42)))
... ]
>>> clf = StackingClassifier(
... estimators=estimators, final_estimator=LogisticRegression()
... )
>>> from sklearn.model_selection import train_test_split
>>> X_train, X_test, y_train, y_test = train_test_split(
... X, y, stratify=y, random_state=42
... )
>>> clf.fit(X_train, y_train).score(X_test, y_test)
0.9...
在 sklearn 中,堆叠泛化如何应用于回归任务?
- 叠加概括包括叠加单个估计器的输出,并使用一个回归器来计算最终的预测结果。叠加允许利用每个估计器的力量,将其输出作为最终估计器的输入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21>>> from sklearn.datasets import load_diabetes
>>> from sklearn.linear_model import RidgeCV
>>> from sklearn.svm import LinearSVR
>>> from sklearn.ensemble import RandomForestRegressor
>>> from sklearn.ensemble import StackingRegressor
>>> X, y = load_diabetes(return_X_y=True)
>>> estimators = [
... ('lr', RidgeCV()),
... ('svr', LinearSVR(random_state=42))
... ]
>>> reg = StackingRegressor(
... estimators=estimators,
... final_estimator=RandomForestRegressor(n_estimators=10,
... random_state=42)
... )
>>> from sklearn.model_selection import train_test_split
>>> X_train, X_test, y_train, y_test = train_test_split(
... X, y, random_state=42
... )
>>> reg.fit(X_train, y_train).score(X_test, y_test)
0.3...