Python——机器学习分类模型实例:进阶模型融合Voting和Stacking详解

本文介绍了如何在Python中利用Stacking和Voting方法对预处理后的数据进行模型融合,以提高机器学习分类模型的准确性。作者通过实例演示了如何使用sklearn库中的StackingClassifier和VotingClassifier,以及如何优化基模型选择和参数设置来获得更好的预测效果。
摘要由CSDN通过智能技术生成

接上篇文章:Python——机器学习分类模型实例:从数据预处理到模型训练全流程-CSDN博客

本文利用上篇文章中,预处理后的数据,介绍模型融合的 Statcking 和 Voting方法,用以提高模型预测的准确率。Stacking 方法扒了一下sklearn中的源码,其处理方法似乎和大部分原理类文章中讲的不太一样。

0. 保存和读取预处理后的数据

        为方便后续利用,可以将上篇文章中预处理后的数据保存为一个新的csv文件。参考代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

import lightgbm as lgb
from sklearn.ensemble import StackingClassifier
from sklearn.ensemble import VotingClassifier


## 将预处理后的数据保存为新的csv文件
train_pre = pd.concat([x_train,y_train],axis=1)
test_pre = pd.concat([x_test,y_test],axis=1)

train_pre.to_csv('train_pre.csv',index=False)
test_pre.to_csv('test_pre.csv',index=False)

        故本文直接读取预处理后的数据:

df_train=pd.read_csv('train_pre.csv')
df_test=pd.read_csv('test_pre.csv')
print(df_train.shape)
print(df_test.shape)

1. Voting方法

     Voting方法有两种,其中 hard voting 是指取各个基模型的分类结果的多数作为最终分类结果,soft voting 是取各个基模型的在各个类别上的概率之和,并取概率最大的那个类别作为最终分类结果。其由 VotingClassifier() 函数中,voting 参数控制,取值为‘hard’和‘soft’。此外,还可以给定各个分类器的权重,由 weights 参数控制。

        下面以我们上篇文章的数据为例,看一下Voting方法的效果。在上篇文章中,我们发现lgbm的效果最好,所以我们选取lgbm模型,并给予不同的模型参数,作为voting的基模型。

## 定义基模型 
lgbm_1 = lgb.LGBMClassifier(colsample_bytree=0.8, max_depth=10, metrics='auc',
               n_estimators=86, num_leaves=80, reg_alpha=0.5, subsample=0.8)

lgbm_2 = lgb.LGBMClassifier(colsample_bytree=0.9, max_depth=12, metrics='auc',
               n_estimators=86, num_leaves=80, reg_alpha=0.2, subsample=0.8)

lgbm_3 = lgb.LGBMClassifier(colsample_bytree=0.8, max_depth=10, metrics='auc',
               n_estimators=86, num_leaves=80, reg_alpha=0.2, subsample=0.7)

ests_2 = [('lgbm1',lgbm_1),('lgbm2',lgbm_2),('lgbm3',lgbm_3)]

## 使用voting方法
ests = [('lgbm1',lgbm_1),('lgbm2',lgbm_2),('lgbm3',lgbm_3)]
vt = VotingClassifier(estimators=ests, voting='soft')
vt.fit(np.array(x_train),y_train)

## 查看得分
vt_2.score(np.array(x_test),y_test)

        运行后,其预测准确率得分值为 0.7895181741335587,高于每个基分类器的结果。注意,此处选取的基模型需要都有较高的得分,否则voting后效果可能会比效果最好的单模型差。

2. Stacking方法

        其基本原理是使用多个基模型对原始特征的预测结果作为新的特征,和原标签一起训练最终的分类模型。

        扒了一下sklearn中StackingClassifier函数的源码,其详细处理逻辑为:

(1)将训练集进行K折切分,对第i个基模型model_i,在 K-1 折数据上进行训练,在剩下的一折上进行预测。改过程重复K次,得到每一折数据上的预测结果(可通过cross_val_predict() 函数完成)。将预测结果拼接得到和原特征行数相同的新的特征。

(2)对每个基模型进行上述操作,并将所有的新的特征按列拼接,记为M。(此处需注意不能打乱特征和标签间的对应关系

(3)可将新的特征集直接作为训练集特征,同原标签一起,训练得到最终的分类模型(final_estimator)。也可以将之和原特征进行按列拼接,一起进行训练得到最终的分类模型。是否拼接原特征集,由参数 passthrough 控制。

(4)同时,使用每个基模型在全部的原始训练集上进行训练,训练好的基分类器用于后续在测试集上的预测(大部分讲原理的文章,这里的处理方式似乎都是对每个基模型K折训练的模型取平均)。至此训练过程完成。

(5)测试集上的预测过程:用第(4)步中训练好的每个基模型,在测试集原特征上进行预测,生成新的特征集。用第(3)步中得到的最终的分类模型,在新的特征集(如果passthrough=True则也拼接原特征集)上进行预测,得到最终的预测结果。

        同样使用上面的lgbm1-3作为基分类器,最终的分类模型(final_estimator)使用 StackingClassifier 函数中默认的逻辑回归模型。采用5折交叉验证。其结果如下:

## 模型训练
sr = StackingClassifier(estimators=ests, cv=5)
sr.fit(np.array(x_train),y_train)

## 计算模型得分
sr.score(np.array(x_test),y_test)

        运行后。模型预测准确率得分为 0.7901033877365238。是我们目前得到的最好的结果。

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值