Logistic Regression – A Complete Tutorial With Examples in R

Regresja logistyczna jest algorytmem modelowania predykcyjnego, który jest używany, gdy zmienna Y jest binarna kategoryczna. To znaczy, że może przyjąć tylko dwie wartości, takie jak 1 lub 0. Celem jest określenie równania matematycznego, które może być użyte do przewidywania prawdopodobieństwa zdarzenia 1. Po ustaleniu równania można go użyć do przewidywania Y, gdy znane są tylko X.

Logistic Regression – A Complete Tutorial With Examples in R Contents1. Wprowadzenie do regresji logistycznej
2. Kilka rzeczywistych przykładów problemów z klasyfikacją binarną
3. Dlaczego nie regresja liniowa?
4. Równanie logistyczne
5. Jak zbudować model regresji logistycznej w R?
6. Jak radzić sobie z nierównowagą klas?
7. Jak radzić sobie z nierównowagą klas za pomocą próbkowania z plusem i minusem?
8. Budowanie modelu regresji logistycznej
9. Jak przewidywać na zbiorze danych testowych
10. Dlaczego radzenie sobie z nierównowagą klas jest ważne?
11. Wnioski

1. Wprowadzenie do regresji logistycznej

Wcześniej dowiedziałeś się czym jest regresja liniowa i jak jej używać do przewidywania ciągłych zmiennych Y.

W regresji liniowej zmienna Y jest zawsze zmienną ciągłą. Jeśli załóżmy, że zmienna Y jest kategoryczna, nie można użyć regresji liniowej do jej modelowania.

Co więc zrobić, gdy Y jest zmienną kategoryczną z 2 klasami?

Regresja logistyczna może być użyta do modelowania i rozwiązywania takich problemów, zwanych również problemami klasyfikacji binarnej.

Kluczowym punktem, na który należy zwrócić uwagę, jest to, że Y może mieć tylko 2 klasy i nie więcej niż to. Jeśli Y ma więcej niż 2 klasy, stałby się klasyfikacją wieloklasową i nie można już używać do tego celu waniliowej regresji logistycznej.

Jednak regresja logistyczna jest klasyczną techniką modelowania predykcyjnego i nadal pozostaje popularnym wyborem do modelowania binarnych zmiennych kategorycznych.

Inną zaletą regresji logistycznej jest to, że oblicza ona wynik prawdopodobieństwa predykcji zdarzenia. Więcej na ten temat, gdy faktycznie zaczniesz budować modele.

Kilka przykładów ze świata rzeczywistego dotyczących problemów z klasyfikacją binarną

Możesz się zastanawiać, do jakiego rodzaju problemów możesz użyć regresji logistycznej.

Oto kilka przykładów problemów klasyfikacji binarnej:

  • Wykrywanie spamu : Przewidywanie, czy wiadomość e-mail jest spamem, czy nie
  • Oszustwa związane z kartami kredytowymi : Przewidywanie, czy dana transakcja kartą kredytową jest oszustwem, czy nie
  • Zdrowie : Przewidywanie, czy dana masa tkanki jest łagodna czy złośliwa
  • Marketing : Przewidywanie, czy dany użytkownik kupi produkt ubezpieczeniowy czy nie
  • Bankowość : Przewidywanie, czy klient nie spłaci kredytu.

Dlaczego nie regresja liniowa?

Gdy zmienna odpowiedzi ma tylko 2 możliwe wartości, pożądane jest posiadanie modelu, który przewiduje wartość jako 0 lub 1 lub jako wynik prawdopodobieństwa, który mieści się w przedziale od 0 do 1.

Regresja liniowa nie ma takiej możliwości. Ponieważ, jeśli używasz regresji liniowej do modelowania binarnej zmiennej odpowiedzi, wynikowy model może nie ograniczać przewidywanych wartości Y w zakresie 0 i 1.

regresja liniowa vs regresja logistyczna

Tutaj regresja logistyczna wchodzi do gry. W regresji logistycznej otrzymujemy wynik prawdopodobieństwa, który odzwierciedla prawdopodobieństwo wystąpienia zdarzenia.

Zdarzeniem w tym przypadku jest każdy wiersz zbioru danych szkoleniowych. Może to być coś takiego jak klasyfikacja, czy dany email jest spamem, czy masa komórek jest złośliwa, czy użytkownik kupi produkt i tak dalej.

Równanie logistyczne

Regresja logistyczna osiąga to przez wzięcie logicznych szans zdarzenia ln(P/1?P), gdzie, P jest prawdopodobieństwem zdarzenia. Tak więc P zawsze leży między 0 a 1.

Odjęcie wykładników po obu stronach równania daje:

Możesz zaimplementować to równanie za pomocą funkcji glm() ustawiając argument family na "binomial".

Jeszcze ważne zastrzeżenie, aby upewnić się, że ustawiłeś type="response", gdy używasz funkcji predict na modelu regresji logistycznej. W przeciwnym razie będzie ona przewidywać log odds of P, czyli wartość Z, zamiast samego prawdopodobieństwa.

