我有一个包含训练数据集的文件,像这样:
sentence F1 F2 F3 F4 F5 classthis is a dog 0 1 0 0 0 1 i like cats 1 0 0 0 0 1 go to the fridge 0 0 1 0 0 0i drive a car 0 0 0 1 0 0i dislike rabbits 0 0 0 0 1 1
我有一组句子。我想预测(在这个例子中,现实生活中的句子更长),每个句子是否包含动物(类别)。我为每个句子分配了特征:F1 = 句子中是否提到猫,F2 = 句子中是否提到狗,F3 = 句子中是否提到冰箱,F4 = 句子中是否提到汽车,F5 = 句子中是否提到兔子,类别是句子中是否有动物。
然后我有另一个包含句子列表的文件(测试数据集):
dolphins live in the seabears live in the woodsthere is no milk leftwhere are the zebras
我想使用训练数据集(上面的特征矩阵)训练一个朴素贝叶斯分类器,然后在测试文件的句子上使用生成的模型。这可以做到吗?
我尝试了这样做:
import numpy as npimport sklearn.naive_bayes import BernoulliNBsentence = []feature1 = []feature2 = []feature3 = []feature4 = []feature5 = []class_name = []test_dataset = [line.strip() for line in open(sys.argv[2])]for line in open(sys.argv[1]): line = line.strip().split('\t') sentence.append(line[0]) feature1.append(line[1]) feature2.append(line[2]) feature3.append(line[3]) feature4.append(line[4]) feature5.append(line[5]) class_name.append(line[6])list_of_features = [feature1,feature2,feature3,feature4,feature5]#我不确定这是否正确:下面的问题1clf = BernoulliNB()clf.fit(list_of_features,class_name)# 我不确定下一行应该是什么:下面的问题2print clf.predict(??)
我有一些问题。
-
当我运行代码直到clf.fit这一句时,我得到了以下错误:
File “naive_bayes.py”, line 28, in clf.fit(list_of_features,class_name)File “/usr/local/lib/python2.7/dist-packages/sklearn/naive_bayes.py”, line 527, in fitX, y = check_X_y(X, y, ‘csr’)File “/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py”, line 520, in check_X_ycheck_consistent_length(X, y)File “/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py”, line 176, in check_consistent_length”%s” % str(uniques))ValueError: Found arrays with inconsistent numbers of samples: [ 5 10]
但是当我计算我的列表长度时,它们似乎都是相同的长度?谁能解释一下我在这里做错了什么?
-
我的第二个问题是,对于’print clf.predict()’这一行,是否应该写成’print clf.predict(test_dataset)’(即,我想要分配到类别0或1的一组没有附加特征或类别的句子;目前我无法测试这一点,因为我似乎无法解决问题1中的错误)。
-
作为一个旁注,一旦我最终能够让它工作,能够计算预测器的准确性会很好。然而,我首先在努力让基础功能工作。
编辑1:修改后的脚本
输出结果:
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0, 0, 0, 0, 0][1, 0, 1, 1, 1, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0, 0, 1, 1, 1][0, 0, 0, 0, 0, 0, 0, 1, 1, 1]BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True)
回答:
1- 这里有几个问题。
- 首先,确保你正确解析了文件。如果你的训练文件完全像上面的行,那么你可能需要跳过第一行。它包含标题,不应该在你的X或Y矩阵中。确保特征和类名变量包含你想要的内容。你可以通过打印来检查它们。
sentence.append(line[0])
我猜,你得到的是字符串’0’或’1’而不是整数值。我认为这个scikit模块不能处理字符串值。你应该将它们转换为整数。可以这样做:sentence.append(int(line[0]))
list_of_features
变量是一个特征数量 x 特征数量的矩阵。它的形状应该是样本数 x 特征数。你可以通过list_of_features = np.array(list_of_features).T
来转置它
2 – 分类器不知道如何将句子映射到特征,所以你必须明确给出特征。你可以通过遍历句子并检查目标词是否存在来实现这一点。
编辑:
上面的代码与之前的相同,除了我直接输入了特征值而不是从文件中读取。