Python 模型融合-投票法

文章目录


前言

  假设你已经训练了一些分类器,每一个都达到了80%的准确率。这些分类器分别是一个逻辑回归分类器,一个支持向量机分类器,一个随机森林分类器,一个k近邻分类器,也许还有其他。
在这里插入图片描述


  有一种非常简单的方法来创建更好的分类器,这个方法就是聚合每个分类器的预测,并将获得最多投票的类作为自己的预测。这种多数投票分类器被称为硬投票分类器。软投票是基于分类标签概率投票,将所有模型预测样本为某一类别的概率的平均值作为标准,概率最高的对应的类型为最终的预测结果;

在这里插入图片描述
  这种投票分类器往往比单个的最佳分类器获得更高的准确率。事实上,即使每个分类器都是一个弱的学习者(意味着它只比随机猜测稍微好一点),如果有足够多的弱学习者并且他们足够多样化,那么最终集成得到的投票分类器仍然可以是一个强学习者(达到高精度)。

  注意事项:当预测器尽可能地相互独立时,集成方法的效果最好。获得独立分类器的一种方法是使用不同的算法在相同的训练集上训练它们。这增加了他们犯不同类型错误的机会,提高了集成的准确性(另一种方法是同一种算法在不同的训练集上训练)。

获得独立分类器的方法:

方法
说明
针对输入数据使用采样的方法得到不同的样本(比如bagging方法采用自助法进行抽样)
针对特征对特征进行抽样
针对算法本身a、个体学习器来自不同的模型
b、个体学习器来自于同一个模型的不同超参数,例如学习率η不同
c、算法本身具有随机性,例如用不同的随机种子来得到不同的模型
针对输出对输出表示进行操纵以增强多样性:
a、如将多分类转化为多个二分类任务来训练单模型
b、将分类输出转化为回归输出等

代码


from sklearn.ensemble import RandomForestClassifier#随机森林分类器(该分类器本身就是集合而来)
from sklearn.ensemble import VotingClassifier      #投票分类器
from sklearn.linear_model import LogisticRegression#逻辑回归分类器
from sklearn.svm import SVC                        #支持向量机分类器  
from sklearn.ensemble import GradientBoostingClassifier #梯度提升树分类器
from sklearn.ensemble import AdaBoostClassifier #Ada分类器
from lightgbm import LGBMClassifier
from sklearn.naive_bayes import GaussianNB #贝叶斯分类器
from sklearn.neighbors import KNeighborsClassifier #K近邻分类器
from xgboost import XGBClassifier #XGB分类器
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split

X,y = make_moons(n_samples=500, noise=0.3,random_state=42)

#划分训练集测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)

#各模型实例化
rnd_clf = RandomForestClassifier()
gdbt_clf = GradientBoodtingClassifier()
ada_clf = AdaBoostClassifier()
lgbm_clf = LGBMClassifier()
xgb_clf = XGBClassifier()
voting_clf = VotingClassifier(estimators=[('rf',rnd_clf ),('gdbt',gdbt_clf ),('ada',ada_clf ),('lgbm',lgbm_clf ),('xgb',xgb_clf )],#estimators:子分类器
                              voting='hard') #参数voting代表你的投票方式,hard,soft
                              
# 训练模型,输出各模型准确率
from sklearn.metrics import accuracy_score
for clf in (log_clf,rnd_clf,svm_clf,voting_clf):
    clf.fit(X_train,y_train)
    y_pre = clf.predict(X_test)
    print(clf.__class__,accuracy_score(y_pre,y_test))

  如果所有的分类器都能够估计类概率(即sklearn中它们都有一个predict_proba()方法),那么可以求出类别的概率平均值,投票分类器将具有最高概率的类作为自己的预测。这称为软投票。在代码中只需要两处做更改,在支持向量机中,需要将参数probablity设置为True,使支持向量机具备预测类概率的功能。投票分类器中需要把voting设置为soft
#soft voting
svm_clf1 = SVC(probability=True)
voting_clf = VotingClassifier(estimators=[('lf',log_clf),('svc',svm_clf1),('rf',rnd_clf)],
                             voting='soft')
for clf in (log_clf, rnd_clf, svm_clf1, voting_clf):
    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)
    print(clf.__class__.__name__,accuracy_score(y_pred, y_test))

一般soft比hard表现的更出色!


参考:
https://www.cnblogs.com/gobetter/p/13786704.html

  • 5
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值