Jak działa regresja logistyczna?

miroslawmamczur.pl 1 rok temu

– Tato, możemy przed czytaniem obejrzeć jeszcze bajkę na dobranoc? – zapytała Jagódka.

– Tak, teraz nasza kolej! – twardo domagała się Otylka.

– Zobaczę tylko ostatnią scenę z tego filmu i już oddaję Wam pilota – powiedziałem wpatrzony z wypiekami w ekran.

– Tatusiu, a dlaczego oglądasz tak stary film? Już go przecież widziałeś kilka razy – zapytała Jagódka.

– Przecież to Gwiezdne Wojny! Klasyka filmów science-fiction! Aby wiedzieć jak powinien wyglądać taki rodzaj, to trzeba znać tę serię – powiedziałem oburzony.

– My tam wolimy bajki – odpowiedziały z uśmiechem dziewczynki.

Czy kiedykolwiek zdarzyło Ci się usłyszeć, iż warto znać klasykę? Pewnie nie raz od różnych osób i w różnym kontekście, jak chociażby moje dziewczyny w kontekście filmów.

W świecie Machine Learning i Data Science także istnieje „klasyka” – modele, które stanowią podstawę dla większości dzisiejszych algorytmów. Jednym z takich modeli jest regresja logistyczna – jeden z najważniejszych modeli w Machine Learning, który sprawia, iż możemy dokładnie przewidzieć, co i z jakim prawdopodobieństwem się wydarzy.

Dzięki regresji logistycznej mamy moc przewidywania przyszłości jak Luke Skywalker, który musiał przewidzieć ruchy swojego przeciwnika, aby zwyciężyć w walce z Darth Vaderem. Możemy otrzymać precyzyjne wyniki, na podstawie których podejmujemy decyzje. Jest to narzędzie, które warto poznać, tak jak warto obejrzeć Gwiezdne Wojny, by zrozumieć, jak powinien wyglądać dobry film science-fiction.

Tak więc jeżeli nie znasz podstaw tajników walki mieczem świetlnym (czytaj regresji logistycznej), to zapraszam Cię w tę podróż!

Uwaga! Zanim przejdziesz dalej warto byłoby przypomnieć sobie jak działa REGRESJA LINIOWA.

Problem w regresji liniowej

Jak pamiętacie z wcześniejszego wpisu na blogu zadaniem regresji liniowej jest po prostu dopasowanie prostej do danych. Jest to bardzo łatwe narzędzie do przewidywania zmiennych ilościowych.

Ale co należy zrobić, jeżeli chcemy przewidzieć tylko dwie wartości? Na przykład czy umrzemy w ciągu kolejnych 10 lat? Albo czy nasz sąsiad odda nam pieniądze z odsetkami, czy nie?

W tym przypadku widzimy, iż wyniki dla takiej regresji liniowej rosną do +/- nieskończoności. A tak naprawdę zależy nam, aby dążyły do wartości od 0 do 1. Zatem potrzebujemy funkcji, która nam to zapewni.

Funkcja logistyczna

Funkcja logistyczna (zwana również sigmoidalną) to funkcja matematyczna, która przekształca dowolną wartość wejściową do wartości z przedziału (0, 1). Jest często wykorzystywana w różnych dziedzinach matematyki i jest wyrażana wzorem:

gdzie:

  • x jest wartością zmiennej niezależnej,
  • e jest liczbą Eulera (około 2,71828),
  • f(x) jest wartością zmiennej zależnej.

W kontekście uczenia maszynowego funkcję logistyczną wykorzystujemy często jako jedną z funkcji aktywacji lub w regresji logistycznej do przewidywania prawdopodobieństwa, czy dany obiekt należy do jednej z dwóch klas (np. „tak” lub „nie”, „0” lub „1”).

Regresja logistyczna

Regresja logistyczna jest prostym i jednocześnie bardzo skutecznym algorytmem klasyfikacji.

Model regresji logistycznej przyjmuje równanie liniowe jako dane wejściowe i wykorzystuje funkcję logistyczną do wykonania zadania klasyfikacji binarnej.

