Неожиданное поведение коэффициентов sklearn Lasso для небольших значений альфаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Неожиданное поведение коэффициентов sklearn Lasso для небольших значений альфа

Сообщение Anonymous »

Вот базовый код, создающий проблему регрессии.

Код: Выделить всё

import numpy as np
import pandas as pd
from sklearn.linear_model import Lasso, LinearRegression

n = 100
np.random.seed(42)
X = np.random.normal(size=n)
eps = np.random.normal(size=n)

b_0, b_1, b_2, b_3 = 0.5, 2.8, 6.7, 3.4
Y = b_0 + b_1 * X + b_2 * (X ** 2) + b_3 * (X ** 3) + eps

n_cols = 10

df_X = pd.DataFrame(columns=[f'X ^ {i}' for i in range(1, n_cols + 1)])
for i in range(1, n_cols + 1):
df_X[f'X ^ {i}'] = X ** i

Я смотрел, как Lasso сжимает коэффициенты, и заметил что-то странное. Значения коэффициентов для переменных X, возведенных в степень больше 3 (переменные, избыточные для реальной задачи, но увеличивающие дисперсию модели), имеют коэффициенты почти 0 для альфа/лямбда, равных 0. Я проверил, каковы коэффициенты для OLS и они очень ненулевые:




бета OLS
бета Lasso




const
0.3
0,3


X^1
2,22,5


X^2
5,8
6,9


X^3
5.3
3.7


X^4
3,0
-0,03


X^5
-2,0
-0,14


X^ 6
-2,4
0


< td>X^7
0.8
0


X^8
0.7
0


X^9
-0,1
0


X^10
-0,07
0



Теоретически Lasso с альфа/лямбда = 0 должно давать те же результаты, что и OLS. Я обнаружил, что здесь был задан аналогичный вопрос, и я понимаю, что, как указано в документации по Lasso:

Когда альфа = 0, Цель эквивалентна обычному методу наименьших квадратов, решаемому с помощью объекта LinearReгрессия. По числовым причинам использование альфа = 0 с объектом «Лассо» не рекомендуется. Вместо этого вам следует использовать объект LinearReгрессия.

Хорошо, конечно, это имеет смысл, числовые проблемы. Но почему результаты такие разные, даже если альфа равна не нулю, а например 0,00001, или 0,001, или 0,1?
Если вы посмотрите на график коэффициентов сжатия, которые я вы заметите, что начальные высокие значения коэффициентов для X^4/5/6/7/8 полностью опущены в том, что создает Lasso. Или, может быть, они начинают проявляться на уровне lasso~=0,5, но тогда же они начинают сжиматься.
[img]https: //i.sstatic.net/26FwAEhM.png[/img]

Код создания графика:

Код: Выделить всё

lambdas = np.concatenate((np.linspace(0, 1 - 1e-8, 1000), np.linspace(1, 200, 1000)))
coefs_path = []
for l in lambdas:
model = Lasso(alpha=l)
model.fit(df_X, Y)
coefs_path.append(model.coef_)
coefs_path = np.array(coefs_path)

for i_var in range(df_X.shape[1]):
plt.plot(lambdas, coefs_path[:, i_var], label=f'$X^{{{i_var+1}}}$')
plt.title('Shrinking coefficients')
plt.xlabel('$\lambda$')
plt.xlim(left=-1, right=10)

# I have a different part of code where I use sklearns' LassoCV, but that is irrelevant here.
lasso_cv_alpha_ = 0.28
plt.axvline(lasso_cv_alpha_, lw=2, linestyle='--', color='#49eb34', label=f'Best coefficients ($\lambda$ = {lasso_cv_alpha_:.3f})')

plt.legend();
Это ожидаемое поведение? Потому что это не так.
Редактировать на основе комментариев Хорди Пастора:
Действительно, изменение параметров модели Лассо на Lasso(alpha=l, max_iter=int(1e6), tol=1e-16) дает ненулевые коэффициенты для X^4/5/6/7/8 /9/10 переменных. Они все еще далеки от OLS, как представлено ниже.




бета-версии OLS
бета-версии Lasso (tol и max_iter)




const< /td>
0,3
0,3


X ^1
2.2
2.7


< td>X^2
5,8
6,0


X^3
5,3
2,8


X^4
3.0
2.1


X^5
-2,0
1,0


X^6
-2,4
-1,3


X^7
0,8
-0,5


X^8
0.7
0,2


X^9
-0,1
0.07


X^10
-0.07
0



Вот обновленный график коэффициентов сжатия с измененными параметрами модели. Я изменил диапазон по оси X, чтобы лучше видеть небольшие значения альфа/лямбда.
Изображение
И снова результаты показались мне странными. Коэффициенты начинаются со значений, указанных выше в столбце бета-лассо, но почти сразу падают до нуля. Чтобы внести ясность, параметры max_iter и tol были установлены для всех прогонов модели.
Честно говоря, сейчас для меня это еще более странно.

Подробнее здесь: https://stackoverflow.com/questions/786 ... pha-values
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Регрессия Sklearn Lasso на порядок хуже, чем регрессия хребта?
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Регрессия Sklearn Lasso на порядок хуже, чем регрессия хребта?
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Расчет коэффициентов, алгоритм распределения коэффициентов
    Anonymous » » в форуме Php
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Реализация sklearn.ensemble.GradientBoostingRegressor с помощью sklearn.multioutput.MultiOutputRegressor и sklearn.model
    Anonymous » » в форуме Python
    0 Ответы
    51 Просмотры
    Последнее сообщение Anonymous
  • Реализация sklearn.ensemble.GradientBoostingRegressor с помощью sklearn.multioutput.MultiOutputRegressor и sklearn.model
    Anonymous » » в форуме Python
    0 Ответы
    54 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»