Skip to content
This repository was archived by the owner on Mar 15, 2021. It is now read-only.

Py@Codette #4 6. Logistic Regression

Giorgiana Vlăsceanu edited this page Nov 12, 2019 · 1 revision

Logistic Regression

Regresia Logistică este o metodă preluată din statistică (David Cox, 1958), pe care o avem printre primele alegeri atunci când vine vorba de clasificarea binară a unor date. Un exemplu clasic și cu care "o să ne jucăm la workshop" este cel al detecției de spam. Evident că asta e o problemă de clasificare binară (este/nu este spam sau, altfel pusă problema: este spam sau este ham). Așa că o să intrăm într-o prezentare high-level a acestei metode (LR pe scurt), căci noi ne vom folosi de implementarea ei din bilbioteci, prin urmare nu este impus, beginneri fiind, să mergem așa departe cu interpretările într-un workshop de 6 ore.

Vom mai posta materiale mai detaliate despre asta, post-workshop.

Funcția Logistică

De matematică nu avem cum să scăpăm în întregime. Doar... hei! Vorbim despre o metodă din Machine Learning, ce a fost preluată din zona de statistică. Iar inima LR pulsează matematică; mai precis, funcția asta despre care vorbim acum și a cărei imagine o aveți mai jos:

Funcția din inima LR, este numită, în literatura de specialitate, funcția sigmoidă și se trasează în formă de "S", după cum se poate vedea în grafic. Această funcție a fost dezvoltată în zona de statistică pentru a descrie creșterea rapidă a populației în ecologie, cu maximizare la capacitatea mediului. Sigmoida primește orice număr real și îl mapează în intervalul [0, 1].

Formula după care calculăm sigmoida este:

1 / (1 + e^-value)

Aici e este baza logaritmului natural (numărul lui Euler) iar value este valoarea pe care vrei tu de fapt să o transformi. Ce vedem noi alături este un grafic al intervalului [-5, 5], trecut prin sigmoidă și mapat în [0, 1].

Variabilele de input (x) sunt combinate liniar folosind weights (coeficienți) pentru a prezice valoarea de output (y). Un exemplu de ecuație din LR, putem să vedem mai jos:

y = e^(b0 + b1x) / (1 + e^(b0 + b1x))

Ecuația asta zice așa:

  • am o necunoscută: y - clasa pe care o am de prezis
  • am un feature (în cazul ăsta): x
  • b0 este bias-ul, ca să-mi reducă șansele de undeflow.
  • b1 este coeficientul input-ului - o să avem b1, b2, ... în funcție de câte feature-uri avem date ca input. Pentru mine foarte importanți sunt acești coeficienți b1, pentru că ei îmi spun câtă importanță să acord fiecărui feature, cât de mult contează în decizia finală feature-ul căruia el îi dă greutate (weight). Pe ăștia vreau eu de fapt să îi învăț și tunez în procesul de învățare.

Deci reprezentarea modelului nostru constă din acești coeficienți b învățați.

Probabilități și LR

LR modelează probabilitatea clasei default. De pildă în cazul cu "spam detection", mail-urile 'spam' ar trebui să fie mai puține decât cele 'ham', prin urmare, by default un mail este 'ham'.

Să luăm exemplul 'spam' detection:

P(type=ham|'sales')

Linia de mai sus se traduce în: probabilitatea ca un mail să fie ham, dat fiind feature-ul 'sales' - adică un cuvânt din textul mail-ului. Altfel spus, vrem să modelăm probabilitatea ca un input dat (cuvântul 'sales') să aparțină clasei default ('ham' = 1). Mai formal, poate fi scrisă așa:

P(X) = P(Y=1|X)

Acuma nu vă speriați, căci noi tot clasificare facem aici, chiar dacă prezicem probabilități de fapt. Gândiți-vă că nu e mare brânză să transformăm probabilitățile acelea în valori binare (0 sau 1).

LR este o metodă liniară. Totuși, predicțiile pot să fie transformate folosind funcția sigmoidă despre care vorbeam mai devreme. Pentru noi asta înseamnă că nu mai putem să vedem predicțiile ca pe o combinație liniară a input-urilor, ca la regresie liniară. Ca atare, continuând ideea de mai sus, modelul nostru poate să fie reprezentat așa:

p(X) = e^(b0 + b1X) / (1 + e^(b0 + b1X))

Dacă aplicăm ln ecuației, și o aranjăm un pic, avem:

ln(p(X) / 1 – p(X)) = b0 + b1 * X

Stânga: odds (șansele clasei default în condițiile curente):

ln(odds) = b0 + b1 * X

Mutăm la loc exponentul în dreapta:

odds = e^(b0 + b1 * X) Asta ne ajută să înțelegem că modelul tot o combinație liniară a input-urilor este, dar aceasta ne dă logaritmul șanselor (odds).

Învățarea în LR

Coeficienții (valorile beta b) din LR trebuiesc estimați din datele de training. Facem asta folosind estimarea maximum likelihood (MLE) - un algoritm foarte comun în ML. Coeficienții inițiali sunt aleși random în acest caz. Singura problemă cu maximum likelihood estimation ar fi că face presupuneri foarte multe despre distribuția datelor.

Cei mai buni coeficienți în cazul nostru vor ajunge să prezică o valoare foarte apropiată de 1 în cazul 'ham' și foarte aproape de 0 pentru 'ham'.

Ce face de fapt maximum likelihood pentru LR?

  • avem o procedură de căutare, care caută valori pentru coeficienți (valorile Beta) care să minimizeze eroare în probabilitățile prezise de model, relativ la groun truth (etichetele din setul de date).

Nu intrăm în matematica pentru maximum likelihood. Este de ajuns să știm că ea face minimizarea erorii din partea de predicție.

