Раскрытие скрытых алгоритмических взаимосвязей через запутанное имя

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

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

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

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

1. Обычно преподаваемый урок SGDRegressor

SGDRegressor — это алгоритм машинного обучения в Scikit-Learn, который реализует стохастический градиентный спуск (SGD) для решения задач регрессии. Это популярный выбор для крупномасштабных задач регрессии из-за его способности обрабатывать многомерные наборы данных и быстрого обучения.

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

1.1 Линейный регрессор

SGDRegressor — это линейная модель, которая использует линейную функцию для прогнозирования целевой переменной. Линейная функция принимает вид:

y = w[0] + w[1] * x[1] + … + w[p] * x[p]

где от x[1] до x[p] — входные признаки, от w[1] до w[p] — коэффициенты линейной модели, а w[0] или b — член пересечения. Цель алгоритма SGDRegressor состоит в том, чтобы найти значения w и b, которые минимизируют функцию потерь, которая должна быть определена между прогнозируемыми значениями и фактическими значениями целевой переменной.

1.2 Стохастический градиентный спуск и градиентный спуск

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

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

1.3 Использование SGDRegressor в scikit-learn

Использовать SGDRegressor в scikit-learn очень просто. Во-первых, нам нужно импортировать класс SGDRegressor из модуля linear_model scikit-learn. Затем мы можем создать экземпляр класса SGDRegressor и подогнать модель к нашим обучающим данным.

Вот пример использования SGDRegressor в scikit-learn:

from sklearn.linear_model import SGDRegressor
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# Load the Boston housing dataset
X, y = load_boston(return_X_y=True)
# Split the dataset into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Create an instance of SGDRegressor
sgd_reg = SGDRegressor(max_iter=1000, tol=1e-3, penalty=None, eta0=0.1)
# Fit the model to the training data
sgd_reg.fit(X_train, y_train)
# Make predictions on the test data
y_pred = sgd_reg.predict(X_test)
# Calculate the mean squared error of the predictions
mse = mean_squared_error(y_test, y_pred)
print("Mean squared error:", mse)

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

2. Распаковка сбивающего с толку имени SGDRegressor для начинающих

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

Однако мы также объясним, что для экспертов название не обязательно является источником путаницы. Это потому, что они уже знакомы с алгоритмом и его назначением и могут легко отличить его от других подобных алгоритмов.

2.1 Почему это сбивает с толку

В моей статье Машинное обучение в три шага: как эффективно изучить его я ​​объяснил, как улучшить ваше изучение алгоритмов машинного обучения, разбив процесс на три отдельных этапа: алгоритм модели, алгоритм подбора и алгоритм настройки. Несмотря на простоту этого подхода, его применение на практике может оказаться затруднительным. Алгоритм SGDRegressor служит ярким примером этого.

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

В scikit-learn принято добавлять «регрессор» или «классификатор» к имени модели машинного обучения, в зависимости от того, используется ли она для задач регрессии или классификации. Это соглашение очевидно во многих примерах, таких как DecisionTreeClassifier и DecisionTreeRegressor, KNeighborsClassifier и KNeighborsRegressor и т. д.

Однако проблема с названием «SGDRegressor» заключается в том, что если мы применим к нему это соглашение об именах, это подразумевает, что «SGD» — это модель машинного обучения, хотя на самом деле это алгоритм подбора. Это может сбивать с толку новичков, которые могут не иметь четкого представления о различных компонентах алгоритмов машинного обучения.

2.2 Как объяснить это название

Для экспертов соглашение об именах «SGDRegressor» может показаться приемлемым. Использование «SGD» предполагает, что эта модель основана на математических функциях или параметрических моделях, а не на дистанционных или древовидных моделях. Следовательно, «SGD» подразумевает использование скрытых моделей, несмотря на то, что сам SGD является алгоритмом подбора.

Хотя теоретически SGD можно использовать как для линейных, так и для нелинейных моделей, таких как нейронные сети, на практике этот оценщик реализует только линейные модели. Таким образом, вы скажете, что более точным и кратким названием для этой оценки могло бы быть «LinearSGDRegressor»! Да все верно! Но вы также заметили, что «SGDRegressor» находится в модуле «linear_model», который по определению реализует только линейные модели?!

В конечном счете кажется, что имя SGDRegressor является подходящим, даже несмотря на то, что SGD относится конкретно к алгоритму подбора, поскольку этот алгоритм используется только для моделей на основе математических функций. Кроме того, учитывая, что SGDRegressor находится в модуле «linear_model», ясно, что используемая модель является линейной моделью.

3. Скрытые модели в SGDRegressor

Параметры, доступные в SGDRegressor, дают нам возможность выбирать различные комбинации функций потерь (squared_error, huber, epsilon_insensitive или squared_epsilon_insensitive) и штрафов (l1, l2, elasticnet или none). Некоторые из этих комбинаций соответствуют традиционным статистическим моделям.

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

3.1 Функции потерь

Функции потерь в квадрате_ошибки, huber, epsilon_insensitive и в квадрате_epsilon_insensitive различаются по своему влиянию на модель и ее производительность.

  • Функция потерь в квадрате_ошибки, также известная как среднеквадратическая ошибка (MSE), наказывает большие ошибки сильнее, чем маленькие, что делает ее чувствительной к выбросам. Эта функция потерь обычно используется в линейной регрессии.
  • Функция потерь Хьюбера менее чувствительна к выбросам, чем функция потерь в квадрате_ошибки, поскольку она переходит от квадратичной к линейной ошибке для больших остатков. Это делает его хорошим выбором для наборов данных с некоторыми выбросами.
  • Функция потерь epsilon_insensitive используется для задач регрессии, когда ожидается, что целевые значения попадают в определенный диапазон значений. Он игнорирует ошибки меньше определенного порога, известного как эпсилон, и линейно штрафует большие ошибки. Эта функция потерь обычно используется в регрессии опорных векторов.
  • Функция потерь squared_epsilon_insensitive похожа на функцию потерь epsilon_insensitive, но она сильнее наказывает большие ошибки, возводя их в квадрат. Эта функция потерь может быть полезна, когда более крупные ошибки необходимо штрафовать более чем линейно, а более мелкие ошибки можно игнорировать.

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

