我真的是Python和Scikit-learn(Sklearn)的新手,我正在尝试加载该数据集,该数据集由7列属性和1列数据分类(类/数据目标)。但是,有一个由数据[1,2,3,4,5]组成的一个属性,实际上标志着某物的阶段,因此使其成为名义而不是数字。但是,当然,Python将其视为数值数据(INT64),而实际上我希望将其视为标称数据(对象)。如何将列类型更改为名义?
我已经完成了以下操作。
print(data.dtypes)
data["col_name"]=data["col_name"].astype(numpy.object)
print(data.dtypes)
在第一个打印中,它仍然识别我的数据[" col_name"]为INT64,但是在astype
行之后,它已将其更改为object
。但这对数据没有任何影响,因为当我尝试使用matplotlib
并创建直方图时,它仍然识别x和y是数字而不是对象。
我也在文档上阅读了有关One Hot Encoding
和Label Encoding
的信息,但我认为在我的情况下它们不是我所需要的。我想知道我是否误解了某些东西,或者也许还有另一个解决方案。
谢谢
通过Sklearn的文档阅读。该软件包具有详尽的文档。特别是关于编码分类特征的预处理部分:
关于在整数中表示的分类特征,即[1,2,3,4,5]
,我们有:
这种整数表示不能直接与Scikit-learn一起使用 估计器,正如这些期望的连续输入一样,将解释 类别是被订购的类别,通常是不需要的(即集合 任意订购浏览器的浏览器。转换的一种可能性 可以与Scikit-Learn一起使用的功能的分类功能 估计器将使用独一无二的或一hot编码 在onehotencoder中实现。此估计器会转换每个 分类功能具有M可能值为M二进制特征的特征, 只有一个活动。
因此,您可以做的是使用单速编码将数组转换为5个新列(这种情况,因为您有5个可能的值)。
这是一些工作代码。输入是分类参数[1,2,3,4,5]
的一列,OUPUT是一个矩阵,5列,1个可能的选择中的每一个:
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
enc.fit([[1],[2],[3],[4],[5]])
OneHotEncoder(categorical_features='all', dtype='numpy.float64', handle_unknown='error', n_values='auto', sparse=True)
print enc.transform([[1],[2],[3],[4],[5]]).toarray()
输出:
[[ 1. 0. 0. 0. 0.]
[ 0. 1. 0. 0. 0.]
[ 0. 0. 1. 0. 0.]
[ 0. 0. 0. 1. 0.]
[ 0. 0. 0. 0. 1.]]
说您的分类参数按以下顺序:[1,3,2,5,4,3,2,1,3,4,2]
。您将获得此输出:
[[ 1. 0. 0. 0. 0.]
[ 0. 0. 1. 0. 0.]
[ 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 1.]
[ 0. 0. 0. 1. 0.]
[ 0. 0. 1. 0. 0.]
[ 0. 1. 0. 0. 0.]
[ 1. 0. 0. 0. 0.]
[ 0. 0. 1. 0. 0.]
[ 0. 0. 0. 1. 0.]
[ 0. 1. 0. 0. 0.]]
因此,此1列将转换为5列。
print(data.dtypes)
data["col_name"]=data["col_name"].astype(str)
print(data.dtypes)