Ранняя остановка в машинном обучении

PythonPythonBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь реализовывать технику ранней остановки в моделях машинного обучения. Ранняя остановка - это мощный метод предотвращения переобучения и улучшения производительности ваших моделей.

🎯 Задачи

В этом проекте вы научитесь:

  • понять концепцию ранней остановки и ее основные этапы
  • реализовать функцию ранней остановки для определения оптимального эпохи остановки
  • протестировать функцию ранней остановки на выборочном наборе данных

🏆 Достижения

После завершения этого проекта вы сможете:

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

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/DataScienceandMachineLearningGroup(["Data Science and Machine Learning"]) python/BasicConceptsGroup -.-> python/variables_data_types("Variables and Data Types") python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/DataStructuresGroup -.-> python/lists("Lists") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/DataScienceandMachineLearningGroup -.-> python/machine_learning("Machine Learning") subgraph Lab Skills python/variables_data_types -.-> lab-300214{{"Ранняя остановка в машинном обучении"}} python/conditional_statements -.-> lab-300214{{"Ранняя остановка в машинном обучении"}} python/lists -.-> lab-300214{{"Ранняя остановка в машинном обучении"}} python/function_definition -.-> lab-300214{{"Ранняя остановка в машинном обучении"}} python/machine_learning -.-> lab-300214{{"Ранняя остановка в машинном обучении"}} end

Разберитесь с концепцией ранней остановки и реализуйте функцию

В этом шаге вы сначала изучите концепцию ранней остановки и ее основные этапы.

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

  1. Разделите исходный тренировочный набор данных на тренировочный и валидационный наборы.
  2. Обучайте модель только на тренировочном наборе и вычисляйте ошибку модели на валидационном наборе в конце каждой эпохи.
  3. Сравните ошибку модели на валидационном наборе с историей обучения. Остановите обучение, когда сравнение соответствует критерию остановки.
  4. Используйте параметры из последней итерации в качестве окончательных параметров для модели.

Существует множество различных критериев остановки, и они могут быть довольно гибкими. Одним из часто используемых критериев является мониторинг значения потери на валидационном наборе. Когда значение потери не было дальней оптимизировано в течение n последовательных эпох (всегда больше минимальной потери), обучение останавливается.

Теперь вы реализуете функцию early_stop в файле early_stop.py.

Функция проверяет значения потерь по эпохам. Если потеря не улучшается (не уменьшается) в течение нескольких эпох, равных patience, рекомендуется остановить обучение.

Вот код функции early_stop:

def early_stop(loss: List[float], patience: int) -> Tuple[int, float]:
    """
    Определяет эпоху, на которой следует остановить обучение, на основе предоставленных значений потерь и терпения.

    Функция проверяет значения потерь по эпохам. Если потеря не улучшается (не уменьшается) в течение
    нескольких эпох, равных `patience`, рекомендуется остановить обучение.

    Параметры:
    - loss (List[float]): Список значений потерь, обычно в том порядке, в котором они были записаны во время обучения.
    - patience (int): Количество эпох без улучшения потерь, после которых обучение должно быть остановлено.

    Возвращает:
    - Tuple[int, float]: Кортеж, содержащий два значения:
        1. Номер эпохи, на которой следует остановить обучение (индексирование с 1).
        2. Минимальное значение потерь, записанное до этого момента.
    """

    min_loss = np.Inf
    max_patience = 0
    stop_epoch = 0
    for epoch, current_loss in enumerate(loss):
        if current_loss < min_loss:
            min_loss = current_loss
            stop_epoch = epoch
            max_patience = 0
        else:
            max_patience += 1
        if max_patience == patience:
            break
    stop_epoch += 1
    return stop_epoch, min_loss

В функции early_stop вы реализуете логику для определения эпохи, на которой следует остановить обучение, на основе предоставленных значений потерь и параметра patience.

Функция должна вернуть кортеж, содержащий два значения:

  1. Номер эпохи, на которой следует остановить обучение (индексирование с 1).
  2. Минимальное значение потерь, записанное до этого момента.
✨ Проверить решение и практиковаться

Протестируйте функцию ранней остановки

В этом шаге вы протестируете функцию early_stop, запустив файл early_stop.py.

Добавьте следующий код в файл early_stop.py:

if __name__ == "__main__":
    loss = [
        1.11,
        1.01,
        0.99,
        0.89,
        0.77,
        0.69,
        0.57,
        0.44,
        0.51,
        0.43,
        0.55,
        0.61,
        0.77,
        0.89,
        0.78,
    ]
    patience = 3
    stop_epoch, min_loss = early_stop(loss, patience)
    print(f"{stop_epoch=}, {min_loss=}")

Затем запустите скрипт из терминала:

python early_stop.py

Вывод должен быть таким:

stop_epoch = 10, loss = 0.43

Это означает, что обучение должно быть остановлено на эпохе 10, и минимальное значение потерь, записанное до этого момента, равно 0.43.

Поздравляем! Вы успешно реализовали функцию ранней остановки. Теперь вы можете использовать эту функцию в своих проектах машинного обучения, чтобы предотвратить переобучение и улучшить производительность ваших моделей.

✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.