Wizualnie wygląda to tak:

Powyższa krzywa w kształcie litery “S” pozwala nam odczytać, jakie jest prawdopodobieństwo tego, czy umrzemy w ciągu 10 najbliższych lat z założeniem konkretnego wieku.

Jeśli podamy bardzo wysoki wiek, to prawdopodobieństwo tego, iż umrzemy w tym czasie jest bardzo wysokie. A dla młodego wieku jest odpowiednio niższe.

Zatem nasz model regresji logistycznej przewidującej prawdopodobieństwo śmierci w ciągu kolejnych 10 lat na podstawie wieku wygląda tak:

Oczywiście, aby model działał lepiej, należy dostarczyć większą liczbę cech niosących za sobą informacje do predykcji zmiennej. Nie wiesz, jak wybrać odpowiednie zmienne? Możesz o tym poczytać TUTAJ (link).

Możemy dodać do naszego zbioru dodatkowe zmienne na przykład “czy_pali” (domyślnie papierosy) i wówczas wzór zostałby rozbudowany do poniższej postaci:

Uwaga! Zapamiętaj, iż regresja logistyczna to klasyfikacja.

Próg odcięcia (ang. treshold)

Jak widać regresja logistyczna zwraca nam prawdopodobieństwo występowania pewnego zdarzenia. Ale my mieliśmy do zaadresowania problem klasyfikacji, czyli czy dana osoba przeżyje kolejne 10 lat czy nie. Pomaga nam w tym próg odcięcia.

Progiem odcięcia (ang. threshold) w modelu regresji logistycznej nazywamy wartość, powyżej której przypisujemy obserwację do jednej klasy, a poniżej której do drugiej klasy. Jest to punkt graniczny, który pozwala na dokonanie decyzji o przynależności danego obiektu do jednej z klas na podstawie wartości przewidywanego prawdopodobieństwa.

Domyślnie w większości implementacji regresji logistycznej próg odcięcia wynosi 0,5 (czyli 50%). Oznacza to, iż wszystkie obserwacje, dla których przewidywane prawdopodobieństwo przynależności do jednej z klas jest większe niż 0,5, zostaną przypisane do tej klasy, a pozostałe do drugiej.

Warto pamiętać, iż wybór wartości progu odcięcia zależy od konkretnego zastosowania i powinien być ustalany na podstawie biznesowych metryk. Zauważ też, iż wybór progu odcięcia wpływa na jakość niektórych metryk (np. recall, accurancy, precision).

No dobra, już wiemy jak działa regresja. To teraz kolejne ważne pytanie: jak wybierane są parametry w modelu regresji logistycznej?

Regresja logistyczna – jak optymalizujemy parametry?

W przypadku regresji liniowej mogliśmy posłużyć się na przykład metodą najmniejszych kwadratów, aby znaleźć optymalne parametry. A następnie wyliczyć współczynnik determinacji (R2) mówiący o jakości dopasowania modelu.

W przypadku regresji logistycznej nie możemy wykorzystać tych metod. Możemy natomiast wykorzystać metodę największej wiarygodności (ang. maximum likelihood).

Metoda największej wiarygodności, czyli Maximum Likelihood (MLE)

Algorytm Maximum Likelihood (MLE) to metoda, która pomaga nam znaleźć najlepsze wartości parametrów w modelach matematycznych, które opisują nasze dane.

Funkcja wiarygodności to funkcja opisująca prawdopodobieństwo obserwacji danych dla różnych wartości parametrów modelu. MLE szuka takich wartości parametrów, które maksymalizują tę funkcję wiarygodności, czyli takich, dla których obserwowane dane są najbardziej prawdopodobne.

Idea działania Maximum Likelihood (MLE)

MLE działa tak, iż bada różne wartości parametrów i oblicza, jak prawdopodobne są nasze dane dla każdej z tych wartości.

Weźmy nasz wcześniejszy przykład z wiekiem i prawdopodobieństwem śmierci w ciągu najbliższych 10 lat i narysujmy pierwszą krzywą dla parametrów theta_0 i theta_1.

