LightGBM risulta in modo diverso a seconda dell'ordine dei dati


8

Ho due set di dati A e B che sono esattamente gli stessi in termini di numero di colonne, nome delle colonne e valori. L'unica differenza è l'ordine di quelle colonne. Quindi treno il modello LightGBM su ciascuno dei due set di dati con i seguenti passaggi

  1. Dividi ogni set di dati in addestramento e test (usa lo stesso seme casuale e il rapporto sia per A che per B)
  2. Lasciare gli iperparametri praticamente predefiniti
  3. Imposta uno stato casuale come numero fisso (per la riproduzione)
  4. Ottimizza learning_rate utilizzando una ricerca griglia
  5. Addestra un modello LightGBM sul set di allenamento e testalo sul set di test
  6. Verrà scelto il tasso di apprendimento con le migliori prestazioni sul set di test

I modelli di output sui due set di dati sono molto diversi, il che mi fa pensare che l'ordine delle colonne influisca sulle prestazioni della formazione del modello utilizzando LightGBM.

Sai perché è così?

Risposte:


6

Una possibile spiegazione è questa:

Quando l'ordine delle colonne differisce, c'è una piccola differenza nella procedura.

Ciò che LightGBM, XGBoost, CatBoost, tra le altre cose, è selezionare diverse colonne dalle funzionalità del set di dati in ogni fase della formazione.

Le selezioni di queste colonne vengono eseguite in modo casuale: supponiamo che il tuo set di dati abbia 20 colonne. Il nodo radice seleziona le funzionalità 1 °, 3 ° e 18 ° , su entrambi i set di dati la 1 °, 3 ° e 18 ° funzionalità sono diverse in entrambi i set di dati possibili. Questo viene ripetutamente fatto e in ogni fase c'è casualità che influenza il tuo risultato finale.


Come possiamo controllare quella casualità quando l'algoritmo seleziona un sottoinsieme di funzionalità per costruire un albero decisionale? Era anche il mio unico pensiero per rispondere a questa situazione. Inoltre, suppongo che se selezioniamo sempre tutte le funzionalità per albero, l'algoritmo utilizzerà Gini (o qualcosa di simile) per calcolare l'importanza della funzione in ogni passaggio, il che non creerà una casualità.
Duy Bui,

lightgbmconsente all'utente di impostare i semi casuali utilizzati per il campionamento di righe e colonne.
Brad

1
@bradS: Non ho impostato il seme come iperparametro in LightGBM ma ho controllato di nuovo e i semi dovrebbero essere impostati come numero fisso per impostazione predefinita. Ciò significa che dovrebbe avere lo stesso risultato, che non è il caso qui. lightgbm.readthedocs.io/en/latest/Parameters.html
Duy Bui

3

Mentre l'ordinamento dei dati è ininfluente in teoria, è importante nella pratica. Considerando che sono state prese misure per garantire la riproducibilità, l'ordinamento diverso dei dati modificherà la logica di divisione del test del treno (a meno che non si sappia con certezza che i set di treni e set di test in entrambi i casi sono esattamente gli stessi). Sebbene non specifichi come dividere i dati, è altamente possibile che un certo assortimento di punti dati renda la macchina più robusta rispetto ai valori anomali e quindi offrendo migliori prestazioni del modello. Nel caso in cui i dati del treno e dei test siano gli stessi in entrambi i casi, probabilmente dovresti vedere se esiste una misura seed / riproducibilità (in qualsiasi parte del codice) che non hai adottato.


Scusa, ho dimenticato di menzionarlo. Aggiornerà la mia domanda. Train e test sono esattamente gli stessi perché li ho divisi usando lo stesso seme casuale.
Duy Bui,

@DuyBui alcuni suggerimenti da provare: 1) se si utilizza Gpu impostare gpu_use_dp su true Da: github.com/Microsoft/LightGBM/pull/560#issuecomment-304561654 2) impostare num_threads su un numero fisso Da: github.com/ Microsoft / LightGBM / issues / 632 ;
gbdata,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.