2016-02-01 14 views
9

Sto riscontrando problemi nell'esecuzione della regressione logistica con xgboost che può essere riepilogata nel seguente esempio.regressione logistica binaria xgboost

lascia supporre ho una molto semplice dataframe con due predittori e una variabile di destinazione:

df= pd.DataFrame({'X1' : pd.Series([1,0,0,1]), 'X2' : pd.Series([0,1,1,0]), 'Y' : pd.Series([0,1,1,0],)}) 

posso pubblicare le immagini perché Im nuovo qui, ma è chiaro che si può vedere che quando X1 = 1 e X2 = 0 , Y è 0 e quando X1 = 0 e X2 = 1, Y è 1.

La mia idea è di costruire un modello che emetta la probabilità che un'osservazione appartenga a ciascuna delle classi, quindi se eseguo xgboost provo per prevedere due nuove osservazioni (1,0) e (0,1) così:

X = df[['X1','X2']].values    
y = df['Y'].values 

params = {'objective': 'binary:logistic', 
      'num_class': 2 
      } 

clf1 = xgb.train(params=params, dtrain=xgb.DMatrix(X, y), num_boost_round=100)      
clf1.predict(xgb.DMatrix(test.values)) 

l'output è:

array([[ 0.5, 0.5], 
     [ 0.5, 0.5]], dtype=float32) 

quale, immagino, significa che per la prima osservazione, c'è il 50% di possibilità che appartenenti a ciascuna delle classi.

Mi piacerebbe sapere perché non l'algoritmo restituisce un valore corretto (1,0) o qualcosa di simile a quello se la relazione tra le variabili è chiara.

FYI, ho provato con più dati (Im solo utilizzando 4 righe per semplicità) e il comportamento è quasi lo stesso; quello che faccio notato è che, non solo le probabilità non sommano a 1, sono spesso molto piccoli in questo modo: (questo risultato è un set di dati diverso, niente a che fare con l'esempio precedente)

array([[ 0.00356463, 0.00277259], 
     [ 0.00315137, 0.00268578], 
     [ 0.00453343, 0.00157113], 
+0

I tuoi due predittori sono solo 0 e 1? In tal caso ci sono solo 4 combinazioni possibili delle tue caratteristiche e quindi dovresti aspettarti (al massimo) 4 previsioni di probabilità uniche. – David

+0

sì, lo sono. Ok, solo 4 possibili combinazioni, ha senso, ma non sono sicuro di come risponde alla mia domanda. – Italo

+0

Sono confuso, qual è la tua domanda? Pensavo che non capissi perché ci fosse poca varianza nelle tue previsioni di probabilità. – David

risposta

3

Ok - ecco cosa sta succedendo ..

L'indizio sul motivo per cui non funziona è nel fatto che nei dataset più piccoli non può allenarsi correttamente. Ho addestrato questo modello esatto e osservando la discarica di tutti gli alberi che vedrai non possono scindere.

(albero discarica sotto)

rotture, sono stati potati!

[1] "booster[0]" "0:leaf=-0" "booster[1]" "0:leaf=-0" "booster[2]" "0:leaf=-0" [7] "booster[3]" "0:leaf=-0" "booster[4]" "0:leaf=-0" "booster[5]" "0:leaf=-0" [13] "booster[6]" "0:leaf=-0" "booster[7]" "0:leaf=-0" "booster[8]" "0:leaf=-0" [19] "booster[9]" "0:leaf=-0"

non c'è abbastanza peso è ciascuna delle foglie di sopraffarexgboost s' regolarizzazione interna (che penalizza per crescere)

Questo parametro può o non può essere accessibile dalla versione Python, ma è possibile afferrarlo da R se si installa Github

http://xgboost.readthedocs.org/en/latest/parameter.html

lambda [default = 1] L2 termine regolarizzazione sui pesi

alpha [default = 0] L1 termine regolarizzazione sui pesi

in fondo questo è il motivo per cui il tuo esempio si allena meglio come si aggiunge più dati, ma non può allenarsi affatto con solo 4 esempi e impostazioni predefinite.

Problemi correlati