使用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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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