首页 > 技术文章 > 集成方法(1)投票法

gobetter 2020-10-09 16:58 原文

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

 

有一种非常简单的方法来创建更好的分类器,这个方法就是聚合每个分类器的预测,并将获得最多投票的类作为自己的预测。这种多数投票分类器被称为硬投票分类器

 

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

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

代码实现

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
# voting_clf.fit(X_train,y_train)
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))

各个分类器准确率

LogisticRegression 0.864
RandomForestClassifier 0.888
SVC 0.896
VotingClassifier 0.904

从结果得知:投票分类器略微优于子分类器。

如果所有的分类器都能够估计类概率(即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表现的更出色!

LogisticRegression 0.864
RandomForestClassifier 0.896
SVC 0.896
VotingClassifier 0.912

 

推荐阅读