将分类数据从CSV导入scikit学习

将分类数据从CSV导入scikit学习,csv,scikit-learn,Csv,Scikit Learn,我想从CSV文件导入数据以用于scikit学习。它混合了数字数据和分类数据,例如 someValue,color,someOtherValue 1.2,red,55.6 1.9,blue,20.5 3.2,red,16.5 我需要将此表示转换为纯数字表示,其中分类数据点转换为多个二进制列,例如 someValue,colorIsRed,colorIsBlue,someOtherValue 1.2,1,0,55.6 1.9,0,1,20.5 3.2,1,0,16.5 是否有任何实用程序可以为我

我想从CSV文件导入数据以用于scikit学习。它混合了数字数据和分类数据,例如

someValue,color,someOtherValue
1.2,red,55.6
1.9,blue,20.5
3.2,red,16.5
我需要将此表示转换为纯数字表示,其中分类数据点转换为多个二进制列,例如

someValue,colorIsRed,colorIsBlue,someOtherValue
1.2,1,0,55.6
1.9,0,1,20.5
3.2,1,0,16.5

是否有任何实用程序可以为我实现这一点,或者有一种简单的方法来迭代数据并获得此表示?

据我所知,scikit learn不提供数据加载功能,但它更喜欢Numpy数组作为输入。Numpy函数及其
转换器
参数可用于加载csv并指定每列的类型。但它不会对第二列进行二值化。

在这个回答中,我假设您正在尝试将CSV转换为一个文件,该文件可以加载

您可以使用
csv2libsvm
,它是Ruby gem的一部分:

您需要Ruby 1.9+

$ ruby -v
ruby 1.9.3p374 (2013-01-15 revision 38858) [x86_64-darwin12.2.0]
如果您没有Ruby 1.9,安装起来很容易,不需要(或建议使用)root:

成功运行
gem install vector_embed
后,确保第一列名为“label”:

请注意,它同时处理分类数据和连续数据,并使用版本3生成功能名称(“colorIsBlue”对应于1089740,“colorIsRed”对应于1997960…尽管Ruby代码实际上是在散列类似“color\0red”的内容)

如果您使用的是svm,请确保按照他们在中建议的方式缩放数据

最后,假设您正在使用:


那么,在scikit learn中表示多类分类数据的正确方法是什么?据我所知,对分类变量进行二值化是一种方法。是的,您必须对数据进行二值化,以便生成的数组与浮点数据类型相同。您可以查看的实现,以获得一个关于如何实现的示例。代码是。一个简单的解决方案是在R中执行此步骤:
$ ruby -v
ruby 1.9.3p374 (2013-01-15 revision 38858) [x86_64-darwin12.2.0]
$ curl -#L https://get.rvm.io | bash -s stable
$ rvm install 1.9.3
$ cat example.csv 
label,color,someOtherValue
1.2,red,55.6
1.9,blue,20.5
3.2,red,16.5

$ csv2libsvm example.csv > example.libsvm

$ cat example.libsvm
1.2 1139043:55.6 1997960:1
1.9 1089740:1 1139043:20.5
3.2 1139043:16.5 1997960:1
>>> from sklearn.datasets import load_svmlight_file
>>> X_train, y_train = load_svmlight_file("/path/to/example.libsvm")