Regresja logistyczna na ratunek

Ale nie musimy jeszcze całkowicie rezygnować z tego zestawu danych. Chociaż nie udało nam się zbudować narzędzia, które przewiduje rangi na podstawie tekstów, możemy spróbować zrobić coś prostszego i sprawdzić, czy możemy przewidzieć, czy książka pojawi się w pierwszej 50. Aby to zrobić, zmienimy problem regresji na problem klasyfikacji. Zamiast przewidywać jedną z nieskończenie wielu możliwych stopni, przechodzimy do prostego kategorycznego osądu: czy ta książka znajduje się w pierwszej 50, czy nie?

Ponieważ to rozróżnienie jest o wiele szersze i prostsze, możemy mieć nadzieję, że łatwiej będzie wydobyć sygnał z naszego małego zestawu danych. Na początek dodajmy etykiety klas do naszego zestawu danych:

y <- rep (c (1, 0), każdy = 50)

W tym przypadku zastosowaliśmy kodowanie pozorne 0/1 omówione wcześniej, gdzie 1 oznacza, że ​​książka znajduje się w pierwszej 50, a 0 oznacza, że ​​książka nie znajduje się w pierwszej 50. Po wprowadzeniu tego kodu, możemy użyć algorytmu klasyfikacji regresji logistycznej,  aby przewidzieć obecność na liście 50 najlepszych książek. Regresja logistyczna jest w gruncie rzeczy regresją, w której przewiduje się prawdopodobieństwo, że element należy do jednej z dwóch kategorii. Ponieważ prawdopodobieństwa są zawsze między 0 a 1, możemy ustawić próg na 0,5, aby skonstruować algorytm klasyfikacji. Poza faktem, że wyniki wynoszą od 0 do 1, regresja logistyczna zachowuje się zasadniczo identycznie jak regresja liniowa. Jedyna różnica polega na tym, że musisz progować wyjścia, aby uzyskać prognozy klas. Przejdziemy przez ten próg, gdy pokażemy, jak łatwo dopasować regresję logistyczną w R. Na początek dopasujemy regresję logistyczną do całego zestawu danych, abyś mógł zobaczyć, jak to jest gotowe:

regularized.fit <- glmnet (x, y, family = ‘binomial’)

Jedyną różnicą między tym wezwaniem do glmnet a wezwaniem, które wykonaliśmy wcześniej w celu wykonania regresji liniowej, jest to, że ustawiamy dodatkowy parametr, family, która kontroluje rodzaj błędów, których można się spodziewać podczas prognozowania. Nie omówiliśmy tego wcześniej, ale regresja liniowa zakłada, że ​​widoczne błędy mają rozkład Gaussa, podczas gdy regresja logistyczna zakłada, że ​​błędy są rozkładane dwumianowo. Nie omawiamy szczegółów rozkładu dwumianowego, ale powinieneś wiedzieć, że jest to statystyczny rozkład danych, które uzyskasz po rzucie monetą. Z tego powodu rozkład dwumianowy powoduje błędy, które wszystkie są zerami lub zerami, co oczywiście jest potrzebne do klasyfikacji. Aby to rozwinąć, pokażmy trzy połączenia, które możesz wykonać w glmnet:

regularized.fit <- glmnet (x, y)

regularized.fit <- glmnet (x, y, family = ‘gaussian’)

regularized.fit <- glmnet (x, y, family = ‘binomial’)

Pierwsze wezwanie jest tym, które wykonaliśmy wcześniej w celu przeprowadzenia regresji liniowej. Drugie wywołanie jest w rzeczywistości równoważne pierwszemu wywołaniu, z tą różnicą, że wyraźnie podaliśmy domyślną wartość parametru rodziny, który jest automatycznie ustawiany na „gaussowski”. Trzecie połączenie to sposób przeprowadzania regresji logistycznej. Jak widać, zmiana analizy z regresji liniowej na regresję logistyczną to tylko kwestia zmiany rodziny błędów. Po dopasowaniu regresji logistycznej do całego zestawu danych, zobaczmy, jak wyglądają prognozy z naszego modelu za pomocą funkcji predict:

predict (regularized.fit, newx = x, s = 0,001)

# 1 4.884576

# 2 6,281354

# 3 4.892129

# 98 -5,958003

# 99 -5,677161

# 100 -4,956271

Jak widać, dane wyjściowe zawierają zarówno wartości dodatnie, jak i ujemne, mimo że mamy nadzieję uzyskać prognozy równe 0 lub 1. Są dwie rzeczy, które możemy zrobić z tymi surowymi prognozami. Pierwszym z nich jest przekroczenie progu 0 i wykonanie prognoz 0/1 za pomocą funkcji ifelse:

ifelse (przewidywanie (regularized.fit, newx = x, s = 0,001)> 0, 1, 0)

# 1 1

# 2 1

# 3 1

# 98 0

# 99 0

# 100 0

Drugi polega na przekształceniu tych surowych prognoz w prawdopodobieństwa, które możemy łatwiej zinterpretować – choć musielibyśmy ponownie wykonać progowanie na poziomie 0,5, aby uzyskać wygenerowane wcześniej prognozy 0/1. Aby przekonwertować surowe prognozy regresji logistycznej na prawdopodobieństwa, użyjemy funkcji inv.logit z pakietu rozruchowego:

