Предположим, вы являетесь частью комиссии по принятию решений, и каждый член комиссии принимает решение по какому-то поводу. Группа проводит голосование среди них и принимает окончательное решение. Как они к этому приходят? Просто они используют режим голосования всех участников.

То же самое вы можете сделать с проблемами классификации машинного обучения. Предположим, вы обучили несколько классификаторов, таких как классификатор логистической регрессии, классификатор SVC, классификатор дерева решений, классификатор случайного леса и, возможно, еще несколько, и каждый из них имеет точность около 85%.

Аналогично классификации машинного обучения мы также можем использовать метод панельного голосования. Другими словами, очень простой способ создать четный классификатор — это агрегировать предсказания каждого классификатора и предсказать класс с наибольшим количеством голосов. Этот классификатор большинства голосов называется классификатором жесткого голосования.

Несколько удивительно, что этот классификатор голосования часто достигает более высокой точности, чем лучший классификатор в ансамбле. На самом деле, даже если каждый классификатор является слабообучаемым (т. е. он лишь немногим лучше, чем случайное угадывание), ансамбль все равно может быть сильно обучаемым (достигающим высокой точности), при условии, что имеется достаточное количество слабых обучающихся и они достаточно разнообразны. Один из способов получить разнообразные классификаторы — обучать их с использованием очень разных алгоритмов. Это увеличивает вероятность того, что они будут делать очень разные типы ошибок, повышая точность ансамбля.

Следующий код создает и обучает классификатор голосования в Scikit-Learn.

from sklearn.ensemble import RandomForestClassifier 
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
log_clf = LogisticRegression()
rnd_clf = RandomForestClassifier()
svm_clf = SVC()
voting_clf = VotingClassifier( estimators=[(‘lr’, log_clf), (‘rf’, rnd_clf),
 (‘svc’, svm_clf)], voting=’hard’ )
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_pred = clf.predict(X_test)
    print(clf.__class__.__name__, accuracy_score(y_test, y_pred))

LogisticRegression 0,864
RandomForestClassifier 0,872
SVC 0,888
VotingClassifier 0,896

Вот оно! Классификатор голосования немного превосходит все индивидуальные классификаторы. Если все классификаторы способны оценивать вероятности классов (т. е. у них есть метод pre dict_proba()), то вы можете указать Scikit-Learn предсказать класс с наибольшей вероятностью класса, усредненной по всем отдельным классификаторам. Это называется мягким голосованием. Это часто обеспечивает более высокую производительность, чем жесткое голосование, потому что оно придает больший вес голосам с высокой степенью уверенности. Все, что вам нужно сделать, это заменить голосование = «жесткий» на голосование = «мягкий» и убедиться, что все классификаторы могут оценивать вероятности классов. Это не относится к классу SVC по умолчанию, поэтому вам нужно установить для его гиперпараметра вероятности значение True (это заставит класс SVC использовать перекрестную проверку для оценки вероятностей класса, замедляя обучение, и он добавит прогнозирование_пробы()). метод). Если вы измените предыдущий код для использования мягкого голосования, вы обнаружите, что точность классификатора голосования превышает 91%!