【发布时间】: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