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}

总之:你不能。

长版本:scorer 必须返回单个标量,因为它可以用于模型选择,并且通常用于比较对象。由于在向量空间上不存在完整的排序——您不能在score(或字典)中返回向量,但从数学角度来看,它可能被视为一个向量。此外,即使是其他用例,如交叉验证,也不支持任意结构化对象作为返回值,因为它们试图在值列表上调用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])))

相关内容

  • 没有找到相关文章

最新更新