我目前正在尝试从Python中提取H2O中的模型结果信息。
对于上下文,我有以下几点:
model = H2ODeepLearningEstimator(...)
model.train()
模型训练完成后,我可以调出各种模型指标。但是,某些指标只会根据模型的类型生成。
例如,我可以调用model.mse(valid=True)
并返回一个值。但如果我调用model.aic(valid=True)
,如果没有生成AIC,它将抛出异常。这是一个问题,因为我需要生成一个函数,将所有生成的指标写入HIVE表。如果尚未生成度量并调用它会抛出一个except,我们只需将NULL写入hive。
所以,我试图做以下事情:
param=None
try:
param=tryParam(model.aic())
except:
pass
print(param)
这将正确返回None
的AIC值
但是,我需要为每个参数执行此操作,因此更喜欢围绕它包装泛型函数。例如,我想将函数model.aic()
作为参数传递给名为tryParam
的函数,该函数然后对其进行评估并捕获发生的任何预期。如:
def tryParam(getParam):
try:
return getParam
except:
return None
tryParam(model.aic())
tryParam(model.mse())
tryParam(model.mae())
etc.
然而,这不起作用。当我调用tryParam(model.aic())
时,会引发异常并且程序停止。在我看来,参数在传递给tryParam
之前正在进行评估(因此在实际调用处理它的代码之前触发异常)。这只是猜测。
有谁知道我怎么能这样做?
答案 0 :(得分:3)
调用tryParam
内的函数,传递任何args或kwargs。
def tryParam(getParam, *args, **kwargs):
try:
return getParam(*args, **kwargs)
except:
return None
然后传递函数本身而不是调用它,以及任何args或kwargs。
tryParam(model.aic, valid=True)
答案 1 :(得分:0)
我会尝试这样做:
def tryParam(obj, methodName):
method = getattr(obj, methodName, None)
if method is not None:
return method()
然后我可以使用:
model = H2ODeepLearningEstimator(...)
model.train()
aic = tryParam(model, 'aic')
mse = tryParam(model, 'mse')
mae = tryParam(model, 'mae')