如何在 python 中捕获特定警告而不引发错误

How to capture specific warning without raising error in python

我正在 运行 不同的数据集,以确定每个数据集的最佳建模算法。我遍历每个数据集以检查各种算法和 select 基于测试分数的最佳模型。我知道我的一些数据集不会针对特定模型收敛(即:LogisticRegression) 并获得收敛警告(即:“lbfgs 收敛失败(状态=1):”)。我不想忽略警告。我的目标是 return 为收敛的模型打分,如果我收到此收敛警告则不会 return 任何值。

我可以通过使用“warnings.filterwarnings('error',category=ConvergenceWarning,module='sklearn')”将此警告变成错误来解决这个问题,然后尝试除了得到我想要的。这种方法的问题是,如果除了 sklearn convergance 警告之外还有任何其他错误,它将绕过 try 行,我将无法知道导致错误的原因。除了将其变为错误之外,还有其他方法可以捕获此警告吗?

这是我的代码的简化概述(数据未作为大数据集包含在内,我认为与问题无关)。我能够找到的大多数 Whosebug 问题都是关于如何抑制错误 (How to disable ConvergenceWarning using sklearn?) 或将此警告变成错误的,我没有找到任何其他方法来捕获警告而不将其变成错误。

  from sklearn.linear_model import LogisticRegression
  from sklearn.exceptions import ConvergenceWarning
  warnings.filterwarnings('error',category=ConvergenceWarning, module='sklearn')
  try:
      model=LogisticRegression().fit(x_train,y_train)
      predict=model.predict(x_test)
  except:
      print('model didnt converge')

这里有几件事可以帮助您。

首先,您可以指定要查找的异常类型,您可以指定多个 except 子句。这是来自 the docs 的示例:

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

上面要注意的另一件事是except OSError as err。使用此语法,您可以打印与错误关联的错误消息。