【问题标题】:sklearn classification with multiple label output具有多个标签输出的 sklearn 分类
【发布时间】:2018-09-11 17:37:44
【问题描述】:

您好,我正在研究 AI 来构建聊天机器人,我现在正在使用 sklearn 测试分类,我通过以下代码设法获得了良好的结果。

def tuned_nominaldb():
    global Tuned_Pipeline
    pipeline = Pipeline([
    ('tfidf', TfidfVectorizer(analyzer=text_process)),
    ('clf', OneVsRestClassifier(MultinomialNB(
        fit_prior=True, class_prior=None))),
    ])
    parameters = {
        'tfidf__max_df': (0.25, 0.5, 0.75),
        'tfidf__ngram_range': [(1, 1), (1, 2), (1, 3)],
        'clf__estimator__alpha': (1e-2, 1e-3)
    }

    Tuned_Pipeline = GridSearchCV(pipeline, parameters, cv=2, n_jobs=2, verbose=10)
    Tuned_Pipeline.fit(cumle_train, tur_train)

我的标签是:

  • 语言不好
  • 政治
  • 宗教
  • 常规

当我输入任何句子时,我大部分时间都会得到正确的标签作为输出。但我的问题是,我想获得多个标签,例如,如果我将糟糕的语言和政治结合起来,那么它只能预测糟糕的语言,我怎样才能获得多个标签,比如糟糕的语言 + 政治。

我尝试添加以下代码,但我收到错误消息,该字符串不适合 fit 方法。

multiout = MultiOutputClassifier(Tuned_Pipeline, n_jobs=-1)
multiout.fit(cumle_train, tur_train)
print(multiout.predict(cumle_test))

非常感谢您的帮助

【问题讨论】:

  • 您想要多标签结果,但我认为您不能简单地开始输出多个类,直到您的“Y”数据不是单个向量而是具有多个列(四个列中的每个列)标签)。这是good example。这是一个answer,可能会有所帮助。
  • 嗨,Jarad,非常感谢您提供的信息,所以让我说说我的理解,如果您不使用多标签进行训练,那么就无法将结果与单标签训练方法相结合。我有我提到的上述主题的训练数据,但我没有任何组合。我认为会有这样的方式,如果句子得分值高于某个点,您可以将该标签添加到输出中。
  • 正确。如果我错了,我会非常惊讶。我见过的唯一多标签输出示例总是有一个“Y”,通常由 MultiLabelBinarizer 编码。我从未见过一个示例,它具有您设置的某些参数,该参数可以自动将您的输出变量从单个预测值“扩展”为突然的多个值,而只需在单维 Y 输入上进行训练。
  • 您好 Jarad,如果您打印 Tuned_Pipeline.predict_proba([choice]),其中的选择是您输入用于测试的句子。它给你每个类的概率结果,结果不足以组合任何东西
  • predict_proba 行总和为 1。如果这是您想要的输出类型,那就太好了!在我看来,predict_proba 不能替代实际的多标签分类问题,因为您必须确定概率阈值,并且您不能盲目地将其设为“n”,因为您可能在 0 概率和 1 附近有 3 个标签高会给你 1 个好标签,1 个坏标签。不过,这是一个创意。

标签: python python-3.x scikit-learn multilabel-classification


【解决方案1】:

当您使用OneVsRestClassifier 时,它会为使用的每个标签训练一个二元分类器,这意味着您可以在同一个句子中使用多个估计器并从中获取多个标签。我建议你检查这个链接:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-16
    • 2017-12-28
    • 2017-09-18
    • 2020-06-29
    • 2016-05-09
    • 1970-01-01
    • 2021-04-14
    • 2017-11-16
    相关资源
    最近更新 更多