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.
Ответы
Ответ 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