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

2024-09-30 20:27:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名单的名字和姓氏与二进制语言类(说英语或不说英语)。在

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

name1,name2,0
name3,name4,0
name5,name6,1
name7,name2,0
name8,name3,0
name9,name10,1
name11,name5,1

我想用scikitlearn应用机器学习算法,如SVM和naivebayes来评估二进制分类任务。由于scikit不允许属性为字符串,所以我将它们转换为整数。转换后的示例文件如下所示:

^{pr2}$

我想问一下,SVM和NaiveBayes是否将名字和姓氏的输入值视为独立的值,还是数字之间存在某种关系?换言之,5大于2是否重要,或者这些数字将被视为唯一值,而不考虑它们的算术值。在

这个问题的原因是,如果我按语言排序(即首先是说英语的人),然后用整数代替名字,算法会给我很好的结果(准确率和f分数在97%以上)。但是,如果我将列表洗牌,然后用整数替换名称,结果会很差。在

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

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

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

#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))

Tags: 文件pathfromimportnumpy算法np整数
1条回答
网友
1楼 · 发布于 2024-09-30 20:27:58

一般来说,要将字符串转换为数字特征值,您必须知道字符串的含义,还必须考虑结果采用哪种学习算法。在这种情况下,最好先尝试一个热编码。^{}实现了这一点。结果将是一个稀疏的指示符变量矩阵,因此您最好从GaussianNB切换到{}(对于您当前的编码,GaussianNB并没有意义)。在

相关问题 更多 >