Что делает параметр sklearn.linear_model RidgeCV normalize=

Меня смущает то, что именно normalized= делает в RidgeCV из sklearn.linear_model.

В документации говорится:

normalize : bool, default=False Этот параметр игнорируется, если для fit_intercept установлено значение False. Если True, регрессоры X будут нормализованы перед регрессией путем вычитания среднего значения и деления на l2-норму. Если вы хотите стандартизировать, используйте :class:sklearn.preprocessing.StandardScaler перед вызовом fit в оценщике с normalize=False.

  1. Обычно мы называем стандартизацию вычитанием среднего и делением на l2-норму. Но в документации это называется «нормализовать».
  2. Если я правильно понимаю документацию, я должен использовать третий блок кода (последний блок), следуя
If you wish to standardize, please use
:class:`sklearn.preprocessing.StandardScaler` before calling ``fit``
on an estimator with ``normalize=False``.
  1. Но тогда как мне интерпретировать коэффициенты? Это нормированные коэффициенты? Но, глядя на их величину, я сомневаюсь, что это стандартизированные коэффициенты.

В целом, я не уверен, что следовал документации по этому параметру normalize.

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

from sklearn.datasets import load_diabetes
from sklearn.linear_model import RidgeCV
X, y = load_diabetes(return_X_y=True)

без стандартизации

clf = RidgeCV(normalize=False,alphas=[1e-3, 1e-2, 1e-1, 1]).fit(X, y)
clf.coef_
print(clf.alpha_)
print(clf.score(X,y))
print(clf.coef_)
0.01 
0.5166287840315846 
[ -7.19945679 -234.55293001 520.58313622 320.52335582 -380.60706569 150.48375154 -78.59123221 130.31305868 592.34958662 71.1337681 ]

стандартизировать и нормализовать = True

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X)
X_std = scaler.transform(X)
clf = RidgeCV(normalize=True,alphas=[1e-3, 1e-2, 1e-1, 1]).fit(X_std, y)
print("standardize and normalize=True")
print(clf.alpha_)
print(clf.score(X_std,y))
print(clf.coef_)

standardize and normalize=True
0.01
0.5166287840315843
[ -0.34244324 -11.15654516  24.76161466  15.24574131 -18.10363195
   7.15778213  -3.7382037    6.19836011  28.17519659   3.38348831]

стандартизировать и нормализовать = False

clf = RidgeCV(normalize=False,alphas=[1e-3, 1e-2, 1e-1, 1]).fit(X_std, y)
print("standardize and normalize=False")
print(clf.alpha_)
print(clf.score(X_std,y))
print(clf.coef_)

standardize and normalize=False
1.0
0.5175831607267165
[ -0.43127609 -11.33381407  24.77096198  15.37375716 -30.08858903
  16.65328714   1.46208255   7.5211415   32.84392268   3.26632702]

person Sarah    schedule 13.02.2020    source источник
comment
Не ответ, но эта статья TDS дает хорошая разбивка шкалы/стандартизации/нормализации. Один большой вывод заключается в том, что, по-видимому, нормализатор sklearn применяется к каждому образцу, а не к каждой функции. (по строкам, а не по столбцам). Из документов на ridgeCV неясно, так ли это, когда normalize=True   -  person G. Anderson    schedule 14.02.2020


Ответы (2)


Редактировать:

Также следует отметить одну вещь, касающуюся диабета набора данных. используется в этом примере.

Данные уже нормализованы, поэтому нормализация сама по себе может не дать желаемого эффекта.

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

Параметр нормализации работает так же, как sklearn .preprocessing.normalizer, который отличается от стандартного масштабатора.

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

Вот еще один пост, связанный с постом. Разница между стандартными масштабировщиками и нормализаторами в sklearn.preprocessing.

Этот пост также содержит ссылки на некоторые дополнительные статьи, которые вы можете изучить.

Редактировать:

Документация сбивает с толку, и после просмотра исходного кода кажется, что он может фактически воздействовать на столбцы, а не на строки, поскольку предоставляется параметр axis = 0.

