python - 有没有办法根据斯坦福 NLP 研究论文在 scikit-learn 多项式朴素贝叶斯中提取最大后验概率?

标签 python scikit-learn text-classification naivebayes

我正在尝试复制链接中论文的结果

https://nlp.stanford.edu/IR-book/html/htmledition/naive-bayes-text-classification-1.html

此链接解释了多项式朴素贝叶斯如何用于文本分类。

我尝试使用 scikit learn 重现该示例。

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn import preprocessing, decomposition, model_selection, metrics, pipeline
from sklearn.model_selection import GridSearchCV, cross_val_score, KFold
from sklearn.metrics import accuracy_score
from sklearn.metrics import make_scorer
from sklearn.naive_bayes import MultinomialNB

#TRAINING SET
dftrain = pd.DataFrame(data=np.array([["Chinese Beijing Chinese", "Chinese Chinese Shanghai", "Chinese Macao", "Tokyo Japan Chinese"], 
["yes", "yes", "yes", "no"]]))

dftrain = dftrain.T
dftrain.columns = ['text', 'label']

#TEST SET
dftest = pd.DataFrame(data=np.array([["Chinese Chinese Chinese Tokyo Japan"]]))
dftest.columns = ['text']

count_vectorizer = CountVectorizer(min_df=0, token_pattern=r"\b\w+\b", stop_words = None)
count_train = count_vectorizer.fit_transform(dftrain['text'])
count_test = count_vectorizer.transform(dftest['text'])

clf = MultinomialNB()
clf.fit(count_train, df['label'])
clf.predict(count_test)

输出正确打印为:

array(['yes'],
  dtype='<U3')

就像论文中提到的那样! 该论文预测它为"is",因为

P(是 | 测试集)= 0.0003 > P(否 | 测试集)= 0.0001

我希望能够看到这两个概率!

当我输入时:

clf.predict_proba(count_test)

我明白

array([[ 0.31024139,  0.68975861]])

我认为这意味着:

P(测试属于标签“no”)= 0.31024139P(测试属于标签"is")= 0.68975861

因此,scikit-learn 预测文本属于标签 yes,但是

我的问题是:为什么概率不同? P(yes | test set) = 0.0003 > P(no | test set) = 0.0001,我没有看到数字 0.00030.0001 > 但请参阅 0.310241390.68975861

我在这里遗漏了什么吗?这与class_prior参数有关吗?

我确实阅读了文档!

http://scikit-learn.org/stable/modules/naive_bayes.html#multinomial-naive-bayes

显然,该参数是通过最大似然的平滑版本估计的,即相对频率计数。

我想知道的是,无论如何,我可以复制并看到研究论文中的结果吗?

最佳答案

这更多地与predict_proba产生的概​​率的含义有关。数字 .0003 和 .0001 未标准化,即它们的总和不等于 1。如果你标准化这些值,你会得到相同的结果

请参阅下面的代码片段:

clf.predict_proba(count_test)
Out[63]: array([[ 0.31024139,  0.68975861]])

In [64]: p = (3/4)*((3/7)**3)*(1/14)*(1/14)

In [65]: p
Out[65]: 0.00030121377997263036

In [66]: p0 = (1/4)*((2/9)**3)*(2/9)*(2/9)

In [67]: p0
Out[67]: 0.00013548070246744223

#normalised values
In [68]: p/(p0+p)
Out[68]: 0.6897586117634674

In [69]: p0/(p0+p)
Out[69]: 0.3102413882365326

关于python - 有没有办法根据斯坦福 NLP 研究论文在 scikit-learn 多项式朴素贝叶斯中提取最大后验概率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48570417/

相关文章:

python - 为什么 Python/Numpy 需要行向量来表示矩阵/向量点积?

python - Base64 和非标准

c# - C# 中的异或解密

python - 使用 SKLearn 中的 GridSearchCV 时出现 JobLibValueError

python - 改进流 Python 分类器并组合功能

Python线在同一个图上绘制多个时间序列

machine-learning - 使用 OneHotEncoder 进行机器学习时出现 "ValueError: could not convert string to float"

python - 决策树中特定类的 Sklearn 决策规则

python - 使用不同文本集的参数网格搜索,用于字典创建和交叉验证

python - 如何训练分类器从语法语言中检测白话?