и почему это так важно!!!

Введение:

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

Ридж-регрессионный подход:

Ридж-регрессия — это модифицированная версия линейной регрессии методом наименьших квадратов (OLS). Он вводит член регуляризации L2 в функцию потерь OLS, эффективно штрафуя сумму квадратов коэффициентов. Параметр регуляризации (альфа) управляет степенью сжатия, применяемой к коэффициентам. Большие значения альфа приводят к большей усадке, эффективно приближая коэффициенты к нулю, в то время как меньшие значения альфа напоминают регрессию МНК.

  1. Реализация гребневой регрессии с помощью 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.

Вот пошаговое объяснение того, что произошло:

  1. В первой реализации 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).
  2. затем мы применили термин регуляризации (self.alpha * I) ко всем столбцам X_train, включая первый столбец, соответствующий термину перехвата. Это означает, что срок регуляризации также повлиял на срок перехвата.
  3. Когда мы установили I[0][0] = 0, мы эффективно удалили регуляризацию из термина перехвата, сделав его эквивалентным реализации sklearn, где перехват не регуляризован по умолчанию.

В заключение, небольшая разница в значениях коэффициентов между нашим исходным классом MeraRidge и классом Ridge sklearn была связана с регуляризацией термина перехвата. Установив I[0][0] = 0 в нашей пользовательской реализации, мы устранили эту разницу и воспроизвели результаты класса Ridge sklearn.

Почему срок регуляризации удален для срока перехвата?

Член регуляризации часто удаляется для члена пересечения (также известного как член смещения) в методах регуляризации, таких как регрессия хребта, по практическим причинам и для лучшей интерпретируемости модели.

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

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

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

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

Заключение:

Ридж-регрессия — это мощный инструмент для решения проблем, связанных с мультиколлинеарностью и переобучением в моделях линейной регрессии. Внедряя регуляризацию, Ridge Regression обеспечивает баланс между сложностью модели и производительностью. Понимание влияния регуляризации на значения коэффициентов и обоснование того, что член пересечения остается нерегуляризированным, позволяет нам делать осознанный выбор при использовании ридж-регрессии в реальных сценариях. Независимо от того, используем ли мы встроенный класс Scikit-learn Ridge Regression или разрабатываем собственную реализацию, понимание нюансов Ridge Regression повышает нашу способность создавать более надежные и интерпретируемые модели в различных областях.