2015-05-21 157 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之前进行一些编码。正如它被告知fit()不接受字符串,但你解决这个问题。

有可以使用几类:

就个人而言,我前段时间在StackOverflow上发布了几乎the same question。我想有一个可扩展的解决方案,但没有得到任何答案。我选择了将所有字符串二进制化的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是字符串数据类型的二维数组):

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数据框为以下形式,RandomForestClassifier可以接受:

C A_Hello A_Hola B_Bueno B_Hi 
0 0  1  0  0  1 
1 1  0  1  1  0 
相关问题