【问题标题】:Sklearn trying to convert string list to floatsSklearn 试图将字符串列表转换为浮点数
【发布时间】:2015-03-16 23:50:43
【问题描述】:

我正在尝试使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 解决了这个问题。

【问题讨论】:

    标签: python numpy scikit-learn


    【解决方案1】:

    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 对看不见的数据进行分类后),请使用 LabelEncoderinverse_transform 来恢复字符串标签:

    lb.inverse_transform(y)
    # => array(['A', '1', '4', 'F', 'A', '1', '4', 'F'], dtype='|S1')
    

    【讨论】:

    • 问题似乎与 sklearn 的版本有关。它在 0.11 中引发错误,并且该版本中不存在 LabelEncoder。升级 sklearn 到 0.15 解决了这个问题,没有添加任何代码。
    • 是的,0.11 已经过时了,如果不是 0.13,我猜你至少需要 0.12,但尚未验证...
    【解决方案2】:

    您需要为每个唯一的字符串标签分配一个唯一的整数。我假设您的 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]
    

    【讨论】:

    • 现在可以了。我在想这个,但我不能写得这么简单。感谢您的帮助
    猜你喜欢
    • 2018-02-15
    • 2020-05-25
    • 2011-11-25
    • 2018-09-20
    • 2019-02-06
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多