使用Sklearn.naive_bayes.Bernoulli的朴素贝叶斯分类器;如何使用模型进行预测?

我有一个包含训练数据集的文件,像这样:

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(??)

我有一些问题。

  1. 当我运行代码直到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]

但是当我计算我的列表长度时,它们似乎都是相同的长度?谁能解释一下我在这里做错了什么?

  1. 我的第二个问题是,对于’print clf.predict()’这一行,是否应该写成’print clf.predict(test_dataset)’(即,我想要分配到类别0或1的一组没有附加特征或类别的句子;目前我无法测试这一点,因为我似乎无法解决问题1中的错误)。

  2. 作为一个旁注,一旦我最终能够让它工作,能够计算预测器的准确性会很好。然而,我首先在努力让基础功能工作。

编辑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 – 分类器不知道如何将句子映射到特征,所以你必须明确给出特征。你可以通过遍历句子并检查目标词是否存在来实现这一点。

编辑:

上面的代码与之前的相同,除了我直接输入了特征值而不是从文件中读取。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注