Następnie wyliczamy prawdopodobieństwa wystąpienia dla każdej obserwacji, mnożymy je i mamy wyliczoną wartość funkcji wiarygodności dla zadanej krzywej (czyli modelu z odpowiednimi parametrami).

Teraz przesuwamy odrobinkę krzywą dla innych parametrów i powtarzamy wyliczenie wartości funkcji wiarygodności dla niej. I tak w kółko.

I ostatecznie wybieramy krzywą z największą wartością likelihood.

Gradient i learning rate

Mówiąc powyżej, iż przesuwamy odrobinkę krzywą, był to duży skrót myślowy, aby uprościć ideę działania algorytmu. Wchodząc bardziej w szczegóły, to w algorytmach najczęściej wyliczamy gradient funkcji wiarygodności.

Jest to wektor zawierający pochodne cząstkowe funkcji wiarygodności względem każdego z parametrów. Ten wektor pozwala na określenie kierunku, w którym funkcja ta rośnie najszybciej, a zatem w którym powinny być dokonywane zmiany wartości parametrów, aby osiągnąć maksimum funkcji.

Krok uczenia (ang. learning rate) to parametr algorytmu, który określa jak duże są zmiany wartości parametrów dokonywane w każdej iteracji. jeżeli krok uczenia jest zbyt mały, to algorytm może działać zbyt wolno lub zatrzymać się w minimum lokalnym. Natomiast, jeżeli krok uczenia jest zbyt duży, to algorytm może nie osiągnąć maksimum funkcji, ponieważ zbyt gwałtownie „przeskoczy” punkt, w którym funkcja ta osiąga maksimum.

Algorytm MLE używający gradientu i kroku uczenia optymalizuje funkcję wiarygodności poprzez iteracyjne aktualizowanie wartości parametrów w kierunku maksimum funkcji. Proces ten powtarzamy, aż wartość funkcji wiarygodności przestaje się poprawiać lub osiągniemy ustaloną iterację.

A jak wyliczyć funkcję wiarygodności?

Dla modelu regresji logistycznej funkcja wiarygodności może być zapisana w postaci:

gdzie:

  • θ to wektor wartości parametrów modelu,
  • y to wektor wartości zmiennej objaśnianej przyjmującej wartość 0 lub 1,
  • X to macierz zmiennych objaśniających,
  • i to numer obserwacji,
  • P(y_i=1 | X_i, θ) to prawdopodobieństwo, iż dla i-tej obserwacji y przyjmuje wartość 1, przy założeniu wartości zmiennej niezależnej X_i oraz wartości parametrów regresji logistycznej.

Zatem liczymy powyższy iloczyn dla wszystkich obserwacji, które mamy i szukamy maksymalnej wartości dla różnych parametrów θ.

W przypadku naszego prostego przykładu z wiekiem doprecyzujmy, iż prawdopodobieństwo możemy zapisać jako funkcję sigmoidalną, zdefiniowaną jako:

Super, już wiemy jak optymalizujemy i szukamy parametrów dla naszego modelu.

Prosty przykład w PYTHON

Stwórzmy prościutki i krótki kod w python, by zobaczyć jak będą wyglądały parametry dla modelu. Przykład od początku do końca z budową karty skoringowej przy pomocji regresji logistycznej pokaże Wam w jednym z kolejnych wpisów.

Zacznijmy od wczytania bibliotek (macie napisane wersje gdybyście chcieli odtworzyć kody i środowisko).

import pandas as pd import math from sklearn.linear_model import LogisticRegression from platform import python_version from sklearn import __version__ as sklearn_ver from statsmodels import __version__ as statsmodels_ver print(f'python: {python_version()}') print(f'\npandas: {pd.__version__}') print(f'sklearn: {sklearn_ver}') print(f'statsmodels: {statsmodels_ver}')

Wczytujemy przygotowane przeze mnie dane:

df = pd.read_excel('../data/data.xlsx') df.head(3)

