如何计算不平衡数据集的精度,召回和F1分数用于K折叠验证



我有一个不平衡的数据集,其中包含二进制分类问题。我已经建立了随机的森林分类器,并使用了10倍的K折交叉验证。

kfold = model_selection.KFold(n_splits=10, random_state=42)
model=RandomForestClassifier(n_estimators=50) 

我得到了10倍的结果

results = model_selection.cross_val_score(model,features,labels, cv=kfold)
print results
[ 0.60666667  0.60333333  0.52333333  0.73        0.75333333  0.72        0.7
  0.73        0.83666667  0.88666667]

我通过采取均值和标准偏差来计算了准确性

print("Accuracy: %.3f%% (%.3f%%)") % (results.mean()*100.0, results.std()*100.0)
Accuracy: 70.900% (10.345%)

我已经计算了我的预测如下

predictions = cross_val_predict(model, features,labels ,cv=10)

由于这是一个不平衡的数据集,所以我想计算每个折叠的精度,召回和F1分数,并平均结果。如何计算Python中的值?

当您使用 cross_val_score方法时,可以指定,哪些得分可以在每个折叠上计算:

from sklearn.metrics import make_scorer, accuracy_score, precision_score, recall_score, f1_score
scoring = {'accuracy' : make_scorer(accuracy_score), 
           'precision' : make_scorer(precision_score),
           'recall' : make_scorer(recall_score), 
           'f1_score' : make_scorer(f1_score)}
kfold = model_selection.KFold(n_splits=10, random_state=42)
model=RandomForestClassifier(n_estimators=50) 
results = model_selection.cross_val_score(estimator=model,
                                          X=features,
                                          y=labels,
                                          cv=kfold,
                                          scoring=scoring)

在交叉验证后,您将获得键的results字典:"精度"," precision","召回','f1_score',它将指标值存储在每个折叠上以获取某些指标。对于每个度量标准,您可以使用np.mean(results[value])np.std(results[value])来计算平均值和STD值,其中值 - 您指定的公制名称之一。

您提到的所有分数 - accuracyprecisionrecallf1-依靠您(手动)设置的阈值来预测类。如果您没有指定阈值,则默认阈值为0.5,请参见此处。阈值应始终根据错误分类的成本设置。如果没有成本,您应该做一个假设。

为了能够比较不同的模型或超参数,您可以考虑使用曲线下的区域(AUC)进行精确召回曲线,因为它通过显示不同阈值的精度和召回来独立于阈值。在您的特定情况下,PR-AUC比ROC的AUC更合适,请参见此处。

另请参阅此处:https://datascience.stackexchange.com/a/96708/131238

最新更新