Углубление в методы регуляризации L1 и L2 в машинном обучении, чтобы объяснить, почему они важны для предотвращения переобучения модели

Машинное обучение — это дисциплина, которая переживает огромное развитие в технологической и промышленной областях.

Благодаря его алгоритмам и методам моделирования можно создавать модели, способные учиться на прошлых данных, обобщать и делать прогнозы на основе новых данных.

Однако в некоторых случаях модели могут превосходить обучающие данные и терять способность к обобщению. Это явление называется переобучение.

Для аналитиков очень важно понять, что такое переобучение и почему оно представляет собой одно из основных препятствий в машинном обучении, когда речь идет о создании прогностической модели.

Общая идея переобучения такова:

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

Хотите узнать больше о переобучении? Прочитайте статью под названием Преодолейте самое большое препятствие в машинном обучении: переобучение, опубликованную на TDS.

Для предотвращения переобучения можно использовать методы регуляризации.

Термин регуляризация включает набор методов, направленных на упрощение модели прогнозирования. В этой статье мы сосредоточимся на двух методах регуляризации, L1 и L2, объясним их различия и покажем, как их применять в Python.

Что такое регуляризация и почему она важна?

Проще говоря, регуляризация модели означает изменение ее поведения при обучении на этапе обучения.

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

Чтобы добавить регуляризацию L1 или L2, мы собираемся изменить функцию потерь модели. Это функция, которую алгоритм обучения пытается оптимизировать на этапе обучения.

Регуляризация происходит путем назначения штрафа, который увеличивается в зависимости от того, насколько сложной становится модель.

Если мы возьмем линейную регрессию в качестве примера, MSE (среднеквадратичная ошибка — подробнее о показателях оценки регрессионной модели читайте здесь) является типичной функцией потерь и может быть выражена как

Где цель алгоритма — минимизировать разницу между предсказанием f(x) и наблюдаемым y.

В уравнении f(x) — это линия регрессии, и она будет равна

Следовательно, алгоритм должен найти значения параметров w и b из обучающего набора, минимизируя MSE.

Модель считается менее сложной, если некоторые параметры w близки или равны нулю.

Регуляризация L1 и L2

Теперь давайте посмотрим на различия между регуляризацией L1 и L2.

Регуляризация L1

Регуляризация L1, также известная как "лассо", добавляет штраф к сумме абсолютных значений весов модели.

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

Это делает L1 особенно полезным для задач выбора признаков и разреженных моделей.

Взяв приведенную выше формулу MSE в качестве примера, регуляризация L1 будет выглядеть так:

где C — это гиперпараметр модели, управляющий интенсивностью регуляризации. Чем выше значение C, тем больше наши веса будут стремиться к нулю. .

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

Риск здесь заключается в том, что очень высокое значение C приведет к недостаточной подгонке модели, что противоположно переподгонке, т. е. она не будет отображать закономерности в наших данных. .

Регуляризация L2

С другой стороны, регуляризация L2, также называемая регуляризацией Риджа, добавляет квадрат весов к члену регуляризации.

Это означает, что большие веса уменьшаются, но не обнуляются, что приводит к моделям с меньшим количеством переменных, чем регуляризация L1, но с более распределенными весами.

Регуляризация L2 особенно полезна, когда у вас много сильно коррелированных переменных, поскольку она имеет тенденцию «распределять» вес по всем переменным, а не фокусироваться только на некоторых из них.

Как и прежде, посмотрим, как изменится исходное уравнение при интегрировании L2

Регуляризация L2 может улучшить стабильность модели, когда обучающие данные зашумлены или неполны, за счет уменьшения влияния выбросов или шума на переменные.

Как применить регуляризацию в Sklearn и Python

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

Мы увидим, как меняется производительность при разных значениях C, и сравним, насколько точна модель при моделировании входных данных.

Мы будем использовать знаменитый набор данных по раку молочной железы от Sklearn. Давайте начнем с того, как импортировать его вместе со всеми библиотеками.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# import the dataset from sklearn
breast_cancer = load_breast_cancer()

# we create a variable "data" which contains the dataframe from the dataset
data = pd.DataFrame(data=breast_cancer['data'], columns=breast_cancer['feature_names'])
data['target'] = pd.Series(breast_cancer['target'], dtype='category')

Будучи проблемой классификации, мы будем использовать точность для измерения производительности модели. Прочтите одну из моих статей о том, как измерить производительность моделей бинарной классификации, если вам интересно узнать больше.

