您的位置:首页 > 其它

集成学习-模型融合学习笔记

2016-12-10 11:33 465 查看

集成学习概念(ensemble learning)

个人理解是按照不同的思路来组合基础模型,在保证准确度的同时也提升了模型防止过拟合的能力。针对弱学习器(泛化能力弱)效果明显,个体学习器满足:1好而不同,具有多样性2不能太坏

三种常见的集成学习框架:bagging,boosting和stacking

Boosting(串行-减少偏差)

典型代表算法AdaBoost(标准adaboost只社和二分类),个体学习器之间有强依赖关系,串行生成。GBDT也是boosting算法

基本思路

1,基分类器权重均分分布 (每个训练数据权重一样)

最终分类器G(x)=w11G(x1)+w12G(x2)+…

2,反复学习基本分类器

2.1由当前权值学习Gm

2.1.1计算基本分类器的误差率

e1=p(G(xi)≠yi)

2.1.2计算基本分类器系数

α1≡(12)∗log(1−e1e1)

2.1.3更新训练数据的权值分布(e是指数函数那个e=2.718)

D2=(w(21),...,w(2i),...)

W(2i)=w(1i)Z1e−α1∗yi∗G1(xi)

Z1=∑ni=1W(1i)e−α1∗yi∗G1(xi)

f1(x)=α1G1(x)

迭代m次得出G2(x)…Gm(x)

最终分类器-(sign符号函数)

G=sign(fm(x))=sign(α1G1(x)+α2G2(x)+...+αmGm(x))

举例

统计学习方法李航p141例子exp(-0.436)约等于(2.718)−0.436

w1i=0.1

e1=p(G(xi)≠yi)=0.3

α1≡(12)∗log(1−e1e1)=0.4236

Z1=∑ni=1W(1i)e−α1∗yi∗G1(xi)=0.1∗(2.718)−0.436∗7+0.1∗(2.718)0.436∗3=0.9165846

W(2i)=w(1i)Z1e−α1∗yi∗G1(xi)=0.1/0.915∗(2.718)−0.436≈0.07143

f1(x)=α1G1(x)=0.4236G1(x)

推导过程(简略公式)

基于加性模型迭代式优化指数损失函数角度推导

详见周志华机器学习P175

或参考http://blog.csdn.net/batuwuhanpei/article/details/52045977

1.计算基本分类器系数的由来

最小化指数损失函数对系数求偏导

得到 权重更新公式

2.计算样本权值的系数的更新过程

变化损失函数为Ht-1(x)与ht(x)的形式

对含ht(x)的部分进行二阶泰勒展开,化简得出损失函数

由最优化目标,拼凑出新的分布公式

化简分布公式得出样本权重系数的更新公式

Bagging(并行-减少方差)

个体学习器之间不存在强依赖关系,可同时生成的并行化方法

基本思路

1、随机采样T个训练样本集(基学习器一般只含63.2%的训练样本)

2、每个采样集训练一个基学习器

3、分类使用简单投票法,相同票数随机选;回归使用简单平均法

优点:存在包外样本,可进行泛化误差的包外估计,在决策树和神经网络等易受样本扰动的模型中效果更好,减少方差

典型Bagging算法RF随机森林

以决策树为基学习器构建Bagging

决策树的每个节点从该节点的属性集合中随机选择一个K个属性的子集,然后再从子集当中选择最优属性用户划分,K控制随机性的引入程度,推荐k=log2d (d是所有属性个数)

随机森林训练效率常优于传统决策树Bagging,原因是考察的属性个数RF少

优势:

1.减少过拟合

2.降低陷入局部极小点的风险

3.相应的假设空间扩大,有可能学到更好的相似

结合策略

平均法

数值型输出:

1简单平均法(适合模型性能相近)[计算皮尔逊系数,相关性不大性能接近融合]

2加权平均法(容易过拟合,适合模型性能相差较大)

排名平均

当评估指标是ranking或者像AUC,使用排名平均

首先将预测结果进行一个排名,然后去平均这个排名

投票法

1多数投票法(预测为得票最多的标记,相同随机)

2加权投票法

类标记:0/1 硬投票

类概率:对后验概率的估计 软投票

类概率不能直接比较,可以转换为累标记然后投票

学习法Stacking generalization

个体学习器称为初级学习器

结合的学习器称为次学习器/元学习器

1. 训练初级学习器

2. 生成新数据集(次级训练集)

3. 新数据集作输入,初始样本标记做样本标记

假设初级集成是异质的

防止过拟合,使用交叉验证或留一法,用训练初级学习器未使用的样本来产生次级学习器的训练样本。

eg:K折交叉验证,D1,D2,…,Dk

取不含Dj的其余样本训练t个算法

对Dj的样本进行t个算法预测

预测结果当次级训练集训练。

