Regresja logistyczna za pomocą Pytorcha

Regresja logistyczna za pomocą Pytorcha
Regresja logistyczna jest znanym algorytmem uczenia maszynowego, który służy do rozwiązywania problemów z klasyfikacją binarną. Pochodzi z algorytmu regresji liniowej, który ma ciągłą zmienną wyjściową, a regresja logistyczna może nawet sklasyfikować więcej niż dwie klasy, nieznacznie ją modyfikując. Przyjrzymy się koncepcji regresji logistycznej i ich wdrożeniu w Pytorch, przydatnej bibliotece do tworzenia modeli uczenia maszynowego i głębokiego uczenia się.

Koncepcja regresji logistycznej

Regresja logistyczna jest algorytmem klasyfikacji binarnej. Jest to algorytm decyzyjny, co oznacza, że ​​tworzy granice między dwiema klasami. Rozszerza problem regresji liniowej, który wykorzystuje funkcja aktywacji na swoich wyjściach, aby ograniczyć go między 1 a 0. W rezultacie jest to używane do problemów z klasyfikacją binarną. Wykres regresji logistycznej wygląda jak poniższy rysunek:

Widzimy, że wykres jest ograniczony między 0 a 1. Normalna regresja liniowa może dać wartość docelową jako dowolną liczbę rzeczywistych, ale nie jest tak w przypadku regresji logistycznej z powodu funkcji sigmoidalnej. Regresja logistyczna opiera się na koncepcji oceny maksymalnego prawdopodobieństwa (MLE). Maksymalne prawdopodobieństwo po prostu przyjmuje rozkład prawdopodobieństwa z danym zestawem parametrów i pyta: „Jak prawdopodobne jest, że zobaczyłbym te dane, gdyby moje dane zostały wygenerowane z tego rozkładu prawdopodobieństwa?„Działa to poprzez obliczenie prawdopodobieństwa dla każdego indywidualnego punktu danych, a następnie mnożąc wszystkie te prawdopodobieństwa razem. W praktyce dodajemy logarytmy prawdopodobieństwa.

Jeśli potrzebujemy zbudować model uczenia maszynowego, każdy niezależny punkt danych zmiennych będzie x1 * w1 + x2 * w2… i tak dalej, dając wartość od 0 do 1, po przekazaniu funkcji aktywacji. Jeśli weźmiemy 0.50 jako czynnik decydujący lub próg. Następnie dowolny wynik większy niż 0.5 jest uważane za 1, podczas gdy każdy wynik mniejszy niż jest uważany za 0.

W przypadku więcej niż 2 klas używamy podejścia One-VS-All. One-VS-All, znany również jako jeden VS-REST, jest procesem klasyfikacji Multilabel i Multiclass ML. Działa poprzez najpierw szkolenie klasyfikatora binarnego dla każdej kategorii, a następnie dopasowanie każdego klasyfikatora do każdego wejścia, aby określić, do której klasy należy wejście. Jeśli twój problem ma n klas, jeden VS-all przekonwertuje Twój zestaw danych szkoleniowych na N Problemy z klasyfikacją binarną.

Funkcja utraty związana z regresją logistyczną jest Binary Cross Entropia co jest odwrotnością wzrostu informacji. Jest to również znane jako nazwa utrata dziennika. Funkcja utraty jest podana przez równanie:

Co to jest funkcja straty?

Funkcja utraty to metryka matematyczna, którą chcemy zmniejszyć. Chcemy zbudować model, który może dokładnie przewidzieć, czego chcemy, a jednym ze sposobów pomiaru wydajności modelu jest spojrzenie na stratę, ponieważ wiemy, co modelu wyprowadza i co powinniśmy uzyskać. Możemy trenować i ulepszyć nasz model, używając tej straty i odpowiednio dostosowując parametry modelu. Funkcje strat różnią się w zależności od rodzaju algorytmu. W przypadku regresji liniowej średnie błąd kwadratowy i średni błąd bezwzględny są popularnymi funkcjami strat, podczas gdy entropia krzyżowa jest odpowiednia do problemów z klasyfikacją.

Jaka jest funkcja aktywacji?

Funkcje aktywacji to po prostu funkcje matematyczne, które modyfikują zmienną wejściową, aby podać nowe wyjście. Zwykle odbywa się to w uczeniu maszynowym, aby standaryzować dane lub ograniczyć dane wejściowe do określonego limitu. Popularne funkcje działania są sigmoidalne, proste liniowe (RELU), TAN (H) itp.

Co to jest Pytorch?

