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

如何在python的多类多输出分类中获得f-度量?,python,scikit-learn,classification,Python,Scikit Learn,Classification,我有一个多类多输出分类问题,我在sklearn中使用随机森林分类器来执行分类。我的代码如下 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

我有一个
多类多输出
分类问题,我在sklearn中使用
随机森林
分类器来执行分类。我的代码如下

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-度量值。我最初尝试了以下代码

scores = cross_validate(clf, X, y, cv=k_fold, scoring = ('f1_weighted'))
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'])
但是,我得到了错误
ValueError:不支持多类多输出

因此,我通过在交叉验证中手动循环折叠尝试了以下方法

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中可能还有其他方法可以做到这一点

如果需要,我很乐意提供更多细节

编辑 我尝试了以下代码

scores = cross_validate(clf, X, y, cv=k_fold, scoring = ('f1_weighted'))
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'])
但是,我得到的错误是
raisevalueerror({0}不受支持)。format(y_type))ValueError:不支持多类多输出


请告诉我解决这个问题的合适方法

scikit learn
实际上支持
多类多输出
分类问题。您只需要正确的模块和分类器。您是否知道该模块以及例如 ? 有了它们,您可以:

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

此代码可以正常工作。

不,我没有听说过
多输出分类器
。你知道如何与我进行交叉验证并得到结果吗?如果是这样,请让我知道:)刚刚用代码更新了答案。您可以尝试一下。请注意,
StratifiedKFold
不会接受多输出目标。我改用了
KFold
。我希望它不会把事情搞砸。非常感谢。当然,我会检查代码并让你知道事情的进展。谢谢:)嗨,我现在试着运行你的代码。但是,我将错误获取为ValueError:不支持多类多输出。您使用的sklearn版本是什么?:)编辑后MWE的问题是,它的标签(5)多于交叉验证的折叠(3)。这意味着您的模型必须预测它从未见过的标签。我再次相应地更新了答案,我可以确认它返回的F分数没有错误或警告。如果这个更新版本仍然给你一个错误,那么我相信它不能来自代码本身。@afsharov它现在可以工作了。非常感谢:)