模型融合(集成方法) -投票法

参考:
https://www.cnblogs.com/gobetter/p/13786704.html
https://blog.csdn.net/oyww710/article/details/106310449


一、基础原理

  在所有集成学习方法中,最直观的是多数投票。因为其目的是输出基础学习者的预测中最受欢迎(或最受欢迎)的预测。多数投票是最简单的集成学习技术,它允许多个基本学习器的预测相结合。与选举的工作方式类似,该算法假定每个基础学习器都是投票者,每个类别都是竞争者。为了选出竞争者为获胜者,该算法会考虑投票。将多种预测与投票结合起来的主要方法有两种:一种是硬投票,另一种是软投票。我们在这里介绍两种方法。

在这里插入图片描述


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


Hard Voting Classifier(硬投票)根据少数服从多数来定最终结果;
Soft Voting Classifier(软投票):将所有模型预测样本为某一类别的概率的平均值作为标准,概率最高的对应的类型为最终的预测结果。

1.1 硬投票

   硬投票通过假设投票最多的类别是获胜者,结合了许多预测。在具有两个类别和三个基础学习器的简单情况下,如果目标类别至少具有两票,则它将成为集成法的最后输出。

   模型 1:A - 99%、B - 1%,表示模型 1 认为该样本是 A 类型的概率为 99%,为 B 类型的概率为 1%;
在这里插入图片描述

1.2 软投票

   软投票考虑了预测类别的可能性。为了结合预测结果,软投票计算每个类别的平均概率,并假设获胜者是具有最高平均概率的类别。
在这里插入图片描述

二、代码

2.1 硬投票

from sklearn.ensemble import RandomForestClassifier#随机森林分类器(该分类器本身就是集合而来)
from sklearn.ensemble import VotingClassifier      #投票分类器
from sklearn.linear_model import LogisticRegression#逻辑回归分类器
from sklearn.svm import SVC                        #支持向量机分类器  
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)
log_clf = LogisticRegression()
rnd_clf = RandomForestClassifier()
svm_clf = SVC()
voting_clf = VotingClassifier(estimators=[('lr',log_clf),('rf',rnd_clf),('svc',svm_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))

2.2 软投票

   如果所有的分类器都能够估计类概率(即sklearn中它们都有一个predict_proba()方法),那么可以求出类别的概率平均值,投票分类器将具有最高概率的类作为自己的预测。这称为软投票。

   在代码中需要两处做更改,在支持向量机中,需要将参数probablity设置为True,使支持向量机具备预测类概率的功能。投票分类器中需要把voting设置为soft

svm_clf1 = SVC(probability=True) # probablity设置为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表现的更出色!

  • 20
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值