Regresia logistică – Un tutorial complet cu exemple în R

Regresia logistică este un algoritm de modelare predictivă care se utilizează atunci când variabila Y este o variabilă categorială binară. Adică poate lua doar două valori precum 1 sau 0. Scopul este de a determina o ecuație matematică care poate fi utilizată pentru a prezice probabilitatea evenimentului 1. Odată stabilită ecuația, aceasta poate fi utilizată pentru a prezice Y atunci când sunt cunoscute doar variabilele X�s.

Logistic Regression – A Complete Tutorial With Examples in R Cuprins1. Introducere în regresia logistică
2. Câteva exemple din lumea reală de probleme de clasificare binară
3. De ce nu regresie liniară?
4. Ecuația logistică
5. Cum se construiește modelul de regresie logistică în R?
6. Cum se tratează dezechilibrul de clasă?
7. Cum se tratează dezechilibrul de clasă cu Upsample și Downsample?
8. Construirea modelului de regresie logistică
9. Cum se face predicția pe setul de date de testare
10. De ce este importantă gestionarea dezechilibrului de clasă?
11. Concluzie

1. Introducere în regresia logistică

Anterior ați văzut ce este regresia liniară și cum să o folosiți pentru a prezice variabilele Y continue.

În regresia liniară, variabila Y este întotdeauna o variabilă continuă. Dacă presupunem că variabila Y este categorică, nu puteți folosi regresia liniară pentru a o modela.

Atunci ce ați face atunci când Y este o variabilă categorică cu 2 clase?

Regresia logistică poate fi folosită pentru a modela și rezolva astfel de probleme, numite și probleme de clasificare binară.

Un punct cheie de reținut aici este că Y poate avea doar 2 clase și nu mai mult de atât. Dacă Y are mai mult de 2 clase, ar deveni o clasificare în mai multe clase și nu mai puteți utiliza regresia logistică de vanilie pentru aceasta.

Cu toate acestea, regresia logistică este o tehnică clasică de modelare predictivă și rămâne încă o alegere populară pentru modelarea variabilelor categoriale binare.

Un alt avantaj al regresiei logistice este că calculează un scor de probabilitate de predicție a unui eveniment. Mai multe despre asta atunci când veți începe efectiv să construiți modelele.

Câteva exemple din lumea reală de probleme de clasificare binară

S-ar putea să vă întrebați pentru ce fel de probleme puteți utiliza regresia logistică.

Iată câteva exemple de probleme de clasificare binară:

  • Detectarea Spam-ului: Predicția dacă un e-mail este Spam sau nu
  • Fraudă cu card de credit: Predicția dacă o anumită tranzacție cu card de credit este frauduloasă sau nu
  • Sănătate : Predicția dacă o anumită masă de țesut este benignă sau malignă
  • Marketing : Predicția dacă un anumit utilizator va cumpăra sau nu un produs de asigurare
  • Bănci : Predicția dacă un client nu va plăti un împrumut.

De ce nu regresia liniară?

Când variabila de răspuns are doar 2 valori posibile, este de dorit să avem un model care prezice valoarea fie ca 0 sau 1, fie ca un scor de probabilitate care variază între 0 și 1.

Regresia liniară nu are această capacitate. Deoarece, Dacă utilizați regresia liniară pentru a modela o variabilă de răspuns binar, este posibil ca modelul rezultat să nu limiteze valorile Y prezise între 0 și 1.

Regresie liniară vs. regresie logistică

Aici intervine regresia logistică. În regresia logistică, se obține un scor de probabilitate care reflectă probabilitatea de apariție a evenimentului.

Un eveniment în acest caz este fiecare rând din setul de date de instruire. Ar putea fi ceva de genul clasificării dacă un anumit e-mail este spam, dacă o masă de celule este malignă sau dacă un utilizator va cumpăra un produs și așa mai departe.

Ecuația logistică

Regresia logistică realizează acest lucru prin luarea șanselor logaritmice ale evenimentului ln(P/1?P), unde, P este probabilitatea evenimentului. Deci, P se situează întotdeauna între 0 și 1.

Totând exponentul pe ambele părți ale ecuației rezultă:

Puteți implementa această ecuație folosind funcția glm() prin setarea argumentului family la "binomial".

