Domanda

sto facendo alcuni problemi su una domanda di albero delle decisioni / foresta casuale. Sto cercando di adattarsi a un problema che ha numeri e stringhe (come il nome del paese) come caratteristiche. Ora la biblioteca, scikit-learn prende solo numeri come parametri, ma voglio di iniettare le stringhe così come essi trasportare una notevole quantità di conoscenze.

Come faccio a gestire un tale scenario?

I in grado di convertire una stringa di numeri da qualche meccanismo come hashing in Python. Ma vorrei sapere le migliori pratiche su come le stringhe vengono gestite in problemi di albero decisionale.

È stato utile?

Soluzione

Nella maggior parte dei sistemi di apprendimento della macchina ben consolidati, variabili categoriali vengono gestite in modo naturale. Per esempio in R si usa fattori, in WEKA si usa variabili nominali. Questo non è il caso in scikit-learn. Gli alberi di decisione attuate in scikit-learn usa solo funzioni numeriche e queste caratteristiche sono interpretati sempre come variabili numeriche continue .

Così, semplicemente sostituendo le corde con un codice hash dovrebbero essere evitati, perché essere considerata come una caratteristica numerica continua alcuna codifica verrà utilizzato indurrà un ordine che semplicemente non esiste nei dati.

Un esempio è quello di codice [ 'rosso', 'verde', 'blu'] con [1,2,3], produrrebbe cose strane come il 'rosso' è inferiore a quella 'blu', e se la media di un 'rosso' e 'blu' si otterrà un 'verde'. Un altro esempio più sottile potrebbe accadere quando si codice [ 'bassa', 'media', 'alto'] con [1,2,3]. In quest'ultimo caso potrebbe accadere di avere un ordinamento che ha senso, tuttavia, alcune incongruenze sottili potrebbe accadere quando 'media' in non nel mezzo di 'basso' e 'alta'.

Infine, la risposta alle vostre bugie domanda nella codifica la funzione categorica in caratteristiche multiple binari . Ad esempio, si potrebbe codice [ 'rosso', 'verde', 'blu'] con 3 colonne, una per ogni categoria, con da 1 quando la partita categoria e 0 altrimenti. Questo è chiamato un hot-codificante , codifica binaria, unico nel k-codificante o altro. È possibile controllare la documentazione qui per codifica categorica caratteristiche e feature Extraction - hashing e dicts . Ovviamente uno-hot-encoding si espanderà le vostre esigenze di spazio e, a volte fa male le prestazioni pure.

Altri suggerimenti

È necessario per codificare le stringhe come le caratteristiche numeriche che sci-kit può utilizzare per gli algoritmi di ML. Questa funzionalità è gestita nel modulo di pre-elaborazione (ad esempio, vedere sklearn.preprocessing.LabelEncoder per un esempio).

Di solito si deve codificare un caldo variabili categoriali per scikit-learn modelli, tra cui foresta casuale. foresta a caso spesso funzionare bene senza la codifica di un caldo, ma di solito esegue meglio se lo fai codice uno-caldo. One-caldo codifica e variabili "Finte" significano la stessa cosa in questo contesto. Scikit-learn ha sklearn.preprocessing.OneHotEncoder e Panda ha pandas.get_dummies per raggiungere questo obiettivo.

Tuttavia, ci sono alternative. L'articolo "Al di là di One-Hot" a KDnuggets fa un grande lavoro di spiegare perché è necessario per codificare le variabili categoriche e alternative a un caldo codifica.

Ci sono implementazioni alternative foresta casuale che non richiedono la codifica di un caldo come R o H2O. L'implementazione di R è computazionalmente costoso e non funziona se i tuoi lineamenti hanno molte categorie . H2O lavorerà con un gran numero di categorie. Continuum ha fatto H2O disponibili in Anaconda Python.

C'è un continuo sforzo per rendere scikit-learn maniglia categorica caratteristiche direttamente .

questo articolo ha una spiegazione dell'algoritmo utilizzato in H2O. Si fa riferimento al documento accademico A Streaming decisione parallela Albero Algoritmo e un versione più della carta stessa.

2018 Update!

È possibile creare uno spazio di embedding (denso vettore) per le variabili categoriali. Molti di voi hanno familiarità con word2vec e fastext, che incorporare le parole in uno spazio denso vettore di significato. Stessa idea qui-- le variabili categoriche saranno indirizzate verso un vettore con un certo significato.

Guo / Berkhahn carta :

Entità embedding non solo riduce l'utilizzo della memoria e accelera neurale reti a confronto con la codifica di un caldo, ma ancora più importante per mappare valori simili vicini l'uno all'altro nello spazio incorporarlo rivela le proprietà intrinseche delle variabili categoriali. Noi applicata con successo in un recente concorso Kaggle ed erano in grado per raggiungere la terza posizione con le caratteristiche semplici relativi.

Gli autori hanno scoperto che rappresentano le variabili categoriali in questo modo ha migliorato l'efficacia di tutte le macchine algoritmi testate, tra cui foresta casuale di apprendimento.

Il miglior esempio potrebbe essere l'applicazione di Pinterest del tecnica al gruppo legato Pins:

entrare descrizione dell'immagine qui

La gente a fastai ha implementato incastri categoriche e ha creato un bel blog postare con accompagnatore demo notebook .

Dettagli aggiuntivi e spiegazione

Una rete neurale viene usato per creare il incastri cioè assegnare un vettore a ciascun valore categorica. Una volta che avete i vettori, li si può utilizzare in qualsiasi modello che accetta valori numerici. Ogni componente di vettore diventa una variabile di ingresso. Ad esempio, se si è utilizzato vettori 3-D per incorporare il tuo lista categorica dei colori, si potrebbe ottenere qualcosa di simile: rosso = (0, 1,5, -2,3), = blu (1, 1, 0), ecc Si potrebbe utilizzare tre variabili di input nella vostra foresta casuale corrispondenti ai tre componenti. Per le cose rosse, c1 = 0, c2 = 1,5, e c3 = -2.3. Per le cose blu, c1 = 1, c2 = 1, e c3 = 0.

in realtà non necessità per utilizzare una rete neurale per creare incastri (anche se io non consiglio shying lontano dalla tecnica). Sei libero di creare i propri incastri a mano o con altri mezzi, quando possibile. Alcuni esempi:

  1. Colori mappa a vettori RGB.
  2. Mappa posizioni a vettori latitudine / longitudine.
  3. In un modello politico degli Stati Uniti, mappa città per alcuni componenti vettoriali rappresentanti sinistra allineamento / destra, pressione fiscale, ecc.

È possibile utilizzare manichino variabili in tali scenari. Con panda.get_dummies di Panda è possibile creare variabili dummy per le stringhe che si desidera mettere in Albero decisionale o Foresta a caso.

Esempio:

import pandas as pd
d = {'one' : pd.Series([1., 2., 3.,4.], index=['a', 'b', 'c','d']),'two' :pd.Series(['Paul', 'John', 'Micheal','George'], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

df_with_dummies= pd.get_dummies(df,columns=["two"],drop_first=False)
df_with_dummies

li trasformano in numeri, per esempio per ogni paese unico assingn un numero univoco (come 1,2,3 e ...)

anche non necessità di utilizzare One-Hot Encoding (variabili aka fittizio) quando si lavora con foresta casuale, perché gli alberi non funzionano come altro algoritmo ( come ad esempio lineare / regressione logistica) e non funzionano da lontano (lavorano con la ricerca di una buona spaccatura per le vostre caratteristiche) in modo da nON NECESSITA per One-Hot Encoding

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top