我有一个包含特征数组 (X) 和因变量数组 (y) 的多类分类问题。 y 有四个类:1、2、3 和 4。数据严重不平衡,第 4 类只有少数观察结果。我选择的分类器模型为:
model = RandomForestClassifier(n_estimators=10, class_weight='balanced', random_state=0)
我将自定义记分器定义为:
custom_scorer = {'accuracy': make_scorer(accuracy_score),
'balanced_accuracy': make_scorer(balanced_accuracy_score),
'precision': make_scorer(precision_score, average='weighted'),
'recall': make_scorer(recall_score, average='weighted'),
'roc auc': make_scorer(roc_auc_score, multi_class='ovo', needs_proba=True),
'f1': make_scorer(f1_score, average='weighted')
}
由于数据不平衡,我使用cross_validate:
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_validate(model, X, y, cv=cv, scoring=custom_scorer, n_jobs=-1)
来自scores
我得到了指标准确度、平衡准确度、精度、召回率等。但是,这只给我指标,而不是包含预测类的数组。我想要得到y_pred
(y 的预测值)也可能是在执行以下代码行时在内部生成的:
scores = cross_validate(model, X, y, cv=cv, scoring=custom_scorer, n_jobs=-1)
但是,为了获得 y 的预测,我使用:
y_pred = cross_val_predict(model, X, y, cv=cv)
这给了我一个错误:
ValueError:cross_val_predict仅适用于分区
如果我将上面的代码更改为
y_pred = cross_val_predict(model, X, y, cv=10)
那么我可以避免该错误,但是 cv=cv 和 cv=10 不是同一件事,是吗?如果我使用以下方法计算对应于每个类别的精度、召回率等:
precision, recall, fscore, support = score(y, y_pred)
那些不能对应于scores我计算使用交叉验证.
我还需要为 y 计算的概率值。
y_proba = cross_val_predict(model, X, y, cv=cv, method='predict_proba')
这也给了我一个错误
ValueError:cross_val_predict仅适用于分区
请帮忙。