用我自己的语料库用 scikit-learn 理解 accuracy_score?

Posted

技术标签:

【中文标题】用我自己的语料库用 scikit-learn 理解 accuracy_score?【英文标题】:Understanding accuracy_score with scikit-learn with my own corpus? 【发布时间】:2015-02-17 22:50:16 【问题描述】:

假设我已经准备好用 scikit learn 和SVC 进行一些文本分类。首先我对语料库进行矢量化,将数据分成测试集和训练集,然后将标签设置到训练集中。现在我想获得分类的准确性。

从documentation 我读到以下内容:

>>> import numpy as np
>>> 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
>>> accuracy_score(y_true, y_pred, normalize=False)
2

问题是我不明白什么是:y_pred = [0, 2, 1, 3]y_true = [0, 1, 2, 3],一旦我对我自己的语料库进行分类测试集,我如何“达到”或获得这些值。有人可以帮我解决这个问题吗?

我们举个例子:

训练数据:

Pošto je EULEX obećao da će obaviti istragu o prošlosedmičnom izbijanju nasilja na sjeveru Kosova, taj incident predstavlja još jedan ispit kapaciteta misije da doprinese jačanju vladavine prava.
De todas as provações que teve de suplantar ao longo da vida, qual foi a mais difícil? O início. Qualquer começo apresenta dificuldades que parecem intransponíveis. Mas tive sempre a minha mãe do meu lado. Foi ela quem me ajudou a encontrar forças para enfrentar as situações mais decepcionantes, negativas, as que me punham mesmo furiosa.
Al parecer, Andrea Guasch pone que una relación a distancia es muy difícil de llevar como excusa. Algo con lo que, por lo visto, Alex Lequio no está nada de acuerdo. ¿O es que más bien ya ha conseguido la fama que andaba buscando?
Vo väčšine golfových rezortov ide o veľký komplex niekoľkých ihrísk blízko pri sebe spojených s hotelmi a ďalšími možnosťami trávenia voľného času – nie vždy sú manželky či deti nadšenými golfistami, a tak potrebujú iný druh vyžitia. Zaujímavé kombinácie ponúkajú aj rakúske, švajčiarske či talianske Alpy, kde sa dá v zime lyžovať a v lete hrať golf pod vysokými alpskými končiarmi.

测试数据:

Por ello, ha insistido en que Europa tiene que darle un toque de atención porque Portugal esta incumpliendo la directiva del establecimiento del peaje
Estima-se que o mercado homossexual só na Cidade do México movimente cerca de oito mil milhões de dólares, aproximadamente seis mil milhões de euros


import codecs, re, time
from itertools import chain

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

trainfile = 'train.txt'
testfile = 'test.txt'

# Vectorizing data.
train = []
word_vectorizer = CountVectorizer(analyzer='word')
trainset = word_vectorizer.fit_transform(codecs.open(trainfile,'r','utf8'))
tags = ['bs','pt','es','sr']

# Training NB
mnb = MultinomialNB()
mnb.fit(trainset, tags)

# Tagging the documents
codecs.open(testfile,'r','utf8')
testset = word_vectorizer.transform(codecs.open(testfile,'r','utf8'))
results = mnb.predict(testset)

print results

【问题讨论】:

好的,所以如果你想要一个准确的答案,你必须告诉你在 train.txt 中有多少个数据样本,以及它们分为多少个类(它们是 4 个?)?另外,您说您使用的是 SVC,但在您的代码中,您实际上使用的是 MultinomialNB!此外,据我所知,“预测”适用于单个数据样本。 是的,他们是 4,是的,我使用 SVC 和 MultinomialNB。我只是几个例子,以了解发生了什么。 所以:accuracy_score(tags, results)accuracy_score(y_true, y_pred, normalize=False)。应该工作吗?。 如果“results”包含预测标签列表,是的!但是对于 4 个数据样本,自己计算准确性要容易得多,而不是使用函数。看看我关于准确性的回答。 您的训练数据中有哪些标签?你想提取什么样的特征? 【参考方案1】:

您的示例中有一个小错误。行:

tags = ['SPAM','HAM','another_class']

错了。语料库中的每个示例(句子/文档)都应该有一个标签。所以tags 不应该是 3,而是你的trainset 的长度。

这同样适用于测试集。您应该有一个与testset 长度相同的变量test_tags。这些标签通常是文件“test.txt”中的一列,但您可能会从其他地方获得它。这将是您的y_true

当您在测试集上进行预测时,您将得到一个与testset 长度相同的向量:

results = mnb.predict(testset)

即测试集中每个示例的标签预测。

这是你的y_pred。我省略了与多类与单类案例相关的一些细节(另一个问题的材料),但这应该可以回答您的问题。

【讨论】:

对不起,我混淆了这些例子。我正在处理几个例子来理解。现在可以了。 所以简而言之,y_true 是标签,y_pred 是分类结果?。【参考方案2】:

我希望这会对你有所帮助。你问:

问题是我不明白什么是:y_pred = [0, 2, 1, 3] 和 y_true = [0, 1, 2, 3] 以及我如何“达到”或获得这些值 一旦我对我自己的语料库的测试集进行分类。任何人都可以帮助我 有这个问题吗?

答案:如您所知,分类器应该将数据分类到不同的类别。在上面的例子中,假设的数据有四个不同的类别,分别用标签 0、1、2 和 3 指定。因此,如果我们的数据是关于对单色图像中的颜色进行分类,则标签将表示如下:蓝色、红色、黄色和绿色。上述示例显示的另一个问题是数据中只有四个样本。例如,他们只有四张图片,y_true 显示了他们的真实标签(或者我们称之为groundtruth)。 y_pred 显示分类器的预测。现在,如果我们比较这两个列表,如果两者相同,我们的准确率是 100%,但是,在这种情况下,您会看到预测标签中的两个标签与它们的真实值不匹配。

现在,在您的示例代码中,您编写了:

tags = ['SPAM','HAM','another_class']

就像我上面解释的那样,首先,您的数据由 3 个不同的类组成;其次,它表明您的数据仅包含 3 个样本(这可能不是您真正想要的)。因此,此列表的长度应等于训练数据中的样本数。如果您还有其他问题,请告诉我。

【讨论】:

以上是关于用我自己的语料库用 scikit-learn 理解 accuracy_score?的主要内容,如果未能解决你的问题,请参考以下文章

根据文本语料库中的出现列出词汇表中的单词,使用 Scikit-Learn CountVectorizer

scikit-learn:在实际项目中用到过的知识点(总结)

在 scikit-learn 中使用 nltk 搭配作为特征

scikit-learn 可以处理多少文本?

Python Scikit-Learn 库中分类数据的异常值预测

使用 scikit-learn 进行文本特征提取