Python 当属性为字符串(不是int或float)时,如何在Scikit学习中应用二进制分类器

Python 当属性为字符串(不是int或float)时,如何在Scikit学习中应用二进制分类器,python,numpy,classification,scikit-learn,svm,Python,Numpy,Classification,Scikit Learn,Svm,我有一份有二元语言课程(说英语或不说英语)的人的名字和姓氏的名单 下面是一个示例文件(为了保护人们的隐私,我用虚拟值更改了名称): 我想应用机器学习算法,如SVM和朴素贝叶斯,使用Scikit学习来评估二元分类任务。由于scikit不允许属性为字符串,因此我将它们转换为整数。转换后的示例文件如下所示: 1,2,0 3,4,0 5,6,1 7,2,0 8,3,0 9,10,1 11,5,1 我想问一下,SVM和朴素贝叶斯是否认为姓氏的输入值是独立的值,或者数字之间存在某种关系?换句话说,重要的是

我有一份有二元语言课程(说英语或不说英语)的人的名字和姓氏的名单

下面是一个示例文件(为了保护人们的隐私,我用虚拟值更改了名称):

我想应用机器学习算法,如SVM和朴素贝叶斯,使用Scikit学习来评估二元分类任务。由于scikit不允许属性为字符串,因此我将它们转换为整数。转换后的示例文件如下所示:

1,2,0
3,4,0
5,6,1
7,2,0
8,3,0
9,10,1
11,5,1
我想问一下,SVM和朴素贝叶斯是否认为姓氏的输入值是独立的值,或者数字之间存在某种关系?换句话说,重要的是5大于2,或者这些数字将被视为唯一值,而不管它们的算术值如何

这个问题的原因是,如果我按语言(即首先是说英语的人)对列表进行排序,然后用整数替换名称,该算法会给出非常好的结果(准确度和f分数高于97%)。但是如果我洗牌列表,然后用整数替换名称,结果会很差

通常,当属性值为字符串时,使用Scikit进行分类的解决方案是什么。

p.S.1:我用Weka测试了相同的数据集,我没有遇到这样的问题,因为Weka使用arff文件,而且它本身也进行必要的转换

p.S.2:这是我用来读取文件和应用算法的代码(工作正常,没有错误)


<>强>一般的,你必须知道字符串是什么意思,以便将它们转换成数值特征值,并且你还必须考虑结果的学习算法。在这种情况下,一次热编码可能是最好的尝试。实现这一点。结果将是指标变量的稀疏矩阵,因此您最好从
GaussianNB
切换到
BernoulliNB
(不是说
GaussianNB
对您当前的编码有意义)。

在支持向量机中,输入是基数(因此顺序很重要)。如果您的输入是名义上的,我会使用归纳规则(例如,决策树)或朴素贝叶斯也可以。您可以使用支持向量机,但必须对它们进行二值化:(在您的情况下,这听起来非常昂贵)
1,2,0
3,4,0
5,6,1
7,2,0
8,3,0
9,10,1
11,5,1
#read file into numpy array format
path = "/path/to/csv/file/BinaryClassification.csv"
import numpy as np
lstAttributes = np.loadtxt(path, delimiter=',')[:,0:2]
lstLabels = np.loadtxt(path, delimiter=',')[:,2:3]
tempArr = []
for v in lstLabels:
    tempArr.append(float(v))
from numpy import array
lstLabels = array(tempArr)

#trains and test algorithms (uses whole data as training and test set)
from sklearn import naive_bayes
classifier = naive_bayes.GaussianNB()
model = classifier.fit(lstAttributes, lstLabels)
prediction = model.predict(lstAttributes)
from sklearn.metrics import confusion_matrix
print confusion_matrix(lstLabels, prediction)

#Use 5 fold cross validation to evaluate the algorithms
from sklearn import cross_validation
scores = cross_validation.cross_val_score(classifier, lstAttributes, lstLabels, cv=5, scoring='f1')
print("cross validation: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))