我正在使用 scikit learn 的线性模型进行岭回归。岭回归惩罚远离零的参数。我想惩罚远离某个先验,每个参数都有不同的先验。
scikit learn 的线性模型可以做到这一点吗?我知道那里有一个BayesianRidge模块,但我不确定它的作用。
我正在使用 scikit learn 的线性模型进行岭回归。岭回归惩罚远离零的参数。我想惩罚远离某个先验,每个参数都有不同的先验。
scikit learn 的线性模型可以做到这一点吗?我知道那里有一个BayesianRidge模块,但我不确定它的作用。
岭回归看起来像:
如果你想改为计算
我想您可以使用新变量将其缩小到零
所以你会解决:
然后再次应用变量的变化(即)。
所以回顾一下,如果我有一些黑盒函数,我可以使用它来解决任意先验只需调用。
Dapz 在唯一答案中发布的内容并没有做它应该做的事情。如果我为任何选择一个 > 0 的值,比如“i-th”,则“i”的相应将低于标准岭回归,而不是应该更高(因为我们惩罚远离大于 0 的东西,而不是远离 0)。
我认为这段代码应该可以工作,实现上面其他人建议的解决方案:
def fit_with_prior(model, X, y, sample_weight=None, prior=None):
"""Fit a regularized model with a nonzero prior"""
assert prior is not None, "you need to specify a prior"
new_y = y - np.sum(prior * X, axis=1)
model.fit(X, new_y, sample_weight=sample_weight)
model.coef_ += prior # modifying underlying model's coefficients
# what about the intercept?
像往常一样初始化Ridge模型对象:my_ridge = Ridge(alpha,...),而不是调用my_ridge.fit(X, y),调用fit_with_prior(my_ridge, X, y, prior=prior),其中prior是长度等于 中的列数的向量x,是您想要正则化的先验值。我认为截距项可能不会受到惩罚,因此可以出于此转换的目的而忽略(除非您明确添加一列常量到X,在这种情况下,它将像其他系数一样被处理)。我认为它也应该适用于其他正则化线性模型,例如ElasticNet,只要它们使用它们的coef_属性来进行预测和评分,这Ridge似乎基于我的测试。