De asemenea, un avertisment important este să vă asigurați că setați type="response" atunci când folosiți funcția predict pe un model de regresie logistică. Altfel, aceasta va prezice șansele logaritmice ale lui P, adică valoarea Z, în loc de probabilitatea propriu-zisă.

Cum se construiește modelul de regresie logistică în R?

Acum să vedem cum se implementează regresia logistică folosind setul de date BreastCancer din pachetul mlbench. Va trebui să instalați pachetul mlbench pentru aceasta.

Obiectivul aici este de a modela și de a prezice dacă un anumit specimen (rând în setul de date) este benign sau malignant, pe baza altor 9 caracteristici ale celulelor. Deci, haideți să încărcăm datele și să păstrăm doar cazurile complete.

Breast Cancer Dataset

Setul de date are 699 de observații și 11 coloane. Coloana Class este variabila de răspuns (dependentă) și spune dacă un anumit țesut este malign sau benign.

Să verificăm structura acestui set de date.

Exceptând Id, toate celelalte coloane sunt factori. Aceasta este o problemă atunci când modelați acest tip de date.

Pentru că, atunci când construiți un model logistic cu variabile factoriale ca caracteristici, acesta convertește fiecare nivel din factor într-o variabilă binară fictivă de 1 și 0.

De exemplu, Cell shape este un factor cu 10 niveluri. Atunci când utilizați glm pentru a modela Clasa ca funcție de forma celulei, forma celulei va fi împărțită în 9 variabile categorice binare diferite înainte de a construi modelul.

Dacă doriți să construiți un model logistic fără a face niciun pas pregătitor, atunci ați putea face următoarele. Dar noi nu vom urma acest lucru deoarece există anumite lucruri de care trebuie să avem grijă înainte de a construi modelul logit.

Sintaxa pentru a construi un model logit este foarte asemănătoare cu funcția lm pe care ați văzut-o în regresia liniară. Trebuie doar să setați family='binomial' pentru glm pentru a construi un model de regresie logistică.

glm înseamnă modele liniare generalizate și este capabilă să construiască mai multe tipuri de modele de regresie în afară de regresia liniară și cea logistică.

Vezi cum ar putea arăta codul pentru a construi un model logistic. Voi reveni la acest pas mai târziu, deoarece există câteva etape de preprocesare care trebuie făcute înainte de a construi modelul.

În modelul de mai sus, Class este modelat ca o funcție doar de Cell.shape.

Dar observați din output, Cell.Shape s-a împărțit în 9 variabile diferite. Acest lucru se datorează faptului că, din moment ce Cell.Shape este stocat ca o variabilă factorială, glm creează 1 variabilă binară (alias variabilă fictivă) pentru fiecare dintre cele 10 niveluri categoriale ale lui Cell.Shape.

Evident, din semnificația lui Cell.Shape se pare că există un fel de ordonare în cadrul nivelurilor categoriale ale lui Cell.Shape. Adică, o valoare a formei de celulă de 2 este mai mare decât forma de celulă 1 și așa mai departe.

Acest lucru este valabil și pentru alte variabile din setul de date. Așadar, este preferabil să le convertiți în variabile numerice și să eliminați coloana id.

Dacă ar fi fost o variabilă pur categorială fără ordonare internă, cum ar fi, să zicem, sexul pacientului, puteți lăsa această variabilă ca factor propriu-zis.

# 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

Classele “benign” și “malign” sunt împărțite aproximativ în raport 1:2.

Este clar că există un dezechilibru de clasă. Deci, înainte de a construi modelul logit, trebuie să construiți eșantioanele astfel încât atât 1-urile cât și 0-urile să fie în proporții aproximativ egale.

Această preocupare este în mod normal tratată cu câteva tehnici numite:

  • Down Sampling
  • Up Sampling
  • Hybrid Sampling folosind SMOTE și ROSE.

Deci, ce este eșantionarea descendentă și eșantionarea ascendentă?

7. Cum se gestionează dezechilibrul de clasă cu eșantionarea ascendentă și eșantionarea descendentă

În eșantionarea descendentă, clasa majoritară este eșantionată în mod aleatoriu în jos pentru a fi de aceeași mărime cu clasa mai mică. Aceasta înseamnă că, atunci când se creează setul de date de instruire, rândurile cu clasa benignă vor fi alese de mai puține ori în timpul eșantionării aleatorii.

