更合理的投票,应该有权值。

假如一个二分类问题,5个模型分别对一个样本进行分类。以下是每个模型认为每种分类的概率:

模型1:A-99%,B-1%
模型2:A-49%,B-51%
模型3:A-40%,B-60%
模型4:A-90%,B-10%
模型5:A-30%,B-70%

按照hard voting,投票结果为B
但考虑上每种类的概率,投票结果为A
把每个分类的概率当作权值,就是soft voting

soft voting要求集合中的每一个模型都能估计概率
即有predict_proba这个函数

逻辑回归,KNN,决策树(叶子结点的每个类的比例),都能估计概率。
SVM本身没有考虑概率,因为它是计算margin。但SVM可以有一种方法来计算概率。

自己实现集成学习

使用13-1的数据:

Hard Voting Classifier

from sklearn.ensemble import VotingClassifier

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

voting_clf = VotingClassifier(estimators=[
    ('log_clf', LogisticRegression()),
    ('svm_clf', SVC()),
    ('dt_clf', DecisionTreeClassifier(random_state=666))
], voting='hard')

voting_clf.fit(X_train, y_train)
voting_clf.score(X_test, y_test)

输出:0.896

Soft Voting Classifier

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

voting_clf2 = VotingClassifier(estimators=[
    ('log_clf', LogisticRegression()),
    ('svm_clf', SVC(probability=True)),
    ('dt_clf', DecisionTreeClassifier(random_state=42))
], voting='soft')

voting_clf2.fit(X_train, y_train)
voting_clf2.score(X_test, y_test)

输出:0.92