评估 NB 模型的预测准确性

Posted

技术标签:

【中文标题】评估 NB 模型的预测准确性【英文标题】:Evaluating the predictive accuracy of the NB model 【发布时间】:2016-08-08 13:51:17 【问题描述】:

使用nltk 中的scikit-learn 来检查朴素贝叶斯分类器的准确性,我做错了什么?

...readFile definition not needed 
#divide the data into training and testing sets
data = readFile('Data_test/')
training_set = list_nltk[:2000000]
testing_set = list_nltk[2000000:]

#applied Bag of words as a way to select and extract feature
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(training_set.split('\n'))

#apply tfd
tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts)
X_train_tf = tf_transformer.transform(X_train_counts)

#Train the data
clf = MultinomialNB().fit(X_train_tf, training_set.split('\n'))

#now test the accuracy of the naive bayes classifier
test_data_features = count_vect.transform(testing_set)
X_new_tfidf = tf_transformer.transform(test_data_features)

predicted = clf.predict(X_new_tfidf)
print "%.3f" % nltk.classify.accuracy(clf, predicted)

问题是当我打印 nltk.classify.accuracy 时,它需要很长时间,我怀疑这是因为我做错了什么,但由于我没有出错,我无法弄清楚是什么错误.

【问题讨论】:

您确定它调用了准确度方法吗?你想预测什么?尝试添加一些打印以查看它停止的位置。您的分类器的拟合方法似乎很奇怪,它应该是clf.fit(X,Y),其中 X 是(矢量化)文本,Y 是训练集的标签。 【参考方案1】:

改用accuracy_score 的sklearn metrics。

>>> from sklearn.metrics import accuracy_score
>>> y_pred = [0, 2, 1, 3]
>>> y_true = [0, 1, 2, 3]
>>> accuracy_score(y_true, y_pred)
0.5

我认为您在混合监督学习方面的一些内容。请参阅此 answer 并尝试理解 top of this page。

您的数据应该采用这种形式(在进行矢量化之前):

X = [["The cat is sleeping"], ..., ["The man is dead"]]
Y = [1, ..., 0] 

【讨论】:

我试过这个: print accuracy_score(test_data_features.toarray(), predict) 但仍然没有结果 您必须将真实标签列表和模型预测标签列表提供给 accuracy_score 方法,以便判断模型的性能。 好吧,我不确定我是否正确,但你能看看我上面粘贴的代码,如果我做错了什么,请告诉我。到目前为止,我没有错误,也无法弄清楚出了什么问题。除了准确性部分,一切正常。我有一个文本文件,分为 testing_set 和 training_set。【参考方案2】:

你至少在这一行有一个错误

clf = MultinomialNB().fit(X_train_tf, training_set.split('\n'))

您需要在其中包含训练标签和矢量化数据,但您拥有原始数据和矢量化数据。

应该是这样的:

clf = MultinomialNB().fit(X_train_tf, y_train)

但据我所知,您的代码中的任何地方都没有标签 y_train 数据。

【讨论】:

谢谢。后来我注意到了这一点,我正在尝试使用 np.array(training_set) 但似乎对我的文本进行矢量化是一个挑战。当我这样做时,这 == np.array(list_nltk.split()) 我得到了行但没有列,例如 (934567,) 我如何真正矢量化我的文本文件?我已经尝试了一段时间了。所以,我想我只需要问一下如何使用 scikit learn 获取训练标签? 训练标签是您在原始数据集中需要的东西。这不是你可以生成的(使用 sklearn) 在这种情况下,我的训练标签将是“莎士比亚”,因为我正在尝试训练莎士比亚文本。关于如何训练此类文本的任何完整示例?我似乎在网上找不到任何可以学习的东西。

以上是关于评估 NB 模型的预测准确性的主要内容,如果未能解决你的问题,请参考以下文章

spss模型预测准确率是哪个

R语言glm拟合logistic回归模型:模型评估(模型预测概率的分组密度图混淆矩阵准确率精确度召回率ROCAUC)PRTPlot函数获取logistic模型最优阈值(改变阈值以优化)

R语言编写自定义函数计算分类模型评估指标:准确度特异度敏感度PPVNPV数据数据为模型预测后的混淆矩阵比较多个分类模型分类性能(逻辑回归决策树随机森林支持向量机)

分类评估指标

模型评估:模型状态评估

模型评估:精确率召回率准确率