【译】MLXTEND之StackingCVRegressor

 

最近忙着在学校办理最后的毕业手续和学历认证相关事宜,忘记了之前翻译sklearn的机器学习拓展框架MLXTEND的计划,而同届的同学们已经有人参与过目前主流机器学习-深度学习框架tensorflow以及keras中文文档的相关翻译,对比之下瞬间觉得自己很low。
目前tensorflow和keras中文文档日渐完善,中文书也有很多,为大家提供了许多便利,但是MLXTEND仍然没有太多中文资料,毕竟不是当下流行的框架……(但是相关功能真的很好用)。
之前翻译了stacking Regressor:
https://www.jianshu.com/p/cc748e4f29c5
这篇是上一篇的交叉验证版本,StackingCVRegressor。
计划在6月之前翻译StackingClassifier & StackingCVClassifier#RBF KernelPCA

regressor.StackingCVRegressor

mlxtend.regressor 中的StackingCVRegressor是一种集成学习元回归器。
导入包:
from mlxtend.regressor 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 mlxtend.regressor import StackingCVRegressor
from sklearn.datasets import load_boston
from sklearn.svm import SVR
from sklearn.linear_model import Lasso
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_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]" % (scores.mean(), 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 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, 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 mlxtend.regressor import StackingCVRegressor
from sklearn.datasets import load_boston
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_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方法将适合把存储在类属性self.regr_中的这些原始回归器的克隆。
• 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

•X:numpy array,shape = [n_samples,n_features]
训练矢量,其中n_samples是样本的数量,n_features是特征的数量。
•y:numpy array,shape = [n_samples]目标值。
•groups:numpy array/None,shape = [n_samples]
每个样本属于的组。 这由具体的折叠策略使用,例如GroupKFold()

Returns

• self : object
*fit_transform(X, y=None, *fit_params)
拟合并转换数据.
Fits transformer to X and y with optional parameters fit_params and returns a transformed version of X.

Parameters

• X : numpy array of shape [n_samples, n_features]
训练集
• y : numpy array of shape [n_samples]
目标值

Returns

• X_new : numpy array of shape [n_samples, n_features_new]
被转换的numpy数组.
get_params(deep=True)
获取该估计器的参数。

Parameters

• deep : boolean类型, optional
如果True,将返回该估计器的参数,并包含有估计量的子对象。

Returns

• params : 将字符串映射到映射到其值的任何参数名称。
predict(X)
None
返回预测的决定系数R2。
系数R2被定义为(1 - u/v),其中u是回归平方和 ((y_true - y_pred) **2).sum() ,并且v是残差平方和((y_true - y_true.mean()) ** 2).sum()。
最好的分数是1.0,可能是负值(因为模型可能会更差)。 一个始终预测y的预期值的常数模型,不考虑输入特征,会得到0.0的R2分数。

Parameters

• X : array-like, shape = (n_samples, n_features)
测试样本
• y : array-like, shape = (n_samples) or (n_samples, n_outputs)
X的真实值.
• sample_weight : array-like, shape = [n_samples], optional
样本权重

Returns

• score : float类型 R2 of self.predict(X) wrt. y.
*set_params(**params)*
设置此估算器的参数。
该方法适用于简单的估计器以及嵌套对象(如管道)。 后者具有<component> __ <parameter>形式的参数,以便可以更新嵌套对象的每个组件。

Returns

self

References

• Breiman, Leo. “Stacked regressions.” Machine learning 24.1 (1996): 49-64.
• Analogous implementation: StackingCVClassifier
• MLXTEND文档:mlxtend-latest.pdf

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