Один из способов проверить это — использовать нормализуйте функцию и сравните ее работу с передачей параметра.

Вот код, который выполняет предварительную обработку. (f_normalize — это та же функция, которая связана).

            if normalize:
                X, X_scale = f_normalize(X, axis=0, copy=False,
                                         return_norm=True)

Я думаю, вы можете попробовать это и посмотреть, получите ли вы тот же результат, что и при использовании параметра normalize.

from sklearn.preprocessing import normalize

X_std= normalize(X,axis=0,return_norm=False)
clf = RidgeCV(normalize=False,alphas=[1e-3, 1e-2, 1e-1, 1]).fit(X_std, y)
print("standardize and normalize=True")
print(clf.alpha_)
print(clf.score(X_std,y))
print(clf.coef_)

standardize and normalize=True
0.01
0.5166287840315835
[  -7.19945679 -234.55293001  520.58313622  320.52335582 -380.60706569
  150.48375154  -78.59123221  130.31305868  592.34958662   71.1337681 ]

Это дает тот же результат, что и:

X, y = load_diabetes(return_X_y=True)

clf = RidgeCV(normalize=True,alphas=[1e-3, 1e-2, 1e-1, 1]).fit(X, y)
print("standardize and normalize=True")
print(clf.alpha_)
print(clf.score(X_std,y))
print(clf.coef_)

standardize and normalize=True
0.01
0.5166287840315835
[  -7.19945679 -234.55293001  520.58313622  320.52335582 -380.60706569
  150.48375154  -78.59123221  130.31305868  592.34958662   71.1337681 ]

person jawsem    schedule 13.02.2020
comment
Спасибо за быстрый ответ. Но в документации сбивает с толку то, что если True, регрессоры X будут нормализованы перед регрессией путем вычитания среднего значения и деления на l2-норму. Описание звучит стандартно для меня. Может быть, это ошибка в документации? - person Sarah; 14.02.2020
comment
Привет, Сара, я согласен, что документация сбивает с толку. Я просмотрел часть исходного кода и добавил некоторые дополнительные детали, которые вы можете изучить подробнее. Я думаю, вы должны получить тот же результат, используя функцию preprocessing.normalize в качестве параметра normalize. Мои ссылки все же должны быть несколько полезны для объяснения разницы. - person jawsem; 14.02.2020
comment
jawsem, спасибо, что заглянули в это. Но я не думаю, что следует использовать from sklearn.preprocessing import normalize. from sklearn.preprocessing import normalize должен сделать длину векторной нормы равной 1. Это не то, что нужно для гребневой регрессии. - person Sarah; 14.02.2020

Нужно интерпретировать этот параметр normalize как standardize в sklearn.linear_model Ridge или RidgeCV.

Это проблема документации в sklearn, которая может вызвать путаницу. Этот параметр normalize следует исправить на standardize.

Во всяком случае, я проверил следующее с помощью SAS PROC REG, используя набор данных о жилье в Бостоне, который не стандартизирован.

from sklearn.datasets import load_boston
dataset =load_boston()
X =dataset.data
y=dataset.target

clf = RidgeCV(normalize=True,alphas=[1e-3, 1e-2, 1e-1, 1]).fit(X, y)
clf.coef_
print(clf.alpha_)
print(clf.score(X,y))
print(clf.coef_)
coef =pd.DataFrame(zip(dataset.feature_names,clf.coef_)) #match SAS closely

0.01  (alpha)
0.7403788769476067 (R square)
0      CRIM  -0.103542
1        ZN   0.043406
2     INDUS   0.005200
3      CHAS   2.746307
4       NOX -16.625596
5        RM   3.865188
6       AGE  -0.000341
7       DIS  -1.413550
8       RAD   0.269159
9       TAX  -0.010577
10  PTRATIO  -0.934596
11        B   0.009288
12    LSTAT  -0.515911

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

person Sarah    schedule 14.02.2020