Jak zbudować model regresji logistycznej w R?

Teraz zobaczmy, jak zaimplementować regresję logistyczną używając zbioru danych BreastCancer w pakiecie mlbench. Będziesz musiał zainstalować pakiet mlbench do tego.

Celem jest tutaj modelowanie i przewidywanie, czy dana próbka (wiersz w zbiorze danych) jest benign lub malignant, w oparciu o 9 innych cech komórek. Załadujmy więc dane i zachowajmy tylko kompletne przypadki.

Breast Cancer Dataset

Zbiór danych ma 699 obserwacji i 11 kolumn. Kolumna Class jest zmienną odpowiedzi (zależną) i mówi, czy dana tkanka jest złośliwa czy łagodna.

Sprawdźmy strukturę tego zbioru danych.

Z wyjątkiem Id, wszystkie pozostałe kolumny są czynnikami. Jest to problem podczas modelowania tego typu danych.

Ponieważ, gdy budujesz model logistyczny ze zmiennymi czynnikowymi jako cechami, przekształca on każdy poziom w czynniku w binarną zmienną dummy składającą się z 1’s i 0’s.

Na przykład, Kształt komórki jest czynnikiem z 10 poziomami. Kiedy używasz glm do modelowania klasy jako funkcji kształtu komórki, kształt komórki zostanie podzielony na 9 różnych binarnych zmiennych kategorycznych przed zbudowaniem modelu.

Jeśli masz zbudować model logistyczny bez wykonywania jakichkolwiek kroków przygotowawczych, to następujące jest to, co możesz zrobić. Ale nie będziemy tego przestrzegać, ponieważ są pewne rzeczy, o które należy zadbać przed zbudowaniem modelu logitowego.

Składnia do budowania modelu logitowego jest bardzo podobna do funkcji lm, którą widziałeś w regresji liniowej. Musisz tylko ustawić family='binomial' dla glm, aby zbudować model regresji logistycznej.

glm oznacza uogólnione modele liniowe i jest w stanie zbudować wiele typów modeli regresji oprócz regresji liniowej i logistycznej.

Zobaczmy, jak może wyglądać kod do zbudowania modelu logistycznego. Będę wracał do tego kroku później, ponieważ istnieją pewne kroki wstępnego przetwarzania, które należy wykonać przed zbudowaniem modelu.

W powyższym modelu, Class jest modelowane jako funkcja Cell.shape samodzielnie.

Ale zauważ na wyjściu, Cell.Shape zostało podzielone na 9 różnych zmiennych. Dzieje się tak dlatego, że ponieważ Cell.Shape jest przechowywany jako zmienna czynnikowa, glm tworzy 1 zmienną binarną (a.k.a dummy variable) dla każdego z 10 poziomów kategorycznych Cell.Shape.

Jasno widać, że ze znaczenia Cell.Shape wynika, że istnieje pewien rodzaj uporządkowania w ramach poziomów kategorycznych Cell.Shape. To znaczy, wartość kształtu komórki 2 jest większa niż kształt komórki 1 i tak dalej.

Tak jest w przypadku innych zmiennych w zestawie danych również. Gdyby była to czysta zmienna kategoryczna bez wewnętrznego uporządkowania, jak np. płeć pacjenta, można pozostawić tę zmienną jako czynnik.

# remove id columnbc <- bc# convert factors to numericfor(i in 1:9) { bc <- as.numeric(as.character(bc))}

Another important point to note. When converting a factor to a numeric variable, you should always convert it to character and then to numeric, else, the values can get screwed up.

Now all the columns are numeric.

Also I’d like to encode the response variable into a factor variable of 1’s and 0’s. Though, this is only an optional step.

So whenever the Class is malignant, it will be 1 else it will be 0. Then, I am converting it into a factor.

bc$Class <- ifelse(bc$Class == "malignant", 1, 0)bc$Class <- factor(bc$Class, levels = c(0, 1))

The response variable Class is now a factor variable and all other columns are numeric.

Alright, the classes of all the columns are set. Let’s proceed to the next step.

How to deal with Class Imbalance?

Before building the logistic regressor, you need to randomly split the data into training and test samples.

Since the response variable is a binary categorical variable, you need to make sure the training data has approximately equal proportion of classes.

table(bc$Class)#> benign malignant #> 444 239

Klasy ‘łagodna’ i ‘złośliwa’ są podzielone w przybliżeniu w stosunku 1:2.

Wyraźnie istnieje nierównowaga klas. Tak więc, przed zbudowaniem modelu logitowego, musisz zbudować próbki takie, że zarówno 1’s jak i 0’s są w przybliżeniu w równych proporcjach.

Ten problem jest zwykle obsługiwany za pomocą kilku technik zwanych:

  • Down Sampling
  • Up Sampling
  • Hybrydowe próbkowanie przy użyciu SMOTE i ROSE.

Więc, czym jest próbkowanie w dół i próbkowanie w górę?

7. Jak radzić sobie z nierównowagą klas z Upsampling i Downsampling

