首页 > 解决方案 > sklearn.linear_model RidgeCV normalize= 参数究竟做了什么

问题描述

normalized=对 sklearn.linear_model 在 RidgeCV 中究竟做了什么感到困惑。

文档说:

fit_interceptnormalize : bool, default=False 当设置为 False时忽略此参数。如果为 True,则回归量 X 将在回归前通过减去均值并除以 l2 范数进行归一化。如果您希望标准化,请sklearn.preprocessing.StandardScaler在调用fit 估算器之前使用 :class: 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 ]

标准化和标准化=真

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]

标准化和标准化=假

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]

标签: pythonscikit-learnnormalizeregularized

解决方案


编辑:

关于本例中使用的糖尿病数据集,还有一点需要注意。

数据已经规范化,因此单独对其运行规范化可能无法获得您正在寻找的确切效果。

为您的测试使用不同的数据集可能会更好。

normalize 参数的工作方式与sklearn.preprocessing.normalizer相同,这与 Standard Scaler 不同。

主要区别在于规范化器将作用于行(观察),而标准缩放器将作用于列。

这是另一个帖子相关的帖子。 sklearn.preprocessing 中的standardscaler 和 Normalizer 之间的区别

这篇文章还链接了一些您可以探索的其他文章。

编辑:

该文档令人困惑,它在查看源代码后出现,看起来它实际上可能作用于列而不是行,因为提供了 axis = 0 参数。

我们可以测试的一种方法是使用normalize 函数并比较它相对于传递参数的执行情况。

这是进行预处理的代码。(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 ]


推荐阅读