Подтвердить что ты не робот

RandomForestClassfier.fit(): ValueError: не удалось преобразовать строку в float

Это простой CSV файл:

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

Очевидно, что реальный набор данных намного сложнее, чем этот, но он воспроизводит ошибку. Я пытаюсь создать для него случайный классификатор леса, например:

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)

Но я просто получаю эту трассировку при вызове fit():

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

версия scikit-learn - 0.16.1.

4b9b3361

Ответ 1

Вы должны сделать некоторую кодировку перед использованием. Как было сказано, fit() не принимает строки, но вы решаете это.

Существует несколько классов:

  • LabelEncoder: превратите свою строку в инкрементное значение
  • OneHotEncoder: используйте алгоритм One-of-K для преобразования вашей строки в целое число

Лично у меня есть сообщение почти того же вопроса в StackOverflow некоторое время назад. Я хотел иметь масштабируемое решение, но не получил никакого ответа. Я выбрал OneHotEncoder, который будет бинаризовать все строки. Это довольно эффективно, но если у вас много разных строк, матрица будет расти очень быстро и потребуется память.

Ответ 2

Вы не можете передать str в свой метод модели fit(). как упоминалось здесь

Образовательные входные образцы. Внутри он будет преобразован в dtype = np.float32, и если разреженная матрица будет предоставлена ​​разреженной csc_matrix.

Попробуйте преобразовать ваши данные в float и попробуйте LabelEncoder.

Ответ 3

LabelEncoding работал у меня (в основном вы должны кодировать ваши данные по-разному) (mydata - это 2-й массив строкового типа данных):

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

Ответ 4

У меня была аналогичная проблема, и я обнаружил, что проблема pandas.get_dummies(). В частности, он разбивает столбцы категориальных данных на множества булевых столбцов, один новый столбец для каждого уникального значения в каждом столбце ввода. В вашем случае вы замените train_x = test[cols] на:

train_x = pandas.get_dummies(test[cols])

Это преобразует data_rame в train_x в следующую форму, которую RandomForestClassifier может принять:

   C  A_Hello  A_Hola  B_Bueno  B_Hi
0  0        1       0        0     1
1  1        0       1        1     0