机器学习基础—集成学习Task8(Bagging)

导语:
本次任务的主题是“Bagging的原理与实践”。
学习链接:
集成学习: EnsembleLearning项目-github.

1.Bagging原理简介

在上一节中,我们介绍了投票法,voting主要是从多模型预测的结果层面进行处理。若每个单模型过于同质化,则voting的效果不会有太大的改善。而事实上,在实际应用中,会遇到很多同质的的单模型,在这种情况下有什么好的办法可以进一步提升模型的效果呢?
自然而然想到,每个单模型从训练集中抽取不同的样本进行训练,这样即使模型一样,但却因为训练样本之间的差异会使得每个基模型之间存在略微的差异,使每个基模型拥有略微不同的训练能力。
而完成这一任务的核心在于自助采样(bootstrap),即有放回的从数据集中进行采样,也就是说,同样的一个样本可能被多次进行采样,是一种在统计中通过样本估计总体的方法。可访问Bootstrap采样用 Bootstrap 进行参数估计大有可为进行更详尽的学习。
Bagging同样是一种降低方差的技术,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效果更加明显。在实际的使用中,加入列采样的Bagging技术对高维小样本往往有神奇的效果。

2.Bagging实践

Sklearn为我们提供了 BaggingRegressor (均值)与 BaggingClassifier(众数) 两种Bagging方法的API,这两种模型的默认基模型都是树模型。基模型的选择可以通过base_estimator参数进行修改,下面以Boston房价数据集进行实践,并对结果对比讨论:

#数据导入
from sklearn import datasets
import pandas as pd
from sklearn.model_selection import train_test_split

boston = datasets.load_boston()     # 返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
#boston_data.head()

导入接下来会用到的包:

#导包
#导包
from sklearn import linear_model 
from sklearn.tree import DecisionTreeRegressor  
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler     # 标准化数据
from sklearn.pipeline import make_pipeline   # 使用管道,把预处理和模型形成一个流程
from sklearn.ensemble import RandomForestRegressor
import xgboost as xgb
import lightgbm as lgb 

from numpy import mean
from numpy import std
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import VotingRegressor

import matplotlib.pyplot as plt

我们分别使用线性回归、决策树和SVM作为基模型,定义投票集成模型:
注意这里的VotingRegressor()参数不需要选择voting参数,上面说了只有分类投票才有“软硬”之分哦!

# get a voting ensemble of models
def get_voting():
    # define the base models
    models = list()
    models.append(('lin_reg', linear_model.LinearRegression()))
    models.append(('DTR', DecisionTreeRegressor(criterion = "mse",min_samples_leaf = 5)))
    models.append(('reg_svr ', make_pipeline(StandardScaler(), SVR(C=1.0, epsilon=0.2))))
    # define the voting ensemble
    ensemble = VotingRegressor(estimators=models)
    return ensemble

接下来,加入Bagging与随机森林,用get_models函数将我们所要比较的模型进行封装:

# get a list of models to evaluate
def get_models():
    models = dict()
    models['lin_reg'] = linear_model.LinearRegression()
    models['DTR'] = DecisionTreeRegressor(criterion = "mse",min_samples_leaf = 5)
    models['reg_svr'] = make_pipeline(StandardScaler(), SVR(C=1.0, epsilon=0.2))
    models['voting'] = get_voting()
    models['Bagging'] = BaggingRegressor()
    models['RFR'] = RandomForestRegressor()
    return models

采用十折交叉验证的方式对模型进行评估,评估函数选择均方误差MSE:

def evaluate_model(model, X, y):
    scores = cross_val_score(model, X, y, scoring='neg_mean_squared_error', cv=10, n_jobs=-1, error_score='raise')
    return scores

训练模型,保存分数,并展示可视化最终结果:

# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():
    scores = evaluate_model(model, X, y)
    results.append(scores)
    names.append(name)
    print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
plt.boxplot(results, labels=names, showmeans=True)
plt.show()

在这里插入图片描述
从Bagging的效果比使用了三种基模型的voting好,随机森林的效果最好。
接下来,我们改变Bagging的基模型,分些用线性回归、SVR、DTR,看看效果:

# get a list of models to evaluate
def get_models():
    models = dict()
    models['Bagging_linear'] = BaggingRegressor(base_estimator=linear_model.LinearRegression())
    models['Bagging_SVR'] = BaggingRegressor(base_estimator=make_pipeline(StandardScaler(), SVR(C=1.0, epsilon=0.2)))
    models['Bagging_DTR'] = BaggingRegressor()
    return models

# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():
    scores = evaluate_model(model, X, y)
    results.append(scores)
    names.append(name)
    print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
plt.boxplot(results, labels=names, showmeans=True)
plt.show()

在这里插入图片描述
从上图中可以看出,采用决策树基模型的Bagging效果最好!而采用线性回归、SVR基模型的Bagging在本案例中相较于单模型在结果上没有太大改变。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值