2016-10-23 2 views
0

У меня есть функция, которая возвращает объект Observation с кратным бомбардиры Как я могу интегрировать его в пользовательском sklearn бомбардир? я определил это как: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 (что ваш метод возвращается).

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

+0

Я понимаю. Но можно ли походить на http://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html, чтобы получить несколько баллов за один проход? –

+0

вы уже реализовали это, поэтому я не понимаю ваш вопрос. class_report не является бомбардиром, вы не можете использовать его в контексте счетчика. – lejlot

+0

Исправить. Я вручную выполнил тест на поезд для цикла. Howeve, r, как я хочу попробовать укладывать и смешивать (https://github.com/rushter/heamy), я начал переходить к конвейеру sklearn, который прекрасно интегрируется с функциями счетчика. –

1

На самом деле это возможно, как описано в этой вилке: 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]))) 
Смежные вопросы