如何将Python中的列类型从int更改为对象为sklearn?

时间:2016-12-18 16:03:09

标签: python scikit-learn

我是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 EncodingLabel Encoding,但我认为它们不是我需要的。我想知道我是否误解了某些东西,或者是否有另一种解决方案。

由于

1 个答案:

答案 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列。