我的问题在scikit:中对Lasso很一般
我正在用Lasso进行回归,以将一定数量的点y_i
拟合到特征x_i
。点的数量n
严格地低于特征的维度p
。
因此,对于给定的惩罚α系数,存在几种解决方案。
scikit给出的解取决于起始点(它是d
零系数的向量)。
除了修改库,你知道还有哪个库可以自由选择起点吗?
或者我在scikit中错过了一个选择起点的明显选项?
可以在scikit学习中为Lasso设置初始点。
但是可能有一个无限组同样好的解决方案,要发现你需要一些先进的二次规划方法
要设置初始点,只需使用warm_start=True
初始化模型并设置其coef_
属性。
像这样:
from sklearn.linear_model import Lasso
model = Lasso(warm_start=True)
model.coef_ = manual_initial_coef
model.fit(X, y)
这是可能的,因为scikit学习拉索实现中的代码包含
if not self.warm_start or not hasattr(self, "coef_"):
coef_ = np.zeros((n_targets, n_features), dtype=X.dtype,
order='F')
else:
coef_ = self.coef_
if coef_.ndim == 1:
coef_ = coef_[np.newaxis, :]
然而,在我看来,对于大多数问题,默认的初始系数(零)是最好的。事实上,当你应用套索时,你通常预计它的大多数最终系数都是零——为什么不从全零开始呢?
在退化设计矩阵的情况下,拉索解确实是非唯一的。但是不可能存在多个不相交的局部最优(就像在神经网络中一样),因为代价函数仍然是(非严格)凸的。相反,可能存在一组连续的(也是凸的)同样好的解。这种模糊性的一个最简单的情况是当x
由两个相同的列组成时:系数(beta, 0)
、(0, beta)
$,并且它们的所有凸组合都是相等的。
如果是这样的话,从多个随机点简单地重新启动不会给你一整套解决方案。相反,您需要使用特殊的技术来以某种方式定义其角点(极值),或者以某种方式在该集合中定义"最佳"解决方案。定义唯一"最佳"解的一种方法是LARS算法(sklearn.linear_model.Lars
),它在不确定的情况下赋予所有协变量"平等的权利"。