2015-05-16 35 views
6

Mam zestaw danych zawierający kolumny kategoryczne i liczbowe, a moja kolumna docelowa również jest kategoryczna. Używam biblioteki Scikit w Python34. Wiem, że Scikit potrzebuje przekształcić wszystkie wartości kategoryczne na wartości numeryczne, zanim podejmie się uczenia maszynowego.Funkcje jakościowe i liczbowe - Cel kategoryczny - Nauka Scikit - Python

Jak przekształcić moje kolumny jakościowe na wartości liczbowe? Próbowałem wiele rzeczy, ale dostaję różne błędy, np. Obiekt "str" ​​nie ma obiektu "numpy.ndarray" nie ma atrybutu "items".

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

Mój zestaw danych jest zapisywany w pliku CSV, tutaj jest trochę kodu pisałem daje wyobrażenie o tym, co chcę zrobić:

#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() 

muszę x_cat_cols być konwertowane na numeryczne wartości i dodaj je do x_numeric_cols, a więc moje pełne wartości wejściowe (x).

Następnie muszę przekonwertować funkcję celu na wartość liczbową i ustawić ją jako kolumnę docelową (y).

Następnie chcę zrobić Losowa Las stosując te dwa komplety jak:

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

dzięki za pomoc!

Odpowiedz

0

Było tak ze względu na sposób wyliczenia danych. Jeśli wydrukuję dane (używając innej próbki), zobaczysz:

>>> 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'}] 

To jest lista dyktatur. Powinniśmy zrobić to zamiast tego:

>>> 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

Dla celu można użyć sklearn's LabelEncoder. To da ci konwerter od etykiet łańcuchowych do liczbowych (a także odwrotnego odwzorowania). Przykład w linku.

Jeśli chodzi o funkcje, algorytmy uczenia się zasadniczo oczekują (lub najlepiej działają z) danych porządkowych. Najlepszą opcją jest użycie OneHotEncoder do konwersji cech jakościowych. Spowoduje to wygenerowanie nowej funkcji binarnej dla każdej kategorii, oznaczającej włączenie/wyłączenie dla każdej kategorii. Ponownie przykład użycia w linku.

+3

Dla celów klasyfikacji, w rzeczywistości nie trzeba używać żadnej transformacji. Wszystkie klasyfikatory mogą obsługiwać dowolne etykiety. –