【问题标题】:Multi-label out-of-core learning for text data: ValueError on partial fit文本数据的多标签核外学习:ValueError on partial fit
【发布时间】:2017-07-05 22:44:07
【问题描述】:

我正在尝试构建一个多标签的核心文本分类器。如here 所述,其想法是批量读取(大规模)文本数据集并将它们部分拟合到分类器。此外,当您有 here 所述的多标签实例时,我们的想法是以 One-Vs-All 的方式构建与数据集中类数一样多的二元分类器。

将 sklearn 的 MultiLabelBinarizer 和 OneVsRestClassifier 类与部分拟合相结合时,出现以下错误:

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

代码如下:

from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.multiclass import OneVsRestClassifier

categories = ['a', 'b', 'c']
X = ["This is a test", "This is another attempt", "And this is a test too!"]
Y = [['a', 'b'],['b'],['a','b']]

mlb = MultiLabelBinarizer(classes=categories)
vectorizer = HashingVectorizer(decode_error='ignore', n_features=2 ** 18,         non_negative=True)
clf = OneVsRestClassifier(MultinomialNB(alpha=0.01))

X_train = vectorizer.fit_transform(X)
Y_train = mlb.fit_transform(Y)
clf.partial_fit(X_train, Y_train, classes=categories)

您可以想象最后三行应用于每个小批量,为了简单起见,我删除了其中的代码。

如果您删除 OneVsRestClassifier 并仅使用 MultinomialNB,则代码运行良好。

【问题讨论】:

    标签: python machine-learning scikit-learn multilabel-classification


    【解决方案1】:

    您传递的是从MultiLabelBinarizer 转换而来的 y_train,其形式为 [[1, 1, 0], [0, 1, 0], [1, 1, 0]],但将类别传递为 @ 987654330@ 然后通过this line the code:-

    if np.setdiff1d(y, self.classes_):
    raise ValueError(("Mini-batch contains {0} while classes " +
                     "must be subset of {1}").format(np.unique(y),
                                                  self.classes_))
    

    这会产生一个布尔值数组,例如 [False, True, ..]。 if 无法将此类数组作为单个真值处理,因此会出现错误。

    首先你应该以与Y_train 相同的数字格式传递课程。 现在即使你这样做了,那么internal label_binarizer_ of OneVsRestClassifier 将决定它是“多类”类型而不是multilabel,然后将拒绝正确转换类。我认为这是 OneVsRestClassifer 和/或 LabelBinarizer 中的一个错误。

    请向 scikit-learn github 提交关于 partial_fit 的问题,看看会发生什么。

    更新 显然,从目标向量 (y) 中决定“多标签”或“多类”是 scikit-learn 上一个当前持续存在的问题,因为它存在所有复杂性。

    【讨论】:

    • 显然问题出在 OneVsRestClassifie 上,因为朴素贝叶斯的部分拟合即使在这种类型的类别下也能正常工作。我想现在我应该自己做一个 vs rest 方法。
    【解决方案2】:

    所以可能会有一个与您预期不同的答案,但我建议您不要使用 OneVsRestClassifier,而是使用基于 scikit-learn 构建的 scikit-multilearn 库,该库提供多标签分类器比简单的 OneVsRest 更先进。

    您可以在tutorial 中找到如何使用 scikit-multilearn 的示例。可以在Tsoumakas's introduction to MLC 中找到对多标签分类方法的回顾。

    但如果碰巧有标签彼此同时出现,我建议使用不同的分类器,例如标签空间划分的标签 Powerset,在输出空间上使用快速贪婪社区检测 - 我解释了为什么这样做在my paper about label space division

    将您的代码转换为使用 scikit-multilearn 将使其如下所示:

    from sklearn.naive_bayes import MultinomialNB
    from sklearn.feature_extraction.text import HashingVectorizer
    from sklearn.preprocessing import MultiLabelBinarizer
    
    from skmultilearn.ensemble import LabelSpacePartitioningClassifier
    from skmultilearn.cluster import IGraphLabelCooccurenceClusterer
    from skmultilearn.problem_transform import LabelPowerset
    
    categories = ['a', 'b', 'c']
    X = ["This is a test", "This is another attempt", "And this is a test too!"]
    Y = [['a', 'b'],['b'],['a','b']]
    
    mlb = MultiLabelBinarizer(classes=categories)
    vectorizer = HashingVectorizer(decode_error='ignore', n_features=2 ** 18,         non_negative=True)
    
    X_train = vectorizer.fit_transform(X)
    Y_train = mlb.fit_transform(Y)
    
    # base single-label classifier 
    base_classifier = MultinomialNB(alpha=0.01)
    
    # problem transformation from multi-label to single-label 
    transformation_classifier = LabelPowerset(base_classifier)
    
    # clusterer dividing the label space using fast greedy modularity maximizing scheme
    clusterer = IGraphLabelCooccurenceClusterer('fastgreedy', weighted=True, include_self_edges=True) 
    
    # ensemble
    clf = LabelSpacePartitioningClassifier(transformation_classifier, clusterer)
    
    clf.fit(X_train, Y_train)
    

    【讨论】:

    • 我很欣赏你的方法,但似乎 skmulitlearn 不支持 partial_fit。我想说 skmultilearn 因此不适用于多标签 out-of-core 学习。
    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2017-09-01
    • 2020-10-31
    相关资源
    最近更新 更多