RandomForestClassfier.fit (): ValueError: no se pudo convertir la cadena a flotar

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.

Tienes que hacer un poco de encoding 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 Uno de K para transformar su cadena en un entero

Personalmente he publicado casi la misma pregunta en StackOverflow 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.

LabelEncoding funcionó para mí (básicamente tienes que codificar tus datos en cuanto a características) (mydata es una matriz 2D de 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 aquí

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 .

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