模型融合

不羁岁月 提交于 2020-01-19 23:22:41

常见的模型融合方法有:Bagging、Boosting、Stacking、Blending。还有权重加权取平均。
(3-1):Bagging
Bagging 将多个模型,也就是多个基学习器的预测结果进行简单的加权平均或者投票。它的好处是可以并行地训练基学习器。Random Forest就用到了Bagging的思想。
(3-2): Boosting
Boosting 的思想有点像知错能改,每个基学习器是在上一个基学习器学习的基础上,对上一个基学习器的错误进行弥补。我们将会用到的 AdaBoost,Gradient Boost 就用到了这种思想。
(3-3): Stacking
Stacking是用新的次学习器去学习如何组合上一层的基学习器。如果把 Bagging 看作是多个基分类器的线性组合,那么Stacking就是多个基分类器的非线性组合。Stacking可以将学习器一层一层地堆砌起来,形成一个网状的结构。
相比来说Stacking的融合框架相对前面的二者来说在精度上确实有一定的提升,所以在下面的模型融合上,我们也使用Stacking方法。
(3-4): Blending
Blending 和 Stacking 很相似,但同时它可以防止信息泄露的问题。
下面我们可以从heamy中实现Stacking、Blending和权重加权取平均。
Stacking的实现

from heamy.dataset import Dataset
from heamy.estimator import Regressor, Classifier
from heamy.pipeline import ModelsPipeline
from sklearn.model_selection import train_test_split
import xgboost as xgb
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
#加载数据集
from sklearn.datasets import load_boston
X = train
y = X.pop('tradeMoney')
X_train_full,X_valid_full,y_train,y_valid = train_test_split(X,y,train_size=0.8,test_size=0.2,
                                                            random_state=0)
other_params = {'learning_rate':0.3, 'n_estimators':850,
                             'max_depth':5, 'min_child_weight':3,
                             'subsample':1, 'colsample_bytree':1, 'gamma':0, 'reg_lambda':1}
#创建数据集
dataset = Dataset(X_train_full,y_train,X_valid_full)
#创建RF模型和LR模型
model_rf = Regressor(dataset=dataset, estimator=xgb.XGBRegressor, parameters=other_params,name='rf')
model_lr = Regressor(dataset=dataset, estimator=LinearRegression, parameters={'normalize': True},name='lr')
# Stack两个模型
pipeline = ModelsPipeline(model_rf,model_lr)
stack_ds = pipeline.stack(k=10,seed=111)
#第二层使用lr模型stack
stacker = Regressor(dataset=stack_ds, estimator=LinearRegression)
results = stacker.predict()
# 使用10折交叉验证结果
results10 = stacker.validate(k=10,scorer=mean_absolute_error)

运行结果:Metric: mean_absolute_error
Folds accuracy: [564.3024530706721, 524.7100334869034, 541.7510909266891, 533.4361804926202, 535.146239721191, 535.866733930904, 562.202293264778, 547.7973573951012, 523.6530203290064, 517.8923927981704]
Mean accuracy: 538.6757795416036
Standard Deviation: 14.843720137879744
Variance: 220.3360275316966

下面是blending的实现

#创建数据集
dataset = Dataset(X_train_full,y_train,X_valid_full)
#创建RF模型和LR模型
model_rf = Regressor(dataset=dataset, estimator=xgb.XGBRegressor, parameters=other_params,name='rf')
model_lr = Regressor(dataset=dataset, estimator=LinearRegression, parameters={'normalize': True},name='lr')
# Blending两个模型
# Returns new dataset with out-of-fold predictions
pipeline = ModelsPipeline(model_rf,model_lr)
stack_ds = pipeline.blend(proportion=0.2,seed=111)
#第二层使用lr模型stack
stacker = Regressor(dataset=stack_ds, estimator=LinearRegression)
results = stacker.predict()
# 使用10折交叉验证结果
results10 = stacker.validate(k=10,scorer=mean_absolute_error)

运行结果:
Metric: mean_absolute_error
Folds accuracy: [530.8248382276691, 510.5451295466427, 551.0798328405328, 539.3712046150375, 515.0342353036311, 579.4145777196466, 567.4765306813867, 571.0937586381513, 548.6958574284319, 567.6464365185399]
Mean accuracy: 548.118240151967
Standard Deviation: 22.703295204765528
Variance: 515.4396131547294

可以看到Stacking的方差比blending的大。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!