2015-05-21 3 views
19

Учитывая это простой файл CSV:RandomForestClassfier.fit(): ValueError: не удалось преобразовать строку плавать

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) 

Но я получаю это отслеживающий при вызове годных():

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

scikit учиться версии 0.16.1 ,

ответ

25

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

Есть несколько классов, которые могут быть использованы:

  • LabelEncoder: превратить строку в значение приращения
  • OneHotEncoder: использование алгоритма Один-K, чтобы превратить вашу строку в целое число

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

+0

Спасибо. В итоге я нашел решение с помощью DictVectorizer. Я немного удивлен, что нет лучшей документации для решения таких проблем. Я бы поднял голову, если бы у меня было достаточно кармы. – nilkn

7

Вы не можете пройти str в свою модель fit() метод. как это упомянуто 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.

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

+0

Ха, как это, что есть примеры, которые явно используют строковые данные? Наверное, они устарели или что-то еще? – nilkn

+0

Например: http://nbviewer.ipython.org/github/ofermend/IPython-notebooks/blob/master/blog-part-1.ipynb – nilkn

+1

Так каков канонический способ борьбы с этим? Я не первый, кто пытается это сделать с помощью scikit-learn. – nilkn

7

LabelEncoding работал для меня (в основном вы, чтобы кодировать данные функция мудр) (MYDATA является 2d массив строкового типа данных):

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

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

train_x = pandas.get_dummies(test[cols]) 

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

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