给出了一个简单的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。
在使用fit之前,必须进行一些编码。正如前面所说,fit()不接受字符串,但您可以解决这个问题。
可以使用几个类:
就我个人而言,不久前我在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