为什么分类器在从测试文件中预测时会出现额外的标签?

在之前的一篇帖子中,我询问了关于文本分类的内容,我希望能更好地理解其中的原理以及scikit-learn是如何工作的。假设train.txt的内容是

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.

test.txt的内容是

Por ello, ha insistido en que Europa tiene que darle un toque de atención porque Portugal esta incumpliendo la directiva del establecimiento del peajeEstima-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

我有一个小脚本可以进行语言识别:

# -- coding: utf-8 --import codecsfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.naive_bayes import MultinomialNBtrain = []#我们设置类别tags = ['bos','pt','es','slov']word_vectorizer = CountVectorizer(analyzer='word')#向量化训练和测试文件trainset = word_vectorizer.fit_transform(    codecs.open('/Users/user/Desktop/train.txt','r','utf8'))testset = word_vectorizer.transform(    codecs.open('/Users/user/Desktop/test.txt','r','utf8'))#我们训练算法:mnb = MultinomialNB()mnb.fit(trainset, tags)res = mnb.predict(testset)print res

这是输出结果:['es' 'pt' 'bos']。输出结果的问题在于显然多了一个错误的类别(即bos)。我猜问题出在我是如何标记traintest文件的,那么,我该如何标记这两个文件以获得正确的结果,即:['es' 'pt']

到目前为止,我明白这两个文件都需要向量化,但我不知道这里发生了什么:

mnb = MultinomialNB()mnb.fit(trainset, tags)res = mnb.predict(testset)

能有人详细解释一下上面脚本部分发生了什么吗?


回答:

你的test.txt中有一行空行,导致了额外的输入。

这行代码逐行读取test.txt并将每一行转换为特征向量:

testset = word_vectorizer.transform(    codecs.open('/Users/user/Desktop/test.txt','r','utf8'))

额外的空行会导致一个额外的向量,这个向量会被标记为最可能的标签。在训练数据train.txt中,所有标签的可能性是相等的,所以空行会采用第一个标签。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注