如何在 Scikit 中应用二元分类器来学习何时属性是字符串(不是 int 或 float)
Posted
技术标签:
【中文标题】如何在 Scikit 中应用二元分类器来学习何时属性是字符串(不是 int 或 float)【英文标题】:How to apply a binary classifier in Scikit learn when attributes are string (not int or float) 【发布时间】:2014-10-14 05:40:20 【问题描述】:我有一个二进制语言类(是否说英语)的人的名字和姓氏的列表。
这是一个示例文件(我用虚拟值更改了名称以保护人们的隐私):
name1,name2,0
name3,name4,0
name5,name6,1
name7,name2,0
name8,name3,0
name9,name10,1
name11,name5,1
我想使用 Scikit learn 应用 SVM 和朴素贝叶斯等机器学习算法来评估二元分类任务。由于 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:这是我用来读取文件并应用算法的代码(工作正常,没有错误)
#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))
【问题讨论】:
在 SVM 中,输入是基数(所以顺序很重要)。如果您的输入是名义上的,我会使用归纳规则(例如,决策树)或朴素贝叶斯也应该没问题。您可以使用 SVM,但必须将它们二值化:stats.stackexchange.com/questions/52915/…(在您的情况下听起来非常昂贵) 【参考方案1】:一般而言,您必须知道字符串的含义才能将它们转换为数字特征值,并且您还必须考虑结果进入哪种学习算法。在这种情况下,one-hot 编码可能是最好先尝试的方法。 DictVectorizer
实现了这一点。结果将是一个稀疏的指标变量矩阵,因此您最好从GaussianNB
切换到BernoulliNB
(不是GaussianNB
对您当前的编码有意义)。
【讨论】:
以上是关于如何在 Scikit 中应用二元分类器来学习何时属性是字符串(不是 int 或 float)的主要内容,如果未能解决你的问题,请参考以下文章
如何保持一个高度相关的变量在scikit-learn中淹没其余部分?
在 scikit-learn 中获得二元概率分类器的最大准确度
机器学习实战----使用Python和Scikit-Learn构建简单分类器