问题描述
我有一个关于投票分类器的简单问题。据我所知,投票分类器应该比构建它的那些个体预测器(人群的智慧)具有最高的准确度。这是代码
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
# import dataset
X,y = make_moons(n_samples=500,noise=0.30,random_state=42)
# split the dataset into train/test sets
X_train,X_test,y_train,y_test = train_test_split(X,y)
rnd_clf = RandomForestClassifier(n_estimators=10,random_state=42)
log_clf = LogisticRegression(solver='liblinear',random_state=42)
svm_clf = SVC(gamma='auto',random_state=42)
voting_clf = VotingClassifier(
estimators= [('lr',log_clf),('rf',rnd_clf),('svc',svm_clf)],voting='hard')
voting_clf = voting_clf.fit(X_train,y_train)
predictors_list= [log_clf,rnd_clf,svm_clf,voting_clf]
for clf in predictors_list:
clf.fit(X_train,y_train)
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_pred,y_test)
print(clf.__class__.__name__,accuracy)
我得到的准确度如下:
LogisticRegression 0.776 随机森林分类器 0.88 SVC 0.864 投票分类器 0.864
正如您在这次运行中所看到的,随机森林预测器的准确度略高于 VotingClassifier!
对此有什么解释吗?
非常感谢
费提
解决方法
我们来看看你传递的投票参数'hard'
文档说:
如果为“hard”,则使用预测的类别标签进行多数规则投票。否则,如果为“软”,则根据预测概率之和的 argmax 预测类别标签,推荐用于经过良好校准的分类器集合。
所以也许,LogisticRegression
和您的 SVC
(SVM) 的预测是相同的,并且在某些情况下是错误的,这导致您对这些情况的多数票错误。
您可以使用 voting='soft'
或将权重分配为每个模型的预测的先验,这样您可以使您的预测免受不良模型的错误预测的影响,并在您的最佳模型上传递更多信息。