Machine Learning Academy · Lekcja

Zespoły głosujące: głosowanie twarde a miękkie

Połącz KNN, regresję logistyczną i drzewo decyzyjne w VotingClassifier oraz porównaj głosowanie większościowe z uśrednianiem prawdopodobieństw.

Lekcja 4 z 413 kroki

Zespoły głosujące: głosowanie twarde a miękkie to bezpłatna lekcja Machine Learning Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Machine Learning Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Machine Learning Academy zawiera 4 lekcji w sumie.

Czym jest zespół głosujący?

Zespół głosujący łączy predykcje kilku różnych typów modeli — takich jak regresja logistyczna, klasyfikator k-najbliższych sąsiadów i drzewo decyzyjne — aby wygenerować pojedynczą końcową predykcję. W przeciwieństwie do baggingu, który wykorzystuje wiele kopii tego samego typu modelu, zespół głosujący korzysta ze zróżnicowania architektur modeli. Ponieważ różne modele popełniają różne rodzaje błędów, ich połączenie może działać lepiej niż każdy pojedynczy model, zwłaszcza na zbiorach danych, na których żaden algorytm nie dominuje.

Głosowanie twarde: decyduje większość

W przypadku głosowania twardego każdy model głosuje na etykietę klasy, a wygrywa klasa, która otrzyma najwięcej głosów. Jeśli trzy modele przewidują [cat, cat, dog], zespół przewiduje cat. Głosowanie twarde jest proste i łatwe do interpretacji, ale traktuje wszystkie modele jako równie wiarygodne i ignoruje poziom pewności. Model mający zaledwie 51% pewności głosuje tak samo jak model mający 99% pewności, co może prowadzić do nieoptymalnych decyzji, gdy poziomy pewności modeli znacznie się różnią.

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))

Głosowanie miękkie: uśrednianie prawdopodobieństw

W przypadku głosowania miękkiego każdy model zwraca prawdopodobieństwa klas zamiast sztywnych etykiet. Zespół uśrednia prawdopodobieństwa ze wszystkich modeli i wybiera klasę o najwyższym średnim prawdopodobieństwie. Jeśli trzy modele przypisują dwóm klasom prawdopodobieństwa [0.9, 0.1], [0.7, 0.3] i [0.6, 0.4], średnia wynosi [0.73, 0.27], więc wygrywa klasa 0. Głosowanie miękkie zazwyczaj przewyższa głosowanie twarde, ponieważ wykorzystuje bogatsze informacje o pewności każdego modelu.

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))

Wymaganie: wszystkie modele muszą obsługiwać predict_proba

Głosowanie miękkie wymaga, aby każdy model w zespole dostarczał oszacowania prawdopodobieństw za pomocą predict_proba(). Większość klasyfikatorów scikit-learn obsługuje to natywnie (regresja logistyczna, las losowy, KNN, naiwny Bayes). Jednak SVC domyślnie nie zwraca prawdopodobieństw — w konstruktorze trzeba ustawić probability=True, co dodaje skalowanie Platta (etap kalibracji) i wydłuża czas trenowania. Jeśli którykolwiek model nie potrafi generować prawdopodobieństw, należy zastosować głosowanie twarde.

Ważenie poszczególnych modeli

Zarówno głosowanie twarde, jak i miękkie obsługują parametr weights, który pozwala nadać większy wpływ dokładniejszym modelom. Jeśli na przykład regresja logistyczna ma dokładność 92%, a KNN 85%, można przypisać im wagi [2, 1]. W głosowaniu twardym każdy głos jest powielany zgodnie z jego wagą. W głosowaniu miękkim wektor prawdopodobieństw każdego modelu jest przed uśrednieniem mnożony przez jego wagę. Wybór wag na podstawie dokładności uzyskanej w walidacji krzyżowej to proste i skuteczne podejście.

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))

Porównanie modeli: twarde, miękkie i pojedyncze

Bezpośrednie porównanie pojedynczych modeli, głosowania twardego i miękkiego na tym samym zbiorze danych wyraźnie pokazuje efekt działania zespołu. W większości przypadków głosowanie miękkie przewyższa twarde, a oba podejścia przewyższają najsłabszy pojedynczy model. Zespół nie zawsze musi jednak pokonać najsilniejszego pojedynczego modelu — zależy to od stopnia korelacji błędów modeli. Jeśli wszystkie modele zawodzą na tych samych przykładach, ich łączenie nie przynosi korzyści.

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}')

Wybór modeli pod kątem różnorodności

Kluczem do skutecznego zespołu głosującego jest różnorodność modeli. Połączenie trzech regresji logistycznych z różnymi wartościami ziarna losowego daje niemal żadną korzyść — wszystkie popełnią te same błędy. Najskuteczniejsze zespoły łączą modele o różnych założeniach indukcyjnych: model liniowy (regresję logistyczną), model oparty na przykładach (KNN), model drzewiasty (las losowy) oraz opcjonalnie model oparty na jądrze (SVM). Każdy z nich postrzega dane z innej perspektywy i popełnia odmienne błędy, które uśrednianie pomaga wzajemnie zniwelować.