Pytorch to popularna alternatywa głębokiego uczenia się, która działa z pochodnią. Został stworzony przez dział AI Facebooka, ale można go używać podobnie do innych opcji. Służy do opracowywania różnych modeli, ale jest najczęściej stosowany w przypadkach użycia języka naturalnego (NLP). Pytorch jest zawsze świetną opcją, jeśli chcesz budować modele o bardzo niewielu zasobach i chcesz przyjazny dla użytkownika, łatwa w użyciu i biblioteka światła dla twoich modeli. Wydaje się również naturalne, które pomaga w zakończeniu procesu. Będziemy używać Pytorcha do wdrożenia naszych modeli z powodu wymienionych powodów. Jednak algorytm pozostaje taki sam z innymi alternatywami, takimi jak tensorflow.

Wdrożenie regresji logistycznej w Pytorch

Wykorzystamy poniższe kroki do wdrożenia naszego modelu:

  1. Utwórz sieć neuronową z niektórymi parametrami, które zostaną zaktualizowane po każdej iteracji.
  2. Iterować podane dane wejściowe.
  3. Wejście przejdzie przez sieć za pomocą propagacji do przodu.
  4. Obecnie obliczamy stratę za pomocą binarnej entropii krzyżowej.
  5. Aby zminimalizować funkcję kosztów, aktualizujemy parametry za pomocą opadania gradientu.
  6. Ponownie wykonaj te same kroki za pomocą zaktualizowanych parametrów.

Będziemy klasyfikować Zestaw danych mnist cyfry. To popularny problem z głębokim uczeniem się nauczycielami dla początkujących.

Najpierw zaimportujmy wymagane biblioteki i moduły.

Importuj pochodnię
od pochodni.Autograd Zmienna importowa
importować pochodną.przekształca się jako transformacje
importować pochodną.Zestawy danych jako DSET

Następnym krokiem jest zaimportowanie zestawu danych.

pociąg = dsets.Mnist (root = './data ', pociąg = true, transform = transformuje.Totensor (), pobierz = false)
test = DSETS.Mnist (root = './data ', pociąg = false, transform = transformuje.Totensor ())

Użyj ładowacza danych, aby Twoje dane były dożywotnie

Train_Loader = pochodnia.Utils.dane.DataLoader (DataSet = Train, Batch_Size = Batch_Size, Shuffle = True)
test_loader = pochodnia.Utils.dane.DataLoader (DataSet = test, Batch_Size = Batch_Size, shuffle = false)

Zdefiniuj model.

model klasy (pochodnia.nn.Moduł):
def __init __ (self, inp, out):
super (model, ja).__w tym__()
samego siebie.liniowe = pochodnia.nn.Liniowy (INP, out)
def przód (self, x):
wyjścia = jaźń.liniowy (x)
Wyjścia zwrotne

Określ hiperparametry, optymalizator i stratę.

partia = 50
n_iters = 1500
epochs = n_iters / (len (Train_Dataset) / Batch)
INP = 784
out = 10
alfa = 0.001
model = logistyka (INP, out)
strata = pochodni.nn.Crossentropyloss ()
Optimizer = Torch.Optim.SGD (model.parametry (), lr = alfa)

Wreszcie trenuj model.

ITR = 0
dla epoki w zakresie (int (epoki)):
dla I, (obrazy, etykiety) w wyliczaniu (Train_Loader):
obrazy = zmienna (obrazy.Widok (-1, 28 * 28))
etykiety = zmienna (etykiety)
Optymalizator.zero_grad ()
wyjścia = model (obrazy)
stratfunc = strata (wyjścia, etykiety)
stratfunc.do tyłu()
Optymalizator.krok()
ITR+= 1
Jeśli ITR%500 == 0:
Prawidłowe = 0
Razem = 0
W przypadku obrazów etykiety w test_loader:
obrazy = zmienna (obrazy.Widok (-1, 28*28))
wyjścia = model (obrazy)
_, przewidywane = pochodni.Max (wyjścia.Dane, 1)
Total+= etykiety.rozmiar (0)
poprawne+= (przewidywane == etykiety).suma()
Dokładność = 100 * Prawidłowe/ogółem
print („Iteracja to . Strata to . Dokładność wynosi .".Format (ITR, stratsfunc.item (), dokładność))

Wniosek

Przeszliśmy wyjaśnienie regresji logistycznej i jej implementacji za pomocą Pytorch, która jest popularną biblioteką do opracowywania modeli głębokiego uczenia się. Wdrożyliśmy problem klasyfikacji zestawu danych MNIST, w którym rozpoznaliśmy cyfry na podstawie parametrów obrazów.