2015-06-06 4 views
6

Есть ли простой способ перекрестного проверки классификатора и вычисления точности и отзыва сразу? В настоящее время я использую функциюПерекрестная проверка точности, отзыв и f1 вместе с sklearn

cross_validation.cross_val_score(classifier, designMatrix, classes, cv=5, scoring="precision") 

однако он вычисляет только одну метрику, так что я должен назвать его 2 раза, чтобы вычислить точность и вспомнить. С большой моделью ML расчет затем излишне занимает 2 раза дольше. Есть ли встроенный лучший вариант, или мне нужно выполнить перекрестную проверку самостоятельно? Благодарю.

+0

Об этом также говорится в [github] (https://github.com/scikit-learn/scikit-learn/issues/1837). Появляется [merge] (https://github.com/scikit-learn/scikit-learn/pull/7388), в котором основное внимание уделяется этой проблеме. – Nash

ответ

1

Я уверен в текущем состоянии дел (эта функция уже обсуждалась), но вы всегда можете уйти со следующим - ужасно - взломать

from sklearn.metrics import recall_score, precision_score 
from sklearn.metrics.scorer import make_scorer 
recall_accumulator = [] 
def score_func(y_true, y_pred, **kwargs): 
    recall_accumulator.append(recall_score(y_true, y_pred, **kwargs)) 
    return precision_score(y_true, y_pred, **kwargs) 
scorer = make_scorer(score_func) 

Затем используйте scoring=scorer в вашей перекрестной проверки. Вы должны найти значения возврата в массиве recall_accumulator. Однако обратите внимание, что этот массив является глобальным, поэтому убедитесь, что вы не пишете его так, как вы не можете интерпретировать результаты.

1

ответ eickenberg работает, когда аргумент n_job из cross_val_score() устанавливается в 1. Для поддержки параллельных вычислений (n_jobs> 1), один должен использовать общий список вместо глобального списка. Это можно сделать с помощью Менеджер класс от многопроцессорный модуль.

from sklearn.metrics import precision_recall_fscore_support 
from sklearn.metrics.scorer import make_scorer 
from multiprocessing import Manager 

recall_accumulator = Manager().list() 
def score_func(y_true, y_pred, **kwargs): 
    recall_accumulator.append(precision_recall_fscore_support(y_true, y_pred)) 
    return 0 
scorer = make_scorer(score_func) 

Тогда результат каждой складки будут сохранены в recall_accumulator.

Смежные вопросы