3 回答
TA贡献1848条经验 获得超6个赞
您可以使用类装饰器来生成度量标准方法的列表。这样做的好处是,您可以在类定义时生成度量标准方法的列表,而不是每次
printResults
调用时都重新生成该列表。另一个优点是您不必手动维护
ClassificationResults.metrics
列表。您无需在两个位置上拼写方法的名称,因此它是DRY-er,而且,如果您添加了另一个指标,则不必记住也要更新ClassificationResults.metrics
。您只需要给它一个以开头的名称即可metrics_
。由于每种度量方法都返回一个相似的对象,因此您可以考虑将该概念形式化为类(例如
Metric
,下面的)。这样做的一个好处是您可以定义一种__repr__
方法来处理结果的打印方式。注意printResults
(下面)变得多么简单。
def register_metrics(cls):
for methodname in dir(cls):
if methodname.startswith('metric_'):
method = getattr(cls, methodname)
cls.metrics.append(method)
return cls
class Metric(object):
def __init__(self, pos, total):
self.pos = pos
self.total = total
def __repr__(self):
msg = "{p} instances labelled positive. {t} of them correct (recall={d:.2g})"
dec = self.pos / float(self.total)
return msg.format(p=self.total, t=self.pos, d=dec)
@register_metrics
class ClassificationResults(object):
metrics = []
def metric_recall(self):
tpos, pos = 1, 2
return Metric(tpos, pos)
def metric_precision(self):
tpos, true = 3, 4
return Metric(tpos, true)
def printResults(self):
for method in self.metrics:
print(method(self))
foo = ClassificationResults()
foo.printResults()
添加回答
举报