我有一个不平衡的数据集,其中包含二进制分类问题。我已经建立了随机的森林分类器,并使用了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值,其中值 - 您指定的公制名称之一。
您提到的所有分数 - accuracy
, precision
, recall
和 f1
-依靠您(手动)设置的阈值来预测类。如果您没有指定阈值,则默认阈值为0.5,请参见此处。阈值应始终根据错误分类的成本设置。如果没有成本,您应该做一个假设。
为了能够比较不同的模型或超参数,您可以考虑使用曲线下的区域(AUC)进行精确召回曲线,因为它通过显示不同阈值的精度和召回来独立于阈值。在您的特定情况下,PR-AUC比ROC的AUC更合适,请参见此处。
另请参阅此处:https://datascience.stackexchange.com/a/96708/131238