提问者:小点点

lassfier.fit:值错误:无法将字符串转换为浮点


给出了一个简单的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-学习版本是0.16.1。


共3个答案

匿名用户

在使用fit之前,必须进行一些编码。正如前面所说,fit()不接受字符串,但您可以解决这个问题。

可以使用几个类:

  • LabelEncoder:将字符串转换为增量值
  • OneHotEncoder:使用One-of-K算法将字符串转换为整数

就我个人而言,不久前我在StackOverflow上发布了几乎相同的问题。我想有一个可扩展的解决方案,但没有得到任何答案。我选择了对所有字符串进行二值化的OneHotEncoder。这是相当有效的,但如果你有很多不同的字符串矩阵将增长非常快,内存将是必需的。

匿名用户

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

匿名用户

我有一个类似的问题,发现熊猫。解决了这个问题。具体来说,它将分类数据列拆分为布尔列集,每个输入列中的每个唯一值对应一个新列。在您的情况下,您可以将train\u x=test[cols]替换为:

train_x = pandas.get_dummies(test[cols])

这会将train_xDataframe转换为以下形式,这可以被接受:

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