python - 如何在使用朴素贝叶斯和python训练数据后进行预测?

Posted

技术标签:

【中文标题】python - 如何在使用朴素贝叶斯和python训练数据后进行预测?【英文标题】:How to predict after training data using naive bayes with python? 【发布时间】:2018-05-06 09:43:24 【问题描述】:

我有一个数据集,其中只包含两个有用的列用于训练我的模型,第一个是新闻标题,第二个是新闻类别。

所以,我使用 python 成功运行了以下训练命令:

import re
import numpy as np
import pandas as pd
# the Naive Bayes model
from sklearn.naive_bayes import MultinomialNB
# function to split the data for cross-validation
from sklearn.model_selection import train_test_split
# function for transforming documents into counts
from sklearn.feature_extraction.text import CountVectorizer
# function for encoding categories
from sklearn.preprocessing import LabelEncoder


# grab the data
news = pd.read_csv("/Users/helloworld/Downloads/NewsAggregatorDataset/newsCorpora.csv",encoding='latin-1')
news.head()

def normalize_text(s):
    s = s.lower()

    # remove punctuation that is not word-internal (e.g., hyphens, apostrophes)
    s = re.sub('\s\W',' ',s)
    s = re.sub('\W\s',' ',s)

    # make sure we didn't introduce any double spaces
    s = re.sub('\s+',' ',s)

    return s

news['TEXT'] = [normalize_text(s) for s in news['TITLE']]

# pull the data into vectors
vectorizer = CountVectorizer()
x = vectorizer.fit_transform(news['TEXT'])

encoder = LabelEncoder()
y = encoder.fit_transform(news['CATEGORY'])

# split into train and test sets
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

nb = MultinomialNB()
nb.fit(x_train, y_train)

所以我的问题是,如何提供一组新数据(例如,仅新闻标题)并告诉程序使用 python sklearn 命令预测新闻类别?

附:我的训练数据是这样的:

【问题讨论】:

您是否尝试过使用属于MultinomialNB 类的predict 方法? scikit-learn.org/stable/modules/generated/…。您已经根据标题对其进行了培训,并且输出是类别。要在测试数据上使用朴素贝叶斯,请执行与训练时相同的特征转换,然后将其提交到朴素贝叶斯分类器。 @why not you just use: y-predicted = nb.predict(x_test) ??? 【参考方案1】:

您应该使用训练数据(如您所做的那样)训练模型,然后您应该使用新数据(测试数据)进行预测。


执行以下操作:

nb = MultinomialNB()
nb.fit(x_train, y_train)

y_predicted = nb.predict(x_test)

现在,如果您想根据**准确度评估预测,您可以执行以下操作:**

from sklearn.metrics import accuracy_score

accuracy_score(y_test, y_predicted) 

同样,您可以计算其他指标。

最后,我们可以看到所有可用的指标here !


编辑 1

当你输入时:

 y_predicted = nb.predict(x_test)

y_predicted 将包含与您的类别相对应的数值。

要投影回这些值并获取标签,您可以这样做:

y_predicted_labels = encoder.inverse_transform(y_predicted) 

【讨论】:

感谢您的提示,塞拉费姆。我试过 y_predicted = nb.predict(x_test) 但它返回一个数字数组,如 2,1,3.... 这是什么意思?在我的训练数据集中,我的类别应该类似于“b”、“a”或“c”。 1,2,3 表示 a,b,c serafeim,我的类别有 'b'、't'、'e' 和 'm'。如何将这些数字从数组转换为这些提到的类别?非常感谢您的帮助。 :-) @userIndulgeInDChord 我编辑了解释如何获取实际标签的答案。请考虑接受我的回答。您使用 LabelEncoder 对 y 变量进行编码,并以同样的方式获取实际标签。 谢谢一百万,serafeim。你救了我几天! ;-)【参考方案2】:

你很亲密。只需要多两行代码。使用此链接,使用 Sci Kit 解释 Naives Bayes, https://www.digitalocean.com/community/tutorials/how-to-build-a-machine-learning-classifier-in-python-with-scikit-learn

你的问题的简短回答如下,导入准确度函数,

from sklearn.metrics import accuracy_score

使用预测函数测试模型,

preds = nb.predict(x_test)

然后测试准确率

print(accuracy_score(y_test, preds))

【讨论】:

感谢您的提示,阿吉斯。加载的数据集实际上分为训练和测试。结果,我想加载一个新的数据集,让程序预测新闻类别。

以上是关于python - 如何在使用朴素贝叶斯和python训练数据后进行预测?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用朴素贝叶斯和主成分分析(C#、Accord.NET)对文档进行分类

朴素贝叶斯和条件概率计算

在 sklearn 中补充朴素贝叶斯和加权类

最近邻、朴素贝叶斯和决策树分类器解决给定分类问题的效果如何?

朴素贝叶斯和逻辑回归的假设

执行朴素贝叶斯和决策树分类时出现 KeyError