【译】MLXTEND之StackingRegressor

regressor.StackingRegressor

集成学习中,bagging和boosting可以直接调用,而stacking则需要自己设计调配一下才行,尤其是交叉验证的环节比较麻烦。
之前毕设使用了blending(stacking)融合了多个推荐系统模型,性能提升很小,后来无意中发现了mlxtend这个工具包,里面集成了stacking分类回归模型以及它们的交叉验证的版本。这里转载过来翻译一下。
一般推荐系统中的模型融合会称为blending而不是stacking,这是netfilx price比赛中的论文形成的习惯,但实际上推荐系统中blending融合和stacking没有什么分别,现在一般认为blending的融合是弱化版的stacking,是切分样本集为不相交的子样本然后用各个算法生成结果再融合,并且不适用交叉验证,这种方法不能够最大限度的利用数据,而stacking是得到各个算法训练全样本的结果再用一个元算法融合这些结果,效果会比较好一些,它可以选择使用网格搜索和交叉验证。

mlxtend.regressor 中的StackingRegressor是一种集成学习元回归器。

1 Overview

stacking回归是一种通过元回归器组合多个回归模型的集成学习技术。每个独立的基回归模型在训练时都要使用整个训练集;那么,在集成学习过程中独立的基回归模型的输出作为元特征成为元回归器的输入,元回归器通过拟合这些元特征来组合多个模型。

stacking回归

2 Example 1 - Simple Stacked Regression

##数据集使用的是波士顿房价的数据集
from mlxtend.regressor import StackingRegressor
from mlxtend.data import boston_housing_data
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.svm import SVR
import matplotlib.pyplot as plt
import numpy as np

# 生成一个样本数据集
np.random.seed(1)
X = np.sort(5 * np.random.rand(40, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - np.random.rand(8))

# 初始化模型
lr = LinearRegression()
svr_lin = SVR(kernel='linear')
ridge = Ridge(random_state=1)
svr_rbf = SVR(kernel='rbf')
#融合四个模型
stregr = StackingRegressor(regressors=[svr_lin, lr, ridge], meta_regressor=svr_rbf)

# 训练stacking分类器
stregr.fit(X, y)
stregr.predict(X)

# 拟合结果的评估和可视化
print("Mean Squared Error: %.4f" % np.mean((stregr.predict(X) - y) ** 2))
print('Variance Score: %.4f' % stregr.score(X, y))
with plt.style.context(('seaborn-whitegrid')):
    plt.scatter(X, y, c='lightgray')
    plt.plot(X, stregr.predict(X), c='darkgreen', lw=2)

plt.show()
结果和模型参数
Mean Squared Error: 0.2039
Variance Score: 0.7049

stregr
StackingRegressor(meta_regressor=SVR(C=1.0, cache_size=200, coef0=0.0, 
degree=3, epsilon=0.1, gamma='auto',kernel='rbf', max_iter=-1, 
shrinking=True, tol=0.001, verbose=False),
regressors=[SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, 
gamma='auto',kernel='linear', max_iter=-1, shrinking=True, 
tol=0.001, verbose=False),
LinearRegression(copy_X=True, fit_normalize=False, random_state=1, 
solver='auto', tol=0.001)],verbose=0)

3 Example 2 - Stacked Regression and GridSearch

为了给sklearn-learn中的网格搜索设置参数网格,我们在参数网格中提供了学习器的名字,对于元回归器的情况,我们加了“meta-”前缀。

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import Lasso

# 初始化模型
lr = LinearRegression()
svr_lin = SVR(kernel='linear')
ridge = Ridge(random_state=1)
lasso = Lasso(random_state=1)
svr_rbf = SVR(kernel='rbf')
regressors = [svr_lin, lr, ridge, lasso]
stregr = StackingRegressor(regressors=regressors,meta_regressor=svr_rbf)

params = {'lasso__alpha': [0.1, 1.0, 10.0],
          'ridge__alpha': [0.1, 1.0, 10.0],
                'svr__C': [0.1, 1.0, 10.0],
           'meta-svr__C': [0.1, 1.0, 10.0, 100.0],
       'meta-svr__gamma': [0.1, 1.0, 10.0]}

