#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.