Как записать конкретное предупреждение, не вызывая ошибки в Python

Я использую разные наборы данных, чтобы определить лучший алгоритм моделирования для каждого набора данных. Я просматриваю каждый набор данных, чтобы проверить различные алгоритмы и выбрать лучшие модели на основе результатов теста. Я знаю, что некоторые из моих наборов данных не собираются сходиться для определенных моделей (например, LogisticRegression) и получают предупреждение о сходимости (например, lbfgs не удалось сойтись (status = 1) :). Я не хочу игнорировать предупреждение. Моя цель - получить оценку для моделей, которые сходятся и не возвращают никакого значения, если я получаю это предупреждение о конвергенции.

Я могу обойти это, превратив это предупреждение в ошибку с помощью warnings.filterwarnings ('error', category = ConvergenceWarning, module = 'sklearn'), а затем выполнить попытку и за исключением того, чтобы получить то, что я хочу. Проблема с этим методом заключается в том, что если есть какая-либо другая ошибка, помимо предупреждения о конвергенции sklearn, она обойдет строку try, и я не смогу узнать, что вызывает ошибку. Есть ли другой способ зафиксировать это предупреждение, кроме как превратить его в ошибку?

Вот упрощенный обзор моего кода (данные не включены как большие наборы данных, и я не думаю, что это имеет отношение к вопросу). Большинство вопросов о stackoverflow, которые мне удалось найти, касаются того, как подавить ошибку (Как сделать отключить ConvergenceWarning с помощью 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')

person Shahin Shirazi    schedule 03.03.2021    source источник
comment
Просто добавьте raise в свой except блок. Также вы, вероятно, захотите except Exception:, а не просто except:.   -  person BallpointBen    schedule 03.03.2021
comment
Спасибо. Вы хотите использовать что-то вроде, кроме ConvergenceWarning, и использовать else: with raise, чтобы по-прежнему получать другие ошибки? если да, то в чем преимущество добавления рейза? Я согласен с исключением Exception (то, что я теперь узнал).   -  person Shahin Shirazi    schedule 03.03.2021


Ответы (1)


Здесь есть пара вещей, которые могут вам помочь.

Во-первых, вы можете указать, какое исключение вы ищете, любое вы можете указать несколько предложений except. Вот пример из документации:

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. Используя этот синтаксис, вы можете распечатать сообщение об ошибке, связанное с ошибкой.

person Cargo23    schedule 03.03.2021
comment
Большое спасибо за ответ и поделились документами. - person Shahin Shirazi; 03.03.2021