目录
一、模型融合概念
模型融合通常可以在各种不同的机器学习任务中使结果获得提升。顾名思义,模型融合就是综合考虑不同模型的情况,并将它们的结果融合到一起。由于其较容易理解且比较简单,在工业界的很多应用,也在天池、kaggle等比赛中常拿来做模型集成。
(一)分类
- 简单加权融合
- 回归:算术平均融合(Arithmetic mean),几何平均融合(Geometric mean)
- 分类:投票(Voting)
- 综合:排序融合(Rank averaging),log融合
- stacking/blending
构建多层模型,并利用预测结果再拟合预测 - boosting/bagging
多树的提升方法
二、Stacking介绍
(一)概念
Stacking就是用初始训练数据学习处若干个基学习器(如果独立的学习器为同质,称为基学习器【都为SVM或都为LR】;同理,如果独立的学习器为异质,称为组合学习器【将SVM+LR组合】)后,将这几个学习器的预测结果作为新的训练集,来学习一个新的学习器。
将个体学习器结合在一起的时候使用的方法叫做结合策略。对于分类问题,我们可以使用投票法来选择输出最多的类。对于回归问题,我们可以将分类器输出的结果求平均值。
上面说的投票法和平均法都是很有效的结合策略,还有一种结合策略是使用另外一个机器学习算法来将个体机器学习器的结果结合在一起,这个方法就是Stacking。
在stacking方法中,我们把个体学习器叫做初级学习器,用于结合的学习器叫做次级学习器或元学习器(meta-learner),次级学习器用于训练的数据叫做次级训练集。次级训练集是在训练集上用初级学习器得到的。
(二)过程
算法示意图
过程1-3 是训练出来个体学习器,也就是初级学习器。
过程5-9是 使用训练出来的个体学习器来得预测的结果,这个预测的结果当做次级学习器的训练集。
过程11 是用初级学习器预测的结果训练出次级学习器,得到我们最后训练的模型。
三、代码示例
(一)回归/分类概率-融合
1.简单加权平均,结果直接融合
# 生成一些简单的样本数据,test_prei 代表第i个模型的预测值
test_pre1 = [1.2, 3.2, 2.1, 6.2]
test_pre2 = [0.9, 3.1, 2.0, 5.9]
test_pre3 = [1.1, 2.9, 2.2, 6.0]
# y_test_true 代表第模型的真实值
y_test_true = [1, 3, 2, 6]
import numpy as np
import pandas as pd
##定义结果的加权平均函数
def Weighted_method(test_pre1,test_pre2,test_pre3,w=[1/3,1/3,1/3]):
Weighted_result = w[0]*pd.Series(test_pre1)+w[1]*pd.Series(test_pre2)+w[2]*pd.Series(test_pre3)
return Weighted_result
from sklearn import metrics
#各类模型的预测结果计算MAE MAE:平均均方误差 是衡量变量精度的两个最常用指标
print("Pred1 MAE:",metrics.mean_absolute_error(y_test_true,test_pre1))
print("Pred2 MAE:",metrics.mean_absolute_error(y_test_true,test_pre2))
print("Pred3 MAE:",metrics.mean_absolute_error(y_test_true,test_pre3))
##根据加权计算MAE
w = [0.3,0.4,0.3] #定义比重权重
Weighted_pre = Weighted_method(test_pre1,test_pre2,test_pre3,w)
print("Weighted_pre MAE:",metrics.mean_absolute_error(y_test_true,Weighted_pre))
##简单加权平均的其它特殊形式,如mean平均,median平均
def Mean_method(test_pre1,test_pre2,test_pre3):
Mean_result = pd.concat([pd.Series(test_pre1),pd.Series(test_pre2),pd.Series(test_pre3)],axis=1)
return Mean_result
Mean_pre = Mean_method(test_pre1,test_pre2,test_pre3)
print("Mean_pre MAE:",metrics.mean_absolute_error(y_test_true,Mean_pre))
#median平均
## 定义结果的加权平均函数
def Median_method(test_pre1,test_pre2,test_pre3):
Median_result = pd.concat([pd.Series(test_pre1),pd.Series(test_pre2),pd.Series(test_pre3)],axis=1).median(axis=1)
return Median_result
Median_pre = Median_method(test_pre1,test_pre2,test_pre3)
print('Median_pre MAE:',metrics.mean_absolute_error(y_test_true, Median_pre))
2.Stacking融合(回归)
stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为训练集进行再训练,从而得到完整的stacking模型。
stacking两层模型都使用了全部的训练数据。
第一层模型:
首先数据有训练集和测试集两部分
1.对训练集进行五折交叉验证,把训练集划分为A,B两部分
2.对A部分进行训练,对B部分进行预测,得到a1,五折后则为a1,a2,a3,a4,a5,对他们合并,形成n行一列的数据
3.对测试集进行预测,会得到b1,b2,b3,b4,b5,将各部分相加取平均得到m行一列的数据
4,。以上是一个模型,如果有三个模型,则可以得到A1,A2,A3,B1,B2,B3
5.在此之后,我们把A1,A2,A3并列合并得到一个n行三列的矩阵作为training data,B1,B2,B3并列合并得到一个m行三列的矩阵作为testing data。让下一层的模型,基于他们进一步训练。
## 生成一些简单的样本数据,test_prei 代表第i个模型的预测值
train_reg1 = [3.2, 8.2, 9.1, 5.2]
train_reg2 = [2.9, 8.1, 9.0, 4.9]
train_reg3 = [3.1, 7.9, 9.2, 5.0]
# y_test_true 代表第模型的真实值
y_train_true = [3, 8, 9, 5]
test_pre1 = [1.2, 3.2, 2.1, 6.2]
test_pre2 = [0.9, 3.1, 2.0, 5.9]
test_pre3 = [1.1, 2.9, 2.2, 6.0]
# y_test_true 代表第模型的真实值
y_test_true = [1, 3, 2, 6]
model_L2 = linear_model.LinearRegression()
Stacking_pre = Stacking_method(train_reg1