Predicții în Machine Learning folosind Logistic Regression

Așa cum am văzut mai sus, în LR este vorba de ecuație și de niște calcule pe care le facem ca să obținem un rezultat. Nimic fancy. Doar este rezolvată o ecuație pentru a ajunge la rezultat.

Imaginea de mai jos (preluată de aici) ne dă o reprezentare foarte bună a felului cum arată modelul LR:

Predicțiile în LR se fac prin simpla rezolvare a unei ecuații, dar ținem cont că trebuie să rezolvăm ecuația asta pentru fiecare feature în parte, apoi transformăm rezultatele în label-ul final (1 dacă exemplul descris de atributele din input aparține clasei default și 0 dacă nu).

Să luăm exemplul 'spam detection' și să vedem o explicație high-level despre cum se întâmplă predicția. Să zicem că am învățat până acum coeficienții b0 = -100 și b1 = 0.6. Și să zicem că ne interesează să prezicem șansa de a fi vorba de ham, dat fiind cuvântul 'sales' reprezentat numeric drept 150.

Vrem să calculăm probabilitatea ca acest mail să fie 'ham', dat fiind cuvântul 'sales'->150.

y = e^(b0 + b1X) / (1 + e^(b0 + b1X))

y = exp(-100 + 0.6150) / (1 + EXP(-100 + 0.6X))

y = 0.0000453978687

Sau o probabilitate de aproape zero ca mail-ul să fie 'ham'. În practică putem să folosim și direct această probabilitate. În cazul acesta, pentru că vorbim de clasificare și ne așteptăm ca algortimul folosit să ne zică mai curând un răspuns clar (aka 1 pentru clasa căreia aparține sample-ul curent și 0 pentru celelalte clase posibile), ca trebui să prelucrăm puțin rezultatul:

  • 0 dacă p(ham) < 0.5
  • 1 dacă p(ham) >= 0.5

Acum că știm cum se fac predicțiile folosind LR, să vedem cum trebuie să ne pregătim datele pentru a maximiza rezultatele din faza de training/test.

Interpretarea pe sigmoida pe care am văzut-o mai sus ar fi că, cu cât mă apropii mai mult de minu infinit cu graficul, predicția mea este 0. Cu cât graficul tinde spre infinit, cu atât sun mai sigur că am de-a face cu 1 ca și etichetă (clasă).

Pregătirea datelor

Există câteva reguli de pregătire a datelor care sunt formale și de multe ori ajută la creșterea performanței clasificatorului, dar nu este musai să se întâmple așa. Și la urma urmei, dacă nu lucrezi la un paper sau proiect de research unde te-ar interesa mai degrabă interpretarea formală a rezultatelor, ci vrei să ai o performanță bună a modelului și atât, s-ar putea să fie o idee mai bună să sari peste câțiva pași din pregătirea datelor.

Câteva considerații peste care trebuie totuși să aruncăm un ochi atunci când vorbim de LR:

  • Output Binar: LR este făcută pentru clasificare binară, și așa cum am menționat și mai sus, ea ne dă probabilitatea de a avea clasa default ca label, date fiind atributele (features) curente. Acest output fiind din mulțimea {0, 1}.

  • Eliminarea Zgomotului: LR presupune că nu există erori în variabilele de output pe care i le dăm noi în setul de training. Spre deosebire de SVM, LR nu este potrivit pentru seturile de date cu outliers. Deci pe aceștia o să trebuiască să-i eliminăm în această etapă de "curățare" a setului de training.

  • Distribuție Gausiană: LR este un algoritm liniar (cu o transformare ne-liniară efectuată asupra output-ului). Deci el presupune o relație liniară între input-uri și output. Cel mai bine este să încercăm să transformăm setul de date așa încât să exprimăm relația asta.

  • Eliminarea Input-urilor Corelate: LR o să dea overfitting (adică o să învețe foarte bine potrivirea unor features la output-uri și n-o să fie în stare să se descurce prea bine pe date noi, pe care nu le-a ami văzut). O idee tot pentru partea de pregătire a datelor este să calculăm cât de corelate sunt input-urile (pe perechi), și să le eliminăm pe acelea foarte corelate. Problema pe care încercăm să o mai fixăm aici este și una de convergență. Este posibil ca acel proces de estimare a coeficienților (maximum likelihood) să nu conveargă niciodată. Pe lângă corelare, o cauză pentru asta ar putea să fie și sparsitatea datelor (ex. dacă am muuuuult mai mult ham decât spam).

Utilizări

Istoric vorbind, prima aplicație pentru LR a fost "dată fiind o doză de otravă, cât de probabil este să moară un gândac?"

Altă aplicație comună:

Companiile de asigurări de viață folosesc LR ca să prezică, bazat pe datele unui deținător de poliță (e.g. vârstă, gen, rezultatele unei examinări fizice) șansela ca acesta să moară înainte să expire asigurarea de viață.

Political campaigns try to predict the chances that a voter will vote for their candidate (or do something else desirable, such as donate to the campaign).

LR este folosită destul de mult în zona de Health Care, Natural Language Proceesing și Științe Sociale și alte domenii avansate de research, corelate cu Machine Learning-ul.

Un exemplu bun este: TRISS : Trauma & Injury Severity Score, folosit pentru predicția mortalității printre pacienții răniți, a fost dezvoltat inițial de către Boyd et al. folosind LR. Multe alte sisteme medicale au fost de asemenea făcute să prezică starea unui pacient, si acestea de asemenea s-au axat pe LR ca și metodă de predicție.

Referințe

Logistic Regression Tutorial for Machine Learning

Guide to Logistic Regression

Logistic Regression Tutorial for Machine Learning 2 Machine Learning Part 3 : Logistic Regression