使用 sklearn 的岭回归制作 L 曲线

Posted

技术标签:

【中文标题】使用 sklearn 的岭回归制作 L 曲线【英文标题】:Making an L-curve with sklearn's ridge regression 【发布时间】:2020-02-14 08:35:42 【问题描述】:

可视化ridge regression 的解决方案的常用方法是L curve,它针对不同选择的正则化参数绘制误差平方和与岭惩罚的关系。这可以用sklearn吗?

【问题讨论】:

Sklearn 和 Python 提供了所有必要的构建块,但我知道没有现成的实现。 @kazemakase 确实有Yellowbrick - 请参阅下面的答案;虽然有趣的是,在各自的 R 包中存在多年的这种功能直到最近才通过 external 包找到了 Python 的方式...... 【参考方案1】:

这是一个纯粹的 sklearn 答案:

import numpy as np
from sklearn.linear_model import Ridge

alphas = np.logspace(-10, 10, 1000)
solution_norm = []
residual_norm = []

for alpha in alphas: 
    lm = Ridge(alpha=alpha)
    lm.fit(X, y)
    solution_norm += [(lm.coef_**2).sum()]
    residual_norm += [((lm.predict(X) - y)**2).sum()]

plt.loglog(residual_norm, solution_norm, 'k-')
plt.show()

其中Xy 分别是您的预测变量和目标。

【讨论】:

【参考方案2】:

scikit-learn 中并没有这样的内置功能,但是这样的功能是由Yellowbrick 库提供的(使用pipconda 安装);将 LassoCV 示例从他们的 documentation 调整到您的 RidgeCV 案例给出:

import numpy as np
from sklearn.linear_model import RidgeCV
from yellowbrick.regressor import AlphaSelection
from yellowbrick.datasets import load_concrete

# Load the regression dataset
X, y = load_concrete()

# Create a list of alphas to cross-validate against
alphas = np.logspace(-10, 1, 40)

# Instantiate the linear model and visualizer
model = RidgeCV(alphas=alphas)
visualizer = AlphaSelection(model)
visualizer.fit(X, y)
visualizer.show()

【讨论】:

感谢您的回答。请注意,这实际上不是 l 曲线。 l 曲线在 y 轴上显示岭惩罚(即平方系数之和,而不是岭参数),在 x 轴上显示误差(即平方残差之和)。

以上是关于使用 sklearn 的岭回归制作 L 曲线的主要内容,如果未能解决你的问题,请参考以下文章

使用插入符号的岭逻辑回归系数的标准误差

拓端tecdat|R语言Bootstrap的岭回归和自适应LASSO回归可视化

偏最小二乘法的岭回归分析

sklearn help之岭回归 ridge regression

机器学习实战---线性回归提高篇之乐高玩具套件二手价预测

R语言之岭回归