【问题标题】:Dummy variable on a vector with scikit onehotencoder带有 scikit onehotencoder 的向量上的虚拟变量
【发布时间】:2014-02-07 17:32:40
【问题描述】:

假设我有一个整数向量,其中每个整数对应一个类别:

A = [1, 2, 2, 3, 3, 1, 2, 4, 4, 1]

我知道我有多少个类别。这个向量是我的 X 数据集的列之一,它将以逻辑回归模型结束。

是否可以使用 sciki-tlearn 函数 onehotencoder 来获得类似的东西:

0 0 0 1(当为 1)
0 0 1 0(当 2 时)
0 1 0 0(当 3 时)
1 0 0 0(无论何时)

甚至更好

0 0 0
0 0 1
0 1 0
1 0 0

?

当我尝试将这样的向量传递给 onehotencoder 时,我收到此错误:need more than 1 value to unpack。

此外:我想如果我有“NULL”记录,我应该首先将它们转换为数字:有没有一种快速的方法可以做到这一点,比如A(find(A=='NULL'))=123?

感谢您的帮助。 弗朗切斯科

【问题讨论】:

    标签: python machine-learning scikit-learn categorization


    【解决方案1】:

    OneHotEncoder 输入需要是二维的,而不是一维的(它需要一组样本)。

    >>> X = [[1, 2, 2, 3, 3, 1, 2, 4, 4, 1]]
    

    假设您的分类特征都可以取四个值:

    >>> n_values = np.repeat(4, len(X[0]))
    >>> n_values
    array([4, 4, 4, 4, 4, 4, 4, 4, 4, 4])
    

    然后OneHotEncoder 工作正常:

    >>> oh = OneHotEncoder(n_values=n_values)
    >>> Xt = oh.fit_transform(X)
    >>> Xt.toarray()
    array([[ 0.,  1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,
             0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  1.,  0.,  0.,  0.,  0.,
             1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  1.,  0.,
             0.]])
    >>> Xt.shape
    (1, 40)
    

    它为每个输入变量生成了一个太多的虚拟变量,这有点浪费。我不知道你所说的 NULL 是什么意思,因为我不知道你的数据是什么样的。您可能想为此打开一个单独的问题。

    【讨论】:

    • 需要将其重新整形为(10,4),它应该可以工作。正确的?这是一个解决方案,谢谢!我想知道为什么它在做一些对一维(理论上)应该有效的事情时需要二维或更多(除非我错过了一些逻辑数学步骤)。我现在的问题是:如果我有多个代表数字类别的列,我可以将它们都放在同一个 onehotencoder 中吗?假设第一列有 5 个类别,第二列有 4 个类别,10 行:最后我应该得到一个数组 (10,9)。 onehotencoder 会这样做吗? (再次感谢!)
    • @foebu 我不明白您为什么要重塑它,至少如果您想将其提供给估算器则不会。它需要是二维的,因为 scikit-learn 中的所有内容都是面向批处理的。对于第二个问题,是的,可以做到,请参阅文档字符串了解详细信息。
    • 我不仅使用类别。我有一些特征是数量,它们是数据集的列,所以我想将 onehotencoder 的结果与其他特征连接起来,并将其用作逻辑回归的训练集。我在玩你的代码,很奇怪,如果我将 X 列表的最后一个数字更改为 4,fit_transform 不起作用,我得到一个“列索引超过矩阵尺寸”;而如果我将其更改为 2 或 3 它可以工作。 X = [[1, 2, 2, 3, 3, 1, 2, 4, 4, 4]] 不起作用,X = [[1, 2, 2, 3, 3, 1, 2, 4, 4, 3]] 这行得通
    • @foebu 我认为有一个名为categorical_features 的参数来控制它。您描述的可能是错误;如果您有时间进行调查,您可能需要通过 github.com/scikit-learn/scikit-learn/issues 提交问题。
    • 参数 categorical_feature 很酷,这样我可以将整个数据集作为参数,只需将分类特征的索引放入 categorical_feature 即可。这应该可以解决我的问题。此外:使用 X = [[1, 2, 2, 3, 3, 1, 2, 4, 4, 3]] 然后重新整形不起作用:它错误地编码了最后三个值。使用 X = [[1],[2], [3], [3], [2], [3], [4], [2], [1], [4]] 与 n_values=' 完美配合auto' 它给了我一个 (10,4) 数组而无需重新整形。这正常吗?无论如何我都会发出信号。
    猜你喜欢
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多