Machine Learning Academy · Урок

Ансамбли голосования: жёсткое и мягкое голосование

Вы объедините KNN, логистическую регрессию и дерево решений в VotingClassifier и сравните большинство при жёстком голосовании с усреднением вероятностей при мягком голосовании

Урок 4 из 413 шагов

«Ансамбли голосования: жёсткое и мягкое голосование» — бесплатный урок Machine Learning Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Machine Learning Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Machine Learning Academy содержит 4 уроков всего.

Что такое ансамбль голосования

Ансамбль голосования объединяет прогнозы нескольких разных типов моделей — например логистической регрессии, классификатора метода k ближайших соседей и дерева решений, — чтобы получить один итоговый прогноз. В отличие от бэггинга, использующего множество копий модели одного типа, ансамбль голосования использует разнообразие архитектур моделей. Поскольку разные модели допускают разные виды ошибок, их объединение может превзойти любую отдельную модель, особенно на наборах данных, где ни один алгоритм не является безусловно лучшим.

Жёсткое голосование: большинство решает

При жёстком голосовании каждая модель голосует за метку класса, и побеждает класс, набравший больше всего голосов. Если три модели предсказывают [cat, cat, dog], ансамбль предсказывает cat. Жёсткое голосование просто и понятно, но считает все модели одинаково надёжными и не учитывает степень уверенности. Модель с уверенностью лишь 51% голосует так же, как модель с уверенностью 99%, что может привести к неоптимальным решениям при сильно различающейся уверенности моделей.

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score

X, y = load_iris(return_X_y=True)
voter = VotingClassifier(
    estimators=[
        ('lr', LogisticRegression(max_iter=1000)),
        ('knn', KNeighborsClassifier()),
        ('dt', DecisionTreeClassifier())
    ],
    voting='hard'
)
scores = cross_val_score(voter, X, y, cv=5)
print('Hard Voting CV:', scores.mean().round(4))

Мягкое голосование: усреднение вероятностей

При мягком голосовании каждая модель выдаёт вероятности классов, а не жёсткие метки. Ансамбль усредняет вероятности всех моделей и выбирает класс с наибольшей средней вероятностью. Например, если три модели назначают двум классам вероятности [0.9, 0.1], [0.7, 0.3] и [0.6, 0.4], среднее значение равно [0.73, 0.27], поэтому побеждает класс 0. Мягкое голосование обычно превосходит жёсткое, поскольку использует более полную информацию об уверенности каждой модели.

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score

X, y = load_iris(return_X_y=True)
voter = VotingClassifier(
    estimators=[
        ('lr', LogisticRegression(max_iter=1000)),
        ('knn', KNeighborsClassifier()),
        ('svc', SVC(probability=True))  # probability=True required for soft vote
    ],
    voting='soft'
)
scores = cross_val_score(voter, X, y, cv=5)
print('Soft Voting CV:', scores.mean().round(4))

Требование: все модели должны поддерживать predict_proba

Для мягкого голосования каждая модель ансамбля должна предоставлять оценки вероятностей через predict_proba(). Большинство классификаторов scikit-learn поддерживают это изначально, включая логистическую регрессию, случайный лес, KNN и наивный байесовский классификатор. Однако SVC по умолчанию не выдаёт вероятности — в конструкторе необходимо установить probability=True. Это добавляет масштабирование Платта (этап калибровки) и увеличивает время обучения. Если какая-либо модель не может выдавать вероятности, необходимо перейти к жёсткому голосованию.

Взвешивание отдельных моделей

И жёсткое, и мягкое голосование поддерживают параметр weights, позволяющий усилить влияние более точных моделей. Например, если точность логистической регрессии составляет 92%, а KNN — 85%, им можно назначить веса [2, 1]. При жёстком голосовании каждый голос учитывается столько раз, каков его вес. При мягком голосовании вектор вероятностей каждой модели умножается на её вес перед усреднением. Выбор весов на основе точности при перекрёстной проверке — простой и эффективный подход.

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score

X, y = load_breast_cancer(return_X_y=True)
voter = VotingClassifier(
    estimators=[
        ('lr', LogisticRegression(max_iter=1000)),
        ('knn', KNeighborsClassifier(n_neighbors=5)),
        ('dt', DecisionTreeClassifier(max_depth=5))
    ],
    voting='soft',
    weights=[2, 1, 1]  # Trust LR twice as much
)
print('Weighted soft vote CV:', cross_val_score(voter, X, y, cv=5).mean().round(4))

Сравнение жёсткого, мягкого голосования и отдельных моделей

Прямое сравнение отдельных моделей, жёсткого и мягкого голосования на одном и том же наборе данных позволяет ясно увидеть эффект ансамбля. В большинстве случаев мягкое голосование превосходит жёсткое, а оба метода превосходят наименее сильную отдельную модель. Однако ансамбль не всегда лучше самой сильной отдельной модели — всё зависит от степени корреляции ошибок моделей. Если все модели ошибаются на одних и тех же примерах, их объединение не даёт преимуществ.

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score

