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

时间:2018-09-17 16:15:23

标签: machine-learning scikit-learn nlp text-classification naivebayes

我正在尝试解决文本分类问题。我捕获的文本数据类别的标签数量有限。如果输入的文本数据不适合任何标签,则将其标记为“其他”。在下面的示例中,我构建了一个文本分类器,将文本数据分类为“早餐”或“意大利语”。在测试场景中,我包含了一些文本数据,这些文本数据不适合我用于训练的标签。这是我面临的挑战。理想情况下,我希望模型说-“其他”代表“我喜欢远足”和“每个人都应该理解数学”。我怎样才能做到这一点?

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       ]]

我将“其他”类别视为噪声,因此无法对该类别进行建模。

4 个答案:

答案 0 :(得分:6)

我认为Kalsi可能已经提出了这个建议,但是我不清楚。您可以为课程定义一个置信度阈值。如果预测的概率未达到您所有类别的阈值(在您的示例中为“意大利语”和“早餐”),则您无法对产生“其他”“类别”的样本进行分类。

我之所以说“课程”,是因为其他人不完全是课程。您可能不希望分类器擅长预测“其他”,因此此置信度阈值可能是一种不错的方法。

答案 1 :(得分:3)

您不能那样做。

您已训练模型仅预测两个标签,即breakfastitalian。因此,该模型对第三个标签或第四个标签没有任何了解。

您和我都知道"i like hiking"既不是breakfast也不是italian。但是一个模特怎么会知道呢?它仅知道breakfastitalian。因此,必须有一种方法来告诉模型:如果您对breakfastitalian之间感到困惑,则将标签预测为other

您可以通过训练以other为标签的模型,并使用诸如"i like hiking"等文本的方式来实现这一目标

但是对于您而言,可以按照以下步骤做一点hack


  

当模型以0.5的概率(或大约0.5)预测标签时,这意味着什么?这意味着标签breakfastitalian之间的模型越来越混乱。所以在这里您可以利用它。

     

如果概率值介于0.45和0.55之间,则可以获取所有预测的概率值并分配标签other。这样,您就可以预测other标签(显然会有一些错误),而无需让模型知道存在一个名为other

的标签。

答案 2 :(得分:1)

不,你不能那样做。

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

处理此问题的另一种方法是,从所有句子中的不同类别(包括其他类别)中获取名词短语,然后将其输入模型中,将其视为机器学习模型的特征选择步骤。这样,与不相关字词相加的杂音将被删除,性能优于tf-idf。

如果您有大量数据,请选择可自动选择功能的深度学习模型。

不要自己动手操作概率,50-50%的概率意味着该模型在您定义的两个类别之间是混淆的,它对第三个“其他类别”一无所知。 假设该句子是“我要意大利早餐”,那么该模型是否会混淆“意大利语”或“早餐”类别,但这并不意味着它属于“其他”类别”。

答案 3 :(得分:0)

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