Ho molti problemi a capire come funziona il class_weight
parametro nella Regressione logistica di scikit-learn.
La situazione
Voglio utilizzare la regressione logistica per eseguire la classificazione binaria su un set di dati molto sbilanciato. Le classi sono etichettate 0 (negativo) e 1 (positivo) ei dati osservati sono in un rapporto di circa 19: 1 con la maggior parte dei campioni con esito negativo.
Primo tentativo: preparazione manuale dei dati di allenamento
Ho diviso i dati che avevo in set disgiunti per l'addestramento e il test (circa 80/20). Quindi ho campionato a caso i dati di allenamento a mano per ottenere dati di allenamento in proporzioni diverse da 19: 1; da 2: 1 -> 16: 1.
Ho quindi addestrato la regressione logistica su questi diversi sottoinsiemi di dati di addestramento e ho tracciato il richiamo (= TP / (TP + FN)) in funzione delle diverse proporzioni di addestramento. Naturalmente, il richiamo è stato calcolato sui campioni di TEST disgiunti che avevano le proporzioni osservate di 19: 1. Nota, anche se ho addestrato i diversi modelli su dati di allenamento diversi, ho calcolato il richiamo per tutti sugli stessi dati di test (disgiunti).
I risultati sono stati quelli attesi: il richiamo è stato di circa il 60% con proporzioni di allenamento 2: 1 ed è diminuito piuttosto velocemente quando è arrivato a 16: 1. C'erano diverse proporzioni 2: 1 -> 6: 1 dove il ricordo era decentemente superiore al 5%.
Secondo tentativo: ricerca sulla griglia
Successivamente, volevo testare diversi parametri di regolarizzazione e quindi ho usato GridSearchCV e ho creato una griglia di diversi valori del C
parametro e del class_weight
parametro. Per tradurre le mie proporzioni n: m di campioni di allenamento negativi: positivi nella lingua del dizionario di class_weight
ho pensato di specificare solo diversi dizionari come segue:
{ 0:0.67, 1:0.33 } #expected 2:1
{ 0:0.75, 1:0.25 } #expected 3:1
{ 0:0.8, 1:0.2 } #expected 4:1
e ho anche incluso None
e auto
.
Questa volta i risultati sono stati totalmente stravaganti. Tutti i miei richiami sono risultati minuscoli (<0,05) per ogni valore di class_weight
tranne auto
. Quindi posso solo presumere che la mia comprensione di come impostare il class_weight
dizionario sia sbagliata. È interessante notare che il class_weight
valore di "auto" nella ricerca sulla griglia era di circa il 59% per tutti i valori di C
, e ho indovinato che equilibra a 1: 1?
Le mie domande
Come si utilizza correttamente
class_weight
per ottenere equilibri diversi nei dati di allenamento da ciò che effettivamente gli si fornisce? In particolare, a quale dizionario devo passare perclass_weight
utilizzare le proporzioni n: m di campioni di allenamento negativi: positivi?Se si passano vari
class_weight
dizionari a GridSearchCV, durante la convalida incrociata verranno riequilibrati i dati della piega di addestramento in base al dizionario ma utilizzerà le proporzioni reali del campione per calcolare la mia funzione di punteggio nella cartella di prova? Questo è fondamentale poiché qualsiasi metrica mi è utile solo se proviene da dati nelle proporzioni osservate.Che
auto
valore ha perclass_weight
quanto riguarda le proporzioni? Ho letto la documentazione e presumo che "bilancia i dati inversamente proporzionali alla loro frequenza" significa solo che lo rende 1: 1. È corretto? In caso contrario, qualcuno può chiarire?