2016-12-18 22 views
0

我对Python和scikit-learn(sklearn)非常陌生,我试图加载这个由7列属性和1列数据分类(类/数据目标)组成的数据集。但是有一个属性由数据[1,2,3,4,5]组成,它实际上标志着某个事物的某个阶段,因此使它成为一个名义数字,而不是数字。但是,当然python将它识别为一个数值数据(int64),实际上我希望它被当作一个标称数据(对象)。如何将列类型更改为标称值?如何将Python中的列类型从int更改为sklearn的对象?

我做了以下工作。

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

谢谢

回答

2

阅读sklearn的文档。这个软件包有详尽的文档。特别是Preprocessing section on encoding categorical features

在问候保持在整数数组表示类别特征,即[1,2,3,4,5],我们有这样的:

这种整数表示不能直接与用来scikit学习 估计,因为这些需要连续输入,并且将 类别解释为被排序,这通常是不期望的(即,浏览器的集合 被任意排序)。将 分类特征转换为可与scikit-learn 估算器一起使用的特征的一种可能性是使用OneHotEncoder中实现的一个K或一个热门编码,即 。该估计器将每个 分类特征转换为m个可能的值为m个二元特征, 只有一个有效。

所以你可以做的是使用one-hot encoding将你的数组转换成5个新列(这种情况下,因为你有5个可能的值)。

以下是一些工作代码。输入是明确的参数[1,2,3,4,5]的一列,所述输出中是一个矩阵,5列,1为每个5点可能的选择的:

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

+1

嘿,对于迟到的回复抱歉,我没有注意到我有一个新的答案。我想试试你的解决方案,但后来我发现data ['class'] = data ['class']。astype(str)'已经工作了,python已经将类列识别为一个字符串(对象)。我认为对我来说就足够了,因为它是一个班级,而不是一个属性。但如果我将来遇到类似问题,我会记住您的解决方案。不管怎么说,还是要谢谢你。 –

相关问题