2015-05-21 8 views
19

eine einfache CSV-Datei ist:RandomForestClassfier.fit(): Valueerror: kann nicht konvertieren Zeichenfolge Gegeben zu schweben

A,B,C 
Hello,Hi,0 
Hola,Bueno,1 

Offensichtlich ist die reale Datenmenge ist weitaus komplexer als dies, aber diese gibt den Fehler. Ich versuche, einen zufälligen Wald Klassifikator für ihn zu bauen, etwa so:

cols = ['A','B','C'] 
col_types = {'A': str, 'B': str, 'C': int} 
test = pd.read_csv('test.csv', dtype=col_types) 

train_y = test['C'] == 1 
train_x = test[cols] 

clf_rf = RandomForestClassifier(n_estimators=50) 
clf_rf.fit(train_x, train_y) 

Aber ich gerade diese Zurückverfolgungs erhalten, wenn fit() aufgerufen wird:

ValueError: could not convert string to float: 'Bueno' 

Scikit-Learn-Version 0.16.1 .

Antwort

25

Sie müssen einige Codierung vor der Verwendung von fit tun. Wie es gesagt wurde passt fit() keine Strings an, aber Sie lösen das.

Es gibt mehrere Klassen, die verwendet werden können:

  • LabelEncoder: schalen Sie die Zeichenfolge in inkrementalen Wert
  • OneHotEncoder: verwenden One-of-K-Algorithmus Ihren String in integer zu verwandeln

Ich persönlich habe PostOverflow vor einiger Zeit post fast the same question Post. Ich wollte eine skalierbare Lösung haben, bekam aber keine Antwort. Ich habe OneHotEncoder ausgewählt, der alle Strings binärisiert. Es ist sehr effektiv, aber wenn Sie viele verschiedene Strings haben, wird die Matrix sehr schnell wachsen und Speicher wird benötigt.

+0

Danke. Ich habe schließlich eine Lösung mit DictVectorizer gefunden. Ich bin etwas überrascht, dass es keine bessere Dokumentation über den Umgang mit solchen Problemen gibt. Ich würde aufheben, wenn ich hier genug Karma hätte. – nilkn

7

Sie können str nicht an Ihr Modell fit() übergeben. wie erwähnt here

The training input samples. Internally, it will be converted to dtype=np.float32 and if a sparse matrix is provided to a sparse csc_matrix.

Versuchen Sie, Ihre Daten transformiert zu schweben und einen Versuch zu LabelEncoder geben.

+0

Huh, wie es ist, dass es Beispiele, die deutlich verwenden Zeichenfolgedaten? Ich denke, sie sind veraltet oder so? – nilkn

+0

Zum Beispiel: http://nbviewer.ipython.org/github/ofermend/IPython-notebooks/blob/master/blog-part-1.ipynb – nilkn

+1

Also, was ist der kanonische Weg, damit umzugehen? Es gibt keine Möglichkeit, dass ich die erste Person bin, die das mit Scikit-Learning versucht. – nilkn

7

LabelEncoding für mich gearbeitet (im Grunde, Sie haben Ihre Daten Feature-weise zu kodieren) (mydata ist ein 2D-Array von String-Datentyp):

myData=np.genfromtxt(filecsv, delimiter=",", dtype ="|a20" ,skip_header=1); 

from sklearn import preprocessing 
le = preprocessing.LabelEncoder() 
for i in range(*NUMBER OF FEATURES*): 
    myData[:,i] = le.fit_transform(myData[:,i]) 
1

hatte ich ein ähnliches Problem und fand, dass pandas.get_dummies() gelöst das Problem. Insbesondere spaltet es Spalten von kategorialen Daten in Mengen von Booleschen Spalten auf, eine neue Spalte für jeden eindeutigen Wert in jeder Eingabespalte.

train_x = pandas.get_dummies(test[cols]) 

Dies verwandelt den train_x Datenrahmen in das folgende Formular, das RandomForestClassifier annehmen kann: In Ihrem Fall, Sie train_x = test[cols] mit ersetzen würde

C A_Hello A_Hola B_Bueno B_Hi 
0 0  1  0  0  1 
1 1  0  1  1  0 
Verwandte Themen