为何设置hard投票的VotingClassifier在不同权重下性能有差异?
VotingClassifier硬投票权重不同导致准确率差异的原因
测试sklearn的VotingClassifier时发现一个费解现象:准备了三个单独分类器,各自的测试集准确率分别为GaussianNB(0.795)、LogisticRegression(0.7925)、RandomForestClassifier(0.94)。随后构建了两个均设置voting="hard"的VotingClassifier,仅权重不同,本以为硬投票是多数投票,但两者准确率却有明显差异,这是为什么?
单独分类器定义:
gnb = GaussianNB() # 准确率 0.795 lr = LogisticRegression() # 准确率 0.7925 rfc = RandomForestClassifier() # 准确率 0.94
两个VotingClassifier对比代码:
vc_hard_equals = VotingClassifier(estimators=[ ("NaiveBayes", gnb), ("LogisticRegression", lr), ("RandomForest", rfc) ], voting="hard", weights=(1, 1, 1), # 权重相等 ) vc_hard_forest_priority = VotingClassifier(estimators=[ ("NaiveBayes", gnb), ("LogisticRegression", lr), ("RandomForest", rfc)], voting="hard", weights=(1, 1, 3), # 提升RandomForest权重(最优模型) ) vc_hard_equals.fit(X_train, y_train) vc_hard_forest_priority.fit(X_train, y_train) print(vc_hard_equals.score(X_test, y_test)) # 0.832 print(vc_hard_forest_priority.score(X_test, y_test)) # 0.915
原因分析
硬投票(voting="hard")模式下,权重并不是简单的"一人一票",而是基于权重的加权投票机制,和传统的简单多数票决逻辑不同:
- 当设置
weights=(1,1,1)时,每个分类器的投票权重相等,最终类别由三个分类器中得票最多的类别决定(普通多数投票)。此时RF的优势被另外两个低准确率模型稀释,整体准确率介于三个模型之间。 - 当设置
weights=(1,1,3)时,RandomForest的投票相当于3票,另外两个模型各1票,总权重和为5。此时最终类别是所有分类器投票的类别中,加权得票总和最高的那个。
举个具体例子:假设某个样本,GNB和LR都预测类别A,RF预测类别B。权重相等时,A得2票、B得1票,最终预测A;而权重为(1,1,3)时,A的加权得票是1+1=2,B的加权得票是3,最终预测B。
由于RF本身的准确率远高于另外两个模型,提升它的权重后,投票结果会更多地偏向RF的正确预测,因此vc_hard_forest_priority的准确率会更接近RF的单独准确率(0.94),自然远高于权重相等的版本。
内容的提问来源于stack exchange,提问作者Krzysztof
相关产品推荐
相关产品推荐

