Sklearn 尝试将字符串列表转换为浮点数
Sklearn trying to convert string list to floats
我正在尝试使 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 解决了问题。
您需要为每个唯一的字符串标签分配一个唯一的整数。我假设您的 y2
变量包含每个 class.
的多个实例
也许它看起来更像:
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]
scikit-learn 中有一个助手 class 可以很好地实现这一点,它叫做 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
class 化看不见的数据之后),使用 LabelEncoder
的 inverse_transform
来恢复字符串标签:
lb.inverse_transform(y)
# => array(['A', '1', '4', 'F', 'A', '1', '4', 'F'], dtype='|S1')
我正在尝试使 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 解决了问题。
您需要为每个唯一的字符串标签分配一个唯一的整数。我假设您的 y2
变量包含每个 class.
也许它看起来更像:
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]
scikit-learn 中有一个助手 class 可以很好地实现这一点,它叫做 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
class 化看不见的数据之后),使用 LabelEncoder
的 inverse_transform
来恢复字符串标签:
lb.inverse_transform(y)
# => array(['A', '1', '4', 'F', 'A', '1', '4', 'F'], dtype='|S1')