Lucrare: Detecția tranzacțiilor bancare frauduloase folosind Machine Learning Cum folosești fișierul: citește întrebarea (bold), încearcă să răspunzi cu voce tare, apoi apasă pe săgeată / „▸" ca să vezi răspunsul. Termenii tehnici pot rămâne în engleză (AUC-PR, Recall, undersampling etc.).
- Nu intra în panică dacă nu știi ceva. Explică raționamentul din spatele deciziei — juriul apreciază gândirea, nu memorarea.
- Știi cifrele-cheie pe de rost: 172:1 (dezechilibru), 0,58% fraude, XGBoost F1 0,6462 / AUC-PR 0,8765 / Recall 90,35%, prinde 1.938 din 2.145 fraude (ratează 207).
- Când nu ești sigură, redirecționează către ce știi: „O abordare posibilă este… iar în lucrare am ales… pentru că…".
- Limitările sunt puncte forte, nu slăbiciuni — arată maturitate. Le enumeri calm.
- Formula de aur: ce am făcut → de ce am ales asta → ce alternativă exista → de ce nu am ales-o.
1. De ce ai folosit AUC-PR ca metrică principală și nu acuratețea?
Pentru că setul de date este puternic dezechilibrat (0,58% fraude). Un model care clasifică totul ca „legitim" obține 99,4% acuratețe și zero fraude detectate — deci acuratețea este înșelătoare. AUC-PR (aria sub curba Precizie-Recall) se concentrează pe clasa rară, cea a fraudelor, și ignoră True Negatives, care domină pe date dezechilibrate. De aceea reflectă mult mai onest performanța reală a modelului.
2. De ce a câștigat XGBoost și nu rețeaua neuronală (cel mai complex model)?
Pe date tabelare, modelele bazate pe arbori precum XGBoost surprind interacțiunile dintre variabile mai eficient și cu mai puține date decât rețelele neuronale. Rețelele neuronale excelează pe date nestructurate (imagini, text). XGBoost obține cel mai bun F1 (0,6462) și AUC-PR (0,8765), egalând sau depășind MLP-ul, dar fără arhitectura complexă și fără costul de antrenare al unei rețele. Concluzia: complexitatea ajută până la un punct — „mai mult" nu înseamnă automat „mai bun".
3. Ce este dezechilibrul de clase și de ce e o problemă?
Este situația în care o clasă (tranzacțiile legitime) domină masiv cealaltă (fraudele) — în setul meu, un raport de 172:1 (0,58% fraude). Problema: algoritmii de optimizare tind să favorizeze clasa majoritară, obținând acuratețe mare dar capacitate slabă de a detecta clasa rară. De aceea am tratat dezechilibrul (prin undersampling) și am ales metrici adecvate (AUC-PR, Recall, F1) în locul acurateței.
4. De ce ai folosit undersampling și de ce exact raportul 10:1?
Undersampling reduce clasa majoritară pentru a echilibra clasele — e frecvent folosit pentru dezechilibru sever și e rapid. Am ales 10:1 ca un compromis: un raport 1:1 ar elimina prea multă informație despre comportamentul normal; un raport 50:1 sau 100:1 ar păstra un dezechilibru încă sever. 10:1 reduce dezechilibrul de la 172:1 fără a pierde tiparul tranzacțiilor normale. Am obținut 65.021 tranzacții de antrenare (5.911 fraude, 9,09%).
5. Cum ai prevenit scurgerile de date (data leakage)?
Trei măsuri: (1) am separat setul de validare înainte de undersampling, ca să reflecte distribuția reală de 0,58% (altfel rețeaua ar fi primit un semnal de early stopping distorsionat, cu 9% fraude artificiale). (2) StandardScaler a fost învățat (fit) exclusiv pe datele de antrenare și doar apoi aplicat pe validare și test. (3) Setul de test este din 2020, separat temporal de antrenarea pe 2019 — evaluăm pe tranzacții din viitor, niciodată văzute.
6. De ce precizia (Precision) e doar ~50% la XGBoost la pragul 0,5?
Pentru că am antrenat pe date reechilibrate (9% fraude), dar am testat pe distribuția reală (0,39% fraude). Modelul își calibrează probabilitățile față de rata de ~9% din antrenare, așa că pe setul real, cu rată mult mai mică, tinde să semnaleze mai multe tranzacții ca fraudă → mai multe alarme false → precizie mai mică la pragul fix de 0,5. Soluția e ajustarea pragului: la pragul 0,9, precizia urcă la 0,88 și F1 la 0,83 (cel mai bun al modelului). Deci pragul de 0,5 nu este optim, iar analiza pragului demonstrează asta.
7. De ce ai folosit date sintetice? Ce limitări are asta?
Tranzacțiile bancare reale nu sunt disponibile public din motive de confidențialitate și reglementări (GDPR). Am folosit setul Sparkov de pe Kaggle, generat de un simulator care imită comportamentul real. Limitări: datele sintetice sunt generate pe baza unor distribuții statistice predefinite, deci tipare de fraudă rare sau foarte sofisticate din realitate pot lipsi; iar un simulator nu poate surprinde evoluția continuă a tacticilor fraudatorilor. Metodologia rămâne însă validă și transferabilă pe date reale.
8. Ce metrici ai folosit și ce înseamnă fiecare?
- Precizie = TP/(TP+FP): din câte alarme ridic, câte sunt fraude reale.
- Recall (sensibilitate) = TP/(TP+FN): din câte fraude reale există, câte prind.
- Scor F1 = media armonică a Preciziei și Recall — un echilibru între ele.
- AUC-PR: aria sub curba Precizie-Recall; performanța pe toate pragurile, metrica mea principală.
- AUC-ROC: aria sub curba ROC; înșelătoare pe date dezechilibrate.
- FNR (fraude ratate), FPR (alarme false), Brier / Log Loss (calibrarea probabilităților).
9. De ce ai ales exact aceste 5 modele?
Le-am ales intenționat pe o scară crescătoare de complexitate, ca să testez ipoteza „crește performanța odată cu complexitatea?": Regresia Logistică (liniar, de referință) → Arbore de Decizie (neliniar simplu) → Random Forest (ansamblu, bagging) → XGBoost (ansamblu, boosting) → MLP (deep learning). Acoperă principalele familii de algoritmi supervizați pentru date tabelare și îmi permit o comparație relevantă.
10. Cum funcționează XGBoost, pe scurt?
XGBoost (Extreme Gradient Boosting) construiește arbori de decizie secvențial: fiecare arbore nou corectează greșelile arborilor anteriori (tehnica boosting). Predicția finală e suma contribuțiilor tuturor arborilor. Include un termen de regularizare în funcția obiectiv (L = pierdere + Ω), care penalizează complexitatea (numărul de frunze și mărimea ponderilor), reducând supraînvățarea. Spre deosebire de Random Forest, care construiește arborii în paralel și independent.
11. Care e cea mai importantă variabilă și de ce?
Suma tranzacției (amt și amt_log), care împreună reprezintă ~67% din importanța totală la Random Forest, iar la Arborele de Decizie amt singură are 67%. Motivul e vizibil în analiza exploratorie: mediana fraudelor e ~400$ față de 47$ la tranzacțiile normale — o separare dramatică. Pe locul doi e ora (~9%), iar genul titularului e ultimul, nesemnificativ (0,005).
12. Ce ai fi făcut diferit / care sunt direcțiile viitoare?
Cinci direcții: (1) codare ciclică (sin/cos) pentru oră și lună, ca să elimin discontinuitatea artificială dintre ora 23 și ora 0; (2) optimizarea pragului de decizie per model, calibrat pe costul real al unei fraude ratate; (3) comparație cu SMOTE / oversampling; (4) interpretare cu SHAP pentru XGBoost și MLP; (5) validare pe date reale și mai recente, cu o împărțire temporală și la validare.
Care este obiectivul principal al lucrării?
Antrenarea și compararea a cinci modele de machine learning de complexitate diferită pentru detecția tranzacțiilor bancare frauduloase, pe un set de date dezechilibrat, pentru a identifica modelul optim și a evidenția punctele forte și limitele fiecărei abordări.
De ce este o temă de actualitate / relevantă?
Fraudele cu carduri au produs pierderi globale de ~33,83 miliarde $ în 2023, cu o proiecție de peste 403 miliarde $ în următorul deceniu (Nilson Report). Volumul masiv de tranzacții face verificarea manuală imposibilă, iar sistemele bazate pe reguli fixe rămân în urma tacticilor fraudatorilor. Machine learning oferă o soluție scalabilă, care învață tiparele direct din date.
De ce nu sunt suficiente sistemele tradiționale, bazate pe reguli?
Regulile fixe sunt statice și ușor de ocolit: fraudatorii își schimbă constant strategiile, iar o regulă scrisă azi devine irelevantă mâine. În plus, nu scalează la volume mari și generează multe alarme false. ML se adaptează, învață tipare complexe și detectează anomalii pe care regulile nu le-ar prinde.
Ce tip de problemă de machine learning este aceasta?
O problemă de clasificare binară supervizată: fiecare tranzacție e clasificată în una din două clase — legitimă (0) sau frauduloasă (1) — pe baza unor exemple etichetate. Este supervizată pentru că avem variabila țintă is_fraud.
Ce înseamnă învățare supervizată vs. nesupervizată?
Supervizată = modelul învață dintr-un set etichetat (știm care tranzacții sunt fraude). Nesupervizată = fără etichete, modelul descoperă singur tipare/anomalii (ex. clustering). Am folosit învățare supervizată pentru că setul de date conține eticheta is_fraud.
Descrie setul de date folosit.
Setul public Credit Card Transactions Fraud Detection de pe Kaggle (creat de Kartik Shenoy, 2020), generat cu simulatorul Sparkov (Brandon Harris). Conține tranzacții sintetice din perioada 1 ian 2019 – 31 dec 2020: 1000 de clienți, 800 de comercianți, SUA. Antrenare pe 2019 (~1,3 mil. tranzacții), test pe 2020 (555.719 tranzacții).
Câte variabile are și pe câte le-ai păstrat?
Setul original are 23 de variabile. Am păstrat 11 considerate cele mai relevante (sumă, populația orașului, coordonate geografice, vârstă, oră, lună, gen, categoria comerciantului), iar după codare setul final are 25 de coloane (11 numerice + 14 one-hot pentru categorie).
Care este variabila țintă?
is_fraud — o variabilă binară: 0 pentru tranzacții legitime, 1 pentru tranzacții frauduloase.
De ce ai antrenat pe 2019 și testat pe 2020?
Pentru o evaluare realistă și onestă: modelul e antrenat pe date istorice (2019) și testat pe tranzacții din viitor (2020), pe care nu le-a văzut niciodată. Așa simulez un scenariu real de producție și evit supraestimarea performanței.
Ce variabile ai eliminat și de ce?
Am eliminat variabile fără putere predictivă sau redundante — de exemplu numele titularului, numărul cardului, ID-ul tranzacției, job-ul, strada. Sunt identificatori sau text liber care nu ajută modelul și ar putea introduce zgomot sau chiar leakage.
Care este raportul de dezechilibru și ce înseamnă?
Aproximativ 172:1 — la fiecare 172 de tranzacții legitime există o singură fraudă (0,58% fraude în setul de antrenare). E un dezechilibru sever, tipic pentru detecția fraudelor.
De ce e periculoasă acuratețea pe astfel de date? Dă un exemplu numeric.
Un clasificator „leneș" care prezice că totul e legitim obține 99,42% acuratețe (pentru că 99,42% chiar sunt legitime) — dar detectează zero fraude. Deci o acuratețe aparent excelentă ascunde un model complet inutil. De aceea am folosit Precizie, Recall, F1 și AUC-PR.
Ce alternative existau pentru tratarea dezechilibrului?
Oversampling (ex. SMOTE — generarea de exemple sintetice ale clasei minoritare), undersampling (reducerea clasei majoritare), sau ponderarea claselor (class weights) în funcția de cost. Am ales undersampling pentru simplitate și viteză; SMOTE și oversampling rămân direcții viitoare de comparat.
Care e dezavantajul undersampling-ului?
Pierzi informație: elimini tranzacții legitime, deci arunci date reale despre comportamentul normal. Din acest motiv nu am mers la 1:1 (care ar elimina prea mult), ci la 10:1, care păstrează un eșantion suficient de comportament normal.
Ce variabile noi ai construit (feature engineering)?
Trei: (1) vârsta la momentul tranzacției, calculată din data nașterii; (2) ora și luna, extrase din marca temporală a tranzacției; (3) amt_log, transformarea logaritmică a sumei. Toate cresc puterea predictivă față de variabilele brute.
Cum ai calculat vârsta și de ce împarți la 365,25?
varsta = (trans_date_trans_time − dob) / 365,25. Împart la 365,25 (nu 365) ca să iau în calcul anii bisecți — o zi în plus la fiecare 4 ani. Astfel vârsta reflectă exact vârsta la momentul tranzacției, nu față de o dată fixă.
Ce ai făcut cu vârstele imposibile (sub 18 sau peste 100 de ani)?
Pe setul de antrenare am eliminat complet cele 15.568 de rânduri cu vârste imposibile (aveam libertatea, era antrenare). Pe setul de test am aplicat metoda clip(18, 100) — am înlocuit valorile aberante cu limitele, fără a șterge rânduri, ca să nu modific numărul total de tranzacții evaluate. Pragul de 18 corespunde vârstei legale a majoratului în SUA.
De ce ai transformat logaritmic suma (amt_log)?
Variabila amt are o distribuție puternic asimetrică spre dreapta: majoritatea tranzacțiilor au valori mici, dar există câteva extreme (până la 28.948$). Logaritmarea log(1+amt) comprimă valorile extreme și normalizează distribuția — media scade de la 70,40 la 3,53 și deviația de la 160,35 la 1,29. Asta ajută mai ales modelele liniare și rețeaua neuronală, sensibile la valori extreme.
De ce log(1+amt) și nu log(amt)?
Funcția log1p (log de 1 plus x) evită cazul în care suma ar fi 0 — logaritmul din 0 este nedefinit (−∞). Adăugarea lui 1 garantează un rezultat valid pentru orice sumă ≥ 0.
De ce ai extras ora și luna din marca temporală?
Ca să surprind tipare temporale ale fraudei. Ora s-a dovedit unul dintre cei mai puternici predictori: fraudele se concentrează noaptea (22:00–03:00), când monitorizarea e redusă. Ora și luna brute au putere predictivă mult mai mare decât marca temporală completă.
De ce ai folosit LabelEncoder pentru gen dar One-Hot pentru categorie?
Genul are doar două valori (F/M) → LabelEncoder (F=0, M=1) e suficient, nu introduce o ordine falsă. Categoria comerciantului are 14 valori nominale (fără ordine naturală); LabelEncoder ar impune o ordine falsă (ex. „grocery" < „shopping"), distorsionând modelele liniare și rețeaua. One-Hot creează 14 coloane binare independente, fără a sugera o ierarhie.
Ce e One-Hot Encoding?
O tehnică de codare a variabilelor categorice: fiecare categorie devine o coloană binară separată (1 dacă tranzacția aparține categoriei, 0 altfel). Pentru cele 14 categorii de comercianți rezultă 14 coloane. Avantaj: nu introduce o ordine falsă între categorii.
Ai aplicat One-Hot pe train și test separat? Cum eviți nepotrivirile?
Am aplicat codarea învățată pe setul de antrenare și apoi pe test, verificând că ambele seturi au exact aceleași 14 categorii. Așa evit data leakage și situația în care testul ar avea o categorie necunoscută sau un număr diferit de coloane.
Explică împărțirea finală a datelor (cele 3 seturi).
- Antrenare: 65.021 tranzacții, 5.911 fraude (9,09%) — după undersampling; rol: antrenarea modelelor.
- Validare: 256.220 tranzacții, 1.477 fraude (0,58%, distribuție reală) — rol: early stopping pentru MLP.
- Test: 555.719 tranzacții (anul 2020), 2.145 fraude (0,39%, distribuție reală) — rol: evaluarea finală.
De ce ai separat validarea ÎNAINTE de undersampling? (întrebare-cheie)
Pentru ca setul de validare să păstreze distribuția reală de 0,58% fraude. Dacă aș fi aplicat undersampling pe tot setul și abia apoi aș fi separat validarea, aceasta ar fi avut ~9% fraude artificiale. Rețeaua neuronală ar fi primit un semnal de early stopping distorsionat, oprindu-se pe baza unei realități false. Separând validarea prima, MLP primește un semnal de monitorizare realist.
La ce servește setul de validare și de ce doar MLP-ul îl folosește?
Validarea monitorizează performanța în timpul antrenării, pentru mecanismul de early stopping al rețelei neuronale — la finalul fiecărei epoci se evaluează AUC-PR pe validare și se salvează cea mai bună versiune. Celelalte 4 modele (LR, Arbore, Random Forest, XGBoost) nu au nevoie de acest mecanism iterativ, deci nu folosesc validarea.
Cum ai împărțit train/validare — aleator sau stratificat?
Stratificat: 20% din datele de antrenare au fost rezervate pentru validare, păstrând proporția reală de fraude (0,58%). Stratificarea asigură că ambele subseturi au aceeași distribuție a claselor.
De ce ai scalat variabilele și cu ce metodă?
Cu StandardScaler (fiecare variabilă are media 0 și deviația standard 1). Algoritmii precum Regresia Logistică și MLP sunt sensibili la scara valorilor: o variabilă cu valori între 0 și 28.948 (suma) ar domina una cu valori între 0 și 23 (ora). Standardizarea aduce toate variabilele la aceeași scară, fără a le distorsiona importanța.
Pe ce set ai calculat media și deviația pentru scalare?
Exclusiv pe setul de antrenare. Dacă scalerul ar „vedea" datele de test, ar fi expus la date viitoare — o formă de data leakage (contaminarea datelor). Media și deviația calculate pe antrenare se aplică apoi identic pe validare și test.
Ai scalat și coloanele one-hot?
Nu — doar cele 11 variabile numerice. Coloanele one-hot conțin deja doar valorile 0 și 1, deci nu au nevoie de standardizare.
Modelele bazate pe arbori au nevoie de scalare?
Nu strict — arborii de decizie, Random Forest și XGBoost sunt insensibili la scara variabilelor (fac split-uri pe praguri). Am aplicat totuși aceeași scalare uniform pe toate modelele, pentru consistență și comparație corectă, fără efecte negative asupra arborilor.
Ce e Precizia și ce înseamnă o valoare mare?
Precision = TP/(TP+FP) — proporția tranzacțiilor semnalate ca fraudă care sunt cu adevărat fraude. O valoare mare = puține alarme false, deci nu deranjăm clienții legitimi.
Ce e Recall și ce înseamnă o valoare mare?
Recall (sensibilitate) = TP/(TP+FN) — proporția fraudelor reale pe care modelul le prinde. O valoare mare = puține fraude ratate, deci pierderi financiare mai mici.
Ce e scorul F1 și de ce e util pe date dezechilibrate?
F1 = media armonică a Preciziei și Recall = 2·P·R/(P+R). Combină cele două într-o singură cifră și penalizează dezechilibrul dintre ele (nu poți avea F1 mare cu una foarte mică). E frecvent folosit pe date dezechilibrate pentru că surprinde simultan corectitudinea și acoperirea.
Care e diferența dintre AUC-ROC și AUC-PR?
Curba ROC compară True Positive Rate cu False Positive Rate; AUC-ROC include True Negatives, care domină pe date dezechilibrate → metrica pare optimistă (toate modelele mele au AUC-ROC > 0,90). Curba Precizie-Recall nu include True Negatives în formule → AUC-PR e o evaluare mult mai onestă a clasei rare. Pe slide se vede clar: la ROC toate modelele par excelente, la PR se separă (Regresia Logistică se prăbușește la 0,18).
De ce e AUC-ROC „înșelător" concret în cazul tău?
Pentru că FPR = FP/(FP+TN), iar TN e uriaș (peste 550.000 de tranzacții legitime corect clasificate). Chiar și multe alarme false dau un FPR foarte mic, deci ROC arată bine. AUC-PR nu conține TN, deci nu e „diluat" de clasa majoritară.
Ce e FNR și de ce e metrica cea mai critică?
FNR (False Negative Rate) = proporția fraudelor reale care trec nedetectate. E cea mai critică pentru că o fraudă ratată înseamnă pierdere financiară directă, în timp ce o alarmă falsă înseamnă doar o verificare suplimentară. XGBoost are cel mai mic FNR: 0,0965 (ratează doar 9,65% din fraude).
Ce e Brier Score și Log Loss?
Măsoară cât de bine sunt calibrate probabilitățile modelului (nu doar clasificarea corectă, ci și încrederea corectă). Un model bun dă probabilități mari pentru fraudele reale și mici pentru cele legitime. XGBoost are cele mai mici valori (Brier 0,0028, Log Loss 0,0114), deci cele mai bine calibrate probabilități.
Ai folosit aceiași parametri de intrare pentru toate modelele?
Da — toate cele 5 modele au fost antrenate pe exact același set (65.021 tranzacții), cu aceleași 25 de variabile și aceeași scalare, și evaluate pe același set de test (555.719 tranzacții din 2020). Doar așa comparația e corectă și diferențele reflectă modelele, nu condițiile.
Ce librării Python ai folosit?
scikit-learn (Regresie Logistică, Arbore de Decizie, Random Forest, preprocesare, metrici), XGBoost (modelul XGBoost) și PyTorch (rețeaua neuronală MLP).
Ce înseamnă un model „de ansamblu" (ensemble)?
Un model care combină predicțiile mai multor modele mai simple pentru un rezultat mai stabil și mai precis. Random Forest (bagging) și XGBoost (boosting) sunt ansambluri de arbori de decizie.
Care e diferența dintre bagging și boosting?
Bagging (Random Forest): construiește mulți arbori în paralel și independent, pe eșantioane bootstrap diferite, și votează majoritar — reduce varianța. Boosting (XGBoost): construiește arbori secvențial, fiecare corectând greșelile celui anterior — reduce bias-ul. Boosting e de obicei mai precis, dar mai sensibil la supraînvățare (de aceea folosește regularizare).
Cum funcționează Regresia Logistică?
Estimează probabilitatea ca o tranzacție să fie frauduloasă printr-o combinație liniară ponderată a variabilelor, trecută prin funcția sigmoidă, care constrânge rezultatul în intervalul [0,1]. E un clasificator liniar, folosit ca model de referință (baseline).
De ce a avut cele mai slabe rezultate?
Pentru că e un model liniar, iar relațiile din date sunt în mare parte neliniare (corelația liniară a variabilelor cu is_fraud e aproape 0, cu excepția sumei la 0,22). Regresia Logistică nu poate surprinde interacțiunile complexe care diferențiază fraudele → ratează peste jumătate din fraude (Recall 0,49, AUC-PR 0,18).
De ce ai inclus-o dacă e slabă?
Ca punct de referință (baseline). Fără un model simplu de comparație nu poți aprecia cât de mult aduc modelele complexe. Diferența dintre AUC-PR 0,18 (LR) și 0,88 (XGBoost) arată exact valoarea neliniarității.
Ce hiperparametru ai setat la Regresia Logistică?
max_iter = 1000 (față de 100 implicit), ca să asigur convergența optimizării. Restul parametrilor au rămas la valorile implicite din scikit-learn.
Cum funcționează un Arbore de Decizie?
Împarte recursiv spațiul datelor prin reguli de tip „dacă-atunci" la fiecare nod, alegând la fiecare pas variabila și pragul care separă cel mai bine clasele. Pornește din nodul rădăcină și ajunge la nodurile frunză, unde se decide clasa finală (fraudă/legitim).
Ce e indicele Gini?
Un criteriu de măsurare a „purității" unui nod: cât de amestecate sunt clasele după o separare. Gini = 1 − Σpᵢ². Valoare 0 = nod complet pur (o singură clasă). La fiecare split, arborele alege separarea care reduce cel mai mult Gini. Am folosit criteriul implicit Gini (mai puțin sensibil decât entropia la variabile cu multe valori).
De ce ai limitat adâncimea la max_depth=8?
Ca să previn supraînvățarea (overfitting). Un arbore fără constrângeri ar crește până când fiecare frunză ar avea un singur exemplu — ar memora datele de antrenare, dar ar generaliza slab pe date noi. Cu adâncime 8, arborele poate genera până la 2⁸ = 256 de frunze, suficient pentru tipare complexe, dar controlat.
De ce are Arborele de Decizie Recall mare (0,90) dar Precizie mică (0,32)?
Pentru că tinde să clasifice agresiv tranzacțiile ca fraudă — prinde multe fraude reale (Recall mare), dar generează și multe alarme false (Precizie mică, cel mai mare FP = 4.141). E dezechilibrat între cele două, de aceea are un F1 mai slab (0,47) decât ansamblurile.
Cum funcționează Random Forest?
Este un ansamblu de mulți arbori de decizie (200 în cazul meu), fiecare antrenat pe un eșantion bootstrap (extras cu revenire) din date și pe o submulțime aleatoare de variabile la fiecare split. Predicția finală se obține prin vot majoritar. Diversitatea arborilor face modelul robust: greșelile unora se compensează cu ale altora.
Ce hiperparametri ai folosit și de ce max_depth=20?
n_estimators = 200 (200 de arbori — echilibru între performanță și cost computațional) și max_depth = 20. Adâncimea mai mare decât la Arborele de Decizie (8) e permisă pentru că mecanismul de ansamblu controlează el însuși supraînvățarea — erorile arborilor individuali se compensează reciproc.
Ce e bootstrap-ul (bagging)?
Bootstrap aggregating = fiecare arbore e antrenat pe un eșantion extras aleator cu revenire din setul original (unele rânduri apar de mai multe ori, altele deloc). Combinat cu selecția aleatoare de variabile, asigură ca arborii să fie diverși și să nu depindă toți de aceleași câteva variabile dominante.
Ce hiperparametri ai folosit la XGBoost și de ce learning_rate mic?
n_estimators=200, max_depth=8, learning_rate=0,05, scale_pos_weight=1. Rata de învățare mică (0,05) face învățarea mai lentă dar mai stabilă, reducând supraînvățarea — fiecare arbore contribuie puțin, deci modelul nu „sare" la concluzii. scale_pos_weight=1 (greutăți egale) pentru că dezechilibrul a fost deja tratat prin undersampling.
Ce e scale_pos_weight și de ce l-ai lăsat 1?
E un parametru XGBoost pentru ponderarea clasei pozitive (fraude) — o alternativă la undersampling pentru tratarea dezechilibrului. L-am lăsat 1 (fără ponderare suplimentară) pentru că echilibrarea o făcusem deja prin undersampling la 10:1; o ponderare dublă ar fi „corectat" de două ori dezechilibrul.
Ce e termenul de regularizare din funcția obiectiv XGBoost?
Funcția obiectiv are două părți: funcția de pierdere (diferența dintre predicție și realitate) + termenul de regularizare Ω(f) = γT + ½λ‖w‖², unde T = numărul de frunze și w = ponderile frunzelor. γ penalizează arborii prea complecși, λ penalizează ponderile mari. Scopul: reducerea supraînvățării, un avantaj cheie al XGBoost față de Random Forest.
De ce e XGBoost mai bun decât Random Forest, deși diferența e mică?
Diferența e mică numeric (F1 0,6462 vs 0,6387), dar XGBoost câștigă pentru că abordarea secvențială (boosting) corectează iterativ greșelile, iar regularizarea încorporată previne supraînvățarea. Obține cel mai bun echilibru Precizie-Recall și cele mai bine calibrate probabilități (Brier, Log Loss cele mai mici).
Descrie arhitectura rețelei neuronale.
Un Multi-Layer Perceptron de tip feedforward, piramidal descrescător: intrare 25 → strat 1 (128 neuroni) → strat 2 (64) → strat 3 (32) → ieșire (2 neuroni cu Softmax pentru P(normal) și P(fraudă)). Fiecare strat ascuns are Batch Normalization, activare ReLU și Dropout.
Ce e funcția de activare ReLU și de ce o folosești?
ReLU (Rectified Linear Unit): g(z) = max(0, z) — transformă valorile negative în 0 și le păstrează pe cele pozitive. Introduce neliniaritate în rețea (fără ea, rețeaua ar fi doar o funcție liniară). E rapidă de calculat și evită problemele de gradient ale funcțiilor mai vechi (sigmoid/tanh).
Ce e Dropout și de ce l-ai folosit?
O tehnică de regularizare: în timpul antrenării, dezactivează aleator o parte din neuroni (0,3 / 0,3 / 0,2 pe cele trei straturi). Astfel rețeaua nu depinde excesiv de anumiți neuroni și generalizează mai bine — previne supraînvățarea.
Ce e Batch Normalization?
Normalizează activările fiecărui strat (medie 0, varianță 1) pe fiecare lot (batch). Stabilizează și accelerează antrenarea și reduce sensibilitatea la inițializarea ponderilor.
Ce e Softmax pe stratul de ieșire?
O funcție care transformă cele 2 valori de ieșire în probabilități care însumează 1: P(normal) și P(fraudă). Așa modelul dă o probabilitate interpretabilă de fraudă, nu doar o clasă.
Ce optimizator și rată de învățare ai folosit?
Optimizatorul Adam cu learning_rate = 0,001 (valoarea standard recomandată) și weight_decay = 0,0001 pentru regularizare L2 (penalizează ponderile mari, previne supraînvățarea). Funcția de pierdere: CrossEntropyLoss.
Ce e early stopping și cum l-ai implementat?
Un mecanism care oprește antrenarea când modelul nu se mai îmbunătățește, ca să evite supraînvățarea. La finalul fiecărei epoci evaluez AUC-PR pe validare; dacă nu se îmbunătățește 10 epoci consecutive, mă opresc și păstrez cea mai bună versiune. La mine, cea mai bună a fost la epoca 49 din 50 (AUC-PR validare 0,9012).
Ce e ReduceLROnPlateau?
Un mecanism care reduce rata de învățare (cu factorul 0,5) când performanța pe validare stagnează câteva epoci. Permite modelului să facă pași mai mici și mai fini când se apropie de optim, îmbunătățind convergența.
De ce ai folosit PyTorch și nu MLPClassifier din scikit-learn?
PyTorch oferă control complet asupra arhitecturii și procesului de antrenare — mi-a permis să implementez Batch Normalization, Dropout per strat, early stopping pe AUC-PR (nu pe loss), ReduceLROnPlateau și monitorizarea personalizată. MLPClassifier din scikit-learn e mai limitat pentru astfel de personalizări.
Ce arată curba de învățare a MLP-ului?
Două curbe complementare pe parcursul a 50 de epoci: Train Loss scade rapid de la ~0,28 la ~0,03 (modelul învață tiparele), iar AUC-PR pe validare crește de la ~0,22 la 0,90. Evoluția inversă (loss ↓, AUC-PR ↑) confirmă că reducerea erorii pe antrenare îmbunătățește capacitatea de detecție. Early stopping salvează versiunea de la epoca 49.
Ce e supraînvățarea (overfitting) și cum ai prevenit-o?
Overfitting = modelul memorează datele de antrenare (inclusiv zgomotul) și generalizează prost pe date noi. Am prevenit-o diferit pentru fiecare model: max_depth la Arbore/Random Forest, regularizare + learning_rate mic la XGBoost, Dropout + weight decay + early stopping la MLP. Și evaluarea pe un set de test complet separat (2020) confirmă generalizarea.
Cum știi că modelul generalizează bine?
Pentru că e evaluat pe un set de test complet independent (555.719 tranzacții din 2020), separat temporal de antrenare, cu distribuția reală de 0,39% fraude. Rezultatele bune pe date niciodată văzute (Recall 0,90, AUC-PR 0,88) arată generalizare, nu memorare.
Care e clasamentul final al modelelor și după ce metrică?
După AUC-PR (și F1): XGBoost (0,8765) > Random Forest (0,8627) ≈ MLP (0,8743) > Arbore de Decizie (0,6136) >> Regresia Logistică (0,1812). XGBoost câștigă pe echilibrul general; Regresia Logistică e clar ultima din cauza limitării liniare.
Care e concluzia principală despre complexitate?
Complexitatea ajută până la un punct. Saltul uriaș de performanță e între modelul liniar și cele neliniare (LR → Arbore). De la Random Forest la XGBoost la MLP, câștigul e marginal. Cel mai complex model (MLP) nu a câștigat — pe date tabelare, un XGBoost bine reglat e suficient. „Mai mult" nu înseamnă automat „mai bun".
De ce toate modelele au acuratețe > 99%?
Din cauza dezechilibrului: 99,4% din tranzacții sunt legitime, deci orice model care le clasifică bine pe majoritatea obține automat acuratețe peste 99% — chiar și Regresia Logistică, cu AUC-PR de doar 0,18. Exact de aceea acuratețea nu e o metrică relevantă aici.
Care sunt cele mai importante rezultate ale XGBoost?
Recall 90,35% (prinde ~90% din fraude), Precizie 50,3%, F1 0,6462, AUC-PR 0,8765, FNR 0,0965 (ratează doar 9,65%). Din matricea de confuzie: din 2.145 de fraude reale, prinde 1.938 și ratează doar 207, cu doar 1.915 alarme false din peste 550.000 de tranzacții legitime.
Ce e pragul de decizie și ce valoare ai folosit implicit?
Pragul de decizie e probabilitatea minimă peste care o tranzacție e considerată fraudă. Am folosit valoarea standard 0,5 pentru comparația principală (o tranzacție e fraudă dacă P(fraudă) > 50%).
Cum afectează pragul rezultatele? Ce ai observat la 0,1 / 0,5 / 0,9?
Pentru XGBoost: la prag 0,1 — Recall maxim (0,96), dar Precizie mică (0,21), multe alarme false. La 0,5 — echilibrul standard (Recall 0,90, Precizie 0,50). La 0,9 — Precizie maximă (0,88) și F1 cel mai bun (0,8255), dar Recall mai mic (0,78). Deci pragul e o pârghie: îl cobori dacă vrei să prinzi cât mai multe fraude, îl ridici dacă vrei să reduci alarmele false.
Pragul de 0,5 e optim? Ce ai recomanda?
Nu, nu e optim — la 0,9, XGBoost obține cel mai bun F1 al său (0,8255). Pragul optim depinde de context: o bancă preocupată de recuperarea pierderilor alege un prag mic (Recall mare); una preocupată de experiența clientului alege un prag mare (puține alarme false). O direcție viitoare e calibrarea pragului per model, pe o matrice de cost care reflectă costul real al unei fraude ratate vs. al unei alarme false.
Ce e matricea de confuzie? Definește TP, TN, FP, FN.
Un tabel 2×2 care compară clasele reale cu cele prezise: TP (True Positive) = fraude reale detectate corect; TN (True Negative) = tranzacții legitime clasificate corect; FP (False Positive) = tranzacții legitime semnalate greșit ca fraudă (alarme false); FN (False Negative) = fraude reale ratate.
Care eroare e mai gravă — FP sau FN — și de ce?
FN (fraudă ratată) e mai gravă: înseamnă o pierdere financiară directă, banii sunt deja furați. Un FP (alarmă falsă) înseamnă doar o verificare suplimentară a unei tranzacții legitime — deranjant, dar recuperabil. De aceea am urmărit un FNR cât mai mic și am evidențiat celula FN în matricea de confuzie.
Interpretează matricea de confuzie a XGBoost.
TN = 551.659 (legitime corecte), FP = 1.915 (alarme false), FN = 207 (fraude ratate), TP = 1.938 (fraude prinse). Din 2.145 de fraude reale, ratează doar 207 (9,65%), cu cel mai mic număr de alarme false dintre toate modelele. Un echilibru foarte bun.
De ce Arborele de Decizie are cel mai mare FP?
Pentru că e cel mai „agresiv" în a clasifica tranzacții ca fraudă — prinde multe fraude (FN mic, 209) dar cu prețul multor alarme false (FP = 4.141). Comportament tipic pentru un singur arbore, cu probabilități mai puțin calibrate decât un ansamblu.
Cum se calculează importanța variabilelor la modelele cu arbori?
Se măsoară cât reduce fiecare variabilă „impuritatea" (Gini) în toate split-urile în care e folosită, agregat pe toți arborii. O variabilă folosită des și în split-uri decisive are importanță mare. E disponibilă nativ pentru Arbore de Decizie și Random Forest.
Ce diferență e între importanța la Random Forest și la Arborele de Decizie?
Random Forest distribuie importanța mai echilibrat: amt_log (0,343) + amt (0,329) ~67%, apoi ora (0,091). Arborele de Decizie concentrează 67% pe o singură variabilă (amt = 0,6694), pentru că un singur arbore alege variabila cu cea mai mare putere discriminatorie și depinde masiv de ea. Ambele confirmă că suma și ora domină.
De ce nu ai analizat importanța pentru XGBoost și MLP?
Importanța nativă bazată pe arbori nu se aplică direct rețelei neuronale, iar pentru XGBoost am considerat că analiza pe Random Forest și Arbore e suficientă pentru concluzia despre variabilele dominante. O analiză completă pentru XGBoost și MLP ar necesita valorile SHAP — este o direcție viitoare declarată în lucrare.
Ce e SHAP și de ce l-ai propus ca direcție viitoare?
SHAP (SHapley Additive exPlanations) e o metodă de interpretabilitate care atribuie fiecărei variabile contribuția ei la fiecare predicție individuală, funcționând pentru orice model (inclusiv XGBoost și rețele neuronale). Ar oferi transparență la nivel local — esențial dacă modelul ar ajunge în producție și ar trebui auditat.
Genul contează în detecția fraudei?
Practic deloc. Rata de fraudă e 0,52% la femei vs. 0,64% la bărbați — o diferență minimă. În importanța variabilelor, genul e ultimul (0,005 la Random Forest). Confirmat independent de analiza exploratorie și de modele.
Ce e curba Lift și ce înseamnă „50×"?
Curba Lift măsoară de câte ori e mai eficient modelul față de o selecție aleatoare, când ordonezi tranzacțiile după scorul de fraudă și verifici cele mai suspecte primele. „50×" înseamnă că, verificând doar top 2% cele mai suspecte tranzacții, găsești de 50 de ori mai multe fraude decât dacă ai alege 2% la întâmplare.
Care e valoarea practică a modelului într-o bancă?
Un analist nu poate verifica manual milioane de tranzacții. Modelul prioritizează investigațiile: îi spune analistului unde să se uite întâi. Verificând doar cele mai suspecte 2-5% din tranzacții, banca prinde marea majoritate a fraudelor cu efort minim. Modelul nu înlocuiește analistul — îi maximizează eficiența.
Cu ce studiu te-ai comparat și care e concluzia?
Cu Baisholan et al. (2025), care folosește aceleași modele pe un set real european. Concluzia principală se păstrează: XGBoost e cel mai performant în ambele studii, urmat de Random Forest. Faptul că ierarhia se menține pe seturi de date diferite întărește robustețea concluziilor.
De ce AUC-PR-ul tău la Regresia Logistică (0,18) e mult mai mic decât al lor (0,74)?
Pentru că sunt seturi de date diferite — al meu sintetic (Sparkov), al lor real european, cu caracteristici și grade de separabilitate diferite. Comparația e orientativă, nu una directă (nu 1-la-1). Ce contează e că ierarhia modelelor e consistentă, nu valorile absolute.
De ce Recall-ul tău e mai mare decât în literatură la majoritatea modelelor?
Datorită strategiei de undersampling 10:1, care crește sensibilitatea la clasa minoritară (fraudele) — modelul e antrenat pe o proporție mai mare de fraude, deci le detectează mai bine. Compromisul e o precizie mai mică la pragul implicit, recuperabilă prin ajustarea pragului.
Ce alte studii citezi în lucrare?
Printre altele: Afriyie et al. (2023) — modelele bazate pe arbori depășesc cele liniare; Wijaya et al. (2024) — impactul tehnicilor de echilibrare (SMOTE, undersampling); Albalawi & Dardouri (2025) — regresia logistică generează multe alarme false; Al-Bulushi et al. (2026) — ajustarea pragului îmbunătățește performanța. Toate conturează aceeași direcție: ansamblurile de arbori domină, iar metrica și echilibrarea contează.
Care sunt principalele limitări ale lucrării?
(1) Date sintetice (Sparkov) — nu reflectă 100% realitatea; (2) hiperparametrii aleși din literatură/încercări, nu printr-o căutare riguroasă (grid/random search); (3) validarea aleatoare, nu temporală (ultimele luni din 2019); (4) ora/luna ca valori brute, nu ciclice (discontinuitate la miezul nopții); (5) pragul implicit 0,5, neoptimizat per model; (6) importanța variabilelor doar pentru modele cu arbori.
Ce înseamnă „ora ca valoare brută" și de ce e o problemă?
Am tratat ora ca număr de la 0 la 23. Problema: ora 23 și ora 0 sunt adiacente în realitate (o oră distanță), dar numeric sunt cât se poate de depărtate. Modelul „crede" că sunt foarte diferite. Soluția (direcție viitoare) e codarea ciclică cu sin/cos: sin(2π·ora/24) și cos(2π·ora/24), care fac ora 23 și ora 0 apropiate.
Nu e o problemă că folosești `ora` — nu e cumva data leakage?
Nu. Ora tranzacției e cunoscută în momentul tranzacției, deci e disponibilă legitim la momentul predicției într-un sistem real. Data leakage ar fi să folosesc o informație din viitor (ex. dacă tranzacția a fost ulterior contestată). Ora e o caracteristică validă.
Cum ai îmbunătăți lucrarea pe viitor?
Codare ciclică sin/cos pentru timp; optimizarea pragului per model pe o matrice de cost; comparație cu SMOTE/oversampling; interpretare cu SHAP pentru XGBoost și MLP; căutare riguroasă a hiperparametrilor; validare temporală; și testare pe date reale, mai recente.
Cum ai pune modelul în producție?
L-aș expune ca serviciu care primește o tranzacție, calculează caracteristicile în timp real, aplică scalarea învățată și returnează probabilitatea de fraudă. Tranzacțiile peste un prag (calibrat pe cost) merg către analiști sau se blochează. Aș adăuga monitorizarea pentru concept drift (reantrenare periodică) și interpretabilitate SHAP pentru audit.
De ce nu ai folosit SMOTE în loc de undersampling?
Undersampling e mai simplu și mai rapid, evită artefactele exemplelor sintetice generate de SMOTE și e recomandat frecvent pentru dezechilibru sever. Am ales-o ca strategie principală, dar recunosc că SMOTE ar putea da rezultate diferite — de aceea e o direcție viitoare de comparat. Nu am afirmat că undersampling e universal cea mai bună, ci că e o alegere justificată pentru acest caz.
De ce doar aceste 5 modele și nu SVM, KNN, LightGBM, CatBoost?
Cele 5 acoperă intenționat scara de complexitate și principalele familii (liniar, arbore, bagging, boosting, deep learning) — suficient pentru ipoteza de cercetare. SVM și KNN scalează prost pe 1,3 milioane de tranzacții; LightGBM și CatBoost sunt tot algoritmi de boosting, similari cu XGBoost. Ar fi extensii valide, dar nu ar schimba concluzia principală.
De ce ai testat pe distribuția reală, dacă ai antrenat pe una echilibrată? Nu e inconsecvent?
Din contră — e corect. Antrenarea pe date echilibrate ajută modelul să învețe clasa rară. Testarea pe distribuția reală (0,39%) e singura care măsoară onest ce s-ar întâmpla în producție. Dacă aș fi testat tot pe date echilibrate, aș fi umflat artificial rezultatele. Această separare e o alegere metodologică deliberată, nu o inconsecvență.
Rezultatele tale ar fi valide și pe date reale?
Valorile absolute s-ar putea schimba, dar metodologia e transferabilă: alegerea AUC-PR, tratarea dezechilibrului fără scurgeri de date, analiza pragului, ierarhia modelelor. Concluzia că ansamblurile de arbori (XGBoost) domină e confirmată și de literatura pe date reale (Baisholan 2025).
Nu e un rezultat trivial că un model complex bate unul simplu?
Nu — rezultatul interesant e că cel mai complex model (rețeaua neuronală) NU a câștigat. Un XGBoost, mai simplu și mai ieftin computațional, l-a egalat sau depășit. Deci nu „complexitatea maximă câștigă", ci „potrivirea modelului la tipul de date" — arborii sunt superiori pe date tabelare.
Cum răspunzi dacă cineva spune că F1 de 0,65 nu e impresionant?
Este un rezultat solid dat fiind dezechilibrul extrem de 172:1 și testarea pe distribuția reală. Recall-ul de 90% arată că prindem 9 din 10 fraude. Iar la pragul de 0,9, F1 urcă la 0,83. F1 la pragul implicit e conservator tocmai pentru că nu am optimizat pragul — o rezervă demonstrată de analiza pragului.
De ce nu ai făcut cross-validation?
Am folosit o împărțire clară train/validare/test cu separare temporală (2019 vs 2020), care e mai realistă decât cross-validation aleatoare pentru date cu componentă temporală — testează pe „viitor". Cross-validation ar amesteca anii și ar putea da o estimare optimistă. Setul de test mare (peste 550.000) oferă o estimare stabilă.
De unde știi că modelul nu e „norocos" pe acest test?
Setul de test are peste 550.000 de tranzacții și 2.145 de fraude — un eșantion suficient de mare pentru rezultate stabile, nu aleatoare. Iar consistența dintre modele și cu literatura confirmă că rezultatele nu sunt întâmplătoare.
Ce e bias-variance tradeoff?
Compromisul dintre eroarea de bias (model prea simplu, nu prinde tiparul — ex. Regresia Logistică) și eroarea de varianță (model prea complex, memorează zgomotul — ex. un arbore adânc fără constrângeri). Scopul e un echilibru: destul de complex să prindă tiparul, destul de constrâns să generalizeze. XGBoost/Random Forest gestionează bine acest compromis.
Ce e o funcție de pierdere (loss function)?
O funcție care cuantifică cât de departe sunt predicțiile modelului de valorile reale; antrenarea înseamnă minimizarea ei. Pentru clasificare am folosit CrossEntropyLoss (la MLP), iar XGBoost/LR optimizează funcții de pierdere logistice.
Ce e un gradient / gradient descent?
Gradientul indică direcția de creștere a funcției de pierdere; gradient descent actualizează ponderile în direcția opusă gradientului, pentru a minimiza pierderea, pas cu pas. Adam (optimizatorul MLP-ului) e o variantă avansată de gradient descent cu rată de învățare adaptivă.
Ce e regularizarea, în general?
Orice tehnică ce descurajează complexitatea excesivă a modelului pentru a preveni supraînvățarea: penalizarea ponderilor mari (L1/L2), limitarea adâncimii arborilor, Dropout, early stopping. Fiecare model din lucrare folosește o formă de regularizare.
Care e diferența dintre parametru și hiperparametru?
Parametrii sunt învățați automat din date în timpul antrenării (ponderile modelului). Hiperparametrii sunt setați manual înainte de antrenare (ex. max_depth, learning_rate, numărul de arbori) și controlează procesul de învățare.
Cum ai structurat codul / fluxul de lucru?
Încărcarea datelor → curățare (vârste imposibile) → feature engineering (vârstă, oră, lună, amt_log) → codare (Label/One-Hot) → împărțirea validării → undersampling pe antrenare → scalare (fit pe train) → antrenarea celor 5 modele → evaluare pe test cu multiple metrici → analiza pragului, matrice de confuzie, importanța variabilelor, curba Lift.
Cât a durat antrenarea? A fost costisitoare?
Modelele clasice (LR, Arbore, Random Forest, XGBoost) se antrenează rapid pe cele 65.021 de tranzacții. Rețeaua neuronală a fost cea mai costisitoare (50 de epoci, cu monitorizare pe validare), dar tot gestionabilă. Undersampling-ul a redus semnificativ costul de antrenare față de setul complet de 1,3 milioane.
De ce fraudele au o distribuție bimodală a sumei?
Se văd două grupuri: unul cu valori mici (sub 50$) — probabil tranzacții de testare prin care fraudatorii verifică dacă cardul funcționează; și unul concentrat în jurul valorii de 500$ — lovitura mare, furtul unei sume semnificative înainte de a fi prinși. Tranzacțiile normale au o singură grupare, la valori mici.
De ce se concentrează fraudele noaptea (22:00–03:00)?
Pentru că noaptea oamenii dorm și nu observă tranzacțiile suspecte, băncile au personal redus de monitorizare, iar reacția la alerte e mai lentă. Rata de fraudă la 22:00–23:00 e de ~2,85-2,90% — de peste 20 de ori mai mare decât media din timpul zilei (sub 0,5%).
De ce comercianții online (_net) au rată de fraudă mai mare decât cei fizici (_pos)?
Pentru că online verificarea identității e mai slabă — nu e nevoie de card fizic sau PIN, doar de datele cardului. Ex: shopping_net (1,74%) vs shopping_pos (0,72%). Fraudatorii preferă canalele online, cu volum mare și verificare redusă.
De ce corelația liniară a sumei cu is_fraud e doar 0,22?
Pentru că relația nu e liniară. Corelația Pearson măsoară doar dependența liniară; o valoare mică nu înseamnă „fără relație", ci „fără relație liniară". Informația despre fraudă e ascunsă în interacțiuni neliniare — exact ce surprind arborii și rețelele neuronale, dar nu un model liniar. De aceea 0,22 e „mare" comparativ cu restul (aproape 0).
Pe harta geografică, de ce nu se concentrează frauda în anumite zone?
Pentru că frauda urmează densitatea populației, nu un tipar geografic propriu. Statele cu cele mai multe fraude (New York 555, Texas 479, Pennsylvania 458) sunt și cele cu activitate economică și populație mare. De aceea locația geografică are putere predictivă redusă.
De ce lat și merch_lat au corelație 0,99?
Pentru că locația comerciantului e aproape identică cu locația titularului la momentul tranzacției (oamenii cumpără de la comercianți apropiați). Fiind aproape redundante, aceste variabile geografice au importanță scăzută în predicție și nu semnalează fraudă.
Ce reprezintă exact raportul 172:1 de pe slide-uri?
Raportul dintre numărul de tranzacții legitime și cele frauduloase în setul de antrenare: la fiecare 172 de tranzacții legitime există o singură fraudă (0,58% fraude). E măsura dezechilibrului de clase.
Ce înseamnă „prag" în tabelul cu 0,1 / 0,5 / 0,9?
Pragul de decizie asupra probabilității de fraudă. La prag 0,1, orice tranzacție cu P(fraudă) > 10% e semnalată (agresiv, prinde mult, dar multe alarme false). La 0,9, doar cele cu P(fraudă) > 90% (conservator, precizie mare, dar ratează mai multe). Tabelul arată compromisul Precizie-Recall la fiecare prag.
De ce în curba ROC toate modelele arată aproape perfect, dar în Precizie-Recall se separă?
Pentru că ROC include True Negatives (clasa majoritară uriașă), care „diluează" diferențele și fac toate modelele să pară excelente (AUC-ROC 0,90–0,998). Curba Precizie-Recall nu include TN, deci reflectă doar performanța pe clasa rară a fraudelor — acolo Regresia Logistică se prăbușește vizibil (0,18) față de XGBoost (0,88). E cea mai bună dovadă de ce contează alegerea metricii.
Succes la apărare! Respiră adânc, vorbește rar și cu încredere — cunoști lucrarea mai bine decât oricine din sală.