Sklearn试图将字符串列表转换为浮点数

时间:2015-01-19 01:29:28

标签: python numpy scikit-learn

我正在尝试使sklearn.svm.SVC(kernel="linear")算法正常工作。我的X是一个用[misc.imread(each).flatten() for each in filenames]制作的数组,我的y2是由["A","1","4","F"..]等字符串组成的列表的一部分。

当我尝试clf.fit(X,y2)时,sklearn尝试将我的字符串列表转换为浮点数并失败,抛出ValueError: could not convert string to float。我该如何解决这个问题?

编辑:将sklearn升级到0.15解决了这个问题。

2 个答案:

答案 0 :(得分:10)

scikit-learn中有一个帮助器类可以很好地实现它,它被称为sklearn.preprocessing.LabelEncoder

from sklearn.preprocessing import LabelEncoder
y2 = ["A","1","4","F","A","1","4","F"]
lb = LabelEncoder()
y = lb.fit_transform(y2)
# y is now: array([2, 0, 1, 3, 2, 0, 1, 3])

要返回原始标签(例如,在使用SVC对未看到的数据进行分类后),请使用inverse_transform的{​​{1}}来恢复字符串标签:

LabelEncoder

答案 1 :(得分:3)

您需要为每个唯一字符串标签指定唯一的整数。我假设你的y2变量包含每个类的多个实例。

所以也许看起来更像是:

y2 = ["A","1","4","F","A","1","4","F"]

现在你可以这样做:

S = set(y2) # collect unique label names
D = dict( zip(S, range(len(S))) ) # assign each string an integer, and put it in a dict
Y = [D[y2_] for y2_ in y2] # store class labels as ints

对于上面的y2,这会产生:

>>> print Y
[0, 1, 2, 3, 0, 1, 2, 3]