数据挖掘之心跳信号分类预测--笔记五--模型融合

什么是模型融合

使用多个不同类型的模型,通过对多个模型的结果进行各种计算或再次训练,从而新的结果。

结果层面的融合

直接加权(回归任务、分类预测的概率)

核心代码:w是权重,可以进行调参

## 定义结果的加权平均函数
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

列子:
模型一预测的结果为[1.2, 3.2, 2.1, 6.2]
模型二预测的结果为[0.9, 3.1, 2.0, 5.9]
模型三预测的结果为[1.1, 2.9, 2.2, 6.0]

真实值:[1, 3, 2, 6]
通过简单加权,设置权重为w = [0.3,0.4,0.3],加权后结果:[1.05, 3.07, 2.09, 6.02]

对比为模型融合前的3个结果的MAE值(平均绝对误差):
Pred1 MAE: 0.1750000000000001
Pred2 MAE: 0.07499999999999993
Pred3 MAE: 0.10000000000000009

融合后结果的MAE值:
Weighted_pre MAE: 0.05750000000000027

可以看到融合后结果比原来3个模型都更加优秀。

但是也未必加权后的结果就是会更好的,这个我认为会受到训练较差模型和权重影响。

反面例子:还是刚刚的例子,将权重设置为w = [0.4,0.2,0.4],最后的结果为MAE: 0.0850000000000003,这个并不由于融合前的。

除了加权平均,还有取均值,取中位数等等:

## 定义结果的加权平均函数
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).mean(axis=1)
    return Mean_result

## 定义结果的加权平均函数
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

这个方法优点很明显:
①简单;
②参数比较容易调,运行结果也比较快,容易找到上限。

Stacking融合(回归)

被封装得有点好,还不怎么清楚具体原理,代码:

from sklearn import linear_model

def Stacking_method(train_reg1,train_reg2,train_reg3,y_train_true,test_pre1,test_pre2,test_pre3,model_L2= linear_model.LinearRegression()):
    model_L2.fit(pd.concat([pd.Series(train_reg1),pd.Series(train_reg2),pd.Series(train_reg3)],axis=1).values,y_train_true)
    Stacking_result = model_L2.predict(pd.concat([pd.Series(test_pre1),pd.Series(test_pre2),pd.Series(test_pre3)],axis=1).values)
    return Stacking_result

## 生成一些简单的样本数据,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,train_reg2,train_reg3,y_train_true,
                               test_pre1,test_pre2,test_pre3,model_L2)
print('Stacking_pre MAE:',metrics.mean_absolute_error(y_test_true, Stacking_pre))

Voting投票机制

Voting(投票机制),分为软投票和硬投票两种,原理是少数服从多数。

硬投票:对多个模型直接进行投票,不区分模型结果的相对重要度,最终投票数最多的类为最终被预测的类。

软投票:将所有模型预测样本为某一类别的概率的平均值作为标准,概率最高的对应的类型为最终的预测结果。

核心代码:

clf1 = lgb.LGBMClassifier(learning_rate=0.1, n_estimators=150, max_depth=3, min_child_weight=2, subsample=0.7,
                     colsample_bytree=0.6, objective='binary:logistic')
clf2 = RandomForestClassifier(n_estimators=200, max_depth=10, min_samples_split=10,
                              min_samples_leaf=63,oob_score=True)
clf3 = SVC(C=0.1)

# 硬投票
eclf = VotingClassifier(estimators=[('lgb', clf1), ('rf', clf2), ('svc', clf3)], voting='hard')
# 软投票
#eclf = VotingClassifier(estimators=[('lgb', clf1), ('rf', clf2), ('svc', clf3)], voting='soft')

Stacking融合(分类)

stacking是一种分层模型集成框架。
举例说明:
两层:第一层由多个基学习器(不同效果的LGB或者LGB+随机森林)组成,其输入为原始训练集。第二层的模型(通常为一个简单的线性模型)则是以第一层基学习器的输出作为训练集进行再训练,如果第二层是一个一层的神经网络,那就可以等于自动的学习各个基础模型的权重。

Blending融合

Blending,其实和Stacking是一种类似的多层模型融合的形式

  • 其主要思路是把原始的训练集先分成两部分,比如70%的数据作为新的训练集,剩下30%的数据作为测试集。
  • 在第一层,我们在这70%的数据上训练多个模型,然后去预测那30%数据的label,同时也预测test集的label。
  • 在第二层,我们就直接用这30%数据在第一层预测的结果做为新特征继续训练,然后用test集第一层预测的label做特征,用第二层训练的模型做进一步预测

其优点在于

  • 比stacking简单(因为不用进行k次的交叉验证来获得stacker feature)
  • 避开了一个信息泄露问题:generlizers和stacker使用了不一样的数据集

缺点在于:

  • 使用了很少的数据(第二阶段的blender只使用training set10%的量)
  • blender可能会过拟合
  • stacking使用多次的交叉验证会比较稳健 ‘’’

模型融合的注意事项

我自己还没有进行过模型融合,这次算是第一次接触,通过对这次任务的理论知识的学习,发现张晋大佬的总结真的很到位,下面这句话很重要:
在做结果融合的时候,有一个很重要的条件是模型结果的得分要比较近似但结果的差异要比较大,这样的结果融合往往有比较好的效果提升。如果不满足这个条件带来的效果很低,甚至是负效果。

模型融合前对基础模型的结果进行分析,看看差异性如何。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值