在 scikit-learn 中约束线性回归器参数?

数据挖掘 scikit-学习 回归 线性回归 岭回归
2021-10-12 01:23:41

sklearn.linear_model.Ridge使用岭回归来提取多项式的系数。然而,一些系数具有要求它们为负的物理约束。有没有办法对这些参数施加约束?我在文档中没有发现...

作为一种解决方法,我尝试使用不同的复杂性参数(参见下面的玩具代码)进行许多拟合,并选择具有满足物理约束的系数的拟合,但这太不可靠而无法在生产中使用。

# Preliminaries
from sklearn.linear_model import Ridge
n_alphas = 2000
alphas = np.logspace(-15,3,n_alphas)
# Perform fit
fits = {}
for alpha in alphas:
   temp_ridge = Ridge(alpha, fit_intercept=False)
   temp_ridge.fit(indep_training_data, dep_training_data)
   temp_ridge_R2 = temp_ridge.score(indep_test_data, dep_test_data)
   fits[alpha] = [temp_ridge, temp_ridge_R2]

有没有办法使用岭回归对某些参数施加符号约束?谢谢!

2个回答

我假设形式的线性回归

y=w0x0+w1x1+wpxp+ε.

如果我们将所有输出观察结果组合成一个向量 y 并用左起 1 列将数据矩阵表示为 X,那么我们可以表示线性回归

y=Xw+ε,

其中 w=[w0,w1,,wp]Tε是模型误差的向量。如果将岭回归损失应用于此模型并简化表达式,您将获得以下损失函数。

E(w)=12wT[XTX+λI]w+[XTy]Tw

我们的目标是通过对系数的附加约束来最小化这个表达式。如果我们只假设负系数,我们将得到这个不等式约束

Iw0.

因此,我们得到了该问题的二次规划公式。

minimize: E(w)=12wT[XTX+λI]w+[XTy]Tw
subject to: Iw0

您可以使用cvxopt for Python直接解决此类问题您还可以有更复杂的线性约束(等式和不等式约束)。

注:CVXOPT 使用x对于未知数,它们是w在我的配方中。

可以将 scikit-learn 中的线性回归限制为仅正系数。sklearn.linear_model.LinearRegression一个选项positive=True

当设置为 True 时,强制系数为正。此选项仅支持密集阵列。

positive=True选项不适用于 scikit-learn 中的岭回归。