W próbkowaniu w dół, klasa większościowa jest losowo próbkowana w dół, aby mieć taki sam rozmiar jak mniejsza klasa. Oznacza to, że podczas tworzenia zbioru danych treningowych wiersze z klasą łagodną będą wybierane mniej razy podczas losowego próbkowania.

Podobnie, w UpSampling, wiersze z klasy mniejszości, czyli malignant są wielokrotnie próbkowane w kółko, aż osiągną ten sam rozmiar co klasa większości (benign).

Ale w przypadku Hybrid sampling, generowane są sztuczne punkty danych, które są systematycznie dodawane wokół klasy mniejszości. Można to zaimplementować za pomocą pakietów SMOTE i ROSE.

Jednakże dla tego przykładu pokażę, jak wykonać próbkowanie w górę i w dół.

Więc pozwól mi utworzyć dane treningowe i testowe za pomocą pakietu caret.

W powyższym snippecie załadowałem pakiet caret i użyłem funkcji createDataPartition do wygenerowania numerów wierszy dla zbioru danych treningowych. Ustawiając p=.70 wybrałem 70% wierszy, które mają znaleźć się wewnątrz trainData, a pozostałe 30% ma trafić do testData.

table(trainData$Class)

Jest około 2 razy więcej łagodnych próbek. Więc zmniejszmy próbkowanie używając funkcji downSample z pakietu caret.

Aby to zrobić wystarczy podać zmienne X i Y jako argumenty.

Próbki łagodne i złośliwe są teraz w tym samym stosunku.

Funkcja %ni% jest zaprzeczeniem funkcji %in% i użyłem jej tutaj do wybrania wszystkich kolumn z wyjątkiem kolumny Class.

Funkcja downSample wymaga ‘y’ jako zmiennej czynnikowej, to jest powód, dla którego przekonwertowałem klasę na czynnik w oryginalnych danych.

Wspaniale! Teraz pozwól mi wykonać upsampling przy użyciu funkcji upSample. Podąża ona za podobną składnią jak downSample.

Jak można się spodziewać, łagodne i złośliwe są teraz w tym samym stosunku.

Użyję wersji downSampled zbioru danych do zbudowania modelu logitowego w następnym kroku.

Building the Logistic Regression Model

How to Predict on Test Dataset

The logitmod is now built. Możesz teraz użyć go do przewidywania odpowiedzi na testData.

pred <- predict(logitmod, newdata = testData, type = "response")

Teraz pred zawiera prawdopodobieństwo, że obserwacja jest złośliwa dla każdej obserwacji.

Zauważ, że kiedy używasz regresji logistycznej, musisz ustawić type='response', aby obliczyć prawdopodobieństwa predykcji. Ten argument nie jest potrzebny w przypadku regresji liniowej.

Powszechną praktyką jest przyjmowanie odcięcia prawdopodobieństwa jako 0,5. Jeśli prawdopodobieństwo Y jest > 0.5, to można je zaklasyfikować jako zdarzenie (złośliwe).

Jeśli więc pred jest większe niż 0.5, to jest złośliwe, w przeciwnym razie jest łagodne.

y_pred_num <- ifelse(pred > 0.5, 1, 0)y_pred <- factor(y_pred_num, levels=c(0, 1))y_act <- testData$Class

Obliczmy dokładność, która jest niczym innym jak proporcją y_pred, która pasuje do y_act.

mean(y_pred == y_act) 

Tutaj masz współczynnik dokładności 94%.

Dlaczego radzenie sobie z nierównowagą klas jest ważne?

W porządku, obiecałem, że powiem ci dlaczego musisz zadbać o nierównowagę klas wcześniej. Aby to zrozumieć, załóżmy, że masz zbiór danych, w którym 95% wartości Y należy do klasy łagodnej, a 5% należy do klasy złośliwej.

Gdybym tylko ślepo przewidział wszystkie punkty danych jako łagodne, osiągnąłbym procent dokładności 95%. Co brzmi dość wysoko. Ale oczywiście jest to błędne. Liczy się to, jak dobrze przewidujesz klasy złośliwe.

Więc to wymaga, aby klasy łagodne i złośliwe były zrównoważone, a na dodatek potrzebuję bardziej wyrafinowanych środków dokładności i metryk oceny modelu, aby poprawić mój model przewidywania.

Pełny kod

Wnioski

W tym poście widziałeś kiedy i jak używać regresji logistycznej do klasyfikowania binarnych zmiennych odpowiedzi w R.

Widziałeś to na przykładzie opartym na zbiorze danych BreastCancer, gdzie celem było określenie czy dana masa tkanki jest złośliwa czy łagodna.

Budowanie modelu i klasyfikowanie Y to tylko połowa pracy. Właściwie, nawet nie połowa. Ponieważ, zakres metryk oceny skuteczności modelu jest ogromny i wymaga starannego osądu, aby wybrać właściwy model. W następnej części omówię różne metryki oceny, które pomogą zrozumieć, jak dobrze model klasyfikacji działa z różnych perspektyw.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.