使用多项式贝叶斯分类器

Posted

技术标签:

【中文标题】使用多项式贝叶斯分类器【英文标题】:Using a Multinomial Bayes Classifier 【发布时间】:2020-06-21 22:20:34 【问题描述】:

我是 python 和 scikit 的新手,所以如果这是一个愚蠢的问题,请多多包涵。为了使用 sklearn 制作多项式朴素贝叶斯分类器,我遵循了一些教程,并且我已经对其进行了训练和测试,达到了不错的准确性。但是,我已经到了教程的结尾,并且意识到我实际上并不知道如何提供新数据以对其进行分类。这是我的代码:

import sklearn as skl;
import pandas as pd;
from sklearn.metrics import accuracy_score, precision_score, recall_score;
from sklearn.model_selection import train_test_split;
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB;
from sklearn.metrics import confusion_matrix;
import matplotlib.pyplot as plt;
import seaborn as sns;
import numpy as np;

def print_top10(vectorizer, clf):
    feature_names = vectorizer.get_feature_names()
    class_labels = clf.classes_
    for i, class_label in enumerate(class_labels):
        top10 = np.argsort(clf.coef_[0])[-10:]
        print("%s: %s" % (class_label,
              " ".join(feature_names[j] for j in top10)))

df = pd.read_excel(r'C:\Users\Nicholas\vegas700.xlsx');

#edit:
df2 = pd.read_excel(r'C:\Users\Nicholas\vegasunlabeled.xlsx');

X_train, X_test, y_train, y_test = train_test_split(df['text'], df['label'], random_state=11, test_size=0.25);

#edit:
finalx_train, finalx_test, finaly_train, finaly_test = train_test_split(df['text'], df['label'], random_state=1, test_size=0.99)

cv = CountVectorizer(strip_accents='ascii', token_pattern=u'(?ui)\\b\\w*[a-z]+\\w*\\b', lowercase=True, stop_words='english');

X_train_cv = cv.fit_transform(X_train.values.astype('U'));
X_test_cv = cv.transform(X_test.values.astype('U'));
#edit:
finalx_cv = cv.transform(finalx_test.values.astype('U'));

print("training...");
mnb = MultinomialNB();
mnb.fit(X_train_cv, y_train);
#edit:
new_predictions = mnb.predict_log_proba(finalx_cv)
print(new_predictions)

我如何使用/给我的分类器一个新的数据集,我如何让它给我这个新集中每个类的出现百分比?

编辑: vegas700.xlsx 有三列:从左到右依次称为'id''text''label'id 只是项目编号,text 是文本,label 是一个类,0 或 1。

添加新代码行后,我得到以下结果:

[[-8.24928263e+00 -2.61480227e-04]
 [-4.33474053e+00 -1.31919059e-02]
 [-3.81104731e+00 -2.23734239e-02]
 ...
 [-1.62156753e-04 -8.72702816e+00]
 [-3.35454988e+00 -3.55495505e-02]
 [-1.16414198e-01 -2.20824326e+00]]

我不知道这是什么意思,也不知道它是否正确。

【问题讨论】:

试试mnb.predict(new_dataset)。顺便说一句,您不需要在每行末尾使用; @moys 新数据集应该采用什么形式?它应该是熊猫数据框吗?还是原始的excel文件?也很抱歉;,这是java的习惯 它应该和你用来训练模型的X_train的形式相同(甚至与X_train相同的列) @moys 我已经意识到这就是我需要弄清楚如何去做的事情。我不确定 X_train 究竟是什么形式,但 vegas700.xlsxvegasunlabeled.xlsx 文件的格式完全相同。我认为在vegasunlabeled 上再做一个train_test_split 不是正确的方法,但我真的不明白X_train 是什么。 【参考方案1】:

您的问题是使用 predict_log_proba 而不仅仅是预测。您看到的是每个样本为 0 或 1 的概率的对数,如果您想了解模型对每个标签的“确定性”程度,这将很有帮助。如果您只想查看标签本身,请使用 predict。更多信息here。

编辑:由于这是一个简单的二分类问题,您只需将预测输出相加并除以标记为 1 的样本百分比的形状:

preds = mnb.predict(x)
print(100*preds.sum()/len(preds))

关于扩展到新数据集的另一个建议,我会研究 sklearn 的 pipeline 功能。这样,您可以创建一个包含任何转换的管道,并快速从文件转到新数据集以进行预测。此外,您不需要对新数据进行训练测试拆分。

【讨论】:

以上是关于使用多项式贝叶斯分类器的主要内容,如果未能解决你的问题,请参考以下文章

朴素贝叶斯分类器(伯努利贝叶斯+高斯贝叶斯+多项式贝叶斯)

使用 Python 示例对多项朴素贝叶斯分类器进行分类

scikit learn 使用多项式朴素贝叶斯作为三元分类器?

R中的多项朴素贝叶斯分类器

向多项式朴素贝叶斯分类器添加功能 - Python

具有二进制数据的朴素贝叶斯分类器