def leave_one_out_report(combined_results):
""" Evaluate leave-one-out CV results from different methods.
Arguments:
combined_results: list of tuples of the form
(method_name, true_y_vector, predicted_probabilities_vector)
Note the vectors really do need to be numpy arrays.
Returns: formatted report as string
"""
###
# Unfortunate code duplication with tabulate_metrics here,
# to be resolved later
probability_metrics = [
('AUC', roc_auc_score),
('AP', metrics.average_precision_score)
]
binary_metrics = [
('F1', metrics.f1_score),
('MCC', metrics.matthews_corrcoef),
('precision', metrics.precision_score),
('recall', metrics.recall_score)
]
metric_results = {label: [] for label, _ in
probability_metrics + binary_metrics}
metric_results.update({'tn': [], 'fp': [], 'fn': [], 'tp': []})
for label, metric in probability_metrics:
for fold, y_true, y_pred in combined_results:
metric_results[label].append(metric(y_true, y_pred))
for method, y_true, probabilities in combined_results:
y_pred = probabilities > 0.5
for label, metric in binary_metrics:
metric_results[label].append(metric(y_true, y_pred))
conf = zip(
('tn', 'fp', 'fn', 'tp'),
metrics.confusion_matrix(y_true, y_pred).flat
)
for label, n in conf:
metric_results[label].append(n)
index=[t[0] for t in combined_results]
table = pd.DataFrame(data=metric_results,
index=index)
report = table.to_string(float_format=lambda x: '%.3g' % x)
return report
评论列表
文章目录