跑 Classification 的傳統方式是決定一個 Classifier 後,透過 feature 的新增或是參數的調整,來提高準確率;而另外一個方法就是集百家之優來改善預測的結果-Essemble。

今天要介紹的是用 Voting 的方式來決定預測的結果,當然這只是 Essemble 中的其中一種,還有很多其他的方法。

Scikit-learn 的 Voting 分為 hardsoft

Hard 簡單來講就是多數決,例如:

這樣預測結果就會是 class 1

Soft 這會依照預測出來每個 class 的機率乘上你給的權重(weight)來做定奪,例如:(w1=w2=w3=1)

# of classifierclass 1class 2class 3class 4
1w1 × 0.2w1 × 0.4w1 × 0.3w1 × 0.1
2w2 × 0.5w2 × 0.2w2 × 0.1w2 × 0.2
3w3 × 0.3w3 × 0.1w3 × 0.2w3 × 0.4
4w4 × 0.1w4 × 0.1w4 × 0.7w4 × 0.1
weighted average0.2750.2250.3250.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