如何在 python 的多类多输出分类中获得 f-measure?

How to get f-measure in multiclass-multioutput classification in python?

我有一个 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

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

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'])

这段代码可以正常工作。