Теперь давайте создадим функцию для применения сравнения регуляризации L1 и L2 к фрейму данных.

def plot_regularization(df, reg_type='l1'):
 # we split our data into training and testing
    X = df.drop('target', axis=1)
    y = df['target']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

 # we define the different values of C
    Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]
    coefs = []
    test_scores = []
    train_scores = []
    for C in Cs:
     # we train the model for the different values of C
        clf = LogisticRegression(penalty=reg_type, C=C, solver='liblinear')
        clf.fit(X_train, y_train)
        # we save the performances
        coefs.append(clf.coef_.ravel())
        train_scores.append(clf.score(X_train, y_train))
        test_scores.append(clf.score(X_test, y_test))

    reg = reg_type.capitalize()
    
    # and create some charts
    fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 4))
    ax1.plot(Cs, train_scores, 'b-o', label='Training Set')
    ax1.plot(Cs, test_scores, 'r-o', label='Test Set')
    plt.suptitle(f'{reg} regularization')
    ax1.set_xlabel('C')
    ax1.set_ylabel('Accuracy')
    ax1.set_xscale('log')
    ax1.set_title('Performance')
    ax1.legend()

    coefs = np.array(coefs)
    n_params = coefs.shape[1]
    for i in range(n_params):
        ax2.plot(Cs, coefs[:, i], label=X.columns[i])
    ax2.axhline(y=0, linestyle='--', color='black', linewidth=2)
    ax2.set_xlabel('C')
    ax2.set_ylabel('Coefficient values')
    ax2.set_xscale('log')
    ax2.set_title('Coefficients')
    plt.show()

Мы применяем эту логику, рассматривая регуляризацию L1

plot_regularization(data, 'l1')

Мы видим, как регуляризация L1 сглаживает коэффициенты модели, близкие к нулю, для многих уровней C. Коэффициенты с самыми высокими значениями, согласно модели, являются наиболее важными характеристиками для прогноза.

Мы также видим начало переобучения — при C=100 производительность тренировочной выборки увеличивается, а производительность тестовой выборки снижается.

Теперь мы применим ту же функцию для оценки эффектов L2.

plot_regularization(data, 'l2')

Коэффициенты всегда выше нуля, таким образом создается распределение с постепенно увеличивающимся весом для наиболее релевантных функций. Мы отмечаем очень небольшое переоснащение после значения C=100.

Другие методы регуляризации

В дополнение к регуляризации L1 и L2 существуют другие методы регуляризации, которые можно использовать в моделях машинного обучения. Среди этих методов мы находим отсев и раннюю остановку.

Выбывать

Dropout — это метод, используемый в нейронных сетях для уменьшения переобучения. Dropout работает путем случайного отключения некоторых нейронов на этапе обучения, заставляя нейронную сеть искать альтернативные способы представления данных.

Ранняя остановка

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

Хотите узнать больше о ранней остановке? Прочтите статью под названием Ранняя остановка в TensorFlow — предотвращение переобучения нейронной сети, опубликованную на TDS

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

Выводы

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

Для этой цели чаще всего используются регуляризации L1 и L2, но есть и другие, которые могут быть полезны в зависимости от контекста. Например, отсев почти всегда наблюдается в контексте глубокого обучения, то есть в нейронных сетях.

В нашем примере мы видели, как регуляризация влияет на производительность модели логистической регрессии и как значение C влияет на саму регуляризацию. Мы также рассмотрели, как коэффициенты модели изменяются при изменении значения C, и как регуляризация L1 и L2 по-разному влияет на коэффициенты модели.

Спасибо, что нашли время прочитать мою статью! 😊

До следующего раза!

Если вы хотите поддержать мою деятельность по созданию контента, не стесняйтесь перейти по моей реферальной ссылке ниже и присоединиться к программе членства Medium. Я получу часть ваших инвестиций, и вы сможете беспрепятственно получить доступ к множеству статей Medium по науке о данных и многому другому.



Рекомендуемые чтения

Для интересующихся вот список книг, которые я рекомендовал по каждой теме, связанной с ML. На мой взгляд, есть НЕОБХОДИМЫЕ книги, которые сильно повлияли на мою профессиональную карьеру.
Отказ от ответственности: это партнерские ссылки Amazon. Я получу небольшую комиссию от Amazon за то, что порекомендую вам эти товары. Ваш опыт не изменится, и вы не будете платить больше, но это поможет мне масштабировать свой бизнес и создавать еще больше контента на основе ИИ.

Полезные ссылки (написано мной)