更合理的投票,应该有权值。
假如一个二分类问题,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