и почему это так важно!!!
Введение:
Линейная регрессия — это фундаментальный метод, используемый для моделирования связи между зависимой переменной и одной или несколькими независимыми переменными. При работе с проблемами мультиколлинеарности или переобучения традиционные методы линейной регрессии могут стать нестабильными и давать ненадежные результаты. Чтобы преодолеть эти проблемы, используются методы регуляризации, такие как регрессия гребня. В этом сообщении блога мы углубимся в ридж-регрессию, изучая, как введение регуляризации влияет на коэффициенты модели и почему термин перехвата обычно остается нерегуляризированным.
Ридж-регрессионный подход:
Ридж-регрессия — это модифицированная версия линейной регрессии методом наименьших квадратов (OLS). Он вводит член регуляризации L2 в функцию потерь OLS, эффективно штрафуя сумму квадратов коэффициентов. Параметр регуляризации (альфа) управляет степенью сжатия, применяемой к коэффициентам. Большие значения альфа приводят к большей усадке, эффективно приближая коэффициенты к нулю, в то время как меньшие значения альфа напоминают регрессию МНК.
- Реализация гребневой регрессии с помощью Scikit-learn:Scikit-learn предоставляет удобный класс гребневой регрессии, который позволяет нам без особых усилий применять регуляризацию к нашим линейным моделям. Мы рассмотрим пример с использованием этого класса и обсудим различия в значениях коэффициентов по сравнению с самодельной моделью гребневой регрессии.
from sklearn.datasets import load_diabetes from sklearn.metrics import r2_score import numpy as np X,y = load_diabetes(return_X_y=True) from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=4) from sklearn.linear_model import Ridge reg = Ridge(alpha=0.1,solver='cholesky') reg.fit(X_train,y_train) y_pred = reg.predict(X_test) r2_score(y_test,y_pred) print(reg.coef_) print(reg.intercept_) r2_score = 0.4693128853309805 reg.coef_ = [ 44.02063391 -241.69329987 452.98665299 332.04420177 -76.33686744 -68.52143809 -164.98809083 149.96908118 431.61347417 58.51862681] reg.intercept_ = 150.89053425602808
Решатель Холецкого — это особый метод решения задачи регрессии гребня, когда параметр регуляризации (alpha
) больше 0 и когда матрица данных (X) имеет полный ранг (т. е. все ее столбцы линейно независимы). Это эффективный и численно стабильный подход для наборов данных малого и среднего размера. Решатель Холецкого напрямую вычисляет решение задачи регрессии хребта в закрытой форме без необходимости использования итерационных алгоритмов оптимизации.
2. Реализация хребтовой регрессии с нуля. Вооружившись интуицией МНК и формулой хребтовой регрессии, теперь мы реализуем хребтовую регрессию с нуля с помощью Python. Мы будем использовать NumPy для матричных операций, шаг за шагом создавая класс Ridge Regression.
class MyRidge: def __init__(self,alpha=0.1): self.alpha = alpha self.coef_ = None self.intercept_ = None def fit(self,X_train,y_train): X_train = np.insert(X_train,0,1,axis=1) I = np.identity(X_train.shape[1]) result = np.linalg.inv(np.dot(X_train.T,X_train) + self.alpha * I).dot(X_train.T).dot(y_train) self.intercept_ = result[0] self.coef_ = result[1:] def predict(self,X_test): return np.dot(X_test,self.coef_) + self.intercept_ reg = MyRidge() reg.fit(X_train,y_train) y_pred = reg.predict(X_test) print(r2_score(y_test,y_pred)) print(reg.coef_) print(reg.intercept_) r2_score = 0.46921361559931885 reg.coef_ = [ 44.04252774 -241.72019592 452.99153345 332.06044266 -76.32617866 -68.54884462 -165.01664054 149.93980143 431.59483654 58.54419942] reg.intercept_ = 150.84762720023167
при ближайшем рассмотрении мы можем увидеть значительное изменение значения коэффициентов и термина пересечения класса ridge sklearn и того, что мы сделали с нуля.
ridge class(sklearn): r2_score = 0.4693128853309805 reg.coef_ = [ 44.02063391 -241.69329987 452.98665299 332.04420177 -76.33686744 -68.52143809 -164.98809083 149.96908118 431.61347417 58.51862681] reg.intercept_ = 150.89053425602808 MyRidge class: r2_score = 0.46921361559931885 reg.coef_ = [ 44.04252774 -241.72019592 452.99153345 332.06044266 -76.32617866 -68.54884462 -165.01664054 149.93980143 431.59483654 58.54419942] reg.intercept_ = 150.84762720023167
Но почему эта аномалия?
Небольшая разница в значениях коэффициентов при использовании нашего пользовательского класса MyRidge
по сравнению с классом Ridge
sklearn
связана с тонкой разницей в реализации термина регуляризации.
В нашей первоначальной реализации MyRidge
мы добавили член регуляризации к диагональным элементам единичной матрицы I
для всех функций, включая член пересечения (первый столбец X_train
). Это отличается от реализации sklearn
, где термин перехвата не регулируется по умолчанию. Установив I[0][0] = 0
, мы можем эффективно удалить регуляризацию из члена перехвата, что привело к тому, что коэффициенты были точно такими же, как у класса Ridge
sklearn
.
Вот пошаговое объяснение того, что произошло:
- В первой реализации
MyRidge
мы использовалиI = np.identity(X_train.shape[1])
, который создал единичную матрицу формы(X_train.shape[1], X_train.shape[1])
. Поскольку мы вставили столбец единиц в началеX_train
для учета термина перехвата, формаX_train
стала(num_samples, num_features + 1)
. - затем мы применили термин регуляризации (
self.alpha * I
) ко всем столбцамX_train
, включая первый столбец, соответствующий термину перехвата. Это означает, что срок регуляризации также повлиял на срок перехвата. - Когда мы установили
I[0][0] = 0
, мы эффективно удалили регуляризацию из термина перехвата, сделав его эквивалентным реализацииsklearn
, где перехват не регуляризован по умолчанию.
В заключение, небольшая разница в значениях коэффициентов между нашим исходным классом MeraRidge
и классом Ridge
sklearn
была связана с регуляризацией термина перехвата. Установив I[0][0] = 0
в нашей пользовательской реализации, мы устранили эту разницу и воспроизвели результаты класса Ridge
sklearn
.
Почему срок регуляризации удален для срока перехвата?
Член регуляризации часто удаляется для члена пересечения (также известного как член смещения) в методах регуляризации, таких как регрессия хребта, по практическим причинам и для лучшей интерпретируемости модели.
Основная причина отказа от регуляризации члена перехвата заключается в том, что он представляет собой среднее значение целевой переменной, когда все признаки равны нулю. Упорядочивание перехвата может привести к смещению этого среднего значения от его естественного значения, что во многих случаях может быть нежелательным.
Вот несколько причин, по которым термин регуляризации обычно опускается для термина перехвата:
- Интерпретация перехвата. Термин перехвата предоставляет базовое значение целевой переменной, когда все функции имеют нулевые значения. Его регуляризация может повлиять на общее смещение модели и может не иметь особого смысла во многих реальных сценариях.
- Предотвращение чрезмерной коррекции. Регуляризация предназначена для наказания модели за сложные или большие значения коэффициентов. Однако штраф за перехват может привести к чрезмерной коррекции, особенно если среднее значение целевой переменной не близко к нулю.
- Упрощение модели. Отсутствие регуляризации для перехвата упрощает интерпретацию и анализ модели. Роль перехвата заключается в корректировке прогноза в соответствии с глобальным смещением данных, и для этой цели не всегда может потребоваться регуляризация.
- Избегание проблем с коллинеарностью. Упорядочивание пересечения с другими объектами может привести к проблемам с коллинеарностью, что сделает модель более чувствительной к масштабу входных объектов.
Однако, если у нас есть особые причины для регуляризации термина перехвата, мы, безусловно, можем изменить реализацию нашего пользовательского класса регрессии гребня, чтобы включить регуляризацию и для перехвата. Решение о включении или исключении регуляризации для перехвата должно основываться на характеристиках наших данных и проблеме, которую мы пытаемся решить.
Заключение:
Ридж-регрессия — это мощный инструмент для решения проблем, связанных с мультиколлинеарностью и переобучением в моделях линейной регрессии. Внедряя регуляризацию, Ridge Regression обеспечивает баланс между сложностью модели и производительностью. Понимание влияния регуляризации на значения коэффициентов и обоснование того, что член пересечения остается нерегуляризированным, позволяет нам делать осознанный выбор при использовании ридж-регрессии в реальных сценариях. Независимо от того, используем ли мы встроенный класс Scikit-learn Ridge Regression или разрабатываем собственную реализацию, понимание нюансов Ridge Regression повышает нашу способность создавать более надежные и интерпретируемые модели в различных областях.