A teraz zbudujmy model na podstawie jednej zmiennej opisowej (age):

X = df[['age']] y = df['target'] model = LogisticRegression() model.fit(X, y) # probability of death age_to_predict = 30 model.predict_proba([[age_to_predict]])[:,1]

Pamiętacie powyższy wzór na prawdopodobieństwo z parametrami θ? Wyciągnijmy te zmienne z modelu i podstawmy pod wzór, by mieć pewność, iż był poprawny.

theta0 = model.intercept_[0] theta1 = model.coef_[0][0] print(f'theta1={round(theta1,3)}; theta0 ={round(theta0,3)}') # probability of death from math formula round(1/(1+math.exp(-(age_to_predict*theta1+theta0))),8)

Super! Mamy to!

W klasycznym podejściu regresji logistycznej bardzo często mamy jeszcze parametry z-score i p-wartości. Niestety do dzisiaj w bibliotece sklearn nie doczekaliśmy się ich jeszcze. Skorzystajmy zatem z innej biblioteki statsmodels by móc się im przyjrzeć, a następnie przeanalizować i lepiej zje rozumieć.

import statsmodels.api as sm X = df[['age']] y = df['target'] X = sm.add_constant(X) model = sm.Logit(y,X) result = model.fit() print(result.summary())

Interpretacja współczynników modelu

Mamy wyliczony prosty model dla naszego przykładu. Spróbujmy zinterpretować jeszcze jego wyniki.

W regresji logistycznej, współczynniki regresji (coef) odpowiadają za ilościową zmianę w logarytmie szans zmiennej objaśnianej (y), która jest wyjaśniana przez zmienne niezależne (X).

Logarytm szans (ang. log odds)

Logarytm szans w regresji logistycznej, to logarytm ilorazu prawdopodobieństwa sukcesu do prawdopodobieństwa niepowodzenia, który jest wykorzystywany do modelowania prawdopodobieństwa sukcesu w zależności od zmiennych niezależnych.

W regresji logistycznej każde prawdopodobieństwo lub możliwy wynik zmiennej zależnej można przekształcić w logarytm szans, znajdując iloraz szans.

Uwaga! Szansa a prawdopodobieństwo to coś innego! Szansa to stosunek tego, co się dzieje, do tego, co się nie dzieje. A prawdopodobieństwo to stosunek tego, co się dzieje, do wszystkiego, co może się wydarzyć.

Współczynnik regresji dla wieku wynosi 0.56. Zmienna coef dla zmiennej niezależnej oznacza, jak bardzo ta zmienna oddziałuje na zmienną objaśnianą w analizie regresji logistycznej. Im większa wartość współczynnika, tym większy wpływ na zmienną objaśnianą.

Wartości współczynnika możemy też wykorzystać do określenia kierunku wpływu zmiennej niezależnej na zmienną objaśnianą. Współczynnik dodatni oznacza, iż zwiększenie zmiennej niezależnej prowadzi do zwiększenia wartości zmiennej objaśnianej, a współczynnik ujemny oznacza, iż zwiększenie zmiennej niezależnej prowadzi do zmniejszenia przewidywanego prawdopodobieństwa.

Współczynniki regresji logistycznej można wykorzystać do oszacowania szansy (odds) sukcesu lub niepowodzenia w modelu, w zależności od wartości zmiennych niezależnych. Aby oszacować szansę (ang. odds) dla danej wartości zmiennej niezależnej, należy pomnożyć wartość zmiennej niezależnej przez współczynnik regresji i dodać stałą.

W naszym przypadku będzie to:

Zatem dla wieku 30 lat (i naszych danych na których wytrenowaliśmy model) szansa na śmierć w ciągu kolejnych 10 lat będzie niecałe 2 razy mniejsza niż średnia. Natomiast 100 latek będzie miał 2 razy wyższą szansę na śmierć.

Test Walda

Podczas wyliczania regresji w bibliotece statmodel mamy podane dodatkowe parametry.

