Используйте ведение журнала вместе с автоматическим обучением

#python #logging #scikit-learn #auto-sklearn

Вопрос:

Я не могу понять, как использовать вход в систему в сочетании с автоматическим обучением.

Пример из документа о ведении журнала с помощью автоматического обучения приведен здесь. Чего я пытаюсь достичь, так это:

  • основной сценарий с основным регистратором,
  • функции, запускающие модели автоматического обучения вместе с разделенными журналами.

Я предпринял несколько попыток; одним из решений, которое я получил, было сначала настроить корневой регистратор (с помощью basicConfig), затем запустить модель автоматического обучения с конфигурацией (корневого) регистратора и, наконец, обновить корневой регистратор (с помощью basicConfig(force=True)). Мне это кажется не очень питоническим, но это работает.

Питоническим способом было бы использовать два именованных регистратора (я думаю). Однако, насколько мне известно, auto-sklearn не может настроить ведение журнала с помощью чего-либо, кроме словаря конфигурации. Поскольку вы не можете передать существующий регистратор в качестве аргумента, вам придется придерживаться некоторого внутреннего механизма, запускаемого конкретными именами регистраторов (имена присутствуют в файле yaml по умолчанию, но не задокументированы AFAIK).

Мой текущий код выглядит следующим образом:

 import logging
import pandas as pd
import numpy as np
from autosklearn.regression import AutoSklearnRegressor

#Basic logging config

file_handler = logging.FileHandler("main.log", mode="a", encoding="utf8")
console_handler = logging.StreamHandler()

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.addHandler(file_handler)
logger.addHandler(console_handler)

    
#Construct dummy dataframe for a short regression
df = pd.DataFrame(
    dict(x1=range(100), x2=range(50, 150), noise=np.random.normal(size=100))
    )
df['y'] = np.square(df.x1 df.noise)   df.x2


#Message is stored to main log and console
logger.info("Starting modelisation")

#Modelisation configuration with logger
logging_config = {
    "version":1,
    "disable_existing_loggers": False,
    "handlers":{
        "spec_logger":{
            'level':'INFO',
            "class":"logging.FileHandler",
            'filename':"dummy_autosklearn.log",
            },
        },
    'loggers': {
        "":{"handlers":["spec_logger"]}, # <- I'd say this is what is wrong here
        },
    }
model = AutoSklearnRegressor(
    memory_limit=None,
    time_left_for_this_task=30,
    logging_config=logging_config,
    )
model.fit(df[['x1', 'x2']], df['y'])


#Message is stored in both logs as well as in the console
logger.info("Finished !")
 

Запустив его, вы получите файл main.log с двумя инструкциями, которые также будут отображаться в консоли.

Но поскольку auto-sklearn запускается с конфигурацией корневого регистратора, оператор «Готово» также будет присутствовать в файле dummy_autosklearn.log.

Как я мог бы легко настроить автоматическое обучение ? (Я имею в виду, что я только перескакиваю, чтобы перенаправить подробный контент, отображаемый auto-sklearn, на случай, если он мне понадобится в будущем…).

Комментарии:

1. Здесь приведен пример того, как вы должны обрабатывать ведение журнала с помощью autosklearn. Я все еще не думаю, что этого достаточно, так как библиотека создает несколько регистраторов и перенаправляет их на корневой регистратор.

Ответ №1:

Так autosklearn , кажется, не позволят вам не настроить ведение журнала на всех (это плохая практика для библиотеки, чтобы настроить ведение журнала — но если вы пройдете None , то будете использовать внутренний файле YAML для настройки ведения журнала) так что я предлагаю тебе пройти в конфигурации, которая включает в себя все — что-то вроде этого и не делать никаких настроек, кроме как через autosklearn себя. Вы можете использовать конфигурацию из этого примера скрипта:

 import logging
import logging.config

logging_config = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '%(levelname)-8s %(name)-15s %(message)s'
        }
    },
    'handlers':{
        'console_handler': {
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file_handler': {
            'class':'logging.FileHandler',
            'mode': 'a',
            'encoding': 'utf-8',
            'filename':'main.log',
            'formatter': 'simple'
        },
        'spec_handler':{
            'class':'logging.FileHandler',
            'filename':'dummy_autosklearn.log',
            'formatter': 'simple'
        },
    },
    'loggers': {
        '': {
            'level': 'INFO',
            'handlers':['file_handler', 'console_handler']
        },
        'autosklearn': {
            'level': 'INFO',
            'propagate': False,
            'handlers': ['spec_handler']
        },
        'smac': {
            'level': 'INFO',
            'propagate': False,
            'handlers': ['spec_handler']
        },
        'EnsembleBuilder': {
            'level': 'INFO',
            'propagate': False,
            'handlers': ['spec_handler']
        },
    },
}

logging.config.dictConfig(logging_config)
for name in (__name__, 'autosklearn', 'smac', 'EnsembleBuilder'):
    logger = logging.getLogger(name)
    logger.debug('DEBUG')
    logger.info('INFO')
    logger.warning('WARNING')
    logger.error('ERROR')
    logger.critical('CRITICAL')
 

Обратите внимание , что он также настраивает ваш основной модуль autosklearn , но вы не выполняете никакой другой конфигурации ведения журнала, кроме передачи этой конфигурации. Вы должны получить те же результаты, что и при выполнении описанного выше:

Консоль должна показывать

 INFO     __main__        INFO
WARNING  __main__        WARNING
ERROR    __main__        ERROR
CRITICAL __main__        CRITICAL
 

main.log должен иметь то же самое:

 INFO     __main__        INFO
WARNING  __main__        WARNING
ERROR    __main__        ERROR
CRITICAL __main__        CRITICAL
 

Другой файл журнала должен иметь

 INFO     autosklearn     INFO
WARNING  autosklearn     WARNING
ERROR    autosklearn     ERROR
CRITICAL autosklearn     CRITICAL
INFO     smac            INFO
WARNING  smac            WARNING
ERROR    smac            ERROR
CRITICAL smac            CRITICAL
INFO     EnsembleBuilder INFO
WARNING  EnsembleBuilder WARNING
ERROR    EnsembleBuilder ERROR
CRITICAL EnsembleBuilder CRITICAL
 

Основные моменты:

  • Убедитесь, что уровни установлены на регистраторах, так как они проверяются в первую очередь. Уровни могут быть установлены на обработчиках, но они проверяются только в том случае, если регистратор передает им сообщение
  • Установите propagate False значение, чтобы autosklearn сообщения не попадали на консоль или main.log

Комментарии:

1. Извините, что так долго не проверял это. Я попробовал ваше предложение, но оно, похоже, работает не так, как планировалось. Autosclearn, похоже, создает больше регистраторов, чем указано в файле yaml (включая регистраторы со случайными частями в их названии), которые попадают в корневой регистратор. Я не могу найти «чистый» способ удалить их, кроме настройки/восстановления корневого регистратора до/после использования autosklearn.