sklearn пользовательский бомбардировщик несколько показателей одновременно

У меня есть функция, которая возвращает Observation объект с несколькими счетчиками Как я могу интегрировать его в пользовательский счетчик sklearn? Я определил это как:

class Observation():
    def __init__(self):
        self.statValues = {}
        self.modelName = ""

    def setModelName(self, nameOfModel):
        self.modelName = nameOfModel

    def addStatMetric(self, metricName,metricValue):
        self.statValues[metricName] = metricValue

Пользовательский счет определяется как:

def myAllScore(y_true, y_predicted):
    return Observation
my_scorer = make_scorer(myAllScore)

который может выглядеть как

{   'AUC_R': 0.6892943119440752,
    'Accuracy': 0.9815382629183745,
    'Error rate': 0.018461737081625407,
    'False negative rate': 0.6211453744493393,
    'False positive rate': 0.0002660016625103907,
    'Lift value': 33.346741089307166,
    'Precision J': 0.9772727272727273,
    'Precision N': 0.9815872808592603,
    'Rate of negative predictions': 0.0293063938288739,
    'Rate of positive predictions': 0.011361068973307943,
    'Sensitivity (true positives rate)': 0.3788546255506608,
    'Specificity (true negatives rate)': 0.9997339983374897,
    'f1_R': 0.9905775376404309,
    'kappa': 0.5384745595159575}

2 ответа

Решение

Короче говоря, вы не можете.

Длинная версия: бомбардир должен возвращать один скаляр, так как это то, что можно использовать для выбора модели и, в общем, для сравнения объектов. Поскольку не существует такого понятия, как полное упорядочение по векторным пространствам - вы не можете вернуть вектор внутри счетчика (или словаря, но с математической точки зрения его можно рассматривать как вектор). Кроме того, даже другие варианты использования, такие как перекрестная проверка, не поддерживают произвольные структурированные объекты в качестве возвращаемого значения, поскольку они пытаются вызвать np.mean над списком значений, и эта операция не определена для списка словарей Python (который возвращает ваш метод).

Единственное, что вы можете сделать, - это создать отдельного счетчика для каждой из имеющихся у вас метрик и использовать их независимо.

На самом деле это возможно, как описано в этом разделе: multiscorer.

Для полноты вот пример:

from multiscorer.multiscorer import MultiScorer

#Scikit's libraries for demonstration
from sklearn.metrics import accuracy_score, precision_score
from sklearn.model_selection import cross_val_score
from numpy import average

scorer = MultiScorer({
  'accuracy': (accuracy_score, {}),
  'precision': (precision_score, {'average': 'macro'})
})

...

cross_val_score(clf, X, target, scoring=scorer )

results = scorer.get_results()

for metric in results.keys():
  print("%s: %.3f" % (metric, average(results[metric])))
Другие вопросы по тегам