如何在不引发python错误的情况下捕获特定警告

问题描述

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

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

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

  from sklearn.linear_model import LogisticRegression
  from sklearn.exceptions import ConvergenceWarning
  warnings.filterwarnings('error',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。使用此语法,您可以打印与错误相关的错误消息。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...