VotingRegressor dla celów ciągłych

VotingRegressor stosuje tę samą ideę do regresji: uśrednia wartości liczbowe przewidywane przez wiele regresorów. W regresji nie ma pojęcia głosowania twardego ani miękkiego — wynik jest zawsze średnią ważoną lub nieważoną poszczególnych predykcji. Połączenie regresji Ridge (liniowej), lasu losowego (zespołu drzew) i SVR (metody opartej na jądrze) często daje lepsze wyniki niż dowolny pojedynczy model na różnorodnych tabelarycznych zbiorach danych.

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))

Zespoły głosujące na produkcji

Zespoły głosujące łatwo wdrażać, ponieważ wszystkie modele składowe można serializować wraz z opakowaniem VotingClassifier za pomocą joblib.dump(). Wnioskowanie wymaga uruchomienia każdego modelu składowego, dlatego opóźnienie predykcji rośnie liniowo wraz z liczbą modeli. W aplikacjach wrażliwych na opóźnienia należy ograniczyć zespół do 2–3 silnych i szybkich modeli zamiast dodawać wiele wolnych modeli. Podczas oceny wdrożenia należy zawsze mierzyć czas wnioskowania.

Kiedy zespoły głosujące nie pomagają

Zespoły głosujące zawodzą, gdy: (1) wszystkie modele składowe mają te same ograniczenia i popełniają skorelowane błędy; (2) jeden model zdecydowanie przewyższa pozostałe, a słabsze modele obniżają wynik zespołu; (3) zadanie charakteryzuje się bardzo małym szumem, więc pojedynczy dobrze dostrojony model już osiąga niemal idealne wyniki; lub (4) zbiór danych jest zbyt mały i dodatkowa złożoność modelu prowadzi jedynie do przeuczenia. Diagnozę należy rozpocząć od porównania wzorców błędów poszczególnych modeli na zbiorze walidacyjnym — jeśli błędy są silnie skorelowane, warto zastąpić niektóre modele architekturami bardziej zróżnicowanymi.

Stacking a głosowanie

Głosowanie wykorzystuje ustaloną, ręcznie wybraną agregację (głosowanie większościowe lub średnią). Stacking (czyli generalizacja wielopoziomowa) idzie dalej: meta-uczeń jest trenowany tak, aby optymalnie łączyć wyniki modeli bazowych. Predykcje modeli bazowych uzyskane poza foldem stają się cechami wejściowymi meta-ucznia. Zwiększa to elastyczność — meta-uczeń może nauczyć się, że model A jest wiarygodny dla łatwych przykładów, a model B lepiej radzi sobie z trudnymi. Stacking zazwyczaj przewyższa głosowanie, ale wymaga staranniejszej implementacji, aby uniknąć wycieku danych.

Szybkie sprawdzenie

Sprawdź swoje rozumienie pojęć związanych z zespołami głosującymi omówionych w tej lekcji.

Podsumowanie lekcji

W tej lekcji nauczyli się Państwo, że: zespoły głosujące łączą różne typy modeli, aby ograniczyć skorelowane błędy, głosowanie twarde wykorzystuje większościowe etykiety, a miękkie uśrednia oszacowania prawdopodobieństw, a różnorodność modeli jest kluczowym składnikiem skutecznego zespołu głosującego. Następnie omówimy maszyny wektorów nośnych i klasyfikator o maksymalnym marginesie.

Bezpłatny start

Ucz się Python dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
30
Lekcje
120

Często zadawane pytania

Czy lekcja „Zespoły głosujące: głosowanie twarde a miękkie” jest bezpłatna?

Tak — pełny tekst „Zespoły głosujące: głosowanie twarde a miękkie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Machine Learning Academy, przejdź na CoddyKit PRO. Kurs Machine Learning Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Zespoły głosujące: głosowanie twarde a miękkie”?

Połącz KNN, regresję logistyczną i drzewo decyzyjne w VotingClassifier oraz porównaj głosowanie większościowe z uśrednianiem prawdopodobieństw. Ćwiczysz Machine Learning Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Machine Learning Academy?

Nie wymagamy żadnego doświadczenia. Machine Learning Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Zespoły głosujące: głosowanie twarde a miękkie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Machine Learning Academy?

Tak. Każda lekcja Machine Learning Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Agregacja bootstrapowa (bagging) wyjaśniona
  2. Losowy wybór cech: sztuczka Random Forest
  3. Błąd out-of-bag: bezpłatna walidacja wewnątrz lasu
  4. Zespoły głosujące: głosowanie twarde a miękkie
← Powrót do Machine Learning Academy