集成学习-模型融合学习笔记
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.436w1i=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 GUIDEkaggle比赛集成指南
相关文章推荐
- 集成学习-模型融合学习笔记
- XPath学习笔记 XPath数据模型
- MPEG4 & H.264学习笔记之三 ------ 图像模型(图像处理过程)
- GMS学习笔记-6 利用概念模型建立MODFLOW模型
- Sandy引擎学习笔记:导入3dsmax模型
- Sandy引擎学习笔记:导入3dsmax模型
- J2ME学习笔记(七)-----J2ME与XML的集成
- GMF学习笔记(二、图形编辑器中标记的元模型 Notation meta-model)
- 《深度探索c++对象模型》学习笔记 - 7 站在对象模型的顶端
- 【.NET 学习笔记】Chapter.01 CLR的执行模型
- QT学习笔记- eclipse集成的QT designer(总结得不错)
- AppFuse学习笔记-模型层
- Jena学习笔记(1)---创建RDF模型
- [CSS2盒模型]--div学习笔记一
- J2ME学习笔记(七)-----J2ME与XML的集成
- MPEG4 & H.264学习笔记之二 ------ 视频编码基本概念及时域模型
- Microsoft .NET 的企业解决方案模式 > Web 表示模式 > 模型-视图-控制器(学习笔记四)
- 关于LINQ(语言集成查询)的一些学习笔记(没实践过的)
- CSS学习笔记:可视化格式模型
- 可视化格式模型--Css学习笔记(二)