Что делает sklearn.linear_model RidgeCV normalize = для параметра - PullRequest
1 голос
/ 14 февраля 2020

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

В документации сказано:

normalize: bool, default = False Этот параметр игнорируется, если для fit_intercept установлено значение False. Если True, регрессоры X будут нормализованы до регрессии путем вычитания среднего значения и деления на l2-норму. Если вы хотите sh для стандартизации, пожалуйста, используйте: 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``.
Но тогда как мне интерпретировать коэффициенты? Являются ли эти стандартизированные коэффициенты? Но, глядя на их величину, я сомневаюсь, что они стандартизированные коэффициенты.

В целом, я не уверен, что следовал документации по этому параметру 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]

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

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

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

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

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

Параметр нормализации работает так же, как 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 ]

0 голосов
/ 14 февраля 2020

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

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

В любом случае, я проверил следующее с помощью SAS PRO C 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

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

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