2015-05-16 5 views
6

Ich habe einen Datensatz mit kategorischen und numerischen Spalten und meine Zielspalte ist auch kategorisch. Ich benutze Scikit Bibliothek in Python34. Ich weiß, dass Scikit alle kategorischen Werte benötigt, um in numerische Werte umgewandelt zu werden, bevor irgendein maschinelles Lernverfahren durchgeführt wird.Kategorische & Numerische Merkmale - Kategorisches Ziel - Scikit Lernen - Python

Wie soll ich meine kategorischen Spalten in numerische Werte umwandeln? Ich habe viel versucht, aber ich bekomme verschiedene Fehler wie "str" ​​Objekt hat keine "numpy.darray" Objekt hat keine Attribute "Elemente".

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

Meine Daten-Set in einer CSV-Datei gespeichert wird, hier ist der kleine Code, den ich schrieb Ihnen eine Vorstellung zu geben, was ich tun möchte:

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

I x_cat_cols müssen numerisch umgewandelt werden Werte und die addieren sie zu x_numeric_cols und so haben meine vollständigen Eingabe (x) Werte.

Dann muss ich meine Zielfunktion auch in numerischen Wert konvertieren und das als meine endgültige Ziel (y) -Spalte machen.

Dann möchte ich als ein Zufalls Wald mit diesen beiden Garnituren zu tun:

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

Vielen Dank für Ihre Hilfe!

Antwort

0

Dies war wegen der Art, wie ich die Daten aufzählen. Wenn ich die Daten drucke (unter Verwendung eines anderen Beispiels), wird Folgendes angezeigt:

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

Dies ist eine Liste von Diktaten. Wir sollten das stattdessen tun:

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

Als Ziel können Sie sklearns LabelEncoder verwenden. Dies wird Ihnen einen Konverter von String-Labels zu numerischen (und auch eine umgekehrte Zuordnung) geben. Beispiel in der Verbindung.

Was Funktionen betrifft, erwarten Lernalgorithmen im Allgemeinen ordinale Daten (oder funktionieren am besten mit ihnen). Die beste Option ist also, OneHotEncoder zu verwenden, um die kategorischen Funktionen zu konvertieren. Dies erzeugt ein neues Binär-Feature für jede Kategorie, das für jede Kategorie an/aus bedeutet. Noch einmal, Anwendungsbeispiel in der Verbindung.

+3

Für das Klassifizierungsziel müssen Sie tatsächlich keine Transformation verwenden. Alle Klassifikatoren können mit beliebigen Labels umgehen. –

Verwandte Themen