在 Python 中重新编码分类变量
Recoding Catigorical Variables in Python
我一直在尝试使用 Anaconda 发行版学习 Python 3.6。我在使用的在线课程的内容上遇到了障碍,需要一些帮助来解决一些错误消息。我会问课程的讲师,但他们似乎对学生的问题反应不灵敏。
我在处理用于重新编码分类数据的三个主要 类 时遇到了一些麻烦。据我了解,从用于重新编码变量的 scikitlearn 包中提取了三个 类:LabelEncoder、OneHotEncoder 和 LabelBinarizer。我试图使用每个来重新编码数据集中的分类变量,但每个都不断出错。
请原谅我对示例代码的相对笨拙。正如人们可能已经猜到我的问题的基础一样,我不太精通 python.
对象 X 包含几列,第一列是我需要转换的分类字符串(如果有人也能告诉我如何插入表格,那会很有帮助。我必须使用 HTML?):
"Fish" 1 5 3
"Dog" 2 6 9
"Dog" 8 8 8
"Cat" 5 7 6
"Cat" 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
标签二值化器
我发现这个最难理解,根据数据集的结构实际上无法尝试。
您提供的任何指导或建议都将大有帮助。
让我们一步一步来。
首先加载您在名称为 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])
您在这里做错的是您将 class LabelEncoder
用作对象,并在其上调用 fit_transform
。因此更正:
from sklearn.preprocessing import LabelEncoder
labelencoder_X =LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
查看上面第 2 行和第 3 行的更改。首先,我通过调用 LabelEncoder()
创建了 LabelEncoder
class 的对象 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 代码,而不是已经编码的代码。并且输出仅显示第一列的二值化形式。
希望这能让事情变得清楚。
我一直在尝试使用 Anaconda 发行版学习 Python 3.6。我在使用的在线课程的内容上遇到了障碍,需要一些帮助来解决一些错误消息。我会问课程的讲师,但他们似乎对学生的问题反应不灵敏。
我在处理用于重新编码分类数据的三个主要 类 时遇到了一些麻烦。据我了解,从用于重新编码变量的 scikitlearn 包中提取了三个 类:LabelEncoder、OneHotEncoder 和 LabelBinarizer。我试图使用每个来重新编码数据集中的分类变量,但每个都不断出错。
请原谅我对示例代码的相对笨拙。正如人们可能已经猜到我的问题的基础一样,我不太精通 python.
对象 X 包含几列,第一列是我需要转换的分类字符串(如果有人也能告诉我如何插入表格,那会很有帮助。我必须使用 HTML?):
"Fish" 1 5 3
"Dog" 2 6 9
"Dog" 8 8 8
"Cat" 5 7 6
"Cat" 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
标签二值化器
我发现这个最难理解,根据数据集的结构实际上无法尝试。
您提供的任何指导或建议都将大有帮助。
让我们一步一步来。
首先加载您在名称为 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])
您在这里做错的是您将 class LabelEncoder
用作对象,并在其上调用 fit_transform
。因此更正:
from sklearn.preprocessing import LabelEncoder
labelencoder_X =LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
查看上面第 2 行和第 3 行的更改。首先,我通过调用 LabelEncoder()
创建了 LabelEncoder
class 的对象 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 代码,而不是已经编码的代码。并且输出仅显示第一列的二值化形式。
希望这能让事情变得清楚。