Pierwszym z nich jest odchylenie standardowe, które mówi, jak szeroko wartości jakiejś wielkości (na przykład wieku) są rozrzucone wokół jej średniej.

Drugim parametrem jest wartość *z (*częściej zwana też z-score). Jest to po prostu iloraz współczynnika (coef) i odchylania (std err). Innymi słowy wartość z-score to po prostu liczba odchyleń standardowych od wartości 0 dla rozkładu normalnego.

Mając wyliczony z-score na podstawie rozkładu normalnego, obliczana jest p-wartość, która informuje nas o tym, jakie jest prawdopodobieństwo uzyskania danej wartości z-score lub większej/ mniejszej, gdyby hipoteza zerowa (czyli brak istotności współczynnika regresji) była prawdziwa.

Jeśli p-wartość jest mniejsza od przyjętego poziomu istotności alfa (najczęściej 0.005), to odrzucamy hipotezę zerową i uważamy, iż istnieje istotna różnica między wartością oszacowanego współczynnika a wartością oczekiwaną, czyli zerem. Z kolei, jeżeli p-wartość jest większa od alfy, to nie ma podstaw do odrzucenia hipotezy zerowej i stwierdzamy, iż brak jest istotnej różnicy między wartością oszacowanego współczynnika a wartością oczekiwaną.

I to jest właśnie test Walda. W naszym przypadku p-wartość dla wieku wyniosła 0. Zatem jest uznawana za istotną na poziomie istotności alfa = 0.05.

A co jakbyśmy dodali inną zmienną np. czy ktoś pali?

# create model for 2 variables X = df[['age', 'smoke']] y = df['target'] X = sm.add_constant(X) model = sm.Logit(y,X) result = model.fit() print(result.summary())

W tym przypadku p-wartość dla palenia wyniosła 0.098. Zatem nie jest uznawana za istotną na poziomie istotności alfa = 0.05, ale może być istotna na wyższym poziomie istotności (np. alfa = 0.1).

Należy jednak pamiętać, iż interpretacja p-wartości jest zawsze względna i zależy od wybranej wartości poziomu istotności oraz liczby próbek w badaniu. Ponadto, ocena istotności wpływu poszczególnych zmiennych powinna być wykonywana w kontekście całego modelu, a nie tylko dla pojedynczych zmiennych.

Wykres log odds

Teraz możemy wykorzystać funkcję logit, aby przerobić nasz wcześniejszy wykres na wykres liniowy.

Wykres log odds to graficzna reprezentacja zależności między wartościami logarytmów oddsów (logitów) a wartościami zmiennej niezależnej w analizie regresji logistycznej. Wykres log odds może pomóc w zrozumieniu, jak zmiana wartości zmiennej niezależnej wpływa na prawdopodobieństwo sukcesu lub niepowodzenia w modelu regresji logistycznej.

Na obu wykresach mamy naszą najlepszą funkcję pasujacą do danych wybranych dzięki maksymalnej wiarygodności.

Jeśli nasze prawdopodobieństwa z modelu będą układać się w wzdłuż linii z modelem oznacza to, iż model dobrze dopasował się do danych.

Interpretacja graficzna

Współczynniki modelu, które otrzymujemy, możemy narysować na wykresie logitowym:

Wyraz wolny jest ujemny. Można to tłumaczyć tak, iż jeżeli dopiero się urodziłeś, to masz znikome szanse na to, aby nie przeżyć kolejnych 10 lat!

Założenia, czyli o czym musisz pamiętać!

1. Zmienna zależna jest binarna lub kategoryczna.

Głównym założeniem regresji logistycznej jest to, iż zmienne odpowiedzi mogą przyjmować dwa możliwe wyniki. Na przykład: chory/zdrowy, 0/1, kobieta/mężczyzna, lewo/prawo, kupi/nie kupi, spłaci/nie spłaci.

Wraz z rozwojem stworzono również modyfikacje podstawowego algorytmu regresji zwanej wielomianową regresją logistyczną, która pozwala przewidywać więcej stanów niż dwa, np. pozytywny/neutralny/negatywny.