grid = GridSearchCV(estimator=stregr,
                    param_grid=params,
                    cv=5,
                    refit=True)

grid.fit(X, y)
for params, mean_score, scores in grid.grid_scores_:
    print("%0.3f +/- %0.2f %r"
        % (mean_score, scores.std() / 2.0, params))

# 拟合结果的评估和可视化
print("Mean Squared Error: %.4f"
% np.mean((grid.predict(X) - y) ** 2))
print('Variance Score: %.4f' % grid.score(X, y))
with plt.style.context(('seaborn-whitegrid')):
    plt.scatter(X, y, c='lightgray')
    plt.plot(X, grid.predict(X), c='darkgreen', lw=2)
plt.show()
网格搜索过程
结果
Mean Squared Error: 0.1844
Variance Score: 0.7331

如果我们打算多次使用一个回归算法,我们需要做的就是在参数网格中添加一个额外的数字后缀,如下所示:

4 API

StackingRegressor(regressors, meta_regressor, verbose=0)
A Stacking regressor for scikit-learn estimators for regression.

Parameters

• regressors基回归器 : 类数组型(array-like), shape = [n_regressors]
基回归器列表. 调用StackingRegressor的拟合方法会拟合所有被存在类属性self.regr_中的原始基学习器的复制版。

• meta_regressor元回归器 : object
用来融合基回归器的元回归器

• verbose详细信息 : int, optional (default=0)
用来控制建立模型时输出的详细信息
Controls the verbosity of the building process.
– verbose=0 (默认):无输出
– verbose=1: 输出被融合的基回归器的数量和名字
– verbose=2: 输出被融合的基学习器的参数信息
– verbose>2: 比self.verbose - 2更详细的参数细节

Attributes属性

• regr_ : list, shape=[n_regressors]
融合的基回归器 (clones of the original regressors)

• meta_regr_ : estimator
用于融合的元回归器(clone of the original meta-estimator)

• coef_ : array-like, shape = [n_features]
元学习器的模型融合回归系数

• intercept_ : float
拟合的元学习器的截距

需要查看方程时,只需要查看coef_和intercept_这两个参数。

4.1 Methods方法

fit(X, y)
拟合出每个回归器学习在训练集中的权重系数。

Parameters

• X : {array-like, sparse matrix}, shape = [n_samples, n_features]
训练的特征向量矩阵,支持稀疏矩阵,n_samples代表样本数,n_features代表特征数

• y : array-like, shape = [n_samples]
目标值。

Returns

• self : object


*fit_transform(X, y=None, **fit_params)*
拟合数据,再转换为标准形式。
将拟合转换器用于X和y,它具有可选参数fit_params,并且返回X的转换后的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]
转换过的数组


get_params(deep=True)
返回网格搜索支持的估计器参数名

predict(X)
为X预测目标值。

Parameters

• X : {array-like, sparse matrix}, shape = [n_samples, n_features]
训练的特征向量矩阵,n_samples 代表样本数, n_features代表特征数

Returns

• y_target : array-like, shape = [n_samples]
预测出的目标值


score(X, y, sample_weight=None)
返回预测系数Rˆ2,R2 score是拟合优劣的评价指标,之前的博客拟合评价指标中有详细介绍

The coefficient Rˆ2 is defined as (1 - u/v), where u is the regression sum of squares ((y_true - y_pred) ** 2).sum() and v is the residual sum of squares ((y_true - y_true.mean()) ** 2).sum().
Best possible score is 1.0 and it can be negative (because the model can be arbitrarily worse). A constant model that always predicts the expected value of y, disregarding the input features, would get a Rˆ2 score of 0.0.

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
Rˆ2 of self.predict(X) wrt. y.


*set_params(**params)*
设置这个估计器的参数
该方法适用于简单的估计器以及嵌套对象(如pipelines)。 后者具有<component> __ <parameter>形式的参数,以便可以更新嵌套对象的每个组件。

Returns

self

4.2 Properties

coef_
None
intercept_
None

下一篇介绍交叉验证的StackingRegressor-StackingRegressorCV

References

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容