【发布时间】: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