2012-02-20 10 views

risposta

25

I valori mancanti non sono supportati in scikit-learn. C'è già stata una discussione sulla mailing list su questo, ma nessun tentativo di scrivere effettivamente il codice per gestirli.

Qualunque cosa tu faccia, non lo fanno uso NaN per codificare i valori mancanti, dal momento che molti degli algoritmi rifiutano di gestire campioni contenenti NaN.

La risposta di cui sopra non è aggiornata; l'ultima versione di scikit-learn ha una classe Imputer che esegue un'imputazione del valore mancante semplice, per caratteristica. È possibile alimentare gli array contenenti NaN per sostituirli con la media, la mediana o la modalità della funzione corrispondente.

+0

Volevo solo sottolineare che la foresta casuale gestisce i valori nan ben –

+0

È ancora il caso di GBM? C'è una ragione per cui la versione per l'apprendimento di scikit non rispecchia la codifica in R, che tratta con garbo i valori mancanti? È una delle caratteristiche interessanti di quell'algoritmo e vorrei che fosse codificato come tale in scikit. –

+0

@B_Miner: è il caso di praticamente tutti gli stimatori di apprendimento scikit. La gestione del valore mancante viene eseguita separatamente dall'apprendimento, ma i due possono essere combinati usando un 'Pipeline'. –

11

Vorrei poter fornire un semplice esempio, ma ho trovato che RandomForestRegressor fa non gestisce nan's con garbo. Le prestazioni peggiorano costantemente quando si aggiungono funzionalità con percentuali crescenti di nan. Le caratteristiche che hanno "troppi" nan sono completamente ignorate, anche quando le nan indicano informazioni molto utili.

AFAIK l'algoritmo non creerà mai una divisione sulla decisione "isnan" o "ismissing". L'algoritmo ignorerà la funzione a un livello particolare dell'albero se la funzione ha solo un valore noto e il resto dei valori della funzione è nan/sconosciuto.

Ho provato varie tecniche di imputazione per affrontare il problema (sostituire con media/media, prevedere valori mancanti utilizzando un modello diverso, ecc.), Ma i risultati sono stati contrastanti.

Invece, questa è la mia soluzione: sostituire i nan con un valore singolo, ovviamente fuori range (come -1.0). Ciò consente alla struttura di dividersi sui criteri "valori sconosciuti rispetto a valori noti". È importante notare, tuttavia, che c'è un problema con la sostituzione con l'utilizzo di tali valori fuori intervallo: i valori noti potrebbero essere raggruppati insieme al valore fuori intervallo quando l'algoritmo tenta di trovare un buon posto per dividere . Ad esempio, il valore minimo conosciuto potrebbe essere moltiplicato con il valore fuori range (i tuoi 0 noti vengono moltiplicati con i -1 che hai usato per sostituire i tuoi valori nan). Quindi il tuo modello potrebbe cambiare in base a se il tuo valore fuori intervallo è inferiore al minimo o se è maggiore del massimo (potrebbe essere accoppiato con il valore minimo o il valore massimo, rispettivamente).

+0

Ottima idea per utilizzare valori "chiaramente fuori dall'intervallo" per i valori mancanti. Questo dovrebbe funzionare molto bene per Decision Trees. – pansen

3

Orange è un'altra libreria di apprendimento automatico di Python dotata di strutture dedicate all'imputazione. Non ho avuto la possibilità di usarli, ma potrebbe essere presto, dal momento che i semplici metodi di sostituzione di nan con zeri, medie o mediani hanno tutti problemi significativi.

+2

Il link non è più valido. Penso che l'attuale URL sia: http://docs.orange.biolab.si/reference/rst/Orange.feature.imputation.html. – JustAC0der

+0

sì hai ragione. Fisso. –

8

ho incontrato problema molto simile, quando si esegue il RandomForestRegressor sui dati. La presenza di valori di NA stava eliminando "nan" per le previsioni. Scorrendo diverse discussioni, la Documentation di Breiman raccomanda due soluzioni rispettivamente per dati continui e categorici.

  1. calcolare la mediana dei dati dalla colonna (caratteristica) e utilizzare questo (Continuous Data)
  2. determinare la categoria più frequente e utilizzare questa (dati categoriali)

Secondo a Breiman la natura casuale dell'algoritmo e il numero di alberi consentiranno la correzione senza troppi effetti sulla precisione della previsione. Questo credo che sarebbe il caso se la presenza di valori di NA fosse scarsa, una caratteristica che contiene molti valori di NA credo che molto probabilmente avrà un effetto.

