【问题标题】:Recoding Catigorical Variables in Python在 Python 中重新编码分类变量
【发布时间】:2018-04-06 12:48:47
【问题描述】:

我一直在尝试使用 Anaconda 发行版来学习 Python 3.6。我遇到了我正在使用的在线课程的内容,并且可以使用一些帮助来解决一些错误消息。我会问课程的讲师,但他们似乎对学生的问题反应不快。

我在处理用于重新编码分类数据的三个主要类时遇到了一些麻烦。据我了解,从 scikitlearn 包中提取了三个用于重新编码变量的类:LabelEncoder、OneHotEncoder 和 LabelBinarizer。我尝试使用每个来重新编码数据集中的分类变量,但每个都不断收到错误。

请原谅我对示例代码的相对菜鸟。有人可能已经猜到我的问题很卑鄙,我并不精通 python。

对象 X 包含几列,第一列是我需要转换的分类字符串(如果有人也可以告诉我如何插入表格,那会很有帮助。我必须使用 HTML 吗?):

“鱼”1 5 3
“狗” 2 6 9
“狗” 8 8 8
“猫”5 7 6
“猫”6 6 6

标签编码器尝试

下面是我尝试实现的代码,以及我收到的对象 X 的错误消息,它大致具有我上面描述的属性。

from sklearn.preprocessing import LabelEncoder
labelencoder_X =LabelEncoder 
X[:, 0] = LabelEncoder.fit_transform(X[:, 0])

TypeError: fit_transform() missing 1 required positional argument: 'y'

让我震惊的是,我认为上面的代码清楚地定义了 y 是什么,X 的第一列。

OneHotEncoder

from sklearn.preprocessing import OneHotEncoder 
onehotencoder = OneHotEncoder(categorical_features=[0]) 
X = onehotencoder.fit_transform[X].toarray()

TypeError: 'method' object is not subscriptable

标签二值化器

我发现这个最难理解,实际上无法根据数据集的结构进行尝试。

您可以提供的任何指导或建议都会很有帮助。

【问题讨论】:

    标签: python scikit-learn feature-extraction categorical-data


    【解决方案1】:

    让我们一步一步来。

    首先加载您在名称为 X 的 numpy 数组中显示的数据

    import numpy as np
    X = np.array([["Fish", 1, 5, 3],
                  ["Dog",  2, 6, 9],
                  ["Dog",  8, 8, 8],
                  ["Cat",  5, 7, 6],
                  ["Cat",  6, 6, 6]])
    

    现在试试你的代码。

    1) 标签编码器

    from sklearn.preprocessing import LabelEncoder
    labelencoder_X =LabelEncoder 
    X[:, 0] = LabelEncoder.fit_transform(X[:, 0])
    

    你在这里做错的事情是你使用类LabelEncoder作为一个对象,在它上面调用fit_transform。所以更正一下:

    from sklearn.preprocessing import LabelEncoder
    labelencoder_X =LabelEncoder()
    X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
    

    请参阅上面第 2 行和第 3 行中的更改。首先,我通过调用LabelEncoder() 创建了LabelEncoder 类的对象labelencoder_X,然后使用该对象通过labelencoder_X.fit_transform() 调用fit_transform()。然后这段代码没有给出任何错误,新的 X 是:

    Output:
    array([['2', '1', '5', '3'],
           ['1', '2', '6', '9'],
           ['1', '8', '8', '8'],
           ['0', '5', '7', '6'],
           ['0', '6', '6', '6']], dtype='|S4')
    

    看到第一列已经修改成功了。

    2) OneHotEncoder

    您的代码:

    from sklearn.preprocessing import OneHotEncoder 
    onehotencoder = OneHotEncoder(categorical_features=[0]) 
    X = onehotencoder.fit_transform[X].toarray()
    

    现在,您并没有犯在 LabelEncoder 中犯的错误。您正在通过调用OneHotEncoder(...) 正确初始化对象。但是您使用fit_transform[X] 犯了一个错误。您会看到fit_transform 是一个方法,应该使用圆括号来调用,如下所示:fit_transform()

    有关错误的更多详细信息,请参阅this question

    正确的代码应该是:

    from sklearn.preprocessing import OneHotEncoder 
    onehotencoder = OneHotEncoder(categorical_features=[0]) 
    X = onehotencoder.fit_transform(X).toarray()
    
    Output: 
    array([[0., 0., 1., 1., 5., 3.],
           [0., 1., 0., 2., 6., 9.],
           [0., 1., 0., 8., 8., 8.],
           [1., 0., 0., 5., 7., 6.],
           [1., 0., 0., 6., 6., 6.]])
    

    注意:上面的代码应该在已经用 LabelEncoder 转换过的 X 上调用。如果在原 X 上使用,还是会报错。

    3) LabelBinarizer 这与 LabelEncoder 并没有什么不同,只是它也会对提供的列进行 one-hot 编码。

    from sklearn.preprocessing import LabelBinarizer
    labelencoder_X =LabelBinarizer()
    new_binarized_val = labelencoder_X.fit_transform(X[:, 0])
    
    Output:
    array([[0, 0, 1],
           [0, 1, 0],
           [0, 1, 0],
           [1, 0, 0],
           [1, 0, 0]])
    

    注意:我在您问题的原始 X 上使用的 LabelBinarizer 代码,而不是已经编码的代码。并且输出只显示第一列的二值化形式。

    希望这能让事情变得清晰。

    【讨论】:

    • 啊啊啊现在一切都说得通了。我没有意识到 LabelEncoder 正在链接到 OneHotEncoder。我认为他们是试图做同样事情的不同进程。我发现一个网站建议您需要在 OneHotEncoder 中使用括号来引用 X,但这没有用。我现在明白我仍然收到错误的原因是因为在 LabelEncoder 中发现了错误。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2019-10-13
    • 2022-11-14
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多