python - score - RandomForestClassfier.fit(): ValueError: no se pudo convertir la cadena a flotar
random forest tutorial (5)
Dado es un simple archivo CSV:
A,B,C
Hello,Hi,0
Hola,Bueno,1
Obviamente, el conjunto de datos real es mucho más complejo que esto, pero este reproduce el error. Estoy intentando construir un clasificador de bosque aleatorio para él, así:
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)
Pero acabo de obtener este rastreo cuando invoco a fit ():
ValueError: could not convert string to float: ''Bueno''
La versión de scikit-learn es 0.16.1.
LabelEncoding funcionó para mí (básicamente tienes que codificar tus datos en función de las características) (mydata es una matriz 2D del tipo de datos de cadena):
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])
No puedes pasar str
a tu método de fit()
modelo. como se menciona here
Las muestras de entrada de entrenamiento. Internamente, se convertirá a dtype = np.float32 y si se proporciona una matriz dispersa a un csc_matrix disperso.
Intente transformar sus datos para flotar y pruebe LabelEncoder .
Tienes que hacer un poco de codificación antes de usar fit. Como se dijo, fit () no acepta cadenas, pero resuelve esto.
Hay varias clases que se pueden utilizar:
- LabelEncoder : convierte tu cadena en valor incremental
- OneHotEncoder : use el algoritmo One-of-K para transformar su cadena en un entero
Personalmente he publicado casi la misma pregunta en hace algún tiempo. Quería tener una solución escalable pero no obtuve ninguna respuesta. Seleccioné OneHotEncoder que binariza todas las cadenas. Es bastante efectivo, pero si tiene muchas cadenas diferentes, la matriz crecerá muy rápidamente y se requerirá memoria.
Tuve un problema similar y encontré que pandas.get_dummies() resolvió el problema. Específicamente, divide las columnas de datos categóricos en conjuntos de columnas booleanas, una nueva columna para cada valor único en cada columna de entrada. En su caso, reemplazaría train_x = test[cols]
con:
train_x = pandas.get_dummies(test[cols])
Esto transforma el marco de datos train_x en el siguiente formulario, que RandomForestClassifier puede aceptar:
C A_Hello A_Hola B_Bueno B_Hi
0 0 1 0 0 1
1 1 0 1 1 0
Usted no puede pasar str
para adaptarse a este tipo de clasificador.
Por ejemplo, si tiene una columna de características llamada ''calificación'' que tiene 3 calificaciones diferentes:
A, B y C.
tiene que transferir esos str
"A", "B", "C " a la matriz mediante un codificador como el siguiente:
A = [1,0,0]
B = [0,1,0]
C = [0,0,1]
porque la str
no tiene significado numérico para el clasificador.
En scikit-learn, OneHotEncoder
y LabelEncoder
están disponibles en el módulo de inpreprocessing
. Sin embargo, OneHotEncoder
no admite fit_transform()
de cadena. "ValueError: no se pudo convertir la cadena a flotar" puede suceder durante la transformación.
Puede usar LabelEncoder
para transferir de str
a valores numéricos continuos. Entonces usted puede transferir por OneHotEncoder
como desee.
En el marco de datos de Pandas, tengo que codificar todos los datos que se clasifican en dtype:object
. El siguiente código funciona para mí y espero que esto te ayude.
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
for column_name in train_data.columns:
if train_data[column_name].dtype == object:
train_data[column_name] = le.fit_transform(train_data[column_name])
else:
pass