2015-10-05 30 views
12

Sto usando xgboost per il ranking conCome accedere alla ponderazione dei singoli alberi decisionali in xgboost?

param = {'objective':'rank:pairwise', 'booster':'gbtree'} 

quanto ho capito gradiente aumentando opere calcolando la somma ponderata dei alberi decisionali imparato. Come posso accedere ai pesi assegnati a ciascun potenziatore imparato? Volevo provare a post-elaborare i pesi dopo l'allenamento per accelerare il passo di predizione, ma non so come ottenere i pesi individuali. Quando si utilizza dump_model(), i diversi alberi decisionali possono essere visualizzati nel file creato ma non vi è alcuna ponderazione memorizzata. Nell'API non ho trovato una funzione adatta. Oppure posso calcolare manualmente i pesi con il parametro di restringimento eta?

+0

piacerebbe una risposta a questa domanda ... buona domanda! –

risposta

16

Ogni albero ha lo stesso peso eta e la previsione generale è la somma delle previsioni di ogni albero, come dici tu.

Probabilmente ci si aspetterebbe che agli alberi precedenti venga attribuito un peso maggiore rispetto agli ultimi alberi, ma ciò non è necessario, a causa del modo in cui la risposta viene aggiornata dopo ogni albero. Ecco un esempio di giocattoli:

Supponiamo di avere 5 osservazioni, con le risposte 10, 20, 30, 40, 50. Il primo albero è costruito e dà le previsioni di 12, 18, 27, 39, 54.

Ora, se eta = 1, le variabili di risposta passate all'albero successivo saranno -2, 2, 3, 1, -4 (ovvero la differenza tra la previsione e la risposta vera). Il prossimo albero tenterà quindi di imparare il "rumore" che non è stato catturato dal primo albero. Se nrounds = 2, la somma delle previsioni dei due alberi fornirà la previsione finale del modello.

Se invece eta = 0,1, tutti gli alberi avranno le loro previsioni ridotte di eta, quindi il primo albero invece 'prevarrà' 1.2, 1.8, 2.7, 3.9, 5.4. La variabile di risposta passata all'albero successivo avrà quindi valori 8.8, 18.2, 27.3, 36.1, 44.6 (la differenza tra la previsione ridimensionata e la risposta vera) Il secondo giro utilizza quindi questi valori di risposta per costruire un altro albero - e di nuovo le previsioni sono ridimensionati da eta. Quindi i pronostici dell'albero 2 dicono, 7, 18, 25, 40, 40, che, una volta ridimensionati, diventano 0,7, 1,8, 2,5, 4,0, 4,0. Come prima, al terzo albero verrà passata la differenza tra questi valori e la variabile di risposta dell'albero precedente (quindi 8.1, 16.4, 24.8, 32.1, 40.6). Di nuovo, la somma delle previsioni di tutti gli alberi darà la previsione finale.

Chiaramente quando eta = 0,1 e base_score è 0, avrete bisogno di almeno 10 round per ottenere una previsione che sia quasi ragionevole. In generale, è necessario un minimo assoluto di 1/eta round e in genere molti altri.

Il razionale per l'utilizzo di un piccolo eta è che il modello beneficia di piccoli passi verso la previsione anziché fare in modo che l'albero 1 faccia la maggior parte del lavoro. È un po 'come la cristallizzazione: si raffredda lentamente e ottieni cristalli più grandi e migliori. Il lato negativo è che è necessario aumentare nrounds, aumentando così il runtime dell'algoritmo.

+0

Buona risposta, questa domanda è davvero una domanda più generica. Poiché si stanno solo adattando i residui, è sufficiente aggiungere la predizione di ogni albero ridimensionata da 'eta' Questo dovrebbe essere accettato. –

+0

@dataShrimp, ciao, forse puoi rispondere [questa domanda] (http://stackoverflow.com/questions/35983565/how-is-the-parameter-weight-dmatrix-used-in-the-gradient-boosting-procedure) ?. – Ojtwist

+0

Questa è una delle spiegazioni più chiare che ho trovato. Grazie! – santon