泛化:次训练集合次学习算法对泛化影响很大

初级学习器的输出类概率作为此训练集用于多响应线性回归(MLR)作为次学习器效果较好

eg:2折stacking:

- 将训练集分成2部分: train_a 与 train_b

- 用train_a来拟合一个初级学习器对train_b进行预测

- 用train_b来拟合同类型的学习器对train_a进行预测

- 最后用整个训练集拟合模型,并对测试集进行预测

- 基于初级学习器的概率输出,来训练次级学习器

安装pip install -U heamy

github地址https://github.com/rushter/heamy

代码示例

from heamy.dataset import Dataset
from heamy.estimator import Regressor, Classifier
from heamy.pipeline import ModelsPipeline
from sklearn import cross_validation
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
#加载数据集
from sklearn.datasets import load_boston
data = load_boston()
X, y = data['data'], data['target']
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.1, random_state=111)
#创建数据集
dataset = Dataset(X_train,y_train,X_test)
#创建RF模型和LR模型
model_rf = Regressor(dataset=dataset, estimator=RandomForestRegressor, parameters={'n_estimators': 50},name='rf')
model_lr = Regressor(dataset=dataset, estimator=LinearRegression, parameters={'normalize': True},name='lr')
# Stack两个模型
# Returns new dataset with out-of-fold predictions
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)


blend

blend包含generalizers和stackers

通过Blending,不需要对训练集创建折外预测(out-of-fold predictions ),你只需创建一个小的留出集,比如10%的训练集做为留出。stacker模型只在留出集里面进行训练。

Blending的优势:

比stacking更加简单
能够防止信息泄露:generalizers和stackers使用不同的数据
你不需要跟你的队友设定一个相同的随机种子来进行相同的分折 谁都可以将模型放入“blender”中,由blender来决定是否保留这个模型。


缺点:

只使用了整体中数据一部分
最终的模型有可能对留出集过拟合
stacking使用交叉验证比使用单一留出集更加稳健 (在更多的折上进行计算)。


stacking和blending的区别

stacking和blending的区别应该在于数据的划分

blending用不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均。Stacking:划分训练数据集为两个不相交的集合,在第一个集合上训练多个学习器,在第二个集合上测试这几个学习器,把第三步得到的预测结果作为输入,把正确的回应作为输出,训练一个高层学习器。

贝叶斯模型平均BMA

加权平均法的特征实现,一般stacking优于BMA,鲁棒性好,BMA对模型的近似误差非常敏感。

Blending

代码

from heamy.dataset import Dataset
from heamy.estimator import Regressor, Classifier
from heamy.pipeline import ModelsPipeline
from sklearn import cross_validation
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
#加载数据集
from sklearn.datasets import load_boston
data = load_boston()
X, y = data['data'], data['target']
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.1, random_state=111)
#创建数据集
dataset = Dataset(X_train,y_train,X_test)
#创建RF模型和LR模型
model_rf = Regressor(dataset=dataset, estimator=RandomForestRegressor, parameters={'n_estimators': 50},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)


Weighted average加权平均数

代码

from heamy.dataset import Dataset
from heamy.estimator import Regressor, Classifier
from heamy.pipeline import ModelsPipeline
from sklearn import cross_validation
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
from sklearn.neighbors import KNeighborsRegressor
data = load_boston()
X, y = data['data'], data['target']
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.1, random_state=111)
#创建数据集
dataset = Dataset(X_train,y_train,X_test)

model_rf = Regressor(dataset=dataset, estimator=RandomForestRegressor, parameters={'n_estimators': 151},name='rf')
model_lr = Regressor(dataset=dataset, estimator=LinearRegression, parameters={'normalize': True},name='lr')
model_knn = Regressor(dataset=dataset, estimator=KNeighborsRegressor, parameters={'n_neighbors': 15},name='knn')

pipeline = ModelsPipeline(model_rf,model_lr,model_knn)

weights = pipeline.find_weights(mean_absolute_error)
result = pipeline.weight(weights)


多样性增强

集成学习需要多样性大的个体学习器,一般对数据样本、输入属性、输出表示、算法参数进行扰动

数据样本扰动

采样法:对决策树、神经网络这种不稳定基学习器有效。

线性学习器、支持向量机、朴素贝叶斯、k近邻这些稳定基学习器对样本扰动不敏感。

输入属性扰动

初始属性集中抽取若干个属性子集

输出表示扰动

对类标记进行变动

翻转法:随机改变一些训练样本的标记

输出调制法:将分类输出转换为回归输出

ECOC:原任务拆解为多个可同时求解的子任务,多分类任务拆解成一系列二分类任务。

算法参数扰动

初始权重、神经元个数等等

参考

KAGGLE ENSEMBLING GUIDE

kaggle比赛集成指南
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: