Regresja logistyczna i funkcja sigmoid
Zastosuj funkcję sigmoid, aby uzyskać prawdopodobieństwa, interpretuj wynik jako pewność klasy i wytrenuj model logistyczny za pomocą scikit-learn.
Regresja logistyczna i funkcja sigmoid to bezpłatna lekcja Machine Learning Academy na CoddyKit. To lekcja 2 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.
Regresja logistyczna: klasyfikator probabilistyczny
Regresja logistyczna to podstawowy algorytm klasyfikacji binarnej. Mimo swojej nazwy jest klasyfikatorem, a nie regresorem. Rozszerza model liniowy, przepuszczając wynik przez specjalną funkcję zwaną sigmoidą, która gwarantuje, że predykcje zawsze będą prawidłowymi prawdopodobieństwami z przedziału od 0 do 1.
Regresja logistyczna jest jednym z najczęściej wdrażanych modeli ML w środowiskach produkcyjnych. Szybko się ją trenuje, jest interpretowalna i dostarcza skalibrowane oszacowania prawdopodobieństwa. Często powinna być pierwszym klasyfikatorem wypróbowanym dla nowego problemu klasyfikacji binarnej, zanim sięgną Państwo po bardziej złożone metody.
Funkcja sigmoidalna
Funkcja sigmoidalna (nazywana także funkcją logistyczną) odwzorowuje dowolną liczbę rzeczywistą na przedział (0, 1):
σ(z) = 1 / (1 + e^(-z))
Najważniejsze właściwości: σ(0) = 0,5, σ(+∞) → 1, σ(-∞) → 0. Krzywa w kształcie litery S płynnie przechodzi od 0 do 1. Gdy z jest dużą liczbą dodatnią (silny sygnał dla klasy 1), wynik zbliża się do 1. Gdy z jest dużą liczbą ujemną (silny sygnał dla klasy 0), wynik zbliża się do 0.
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(z):
return 1 / (1 + np.exp(-z))
z = np.linspace(-10, 10, 200)
y = sigmoid(z)
plt.plot(z, y, 'b-', linewidth=2)
plt.axhline(y=0.5, color='red', linestyle='--', alpha=0.5, label='threshold=0.5')
plt.axvline(x=0, color='gray', linestyle='--', alpha=0.5)
plt.xlabel('z (linear score)')
plt.ylabel('sigmoid(z) = probability')
plt.title('The Sigmoid Function')
plt.legend()
plt.show()
print('sigmoid(0):', sigmoid(0)) # 0.5
print('sigmoid(5):', sigmoid(5)) # ~0.993
print('sigmoid(-5):', sigmoid(-5)) # ~0.007Jak regresja logistyczna oblicza prawdopodobieństwo
Regresja logistyczna najpierw oblicza tę samą kombinację liniową co regresja liniowa (z = w₁x₁ + w₂x₂ + ... + b), a następnie przekazuje ją do funkcji sigmoidalnej, aby uzyskać prawdopodobieństwo:
P(y=1|x) = σ(wᵀx + b) = 1 / (1 + e^(-(wᵀx+b)))
Model zwraca prawdopodobieństwo, że dane wejściowe należą do klasy 1. Jeśli to prawdopodobieństwo przekracza 0,5, model przewiduje klasę 1; w przeciwnym razie klasę 0. Wagi w są wyznaczane podczas trenowania tak, aby maksymalizować wiarygodność zaobserwowanych etykiet — proces ten nazywa się estymacją największej wiarygodności.
import numpy as np
def logistic_predict_proba(X, weights, bias):
z = X @ weights + bias # linear score
probability = 1 / (1 + np.exp(-z)) # sigmoid
return probability
# Example: spam classification
# Features: word_count, exclamation_marks, capital_ratio
weights = np.array([0.05, 0.3, 2.0])
bias = -3.0
new_email = np.array([50, 5, 0.6]) # 50 words, 5 '!', 60% capitals
prob_spam = logistic_predict_proba(new_email, weights, bias)
print(f'P(spam): {prob_spam:.3f}')
print('Predicted label:', 1 if prob_spam >= 0.5 else 0)Log loss: właściwa funkcja kosztu
Regresja logistyczna nie używa MSE jako funkcji kosztu. Zamiast tego korzysta z binarnej entropii krzyżowej (straty logarytmicznej):
Loss = -(y × log(ŷ) + (1-y) × log(1-ŷ))
Ta funkcja niezwykle surowo karze pewne siebie, błędne predykcje. Jeśli prawdziwa etykieta to 1, a model przewiduje prawdopodobieństwo 0.001, strata logarytmiczna wynosi -log(0.001) ≈ 6.9 — to ogromna wartość. Jeśli model przewiduje 0.99, strata wynosi -log(0.99) ≈ 0.01 — bardzo mało. Taka asymetryczna kara jest dokładnie tym, czego potrzeba do kalibracji prawdopodobieństwa.
import numpy as np
def log_loss_single(y_true, y_pred_proba, epsilon=1e-9):
# Clip to avoid log(0)
p = np.clip(y_pred_proba, epsilon, 1 - epsilon)
return -(y_true * np.log(p) + (1 - y_true) * np.log(1 - p))
# True label = 1 (spam)
print('P(spam)=0.95, loss:', log_loss_single(1, 0.95).round(3)) # small
print('P(spam)=0.5, loss:', log_loss_single(1, 0.50).round(3)) # moderate
print('P(spam)=0.05, loss:', log_loss_single(1, 0.05).round(3)) # large!
print('P(spam)=0.001,loss:', log_loss_single(1, 0.001).round(3)) # very large!Trenowanie regresji logistycznej za pomocą scikit-learn
Scikit-learn's LogisticRegression uses a gradient-based optimiser (LBFGS by default) to minimise log loss and find the optimal weights. The API is identical to LinearRegression: instantiate, fit, predict.
Ważne parametry to między innymi C (odwrotność siły regularyzacji — mniejsza wartość C oznacza silniejszą regularyzację) oraz max_iter (maksymalna liczba kroków optymalizacji). Jeśli pojawi się ostrzeżenie o braku zbieżności, należy zwiększyć max_iter lub najpierw przeskalować cechy.
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Scale features (important for logistic regression)
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)
model = LogisticRegression(C=1.0, max_iter=1000)
model.fit(X_train_s, y_train)
print('Test accuracy:', model.score(X_test_s, y_test).round(3))Wyniki prawdopodobieństwa i poziom pewności
Regresja logistyczna jest jednym z niewielu klasyfikatorów, które generują dobrze skalibrowane oszacowania prawdopodobieństwa. Prawdopodobieństwo 0.85 dla klasy 1 oznacza, że mniej więcej 85% predykcji z takim poziomem pewności powinno faktycznie dotyczyć klasy 1. Taka kalibracja jest cenna w zastosowaniach związanych z zarządzaniem ryzykiem (ocena zdolności kredytowej, diagnoza medyczna), gdzie znaczenie ma samo prawdopodobieństwo, a nie tylko etykieta binarna.
Użyj predict_proba(), aby pobrać pełny wektor prawdopodobieństw. Dwie kolumny reprezentują P(class 0) i P(class 1). Ich suma zawsze wynosi 1.0.
import numpy as np
# Get class probabilities
probas = model.predict_proba(X_test_s[:8])
labels = model.predict(X_test_s[:8])
print('Sample | P(benign) | P(malignant) | Predicted')
for i, (proba, label) in enumerate(zip(probas, labels)):
print(f' {i+1} | {proba[0]:.3f} | {proba[1]:.3f} | {label}')
print('\nClass names:', model.classes_) # [0, 1] or ['benign', 'malignant']Interpretowanie współczynników regresji logistycznej
Współczynniki regresji logistycznej nie są tak bezpośrednio interpretowalne jak współczynniki regresji liniowej, ale nadal niosą istotne informacje. Współczynnik w dla cechy oznacza zmianę logarytmu szans klasy pozytywnej przy zwiększeniu wartości tej cechy o jedną jednostkę:
log(P(y=1)/P(y=0)) = wᵀx + b
Iloraz szans dla cechy wynosi exp(w). Jeśli exp(w) = 2, ta cecha podwaja szanse przynależności do klasy pozytywnej. Duże dodatnie współczynniki wskazują cechy, które silnie przewidują klasę 1; duże ujemne współczynniki silnie przewidują klasę 0.
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
feature_names = data.feature_names
# Coefficient table with odds ratios
coef_df = pd.DataFrame({
'Feature': feature_names,
'Coefficient': model.coef_[0],
'Odds_Ratio': np.exp(model.coef_[0])
}).sort_values('Coefficient', key=abs, ascending=False)
print(coef_df.head(5).to_string(index=False))
# Features with largest |coef| drive predictions most stronglyRegularyzacja w regresji logistycznej
Regresja logistyczna w scikit-learn domyślnie stosuje regularyzację L2 sterowaną parametrem C. W przeciwieństwie do większości parametrów regularyzacji wartość C jest odwrotnością siły regularyzacji: mniejsza wartość C oznacza silniejszą regularyzację (większe zmniejszenie wag), a większa wartość C oznacza słabszą regularyzację.
Użyj penalty='l1' oraz solvera 'liblinear', aby zastosować regularyzację L1, która automatycznie wybiera cechy, zerując wagi nieistotnych cech. Regresja logistyczna L1 jest szczególnie przydatna, gdy mają Państwo wiele cech i podejrzewają, że większość z nich jest nieistotna.
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
# Compare regularisation strengths
for C in [0.01, 0.1, 1.0, 10.0, 100.0]:
model_c = LogisticRegression(C=C, max_iter=1000)
scores = cross_val_score(model_c, X_train_s, y_train, cv=5)
print(f'C={C:6}: CV Accuracy = {scores.mean():.3f} (+/- {scores.std():.3f})')Raport klasyfikacji
Pojedyncza wartość dokładności ukrywa ważne informacje. Funkcja classification_report() biblioteki scikit-learn wyświetla precyzję, czułość i wynik F1 dla każdej klasy, a także średnie makro i ważone. Jest to standardowy sposób raportowania jakości klasyfikacji w badaniach i przemyśle.
Jak czytać raport: kolumna „support” pokazuje, ile przykładów każdej klasy znajduje się w zbiorze testowym. Jeśli wartości support są bardzo nierówne (niezrównoważenie klas), należy przeanalizować czułość dla poszczególnych klas zamiast ogólnej dokładności, aby zrozumieć, gdzie model popełnia błędy.
from sklearn.metrics import classification_report
y_pred = model.predict(X_test_s)
print(classification_report(y_test, y_pred, target_names=['benign', 'malignant']))
# Shows for each class:
# precision: of all predicted positive, how many were actually positive
# recall: of all actual positive, how many did we catch
# f1-score: harmonic mean of precision and recall
# support: number of true instances of each class in test setPorównanie regresji logistycznej i liniowej
Jasne porównanie, kiedy należy użyć każdego z modeli:
- Typ zmiennej docelowej: regresja liniowa → liczba ciągła; regresja logistyczna → prawdopodobieństwo / etykieta binarna.
- Zakres wyników: liniowa → (-∞, +∞); logistyczna → (0, 1).
- Funkcja straty: liniowa → MSE; logistyczna → binarna entropia krzyżowa (strata logarytmiczna).
- Ocena: liniowa → RMSE, R²; logistyczna → Accuracy, F1, AUC-ROC.
- Wspólna właściwość: oba modele są liniowe — granicą decyzyjną jest hiperpłaszczyzna, a oba modele korzystają na skalowaniu cech i regularyzacji.
Wieloklasowa regresja logistyczna
W przypadku problemów obejmujących więcej niż dwie klasy regresję logistyczną uogólnia się do regresji Softmax (nazywanej także wielomianową regresją logistyczną). Zamiast jednej funkcji sigmoidalnej model oblicza jeden wynik liniowy dla każdej klasy, a następnie przekazuje je wszystkie do funkcji softmax, uzyskując rozkład prawdopodobieństwa dla wszystkich klas.
W scikit-learn należy ustawić multi_class='multinomial' i użyć solvera 'lbfgs' lub 'saga'. Model zwraca prawdopodobieństwo dla każdej klasy, a przewidywaną klasą jest ta o najwyższym prawdopodobieństwie.
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train_s = StandardScaler().fit_transform(X_train)
X_test_s = StandardScaler().fit_transform(X_test)
# Multinomial for 3 classes
model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=1000)
model.fit(X_train_s, y_train)
print('Test accuracy:', model.score(X_test_s, y_test).round(3))
print('Proba shape:', model.predict_proba(X_test_s[:1]).shape) # (1, 3)Szybkie sprawdzenie
Sprawdź swoją znajomość zagadnień uczenia maszynowego w Pythonie przedstawionych w tej lekcji.
Podsumowanie lekcji
W tej lekcji nauczyli się Państwo, że: funkcja sigmoidalna przekształca dowolny wynik liniowy w prawidłowe prawdopodobieństwo z przedziału od 0 do 1, regresja logistyczna używa funkcji straty opartej na binarnej entropii krzyżowej, która surowo karze pewne siebie, błędne predykcje, a współczynniki reprezentują zmiany logarytmu szans, przy czym iloraz szans exp(w) zapewnia bardziej intuicyjną interpretację niezależną od skali. W następnej części zbudujemy macierz pomyłek na podstawie predykcji i wartości rzeczywistych, uzyskując szczegółowy obraz tego, gdzie klasyfikator działa poprawnie, a gdzie się myli.
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 „Regresja logistyczna i funkcja sigmoid” jest bezpłatna?
Tak — pełny tekst „Regresja logistyczna i funkcja sigmoid” 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 „Regresja logistyczna i funkcja sigmoid”?
Zastosuj funkcję sigmoid, aby uzyskać prawdopodobieństwa, interpretuj wynik jako pewność klasy i wytrenuj model logistyczny za pomocą scikit-learn. Ć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 2 z 4.
Ile czasu zajmuje lekcja „Regresja logistyczna i funkcja sigmoid”?
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
- Od regresji do klasyfikacji: decyzje progowe
- Regresja logistyczna i funkcja sigmoid
- Macierz pomyłek wyjaśniona
- Precyzja, czułość i F1-score w praktyce