Py学习  »  机器学习算法

机器学习模型如何处理看不见的数据和看不见的标签?

Prasanth Regupathy • 4 年前 • 593 次点击  

我正试图解决一个文本分类问题。我的标签数量有限,只能捕获文本数据的类别。如果输入的文本数据不符合任何标签,则将其标记为“其他”。在下面的示例中,我构建了一个文本分类器,将文本数据分类为“早餐”或“意大利语”。在测试场景中,我包含了一些不适合我用于培训的标签的文本数据。这是我面临的挑战。理想情况下,我想让模特说“另一个”代表“我喜欢徒步旅行”,“每个人都应该懂数学”。我该怎么做?

import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer

X_train = np.array(["coffee is my favorite drink",
                    "i like to have tea in the morning",
                    "i like to eat italian food for dinner",
                    "i had pasta at this restaurant and it was amazing",
                    "pizza at this restaurant is the best in nyc",
                    "people like italian food these days",
                    "i like to have bagels for breakfast",
                    "olive oil is commonly used in italian cooking",
                    "sometimes simple bread and butter works for breakfast",
                    "i liked spaghetti pasta at this italian restaurant"])

y_train_text = ["breakfast","breakfast","italian","italian","italian",
                "italian","breakfast","italian","breakfast","italian"]

X_test = np.array(['this is an amazing italian place. i can go there every day',
                   'i like this place. i get great coffee and tea in the morning',
                   'bagels are great here',
                   'i like hiking',
                   'everyone should understand maths'])

classifier = Pipeline([
    ('vectorizer', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('clf', MultinomialNB())])

classifier.fit(X_train, y_train_text)
predicted = classifier.predict(X_test)
proba = classifier.predict_proba(X_test)
print(predicted)
print(proba)

['italian' 'breakfast' 'breakfast' 'italian' 'italian']
[[0.25099411 0.74900589]
 [0.52943091 0.47056909]
 [0.52669142 0.47330858]
 [0.42787443 0.57212557]
 [0.4        0.6       ]]

我认为“另一个”类别是噪音,我不能为这个类别建模。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38089
 
593 次点击  
文章 [ 4 ]  |  最新文章 4 年前
Pascal Soucy
Reply   •   1 楼
Pascal Soucy    5 年前

在创建多项式nb时,可以尝试设置类优先级。您可以创建一个虚拟的“其他”培训示例,然后为其他实例设置足够高的优先级,以便在没有足够的证据选择其他类时,实例默认为“其他”。

GraphicalDot
Reply   •   2 楼
GraphicalDot    5 年前

不,你不能那样做。

您必须定义第三个类别“其他”或适合您的任何名称,并为您的模型提供一些与该类别相关的数据。确保所有三个类别的培训示例的数量都是相等的,否则“其他”作为一个非常广泛的类别可能会使您的模型偏向“其他”类别。

另一种方法是从不同类别的句子中获取名词短语,包括“其他”,然后输入模型,将其视为机器学习模型的功能选择步骤。这样就可以去除无关词添加的噪声,性能优于tf idf。

如果你有大量的数据,去深入学习模型,自动选择功能。

不要使用自己操纵概率的方法,50-50%的概率意味着模型在你定义的两个类之间被混淆,它不知道第三个“其他类”。 假设这个句子是“我想要意大利早餐”,那么这个模型会混淆这个句子是属于“意大利语”还是“早餐”类别,但这并不意味着它属于“其他”类别。

Kalsi
Reply   •   3 楼
Kalsi    5 年前

你不能那样做。

您已经训练了模型,只预测两个标签,即, breakfast italian . 所以这个模型不知道第三个标签或者第四个标签等等。

你和我都知道 "i like hiking" 两者都不是 早餐 也不 意大利语 . 但是A型车怎么会知道呢?它只知道 早餐 和; 意大利语 . 因此必须有一种方法来告诉模型: 如果你对 早餐 和; 意大利语 ,然后预测标签为 other

你可以通过训练 其他 作为一些文本的标签 “我喜欢徒步旅行”

但在你的情况下,有一点 hack 可以做如下。


那么,当一个模型预测一个概率为0.5(或大约0.5)的标签时,这意味着什么呢?这意味着模型在标签之间变得混乱 早餐 意大利语 . 所以在这里你可以利用这个。

您可以获取所有预测的概率值并分配标签 其他 如果概率值介于0.45和0.55之间。这样你就可以预测 其他 在不让模型知道有一个名为 其他

Fabio Picchi
Reply   •   4 楼
Fabio Picchi    5 年前

我想卡西可能提出过这个建议,但我不清楚。你可以定义一个 置信阈值 为了你的课。如果预测的概率没有达到任何类的阈值(在您的示例中为“意大利语”和“早餐”),则无法对产生“其他”类的样本进行分类。

我说“班”是因为其他的不完全是一个班。您可能不希望分类器擅长预测“其他”,所以这个信心阈值可能是一个好方法。