假設你已經訓練了一些分類器,每一個都達到了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