【问题标题】:How to get f-measure in multiclass-multioutput classification in python?如何在python的多类多输出分类中获得f-measure?
【发布时间】:2020-09-30 16:32:31
【问题描述】:

我有一个multiclass-multioutput 分类问题,我在 sklearn 中使用randomforest 分类器来执行分类。我的代码如下。

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:5]
y = np.array([[0,0], [0,1], [0,2], [0,4], [1,1]])
clf = RandomForestClassifier(random_state = 42, class_weight="balanced")
k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)

我想进行 10 折交叉验证并获得分类的f-measure。我最初尝试了以下代码。

scores = cross_validate(clf, X, y, cv=k_fold, scoring = ('f1_weighted'))

但是,我收到了错误ValueError: multiclass-multioutput is not supported

因此,我通过手动循环交叉验证中的折叠来尝试以下方式。

cv_f = []
for train_index, val_index in k_fold.split(X, y):
    clf.fit(X[train_index], y[train_index])
    pred = clf.predict(X[val_index])
    f = f1_score(y[val_index], pred)
    cv_f.append(f)

但是,它也不起作用。

似乎 sklearn 不支持多类多输出分类。但是,我很确定在 python 中可能还有其他方法可以做到这一点。

如果需要,我很乐意提供更多详细信息。

编辑

我尝试了以下代码。

import numpy as np
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_validate, KFold
from sklearn.multioutput import MultiOutputClassifier

iris = datasets.load_iris()
X = iris.data[:5]
y = np.array([[0,0], [0,1], [0,2], [0,4], [1,1]])

clf = MultiOutputClassifier(RandomForestClassifier(random_state=42, class_weight="balanced"))
k_fold = KFold(n_splits=3, shuffle=True, random_state=42)

scores = cross_validate(clf, X, y, cv=k_fold, scoring=['f1_weighted'])

但是,我仍然收到raise ValueError("{0} is not supported".format(y_type)) ValueError: multiclass-multioutput is not supported 的错误。

请告诉我解决此问题的合适方法。

【问题讨论】:

  • 编辑后 MWE 的问题在于它的标签 (5) 多于交叉验证的折叠 (3)。这意味着您的模型将不得不预测它从未见过的标签。我再次相应地更新了答案,我可以确认它返回的 F 分数没有错误或警告。如果这个更新版本仍然给你一个错误,那么我相信它不可能来自代码本身。
  • @afsharov 现在可以使用了。非常感谢你:)

标签: python scikit-learn classification


【解决方案1】:

scikit-learn 实际上确实支持multiclass-multioutput 分类问题。您只需要正确的模块和分类器。你知道sklearn.multioutput 模块吗?这 MultiOutputClassifier?有了它们,您可以:

import numpy as np
from random import choices
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_validate, KFold
from sklearn.multioutput import MultiOutputClassifier

iris = datasets.load_iris()
X = iris.data[:100]
y = np.array(choices([[0, 0], [0, 1], [1, 0], [1, 1]], k=100))

clf = MultiOutputClassifier(RandomForestClassifier(random_state=42, class_weight="balanced"))
k_fold = KFold(n_splits=5, shuffle=True, random_state=42)

scores = cross_validate(clf, X, y, cv=k_fold, scoring=['f1_weighted'])

这段代码可以正常工作。

【讨论】:

  • 不,我没听说过multioutputclassifier。你知道如何用 i 进行交叉验证并得到结果吗?如果是这样,请告诉我:)
  • 刚刚用代码更新了答案。你可以试试看。
  • 请注意StratifiedKFold 不会接受多输出目标。我改用KFold。我希望它不会把事情搞砸。
  • 非常感谢。当然,我会检查代码并让你知道事情的进展。谢谢你:)
  • 您好,我现在尝试运行您的代码。但是,我仍然会收到 ValueError: multiclass-multioutput is not supported 的错误。您使用的 sklearn 版本是什么? :)
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2012-09-25
  • 2018-01-25
  • 2017-06-12
  • 2020-09-16
  • 2017-12-28
  • 2019-12-15
相关资源
最近更新 更多