一次sklearn自定义记分器多个指标
sklearn custom scorer multiple metrics at once
我有一个函数,其中 returns 一个 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}
简而言之:你不能。
长版本:记分器 必须 return 一个标量,因为它可以用于模型选择,并且通常 - 比较对象。由于不存在向量空间的完整排序之类的东西 - 你不能 return 记分器(或字典,但从数学角度来看它可能被视为向量)内的向量。此外,即使是其他用例,例如进行交叉验证,也不支持将任意结构化对象作为 return 值,因为它们会尝试在值列表上调用 np.mean
,并且此操作未针对python 词典列表(您的方法 returns)。
您唯一能做的就是为您拥有的每个指标创建单独的记分器,并独立使用它们。
事实上这是可能的,正如这个 fork 中所描述的: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])))
我有一个函数,其中 returns 一个 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}
简而言之:你不能。
长版本:记分器 必须 return 一个标量,因为它可以用于模型选择,并且通常 - 比较对象。由于不存在向量空间的完整排序之类的东西 - 你不能 return 记分器(或字典,但从数学角度来看它可能被视为向量)内的向量。此外,即使是其他用例,例如进行交叉验证,也不支持将任意结构化对象作为 return 值,因为它们会尝试在值列表上调用 np.mean
,并且此操作未针对python 词典列表(您的方法 returns)。
您唯一能做的就是为您拥有的每个指标创建单独的记分器,并独立使用它们。
事实上这是可能的,正如这个 fork 中所描述的: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])))