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

目录(?)[-]

集成学习概念ensemble learning
Boosting串行-减少偏差
基本思路
举例
推导过程简略公式
Bagging并行-减少方差
基本思路
典型Bagging算法RF随机森林
结合策略
平均法
排名平均
投票法
学习法Stacking generalization
blend
stacking和blending的区别
贝叶斯模型平均BMA
Blending
Weighted average加权平均数
多样性增强
数据样本扰动
输入属性扰动
输出表示扰动
算法参数扰动
参考
集成学习概念(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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
多样性增强
集成学习需要多样性大的个体学习器,一般对数据样本、输入属性、输出表示、算法参数进行扰动

数据样本扰动
采样法:对决策树、神经网络这种不稳定基学习器有效。
线性学习器、支持向量机、朴素贝叶斯、k近邻这些稳定基学习器对样本扰动不敏感。

输入属性扰动
初始属性集中抽取若干个属性子集

输出表示扰动
对类标记进行变动
翻转法:随机改变一些训练样本的标记
输出调制法:将分类输出转换为回归输出
ECOC:原任务拆解为多个可同时求解的子任务,多分类任务拆解成一系列二分类任务。

算法参数扰动
初始权重、神经元个数等等

你可能感兴趣的:(集成学习-模型融合学习笔记)