Naivebayes MultinomialNB scikit-learn/sklearn

Posted

技术标签:

【中文标题】Naivebayes MultinomialNB scikit-learn/sklearn【英文标题】: 【发布时间】:2018-11-04 01:24:42 【问题描述】:

我正在构建一个朴素贝叶斯分类器,并按照 scikit-learn 网站上的教程进行操作。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import time
import csv
import string
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

# Importing dataset
data = pd.read_csv("test.csv", quotechar='"', delimiter=',',quoting=csv.QUOTE_ALL, skipinitialspace=True,error_bad_lines=False)
df2 = data.set_index("name", drop = False)



df2['sentiment'] = df2['rating'].apply(lambda rating : +1 if rating > 3 else -1)


train, test = train_test_split(df2, test_size=0.2)


count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(traintrain['review'])
test_matrix = count_vect.transform(testrain['review'])

clf = MultinomialNB().fit(X_train_tfidf, train['sentiment'])

第一个参数是词汇字典,它返回一个 Document-Term 矩阵。 第二个参数应该是什么,twenty_train.target?

编辑数据示例

Name, review,rating
film1,......,1
film2, the film is....,5 
film3, film about..., 4

根据此说明,我创建了一个新列,如果评分 >3,则评论为正面,否则为负面

df2['sentiment'] = df2['rating'].apply(lambda rating : +1 if rating > 3 else -1)

【问题讨论】:

第二个参数应该是您希望模型学习的类标签。你不确定你的目标是什么?你能解释一下你想对数据做什么,你想让模型学习什么吗?如果您不确定这些问题,我建议您阅读有关机器学习的更多信息。 不,我确定,这是电影评论的极性,正面或负面,我的数据包含 3 个文件名、评论、评级,我添加了第 4 个包含极性的文件 那么'sentiment' 你这里有什么?为什么要在多列上训练 tfidfvectorizer?它会给出错误的结果。 @VivekKumar:我编辑了帖子,情绪是正面或负面的,我只在专栏评论上训练 代码没有显示你只在复习上训练。目前,您将完整的 df2 发送到 train_test_split,然后使用它来训练 CountVectorizer,这意味着它使用所有 df2。不仅仅是'reviews' 【参考方案1】:

MultinomialNBfit 方法需要 xy 作为输入。 现在,x 应该是训练向量(训练数据),y 应该是目标值。

clf = MultinomialNB().fit(X_train_tfidf, twenty_train.target)

更详细:

X : array-like, sparse matrix, shape = [n_samples, n_features]
Training vectors, where n_samples is the number of samples and n_features is 
the number of features.

y : array-like, shape = [n_samples]
Target values.

注意:确保xy 中的shape = [n_samples, n_features]shape = [n_samples] 定义正确。否则,fit 会抛出错误。


玩具示例:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics

newsgroups_train = fetch_20newsgroups(subset='train')
categories = ['alt.atheism', 'talk.religion.misc',
              'comp.graphics', 'sci.space']

newsgroups_train = fetch_20newsgroups(subset='train',
                                      categories=categories)
vectorizer = TfidfVectorizer()
# the following will be the training data
vectors = vectorizer.fit_transform(newsgroups_train.data)
vectors.shape

newsgroups_test = fetch_20newsgroups(subset='test',
                                     categories=categories)
# this is the test data
vectors_test = vectorizer.transform(newsgroups_test.data)

clf = MultinomialNB(alpha=.01)

# the fitting is done using the TRAINING data
# Check the shapes before fitting
vectors.shape
#(2034, 34118)
newsgroups_train.target.shape
#(2034,)

# fit the model using the TRAINING data
clf.fit(vectors, newsgroups_train.target)

# the PREDICTION is done using the TEST data
pred = clf.predict(vectors_test)

编辑:

newsgroups_train.target 只是一个包含labels (or targets or classes)numpy 数组。

import numpy as np

newsgroups_train.target
array([1, 3, 2, ..., 1, 0, 1])

np.unique(newsgroups_train.target)
array([0, 1, 2, 3])

所以在这个例子中,我们有 4 个不同的类/目标。

为了适应分类器需要这个变量。

【讨论】:

我不明白什么是 newsgroups_train.target!如何构建它,或者功能目标是什么?在我的情况下,我只有一个培训文件,我不使用预定义文件,我应该创建一个新文件吗? 在我的情况下,我将预测两个类 0(负)和 1(正),所以目标是情感列,我有 MultinomialNB().fit(X_train_counts, train['sentiment'] ) 那么是的。我同意。考虑接受并支持我的回答。

以上是关于Naivebayes MultinomialNB scikit-learn/sklearn的主要内容,如果未能解决你的问题,请参考以下文章

MultinomialNB - 理论与实践

在多列数据上拟合 MultinomialNB

处理 sklearn MultinomialNB 中的负值

CountVectorizer MultinomialNB ValueError:维度不匹配

python/pandas 中的 MultinomialNB 在预测时返回“对象未对齐”错误

用于文本分类的 Scikit Learn-MultinomialNB