带有多标签的 sklearn-KN​​earestNeighbors

Posted

技术标签:

【中文标题】带有多标签的 sklearn-KN​​earestNeighbors【英文标题】:sklearn-KNearestNeighbors with Multilabels 【发布时间】:2015-11-10 04:22:38 【问题描述】:

我有一个包含特征及其标签的数据集。

看起来像这样:

X1, X2, X3, X4, X5 .. Xn L1, L2, L3
Y1, Y2, Y3, Y4, Y5 .. Yn L5, L2
..

我想在这个数据集上训练一个 KNeighborsClassifier。似乎 sklearn 不采用多标签。我一直在尝试这个:

mlb = MultiLabelBinarizer()
Y = mlb.fit_transform(Y)

# parameters:  n_neighbors=[5,15], weights = 'uniform', 'distance'
bagging = BaggingClassifier(KNeighborsClassifier(n_neighbors =5,weights ='uniform'), max_samples = 0.6, max_features= 0.7, verbose =1, oob_score =True)
scores = cross_val_score(bagging, X, Y, verbose =1, cv=3, n_jobs=3, scoring='f1_macro')

它给了我ValueError: bad input shape

有没有办法可以在 sklearn 中运行多标签分类器?

【问题讨论】:

KNeighborsClassifier 确实采用多标签,而不是 BaggingClassifier 没有。 github.com/scikit-learn/scikit-learn/issues/4758 【参考方案1】:

根据sklearndocumentation,支持多输出-多类分类任务的分类器是:

决策树、随机森林、最近邻

【讨论】:

【参考方案2】:

由于您的标签有一个二进制矩阵,您可以使用OneVsRestClassifier 让您的BaggingClassifier 处理多标签预测。代码现在应该如下所示:

bagging = BaggingClassifier(KNeighborsClassifier(n_neighbors=5, weights='uniform'), max_samples=0.6, max_features=0.7, verbose=1, oob_score=True)
clf = OneVsRestClassifier(bagging)
scores = cross_val_score(clf, X, Y, verbose=1, cv=3, n_jobs=3, scoring='f1_macro')

您可以将OneVsRestClassifier 与任何 sklearn 模型一起使用来进行多标签分类。

这里有一个解释:

http://scikit-learn.org/stable/modules/multiclass.html#one-vs-the-rest

这里是文档:

http://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsRestClassifier.html

【讨论】:

【参考方案3】:

对于发现这个寻找多标签 KNN (MLK​​NN) 选项的任何人,我建议使用 skmultilearn,它构建在 sklearn 之上,如果您熟悉后者的包,那么它很容易使用。

文档here。此示例来自文档:

from skmultilearn.adapt import MLkNN

classifier = MLkNN(k=3)

# train
classifier.fit(X_train, y_train)

# predict
predictions = classifier.predict(X_test)

【讨论】:

以上是关于带有多标签的 sklearn-KN​​earestNeighbors的主要内容,如果未能解决你的问题,请参考以下文章

带有约束的标签添加到具有纵横比的 ImageView

Caffe:具有不同数量标签的多标签图像

带有组和构面的堆叠 ggplot 条形图的百分比标签

Keras - 带权重的多标签分类

帝国CMS灵动标签调用指定栏目的问题

为啥我的多标签文本分类 LSTM 表现不佳?