در واقع به Ensemble کردن کلاسیفایر اشاره داره .
رای اکثریت :
فرض کنید شما 3 تا کلاسیفایر دارید و top1 را برای هر 3 کلاسیفایر محاسبه می کنید و سپس مد یا همان اکثریت را بر روی خروجی کلاسیفایر ها محاسبه می کنید.
فرض کنید مثال ما به صورت زیر باشه:
classifier 1 -> class 1
classifier 2 -> class 1
classifier 3 -> class 2
رای اکثریت در مثال بالا class1 را انتخاب می کنه به این روش hard voting هم گفته میشه.
یه مثال ساده هم روی دیتاست iris به شکل زیر میشه:
>>> from sklearn import datasets
>>> from sklearn.model_selection import cross_val_score
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.naive_bayes import GaussianNB
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.ensemble import VotingClassifier
>>> iris = datasets.load_iris()
>>> X, y = iris.data[:, 1:3], iris.target
>>> clf1 = LogisticRegression(random_state=1)
>>> clf2 = RandomForestClassifier(random_state=1)
>>> clf3 = GaussianNB()
>>> eclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='hard')
>>> for clf, label in zip([clf1, clf2, clf3, eclf], ['Logistic Regression', 'Random Forest', 'naive Bayes', 'Ensemble']):
... scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')
... print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))
Accuracy: 0.90 (+/- 0.05) [Logistic Regression]
Accuracy: 0.93 (+/- 0.05) [Random Forest]
Accuracy: 0.91 (+/- 0.04) [naive Bayes]
Accuracy: 0.95 (+/- 0.05) [Ensemble]
رای اکثریت وزن دار :
در مقابل روش بالا که بهش hard voting اطلاق میشه روش soft voting وجود داره که در این روش به جای استفاده از top1 میان از top n استفاده می کنند. در این روش هر کلاسیفایر علاوه بر شناسه کلاس یک توزیع احتمال هم برای آن کلاس ارائه میده .علاوه بر این هر کلاسیفایر در این روش وزن داره .(بر خلاف روش قبلی که وزن همه کلاسیفایر یکسان بود)که در این روش وزن هر کلاسیفایر را در توزیع احتمال کلاس موردنظر در کلاسیفایر مربوطه ضرب می کنیم و میانگین را به صورت زیر محاسبه می کنیم.
classifier |
class 1 |
class 2 |
class 3 |
classifier 1 |
w1 * 0.2 |
w1 * 0.5 |
w1 * 0.3 |
classifier 2 |
w2 * 0.6 |
w2 * 0.3 |
w2 * 0.1 |
classifier 3 |
w3 * 0.3 |
w3 * 0.4 |
w3 * 0.3 |
weighted average |
0.37 |
0.4 |
0.23 |
یه مثال دیگر از این روش در ski learn :
>>> from sklearn import datasets
>>> from sklearn.tree import DecisionTreeClassifier
>>> from sklearn.neighbors import KNeighborsClassifier
>>> from sklearn.svm import SVC
>>> from itertools import product
>>> from sklearn.ensemble import VotingClassifier
>>> # Loading some example data
>>> iris = datasets.load_iris()
>>> X = iris.data[:, [0,2]]
>>> y = iris.target
>>> # Training classifiers
>>> clf1 = DecisionTreeClassifier(max_depth=4)
>>> clf2 = KNeighborsClassifier(n_neighbors=7)
>>> clf3 = SVC(kernel='rbf', probability=True)
>>> eclf = VotingClassifier(estimators=[('dt', clf1), ('knn', clf2), ('svc', clf3)], voting='soft', weights=[2,1,2])
>>> clf1 = clf1.fit(X,y)
>>> clf2 = clf2.fit(X,y)
>>> clf3 = clf3.fit(X,y)
>>> eclf = eclf.fit(X,y)