2. Brak współliniowości między zmiennymi wyjaśniającymi

Jeśli zmienne objaśniające są silnie skorelowane między sobą (tj. występuje tzw. współliniowość), to otrzymane wyniki modelu mogą być niestabilne i trudne do interpretacji. Współliniowość może prowadzić do błędnych wniosków na temat wpływu poszczególnych zmiennych objaśniających na zmienną zależną oraz do przeszacowania istotności niektórych zmiennych objaśniających.

Na przykład, jeżeli zmienna doświadczenie zawodowe jest zależna od zmiennej wiek, a zmienna wiek jest jednym z czynników objaśniających, to wyniki modelu mogą sugerować, iż zmienna wiek ma wpływ na przewidywanie dochodu, podczas gdy w rzeczywistości to zmienna doświadczenie zawodowe ma większy wpływ.

3. Wartości odstające

Kolejnym krytycznym założeniem dla regresji logistycznej jest konieczność pozbycia się wartości odstających w zbiorze danych, ponieważ mocno będą zaburzać dobierane parametry modelu θ.

4. Preferowany większy rozmiar próby

Regresja logistyczna daje wiarygodne i stabilne wyniki, gdy bierze się pod uwagę większy rozmiar próby zbioru danych.

Zwykle zaleca się, aby liczba przypadków (zarówno pozytywnych jak i negatywnych) w próbie była co najmniej dziesięciokrotnie większa niż liczba zmiennych objaśniających. Zatem przy budowie modelu z 10 zmiennymi oznaczałoby, iż powinno być co najmniej po 100 przypadków dla każdej klasy.

Jednakże, zalecana minimalna liczba przypadków może być różna w zależności od kontekstu badawczego oraz stopnia złożoności modelu oraz rodzajów zmiennych.

5. Monotoniczność zmiennych

Regresja logistyczna wymaga, aby zmienne objaśniające miały liniowy lub logarytmiczny wpływ na logarytm szansy. Na przykład wraz z wiekiem mamy coraz mniejszą szanse na przeżycie kolejnych 10 lat.

W przypadku, gdy zmienne objaśniające nie spełniają założeń modelu regresji logistycznej, konieczne jest zastosowanie odpowiednich przekształceń lub modeli nieliniowych, aby poprawić jakość modelowania i uniknąć błędnej interpretacji efektów.

Na przykład zmienne ciągłe można pokateryzować w koszyki. Na przykład zamiast zmiennej ciągłej wiek, dać zmienną wiek przyjmującą 5 wartości: ≤18, 18-25, 26-40, 40-65, 65+ i sprawdzić czy wówczas zmienna jest monotoniczna.

W przypadku zmiennych kategorycznych warto zastosować one-hot-encoder lub label encoder zgodny z rosnącym prawdopodobieństwem wartości zmiennej.

Podsumowanie

Uff. jeżeli dotarliście aż tutaj, to mam nadzieję, iż odczarowałem dla Was czym jest regresja logistyczna.

W końcu regresja logistyczna to nic innego jak gotowanie, tylko zamiast składników mamy zmienne objaśniające, a zamiast dania gotowego model. Ważne, żeby każdy składnik (czyli zmienna) był odpowiednio dobrany i zbalansowany, tak jak w przypadku przypraw w kuchni.

A kiedy już wszystko się uda i nasz model jest gotowy, możemy cieszyć się smakiem sukcesu i przekonaniem, iż nasz przepis na sukces jest jedynie nasz!

Pozdrawiam z całego serducha,

Bibliografia

  1. https://www.youtube.com/embed/yIYKR4sgzI8
  2. https://en.wikipedia.org/wiki/Linear_regression
  3. https://www.spiceworks.com/tech/artificial-intelligence/articles/what-is-logistic-regression/
  4. http://prac.im.pwr.wroc.pl/~sobczyk/dydaktyka/regresja_logistyczna_dane.pdf
  5. https://www.kartydatascience.pl/
  6. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
Idź do oryginalnego materiału