【问题标题】:Scikit-learn multi-label classificationScikit-learn 多标签分类
【发布时间】:2016-10-17 22:36:03
【问题描述】:

我正在尝试使用 Scikit-learn 了解文本的多标签分类,我正在尝试将 scikit 附带的初始示例教程之一改编为使用维基百科文章作为训练数据的语言分类。我正在尝试在下面实现这一点,但代码仍然为每个我希望最后一个预测返回 fr, en 的地方返回一个标签

任何人都可以就启用多标签分类的正确方法提出建议。

import sys

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.datasets import make_multilabel_classification
from sklearn.preprocessing import LabelBinarizer

from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
from sklearn.datasets import load_files
from sklearn.cross_validation import train_test_split
from sklearn import metrics
from sklearn.multiclass import OneVsRestClassifier
#change model_selection to cross_validation

# The training data folder must be passed as first argument - This uses the example wiki language data files
languages_data_folder = sys.argv[1]
dataset = load_files(languages_data_folder)

# Split the dataset in training and test set:
docs_train, docs_test, y_train, y_test = train_test_split(
dataset.data, dataset.target, test_size=0.5)


#pipeline
clf = Pipeline([
('vectorizer', CountVectorizer(ngram_range=(1,2))),
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(LinearSVC())),
])
    target_names=dataset.target_names



# TASK: Fit the pipeline on the training set
clf.fit(docs_train, y_train)

# TASK: Predict the outcome on the testing set in a variable named y_predicted
y_predicted = clf.predict(docs_test)

print target_names


# Predict the result on some short new sentences:
sentences = [
    u'This is a language detection test.',
    u'Ceci est un test de d\xe9tection de la langue.',
    u'Dies ist ein Test, um die Sprache zu erkennen.',
    u'Bonjour Mon ami. This is a language detection test.',

]
predicted = clf.predict(sentences)

for s, p in zip(sentences, predicted):
    print(u'The language of "%s" is "%s"' % (s, target_names[p]))

返回 -

“这是一个语言检测测试”的语言。是“恩”

“Ceci est un test de détection de la langue”的语言。是“fr”

“Dies ist ein Test, um die Sprache zu erkennen”的语言。是“德”

“Bonjour Mon ami。这是一个语言检测测试”的语言。是“恩”

【问题讨论】:

  • predict 返回单个类标签,predict_proba 返回每​​个类标签的概率,这就是你所追求的吗?
  • 是的,虽然我可能实际上并不需要每个的概率,但我希望能够看到最有可能的标签,而不仅仅是一个。例如,第 4 个例句同时包含法语和英语,所以我假设它会同时返回 en 和 fr 作为标签,而不仅仅是 en。
  • 你的训练数据有多标签输出吗?

标签: python scikit-learn multilabel-classification


【解决方案1】:

您可以使用scikit-multilearn 进行多标签分类,它是一个建立在 scikit-learn 之上的库。对于语言,标签之间的相关性并不那么重要,因此二元分类器应该非常适合。您可以在documentation 中找到如何进行分类的示例,但在您的情况下,您需要替换:

('clf', OneVsRestClassifier(LinearSVC())),

('clf', BinaryRelevance(LinearSVC())),

并在顶部添加导入:

from skmultilearn.problem_transform import BinaryRelevance

记得先安装 scikit-multilearn!

【讨论】:

  • 感谢您的建议,如果我按照这些步骤操作,我会在 fit-ValueError: Found arrays with contrast numbers of samples: [1 476] 上得到一个错误,不过我也会查看文档,谢谢。
猜你喜欢
  • 2016-01-24
  • 2014-11-19
  • 2013-04-30
  • 2017-08-05
  • 2018-11-13
  • 2019-11-18
  • 2013-09-26
  • 2016-07-12
  • 2012-10-29
相关资源
最近更新 更多