【问题标题】:How to capture specific warning without raising error in python如何在不引发python错误的情况下捕获特定警告
【发布时间】:2021-06-02 07:10:54
【问题描述】:

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

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

这是我的代码的简化概述(数据不包含在它的大数据集中,我认为与问题无关)。我能找到的大多数 stackoverflow 问题都是关于如何抑制错误(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')

【问题讨论】:

  • 只需将raise 添加到您的except 块中。此外,您可能想要except Exception: 而不仅仅是一个裸露的except:
  • 谢谢。你的意思是使用“除了 ConvergenceWarning”之类的东西并使用 else: with raise 仍然会出现其他错误吗?如果是这样,增加加薪有什么好处?我同意except Exception(我现在学到的东西。)

标签: python scikit-learn convergence


【解决方案1】:

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

首先,您可以指定您要查找的异常类型,您可以指定多个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。使用此语法,您可以打印与错误相关的错误消息。

【讨论】:

  • 非常感谢您的回答和分享文档。
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 2016-05-26
  • 2017-10-29
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
相关资源
最近更新 更多