În mod similar, în UpSampling, rândurile din clasa minoritară, adică malignant, sunt eșantionate în mod repetat de mai multe ori până când ajung la aceeași dimensiune ca și clasa majoritară (benign).

Dar în cazul eșantionării hibride, se generează puncte de date artificiale care sunt adăugate sistematic în jurul clasei minoritare. Acest lucru poate fi implementat folosind pachetele SMOTE și ROSE.

Cu toate acestea, pentru acest exemplu, voi arăta cum se face eșantionarea ascendentă și descendentă.

Așa că permiteți-mi să creez datele de instruire și de testare folosind pachetul caret.

În fragmentul de mai sus, am încărcat pachetul caret și am folosit funcția createDataPartition pentru a genera numerele de rând pentru setul de date de instruire. Prin setarea p=.70Am ales ca 70% din rânduri să meargă în interiorul trainData și restul de 30% să meargă în testData.

table(trainData$Class)

Există aproximativ de 2 ori mai multe eșantioane benigne. Așadar, haideți să facem o eșantionare redusă folosind funcția downSample din pachetul caret.

Pentru a face acest lucru trebuie doar să furnizați variabilele X și Y ca argumente.

Benign și malign sunt acum în același raport.

Funcția %ni% este negația funcției %in% și am folosit-o aici pentru a selecta toate coloanele, cu excepția coloanei Class.

Funcția downSample are nevoie de “y” ca o variabilă factor, acesta este motivul pentru care am convertit clasa într-un factor în datele originale.

Genial! Acum permiteți-mi să fac supraeșantionarea folosind funcția upSample. Aceasta urmează o sintaxă similară cu downSample.

Așa cum era de așteptat, benignele și malignele sunt acum în același raport.

Voi folosi versiunea downSampled a setului de date pentru a construi modelul logit în pasul următor.

Constituirea modelului de regresie logistică

Cum se face predicția pe setul de date de test

Modelul logitmod este acum construit. Acum îl puteți utiliza pentru a prezice răspunsul pe testData.

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

Acum, pred conține probabilitatea ca observația să fie malignă pentru fiecare observație.

Rețineți că, atunci când utilizați regresia logistică, trebuie să setați type='response' pentru a calcula probabilitățile de predicție. Acest argument nu este necesar în cazul regresiei liniare.

Practica uzuală este de a lua cutoff-ul de probabilitate ca fiind 0,5. Dacă probabilitatea lui Y este > 0,5, atunci poate fi clasificat un eveniment (malign).

Atunci, dacă pred este mai mare de 0,5, este malign, altfel este benign.

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

Să calculăm precizia, care nu este altceva decât proporția de y_pred care se potrivește cu y_act.

mean(y_pred == y_act) 

Aici aveți o rată de acuratețe de 94%.

De ce este important să vă ocupați de dezechilibrul de clasă?

În regulă, am promis că vă voi spune de ce trebuie să vă ocupați mai devreme de dezechilibrul de clasă. Pentru a înțelege acest lucru, să presupunem că aveți un set de date în care 95% din valorile Y aparțin clasei benigne și 5% aparțin clasei maligne.

Dacă aș fi prezis orbește toate punctele de date ca fiind benigne, aș fi obținut un procent de precizie de 95%. Ceea ce sună destul de ridicat. Dar, în mod evident, acest lucru este eronat. Ceea ce contează este cât de bine preziceți clasele maligne.

Așa că este nevoie ca clasele benigne și maligne să fie echilibrate ȘI, în plus, am nevoie de măsuri de acuratețe mai rafinate și de metrici de evaluare a modelului pentru a-mi îmbunătăți modelul de predicție.

Cod complet

Concluzie

În această postare ați văzut când și cum să folosiți regresia logistică pentru a clasifica variabilele de răspuns binar în R.

Ați văzut acest lucru cu un exemplu bazat pe setul de date BreastCancer în care scopul era de a determina dacă o anumită masă de țesut este malignă sau benignă.

Construirea modelului și clasificarea lui Y este doar jumătate din munca făcută. De fapt, nici măcar jumătate. Deoarece, domeniul de aplicare a parametrilor de evaluare pentru a judeca eficacitatea modelului este vast și necesită o judecată atentă pentru a alege modelul potrivit. În partea următoare, voi discuta diverse metrici de evaluare care vor ajuta la înțelegerea performanței modelului de clasificare din diferite perspective.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.