2015-05-16 21 views
6

Ho un set di dati contenente sia colonne categoriali che numeriche e la mia colonna di destinazione è anche categoriale. Sto usando la libreria Scikit in Python34. So che Scikit richiede che tutti i valori categoriali vengano trasformati in valori numerici prima di eseguire qualsiasi approccio di apprendimento automatico.Caratteristiche categoriali e numeriche - Target categoriale - Scikit Learn - Python

Come devo trasformare le mie colonne categoriali in valori numerici? Ho provato un sacco di cose, ma sto ricevendo errori diversi, come l'oggetto "str", nessun oggetto "numpy.ndarray" non ha attributi "elementi".

Here is an example of my data: 
UserID LocationID AmountPaid ServiceID Target 
29876  IS345  23.9876  FRDG  JFD 
29877  IS712  135.98  WERS  KOI 

mio set di dati viene salvato in un file CSV, ecco il piccolo codice che ho scritto per dare un'idea di quello che voglio fare:

#reading my csv file 
data_dir = 'C:/Users/davtalab/Desktop/data/' 
train_file = data_dir + 'train.csv' 
train = pd.read_csv(train_file) 

#numeric columns: 
x_numeric_cols = train['AmountPaid'] 

#Categrical columns: 
categorical_cols = ['UserID' + 'LocationID' + 'ServiceID'] 
x_cat_cols = train[categorical_cols].as_matrix() 


y_target = train['Target'].as_matrix() 

ho bisogno x_cat_cols per essere convertito in numerico valori e li aggiungo a x_numeric_cols e così hanno i miei valori di input completi (x).

Quindi ho bisogno di convertire la mia funzione di destinazione in valore numerico e renderlo come la mia colonna target finale (y).

poi voglio fare una foresta a caso utilizzando questi due set completi come:

rf = RF(n_estimators=n_trees,max_features=max_features,verbose =verbose, n_jobs =n_jobs) 
rf.fit(x_train, y_train) 

Grazie per il vostro aiuto!

risposta

0

Ciò è dovuto al modo in cui enumerare i dati. Se stampo i dati (utilizzando un altro campione) vedrai:

>>> import pandas as pd 
>>> train = pd.DataFrame({'a' : ['a', 'b', 'a'], 'd' : ['e', 'e', 'f'], 
...      'b' : [0, 1, 1], 'c' : ['b', 'c', 'b']}) 
>>> samples = [dict(enumerate(sample)) for sample in train] 
>>> samples 
[{0: 'a'}, {0: 'b'}, {0: 'c'}, {0: 'd'}] 

Questa è una lista di dict. Dovremmo farlo invece:

>>> train_as_dicts = [dict(r.iteritems()) for _, r in train.iterrows()] 
    >>> train_as_dicts 
    [{'a': 'a', 'c': 'b', 'b': 0, 'd': 'e'}, 
    {'a': 'b', 'c': 'c', 'b': 1, 'd': 'e'}, 
    {'a': 'a', 'c': 'b', 'b': 1, 'd': 'f'}] 
Now we need to vectorize the dicts: 

>>> from sklearn.feature_extraction import DictVectorizer 

>>> vectorizer = DictVectorizer() 
>>> vectorized_sparse = vectorizer.fit_transform(train_as_dicts) 
>>> vectorized_sparse 
<3x7 sparse matrix of type '<type 'numpy.float64'>' 
    with 12 stored elements in Compressed Sparse Row format> 

>>> vectorized_array = vectorized_sparse.toarray() 
>>> vectorized_array 
array([[ 1., 0., 0., 1., 0., 1., 0.], 
     [ 0., 1., 1., 0., 1., 1., 0.], 
     [ 1., 0., 1., 1., 0., 0., 1.]]) 
To get the meaning of each column, ask the vectorizer: 

>>> vectorizer.get_feature_names() 
['a=a', 'a=b', 'b', 'c=b', 'c=c', 'd=e', 'd=f'] 
4

Per il target, è possibile utilizzare lo LabelEncoder di sklearn. Questo ti darà un convertitore da etichette stringa a quelle numeriche (e anche una mappatura inversa). Esempio nel link.

Per quanto riguarda le funzionalità, in generale gli algoritmi di apprendimento si aspettano (o funzionano meglio con) i dati ordinali. Quindi l'opzione migliore è utilizzare OneHotEncoder per convertire le funzionalità categoriali. Questo genererà una nuova funzionalità binaria per ogni categoria, che indica on/off per ogni categoria. Ancora una volta, esempio di utilizzo nel link.

+3

Per l'obiettivo di classificazione, in realtà non è necessario utilizzare alcuna trasformazione. Tutti i classificatori possono trattare con etichette arbitrarie. –