Вот изображение, суммирующее все функции потерь с их математическими выражениями. Также предоставляются реализации Python, что позволяет нам визуализировать и сравнивать их поведение. Если вы хотите получить доступ к коду Python, вы можете поддержать меня на Ko-fi по следующей ссылке: https://ko-fi.com/s/4cc6555852.

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

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

Приняв этот подход, можно потенциально создать свою собственную функцию потерь!

3.2 Срок наказания

При использовании SGDRegressor мы также можем указать штрафы, которые будут использоваться в дополнение к выбранной функции потерь. Доступные штрафы: L1, L2, Elastic Net и None.

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

Штраф L2 добавляет квадрат коэффициентов к функции потерь, что приводит к меньшим, но ненулевым коэффициентам. Этот штраф также может помочь уменьшить переоснащение и улучшить обобщение модели.

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

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

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

Вот интересная визуализация из документации scikitlearn

3.3 Представление скрытых моделей

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

Квадрат ошибки

Самая простая комбинация в SGDRegressor — это Squared_Error без штрафа, что соответствует классической модели линейной регрессии, доступной в оценщике LinearRegression Scikit-learn. Однако такое соглашение об именах может ввести в заблуждение. Хотя все эти модели являются регрессорными и линейными, обращение к ним как к «линейной регрессии» может вызвать путаницу. Чтобы избежать этого, лучше вместо этого использовать термин «линейная модель» и зарезервировать термин «линейная регрессия» специально для регрессии МНК.

Лассо — это модель линейной (OLS) регрессии с регуляризацией L1, что способствует разреженности оценок коэффициентов.

С другой стороны, гребенчатая регрессия добавляет штраф L2 к модели линейной (OLS) регрессии, чтобы помочь смягчить эффекты мультиколлинеарности.

ElasticNet сочетает в себе недостатки регуляризации L1 и L2, чтобы достичь баланса между разреженностью Lasso и стабильностью Ridge.

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

Потеря Хубера

Функция потерь Хьюбера — это альтернативная функция потерь, которая менее чувствительна к выбросам, что делает ее хорошим выбором для наборов данных со значительными выбросами. Функция потерь Хьюбера представляет собой комбинацию функции квадратичных потерь и функции абсолютных потерь. Для небольших ошибок она ведет себя как функция квадрата потерь, а для больших ошибок — как абсолютная функция потерь. Это делает ее более устойчивой к выбросам, чем функция квадратичных потерь, и в то же время обеспечивает хорошую производительность при небольших ошибках.

Нечувствительная потеря Epsilon

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

Фактически, сочетание потерь, нечувствительных к Epsilon, и регуляризации L2 также называется SVR (регрессия опорных векторов). Использование концепции эпсилон-нечувствительной трубки делает обязательным добавление штрафа, поскольку без него может быть бесконечное количество решений. Термин «вектор опоры» используется потому, что точно так же, как член регуляризации L1 для коэффициентов приведет к тому, что некоторые коэффициенты станут равны нулю, потери L1 (абсолютные потери), примененные к набору данных, приведут к тому, что определенные точки данных не будут использоваться для расчета коэффициентов. , оставив только оставшиеся, которые называются опорными векторами.

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

Чтобы узнать больше о SVR и нечувствительных потерях Epsilon с помощью Scikit-learn, вы можете прочитать эту статью: Понимание SVR и нечувствительных потерь Epsilon с помощью Scikit-learn.

Квадрат нечувствительных к эпсилону потерь

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

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

3.4 Одна настраиваемая модель или разные модели?

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

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

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

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

Что касается SGDRegressor, вот три шага:

  • Модель: затем мы можем рассматривать LASSO, гребень, эластичную сеть, SVM и регрессию Хубера как ОДНУ единую модель, которая представляет собой линейную модель, представленную как y = wX + b.
  • Подгонка: используемый алгоритм подгонки представляет собой стохастический градиентный спуск (SGD).
  • Настройка: гиперпараметры, которые можно настроить, включают, среди прочего, потери и штрафы.

Хотя в научном наборе есть несколько моделей в виде автономных оценок, таких как LinearRegression, LASSO и Ridge в одном и том же модуле linear_model, нет необходимости обсуждать, являются ли они на самом деле одной и той же моделью или нет. Основное внимание следует уделить пониманию их внутреннего функционирования, поскольку названия могут вводить в заблуждение.

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

Заключение и основные выводы

В заключение, SGDRegressor в scikit-learn предлагает гибкий и мощный инструмент для задач линейной регрессии. Его различные функции потерь и варианты штрафов предоставляют пользователю множество возможностей для настройки модели в соответствии со своими конкретными потребностями. Кроме того, возможность использовать SGD для соответствия невыпуклым функциям является значительным преимуществом по сравнению со стандартным градиентным спуском. Важно иметь в виду, что параметры потерь и штрафов следует рассматривать как гиперпараметры, требующие настройки. Применяя структуру обучения модели, подгонки и настройки, специалисты по данным могут использовать SGDRegressor для достижения оптимальных результатов в своих задачах линейной регрессии.