8

La sostituzione di un valore mancante con una media/mediana/altra statistica potrebbe non risolvere il problema in quanto il fatto che il valore sia mancante potrebbe essere significativo. Ad esempio, in un sondaggio sulle caratteristiche fisiche, un rispondente potrebbe non mettere la propria altezza se fosse imbarazzato per essere anormalmente alto o piccolo. Ciò implicherebbe che i valori mancanti indicano che il rispondente era insolitamente alto o piccolo - l'opposto del valore mediano.

Ciò che è necessario è un modello che ha una regola separata per i valori mancanti, qualsiasi tentativo di indovinare il valore mancante probabilmente ridurrà la potenza predittiva del modello.

+1

Vero. Inoltre, in molti casi i dati potrebbero essere molto NULL (diciamo che il 20% di ogni riga è compilato). Il metodo basato su DT dovrebbe essere in grado di assorbirlo - e se usato correttamente, il modello può essere molto meglio di uno con i dati imputati. – user48956

+0

@Johnny V Cosa intendi per "un modello con una regola separata"? – KouchakYazdi

+0

La strategia che uso è quella di aggiungere una colonna di flag di valore mancante e di inserire il valore mancante con la mediana o la modalità. Ciò che fa è far sì che il record venga trattato normalmente dal modello, a meno che il valore mancante non sia significativo, nel qual caso il modello stabilirà una regola per il flag di dati mancanti. Ad esempio "se il record ha un punto dati mancante, allora classificalo come tipo A" –

1

Ho riscontrato questo problema. In un caso pratico, ho trovato un pacchetto in R chiamato missForest in grado di gestire bene questo problema, imputando il valore mancante e migliorando notevolmente la mia previsione. Penso che questo metodo basato su una foresta casuale di imputazione sia molto più efficace della semplice sostituzione di NA con mediana o media, ma funziona molto lentamente su un grande set di dati. Quindi c'è un compromesso per questo metodo.

1

Quando si incontrano valori mancanti nelle funzionalità di input, il primo ordine del giorno non è il modo in cui imputare i mancanti. La domanda più importante è PERCHÉ TI DEVI. A meno che tu non abbia una mente chiara e definitiva su quale sia la vera "realtà" dietro ai dati, potresti voler ridurre l'impulso di imputare. Non si tratta di tecnica o pacchetto, in primo luogo. Storicamente abbiamo fatto ricorso a metodi ad albero come gli alberi decisionali principalmente perché alcuni di noi ritenevano che l'imputazione mancante alla stima della regressione come la regressione lineare, la regressione logistica o anche la NN siano abbastanza distorsivi da dover disporre di metodi che non richiedano l'imputazione manca "tra le colonne". La cosiddetta informatività mancante. Quale dovrebbe essere un concetto familiare per chi ha familiarità con, per dire, Bayesiano.

Se si sta davvero modellando su big data, oltre a parlarne, è probabile che si faccia fronte a un numero elevato di colonne. Nella pratica comune dell'estrazione di feature come l'analisi del testo, si potrebbe dire che missing significa count = 0. Questo va bene perché conosci la causa principale. La realtà, soprattutto quando si affronta una fonte di dati strutturata, è che non si conosce o semplicemente non si ha il tempo di conoscere la causa principale. Ma il tuo motore impone di inserire un valore, che si tratti di NAN o di altri segnaposto che il motore può tollerare, potrei benissimo sostenere che il tuo modello è buono come quello che imputi, il che non ha senso.

Una domanda interessante è: se lasciamo missingness per essere giudicato dal suo vicino contesto all'interno del processo di scissione, di primo o secondo grado surrogata, non silvicolo effettivamente rendere il giudizio contestuale un discutibile perché il contesto di per sé è selezione casuale? Questo, tuttavia, è un problema "migliore". Almeno non fa così male. Certamente dovrebbe rendere superfluo preservare la mancanza di informazioni.

In pratica, se si dispone di un numero elevato di funzioni di input, non è possibile avere una strategia "buona" da imputare dopo tutto. Dalla pura prospettiva dell'imputazione, la pratica migliore è tutt'altro che univariata.Il che è nel contesto della RF significa praticamente usare la RF per imputare prima di modellarla con essa.

Pertanto, a meno che qualcuno non mi dica (o noi), "non siamo in grado di farlo", penso che dovremmo permettere di portare avanti le "cellule" mancanti, ignorando completamente il soggetto di come "meglio" imputare.

Problemi correlati