我是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
,但我认为它们不是我需要的。我想知道我是否误解了某些东西,或者是否有另一种解决方案。
由于
答案 0 :(得分:2)
阅读sklearn的文件。这个包有完整的文档。特别是Preprocessing section on encoding categorical features:
关于保持以整数数组表示的分类特征,即[1,2,3,4,5]
,我们有:
此类整数表示不能直接与scikit-learn一起使用 估计者,因为他们期望连续输入,并将解释 被排序的类别,这通常是不希望的(即集合 浏览器是任意订购的)。转换的一种可能性 可以与scikit-learn一起使用的功能的分类功能 估计器是使用一个K或一个热编码,即 在OneHotEncoder中实现。该估算器转换每个 具有m个可能值的分类特征到m个二进制特征, 只有一个活跃的。
所以你可以做的是使用one-hot encoding将数组转换为5个新列(这种情况,因为你有5个可能的值)。
这是一些有效的代码。输入是一列分类参数[1,2,3,4,5]
,输出是一个矩阵,5列,每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列。