Машинное обучение

Линейная регрессия с Python и библиотекой scikit-learn

Введение в обобщенную линейную регрессию

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

где x ₖ обозначает объясняющий вектор k, а w ₖ обозначает вес каждой независимой переменной. Кроме того, как обычно нам нужно для перехвата, по соглашению мы устанавливаем x= 1 так, чтобы вес w ₀ представлял перехват.

Линейная регрессия

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

для всех M точек (xᵢ, yᵢ)

Чтобы проиллюстрировать этот простой пример, давайте воспользуемся замечательной библиотекой scikit-learn и особенно пакетом sklearn.linear_model

Модель, которую мы здесь используем, довольно проста, это просто линия. Модель кажется неплохой с подобранными коэффициентами w₀ = -0,87998 и w₁ = 4,54914, но ошибка не равна нулю (среднеквадратичная ошибка = 15,57 в примере). Иногда способ уменьшить остаточную ошибку - изменить модель на более сложную. В нашем случае мы просто подобрали многочлен степени 1. Что, если мы увеличим степень многочлена? Например, допустим, мы увеличиваем степень до 12:

Как мы видим, чем больше мы увеличиваем полиномиальную степень модели, тем больше мы уменьшаем остаточную ошибку. Однако, и это особенно очевидно в этом примере, уменьшение ошибки не обязательно является признаком лучшей модели. В самом деле, представьте, что мы используем полином высокой степени в качестве нашей модели, ошибка имеет тенденцию быть нулевой (и это на самом деле здесь, поскольку у нас есть степень полинома, равная количеству наблюдений). Но если мы добавим дополнительное наблюдение, наша модель наверняка испытает высокую остаточную ошибку.

и результат

Остаточная ошибка для X = 15 составляет [57.50465854]
Остаточная ошибка для X = 15 составляет [540.59208041]
Остаточная ошибка для X = 15 равна [23711.11027247]
Остаточная ошибка для X = 15 равно [192880.65211092]
Остаточная ошибка для X = 15 равна [3.55927302e + 09]
Остаточная ошибка ошибка для X = 15 равна [4.83622098e + 12]

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

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

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

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

где |. | обычно является нормой L1 или L2, а лямбда - это гиперпараметр, который можно настраивать для регулировки чувствительности к наказанию (0 означает отсутствие штрафа, т.е. нерегуляризованная модель). Два широко используемых метода регуляризации - это регуляризация L1 и L2, также называемая LASSO и RIDGE регрессией.

ЛАССО

Цитировать содержимое библиотеки scikit-learn

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

Мы ясно видим эффект регуляризации. Когда мы увеличиваем штраф, мы строго ограничиваем веса каждого коэффициента, вплоть до сохранения точки пересечения. Но как правильно выбрать параметр? Что ж, здесь нам снова нужно посмотреть на остаточную ошибку, вычисленную на наборе, который не является обучающим набором. Такой метод известен как проверка. Принцип состоит в том, чтобы разделить набор данных на три части, скажем, 80% для обучающего набора, 10% для проверки и 10% для тестирования. Модель обучается на обучающем наборе, затем проверочный набор используется для выбора гиперпараметра. Наконец, набор тестов используется для оценки истинной ошибки модели. Однако для небольших наборов данных этот подход недостаточно эффективен, поскольку ограничивает объем данных, доступных для обучения. Для таких небольших наборов данных мы можем применить метод перекрестной проверки. Для этого мы разделили набор данных на две части: одну для обучения, а другую для теста. Затем обучение выполняется на всем обучающем наборе, кроме некоторых k выборок. Итак, давайте представим, что обучающая выборка состоит из N выборок. Мы выполняем N / k регрессий для N-k выборок и вычисляем ошибку проверки для оставшихся k выборок. После всех этих регрессий ошибка валидации является средней ошибкой всех ошибок валидации.

В библиотеке scikit-learn есть класс, реализующий этот подход и находящий оптимальный гиперпараметр: LassoCV. Затем мы повторно используем предыдущий пример кода, опуская параметр alpha, чтобы принудительно использовать модель LassoCV:

Согласно модели LassoCV, оптимальный гиперпараметр альфа = 4,16e⁻⁴.

RIDGE Регрессия

Регрессия RIDGE очень похожа на LASSO и отличается только порядком нормы, используемой в члене регуляризации. В LASSO мы использовали норму порядка 1 (L1), а в регрессии RIDGE мы использовали норму порядка 2 (L2). Поведение этого метода регуляризации заключается в том, что все результирующие веса моделей по-прежнему не равны нулю, но в конечном итоге имеют очень маленькое значение, так что их влияние на прогнозируемое значение довольно низкое. Напротив, LASSO налагает разреженность модели, в конечном итоге устанавливая веса равными нулю, что упрощает интерпретацию модели. Основное преимущество регрессии RIDGE состоит в том, что она безразлична к мультипликативному фактору и стремится к равным весам сильно коррелированных переменных, тогда как LASSO выберет либо другое.

Реализация нашего примера действительно похожа на предыдущий случай LASSO. Все, что нам нужно сделать, это заменить Lasso и LassoCV на Ridge и RidgeCV!

И с использованием перекрестной проверки:

Как мы видим, полученная модель немного отличается от регуляризации LASSO. А теперь посмотрим на весовые коэффициенты:

Вывод

В этой статье мы увидели два метода регуляризации и важность использования регуляризации, когда мы пытаемся подогнать под модель. Мы также увидели, что оба метода, хотя и очень похожи, дают очень разные результаты. Действительно, в то время как метод RIDGE включает все объясняющие переменные, LASSO приводит к разреженной модели, которую часто легче понять. Однако LASSO работает хуже в случае сильно коррелированных переменных, так как имеет тенденцию давать очень разреженный результат. И это именно то, что мы видели в нашем примере, когда пытались сопоставить косинус с многочленом. Каждая переменная сильно коррелирована, поэтому результирующая модель имеет множество нулевых значений в качестве весовых коэффициентов. Наряду с RIDGE и LASSO, Elastic Net - еще один полезный метод, сочетающий регуляризацию L1 и L2. Это позволяет изучать разреженную модель, сохраняя при этом свойства RIDGE.

Конец примечания

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