library(‘boot’)

inv.logit(predict(regularized.fit, newx = x, s = 0.001))

#1 0.992494427

#2 0.998132627

#3 0.992550485

#98 0.002578403

#99 0.003411583

#100 0.006989922

Jeśli chcesz poznać szczegóły dotyczące działania inv.logit, zalecamy zapoznanie się z kodem źródłowym tej funkcji, aby dowiedzieć się, jaką matematyczną transformację oblicza. Dla naszych celów chcemy tylko, abyś zrozumiał, że regresja logistyczna oczekuje, że jej dane wyjściowe zostaną przekształcone przez funkcję odwrotnego logitu, zanim będziesz mógł wygenerować prawdopodobieństwa jako dane wyjściowe. Z tego powodu regresja logistyczna jest często nazywana modelem logit. Niezależnie od tego, w jaki sposób zdecydujesz się przekształcić nieprzetworzone dane wyjściowe z regresji logistycznej, tak naprawdę ważne jest to, że regresja logistyczna zapewnia narzędzie, które dokonuje klasyfikacji równie łatwo, jak przeprowadziliśmy regresję liniową w rozdziale 5. Spróbujmy więc użyć regresji logistycznej, aby zobaczyć, jak więc możemy zaklasyfikować książki do 50 najlepszych lub poniżej. Jak zauważysz, kod do wykonania tego jest zasadniczo identyczny z kodem, który użyliśmy wcześniej do dopasowania naszego modelu przewidywania rangi za pomocą regresji liniowej:

set.seed(1)

performance <- data.frame()

for (i in 1:250)

{

indices <- sample(1:100, 80)

training.x <- x[indices, ]

training.y <- y[indices]

test.x <- x[-indices, ]

test.y <- y[-indices]

for (lambda in c(0.0001, 0.001, 0.0025, 0.005, 0.01, 0.025, 0.5, 0.1))

{

glm.fit <- glmnet(training.x, training.y, family = ‘binomial’)

predicted.y <- ifelse(predict(glm.fit, test.x, s = lambda) > 0, 1, 0)

error.rate <- mean(predicted.y != test.y)

performance <- rbind(performance,

data.frame(Lambda = lambda,

Iteration = i,

ErrorRate = error.rate))

}

}

Zmiany algorytmiczne w tym fragmencie kodu w stosunku do tego, którego użyliśmy do regresji liniowej, są nieliczne: (1) wywołania glmnet, w których do regresji logistycznej używamy parametru rodziny błędów dwumianowych; (2) etap progowania, który daje prognozy 0/1 na podstawie surowych prognoz logistycznych; oraz (3) wykorzystanie wskaźników błędów zamiast RMSE jako naszej miary wydajności modelu. Kolejną zmianą, którą możesz zauważyć, jest to, że zdecydowaliśmy się wykonać 250 podziałów danych zamiast 50, abyśmy mogli lepiej poznać nasz średni poziom błędu dla każdego ustawienia lambda. Zrobiliśmy to, ponieważ wskaźniki błędów są bardzo zbliżone do 50%, i chcieliśmy potwierdzić, że naprawdę robimy coś lepszego niż przypadek przy prognozowaniu. Aby ten zwiększony podział był bardziej wydajny, odwróciliśmy kolejność pętli podziału i lambda, aby nie powtarzać podziału dla każdej pojedynczej wartości lambda. To oszczędza dużo czasu i służy jako przypomnienie, że pisanie efektywnego kodu uczenia maszynowego wymaga zachowywania się jak dobry programista, któremu zależy na pisaniu wydajnego kodu. Jesteśmy jednak bardziej zainteresowani naszą wydajnością w tym zbiorze danych, więc zróbmy wykres naszego poziomu błędów podczas przeglądania wartości lambda:

ggplot(performance, aes(x = Lambda, y = ErrorRate)) +

stat_summary(fun.data = ‘mean_cl_boot’, geom = ‘errorbar’) +

stat_summary(fun.data = ‘mean_cl_boot’, geom = ‘point’) +

scale_x_log10()

Wyniki mówią nam, że odnieśliśmy prawdziwy sukces, zastępując regresję klasyfikacją. W przypadku niskich wartości lambda jesteśmy w stanie uzyskać wyniki lepsze niż przypadkowe, przewidując, czy książka znajdzie się w pierwszej 50, co jest ulgą. Chociaż danych tych było po prostu za mało, aby zmieścić się w wyrafinowanej regresji przewidywania rang, okazuje się, że są wystarczająco duże, aby zmieścić się w znacznie prostszym binarnym rozróżnieniu, które dzieli książki na 50 najlepszych i poniżej. I to jest ogólna lekcja, na której zamkniemy ten rozdział: czasem prostsze rzeczy są lepsze. Regulararyzacja zmusza nas do korzystania z prostszych modeli, aby uzyskać wyższą wydajność naszych danych testowych. A przejście z modelu regresji na model klasyfikacji może dać znacznie lepszą wydajność, ponieważ wymagania dotyczące binarnego rozróżnienia są ogólnie znacznie słabsze niż wymagania dotyczące bezpośredniego przewidywania rang.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *