MLXTEND之StackingCVRegressor
【译】MLXTEND之StackingCVRegressor
regressor.StackingCVRegressor
导⼊包:
ssor import StackingCVRegressor
1 Overview
Stacking是⼀种通过元回归器组合多个回归模型的集成学习技术。
StackingCVRegressor扩展了使⽤Stacking预测的标准Stacking算法(实现为StackingRegressor),预
测的结果作为2级分类器的输⼊数据。
在标准 stacking程序中,拟合⼀级回归器的时候,我们如果使⽤第⼆级回归器的输⼊的相同训练集,这很可能会导致过度拟合。 然
⽽,StackingCVRegressor使⽤了‘⾮折叠预测’的概念:数据集被分成k个折叠,并且在k个连续的循环中,使⽤k-1折叠来拟合第⼀级回归器(即k折交叉验证的stackingRegressor)。
在每⼀轮中(⼀共K轮),⼀级回归器然后被应⽤于在每次迭代中还未⽤过的模型拟合的剩余1个⼦集。
然后将得到的预测叠加起来并作为输⼊数据提供给⼆级回归器。在StackingCVRegressor的训练完之后,⼀级回归器拟合整个数据集以获得最佳预测。
2 例⼦
例1:波⼠顿房屋数据预测
在这个例⼦中,我们评估波⼠顿房屋数据集的⼀些基本模型,并通过将模型与StackingCVRegressor相结合来了解R2和MSE score是如何受到模型融合影响的。 下⾯的代码的输出表明stacking模型在这个数据集上的最优结果要略好于最佳单⼀模型在次数据集上的最优结果。
from sklearn.svm import SVR
from sklearn.linear_model import Lasso
semble import RandomForestRegressor
del_selection import cross_val_score
import numpy as np
RANDOM_SEED = 42
X, y = load_boston(return_X_y=True)
svr = SVR(kernel='linear')
lasso = Lasso()
rf = RandomForestRegressor(n_estimators=5,
random_state=RANDOM_SEED)
# The StackingCVRegressor uses scikit-learn's check_cv
# internally, which doesn't support a random seed. Thus
# NumPy's random seed need to be specified explicitely for
# deterministic behavior
np.random.seed(RANDOM_SEED)
stack = StackingCVRegressor(regressors=(svr, lasso, rf),
meta_regressor=lasso)
print('5-fold cross validation scores:\n')
for clf, label in zip([svr, lasso, rf, stack], ['SVM', 'Lasso','Random Forest','StackingClassifier']):
scores = cross_val_score(clf, X, y, cv=5)
print("R^2 Score: %0.2f (+/- %0.2f) [%s]" % (an(), scores.std(), label))
5-fold cross validation scores:
R^2 Score: 0.45 (+/- 0.29) [SVM]
R^2 Score: 0.43 (+/- 0.14) [Lasso]
R^2 Score: 0.52 (+/- 0.28) [Random Forest]
R^2 Score: 0.58 (+/- 0.24) [StackingClassifier]
# The StackingCVRegressor uses scikit-learn's check_cv
# internally, which doesn't support a random seed. Thus
# NumPy's random seed need to be specified explicitely for
# deterministic behaviorrandom翻译
np.random.seed(RANDOM_SEED)
stack = StackingCVRegressor(regressors=(svr, lasso, rf),
meta_regressor=lasso)
print('5-fold cross validation scores:\n')
for clf, label in zip([svr, lasso, rf, stack], ['SVM', 'Lasso','Random Forest','StackingClassifier']):
scores = cross_val_score(clf, X, y, cv=5, scoring='neg_mean_squared_error')
print("Neg. MSE Score: %0.2f (+/- %0.2f) [%s]"
结果:
5-fold cross validation scores:
Neg. MSE Score: -33.69 (+/- 22.36) [SVM]
Neg. MSE Score: -35.53 (+/- 16.99) [Lasso]
Neg. MSE Score: -27.32 (+/- 16.62) [Random Forest]
Neg. MSE Score: -25.64 (+/- 18.11) [StackingClassifier]
例2:GridSearchCV with Stacking(stacking 的⽹格搜索调参)
在第⼆个例⼦中,我们演⽰了StackingCVRegressor如何与GridSearchCV结合使⽤。
使⽤此⽅法stacking仍允许调整基本和元模型的超参数。
为了为scikit-learn的GridSearch设置参数⽹格,我们只需在参数⽹格中提供估算器的名称 - 在元回归器的特殊情况下,我们追加'meta-'前缀。
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
semble import RandomForestRegressor
del_selection import GridSearchCV
X, y = load_boston(return_X_y=True)
ridge = Ridge()
lasso = Lasso()
rf = RandomForestRegressor(random_state=RANDOM_SEED)
# The StackingCVRegressor uses scikit-learn's check_cv
# internally, which doesn't support a random seed. Thus
# NumPy's random seed need to be specified explicitely for
# deterministic behavior
np.random.seed(RANDOM_SEED)
stack = StackingCVRegressor(regressors=(lasso, ridge),
meta_regressor=rf,
use_features_in_secondary=True)
params = {'lasso__alpha': [0.1, 1.0, 10.0],
'ridge__alpha': [0.1, 1.0, 10.0]}
grid = GridSearchCV(
estimator=stack,param_grid={'lasso__alpha': [x/5.0 for x in range(1, 10)],
'ridge__alpha': [x/20.0 for x in range(1, 10)],
'meta-randomforestregressor__n_estimators': [10,100]},
cv=5,
refit=True
)
grid.fit(X, y)
print("Best: %f using %s" % (grid.best_score_, grid.best_params_))
#Best: 0.673590 using {'lasso__alpha': 0.4, 'meta-randomforestregressor__n_estimators': 10, 'ridge__alpha
cv_keys = ('mean_test_score', 'std_test_score', 'params')
for r, _ in enumerate(grid.cv_results_['mean_test_score']):
print("%0.3f +/- %0.2f %r"
% (grid.cv_results_[cv_keys[0]][r],
grid.cv_results_[cv_keys[1]][r] / 2.0,
grid.cv_results_[cv_keys[2]][r]))
if r > 10:
break
print('...')
print('Best parameters: %s' % grid.best_params_)
print('Accuracy: %.2f' % grid.best_score_)
结果:
注意
StackingCVRegressor还⽀持通过回归参数进⾏⽹格搜索。 但是,由于
当前在scikit-learn中实现GridSearchCV,不可能同时搜索不同的分类器和分类器参数。 例如,当下⾯的参数字典⼯作于:
params = {'randomforestregressor__n_estimators':[1,100],
'regressors':[(regr1,regr1,regr1),(regr2,regr3)]}
它将使⽤regr1,regr2和regr3的实例设置,并且不会⽤'randomforestregressor__n_estimators'中的'n_estimators'设置覆盖它:[1,100]。
3 API
StackingCVRegressor(regressors,meta_regressor,cv = 5,shuffle = True,use_features_in_secondary = False)
⽤于scikit-learn估计器的'叠加交叉验证'回归器。
mlxtend v0.7.0中的新功能
notes:
StackingCVRegressor在内部使⽤scikit-learn的check_cv,它不⽀持随机种⼦。 因此,NumPy的随机种⼦需要明确指定⽤于确定性⾏为,例如在拟合StackingCVRegressor之前,设置np.random.seed(RANDOM_SEED)。
Parameters
· regressors回归器 : array-like数组或者类数组, shape = [n_regressors]
回归器列表。在StackingCVRegressor上调⽤fit⽅法将适合把存储在类属性_中的这些原始回归器的克隆。
· meta_regressor(元分类器 ): object
被集成回归器拟合的元分类器
·cv:int类型,交叉验证⽣成器或可迭代的,可选的(默认值:5)
确定交叉验证拆分策略。 cv可能的输⼊是:
None,使⽤默认的5折交叉验证,
整数,指定KFold中折叠的次数,
⽤作交叉验证⽣成器的对象。
⼀个迭代产⽣的训练集,测试集的分割集。 对于整数/⽆输⼊,它将使⽤KFold交叉验证。
·use_features_in_secondary:bool(默认值:False)
如果为True,元分类器将根据原始回归器和原始数据集的预测进⾏训练。 如果是假的,则元回归器将仅接受原始回归者的预测训练。·shuffle:bool(默认值:True)
如果为True,且cv参数为整数,则在交叉验证之前的训练数据将在拟合阶段打乱顺序。 如果cv参数是特定的交叉验证技术,则省略此参数。
4 Methods
fit(X, y, groups=None)
拟合集成回归器和元回归器。
Parameters
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论