Scikit Learn Combining Classifiers
跑 Classification 的傳統方式是決定一個 Classifier 後,透過 feature 的新增或是參數的調整,來提高準確率;而另外一個方法就是集百家之優來改善預測的結果-Essemble。
今天要介紹的是用 Voting 的方式來決定預測的結果,當然這只是 Essemble 中的其中一種,還有很多其他的方法。
Scikit-learn 的 Voting 分為 hard
與 soft
。
Hard 簡單來講就是多數決,例如:
這樣預測結果就會是 class 1
。
Soft 這會依照預測出來每個 class 的機率乘上你給的權重(weight)來做定奪,例如:(w1=w2=w3=1)
# of classifier | class 1 | class 2 | class 3 | class 4 |
---|---|---|---|---|
1 | w1 × 0.2 | w1 × 0.4 | w1 × 0.3 | w1 × 0.1 |
2 | w2 × 0.5 | w2 × 0.2 | w2 × 0.1 | w2 × 0.2 |
3 | w3 × 0.3 | w3 × 0.1 | w3 × 0.2 | w3 × 0.4 |
4 | w4 × 0.1 | w4 × 0.1 | w4 × 0.7 | w4 × 0.1 |
weighted average | 0.275 | 0.225 | 0.325 | 0.200 |
這樣我們可以看到其中機率最高的是 class 3
, 因此這次分類的結果就是 class 3
。
Usage
from sklearn import cross_validation
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
knn = KNeighborsClassifier(n_neighbors=5)
dt = DecisionTreeClassifier(random_state=1)
lr = LogisticRegression(random_state=1)
# hard
eclf = VotingClassifier(estimators=[('knn', knn), ('dt_clf', dt), ('lr_clf', lr)], voting='hard')
# soft
eclf = VotingClassifier(estimators=[('knn', knn), ('dt_clf', dt), ('lr_clf', lr)], voting='soft', weights=[1, 2, 3])
scores = cross_validation.cross_val_score(eclf, recipe_X.ingredients, recipe_X.cuisine, cv=5)
print("Accuracy: %0.5f (+/- %0.5f)" % (scores.mean(), scores.std() * 2))
更多細節可以參考 http://scikit-learn.org/stable/modules/ensemble.html。