【发布时间】:2014-06-13 21:46:15
【问题描述】:
我想计算不同分类器的交叉验证测试的 recall、precision 和 f-measure。 scikit-learn 带有 cross_val_score 但不幸的是这种方法不会返回多个值。
我可以通过调用 3 次 cross_val_score 来计算此类度量,但这并不高效。有没有更好的解决方案?
现在我写了这个函数:
from sklearn import metrics
def mean_scores(X, y, clf, skf):
cm = np.zeros(len(np.unique(y)) ** 2)
for i, (train, test) in enumerate(skf):
clf.fit(X[train], y[train])
y_pred = clf.predict(X[test])
cm += metrics.confusion_matrix(y[test], y_pred).flatten()
return compute_measures(*cm / skf.n_folds)
def compute_measures(tp, fp, fn, tn):
"""Computes effectiveness measures given a confusion matrix."""
specificity = tn / (tn + fp)
sensitivity = tp / (tp + fn)
fmeasure = 2 * (specificity * sensitivity) / (specificity + sensitivity)
return sensitivity, specificity, fmeasure
它基本上总结了混淆矩阵的值,一旦你有 false positive、false positive 等,你可以轻松计算召回率、精度等......但我仍然不喜欢这个解决方案:)
【问题讨论】:
-
使用
classification_report有什么问题?见scikit-learn.org/stable/modules/generated/… -
你基本上已经吸取了
cross_val_score的精髓,并根据你的情况进行了改编。这似乎是一个完全可行的选择,我不知道如何做得更好。如果您想修改 sklearn 代码,请参阅我对问题的解释和解决方法的回答。 -
@EdChum 这不做任何交叉验证。您可以根据单个预训练阶段来衡量模型的性能。
-
调用
cross_val_score3 次不是一个好主意。您必须小心使用相同的测试/训练集。 -
@Dror 是的,你是对的,我当时看错了问题
标签: python numpy scikit-learn