X, y = load_breast_cancer(return_X_y=True)
estimators = [('lr', LogisticRegression(max_iter=1000)), ('knn', KNeighborsClassifier()), ('dt', DecisionTreeClassifier())]
for name, est in estimators:
    print(f'{name}: {cross_val_score(est, X, y, cv=5).mean():.4f}')
for v in ['hard', 'soft']:
    vc = VotingClassifier(estimators=estimators, voting=v)
    print(f'Voting ({v}): {cross_val_score(vc, X, y, cv=5).mean():.4f}')

Выбор разнообразных моделей

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

VotingRegressor для непрерывных целевых значений

VotingRegressor применяет ту же идею к регрессии: усредняет числовые прогнозы нескольких регрессоров. Для регрессии нет понятия жёсткого и мягкого голосования — результатом всегда является взвешенное или невзвешенное среднее отдельных прогнозов. Объединение регрессии Ridge (линейной модели), случайного леса (ансамбля деревьев) и SVR (метода на основе ядер) часто превосходит любую отдельную модель на разнообразных табличных наборах данных.

from sklearn.ensemble import VotingRegressor, RandomForestRegressor
from sklearn.linear_model import Ridge
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import cross_val_score
import numpy as np

X, y = fetch_california_housing(return_X_y=True)
vr = VotingRegressor(estimators=[
    ('ridge', make_pipeline(StandardScaler(), Ridge())),
    ('rf', RandomForestRegressor(n_estimators=50, random_state=42)),
    ('svr', make_pipeline(StandardScaler(), SVR()))
])
rmse = np.sqrt(-cross_val_score(vr, X, y, scoring='neg_mean_squared_error', cv=3).mean())
print('VotingRegressor RMSE:', round(rmse, 4))

Ансамбли голосования в рабочей среде

Ансамбли голосования легко разворачивать, поскольку все модели-участники можно сериализовать вместе с оболочкой VotingClassifier с помощью joblib.dump(). Для получения прогноза необходимо запустить каждую модель-участник, поэтому задержка прогнозирования растёт линейно с числом участников. В приложениях, чувствительных к задержке, ограничьте ансамбль двумя–тремя сильными и быстрыми моделями вместо множества медленных. Всегда измеряйте время получения прогнозов как часть оценки развёртывания.

Когда ансамбли голосования не помогают

Ансамбли голосования разочаровывают, когда: (1) все модели-участники имеют одинаковые слабые места и допускают коррелированные ошибки; (2) одна модель намного превосходит остальные, а слабые модели ухудшают результат ансамбля; (3) задача содержит очень мало шума, поэтому одна хорошо настроенная модель уже почти идеально справляется; или (4) набор данных слишком мал и дополнительные возможности модели приводят лишь к переобучению. Для диагностики сравните характер ошибок отдельных моделей на проверочной выборке. Если ошибки сильно коррелируют, попробуйте заменить некоторые модели архитектурами с большим разнообразием.

Стекинг и голосование

Голосование использует фиксированное агрегирование, выбранное вручную: голосование большинства или усреднение. Стекинг (или многоуровневое обобщение) идёт дальше: метамодель обучается оптимально объединять выходы базовых моделей. Прогнозы базовых моделей вне обучающих частей становятся входными признаками для метамодели. Это добавляет гибкости: метамодель может научиться тому, что модель A надёжна на простых примерах, а модель B лучше работает на сложных. Стекинг обычно превосходит голосование, но требует более тщательной реализации, чтобы избежать утечки данных.

Быстрая проверка

Проверьте, насколько хорошо вы поняли концепции ансамблей голосования из этого урока.

Итоги урока

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

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Ансамбли голосования: жёсткое и мягкое голосование» бесплатный?

Да — полный текст урока «Ансамбли голосования: жёсткое и мягкое голосование» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Machine Learning Academy, подпишись на CoddyKit PRO. Курс Machine Learning Academy содержит 4 уроков всего.

Чему я научусь в уроке «Ансамбли голосования: жёсткое и мягкое голосование»?

Вы объедините KNN, логистическую регрессию и дерево решений в VotingClassifier и сравните большинство при жёстком голосовании с усреднением вероятностей при мягком голосовании Ты практикуешь Machine Learning Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Machine Learning Academy?

Предыдущий опыт не требуется. Machine Learning Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Ансамбли голосования: жёсткое и мягкое голосование»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Machine Learning Academy?

Да. Каждый урок Machine Learning Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Бэггинг: объяснение агрегирования с помощью бутстрепа
  2. Случайный выбор признаков: приём случайного леса
  3. Внутрилесная ошибка: бесплатная проверка внутри леса
  4. Ансамбли голосования: жёсткое и мягкое голосование
← Назад к Machine Learning Academy