3

我有一个相当大的数据集,其中包括 100 多个系数和数千个条目。因此,我想使用 Lasso 方法进行模型训练。

我目前正在研究 sci-kit 文档:

尽管实现看起来很简单,但我找不到允许限制非零系数的最大数量的输入参数,例如 10。

更清楚地说,在 Lasso 的 MatLab 实现中,参数 'DFMax' 允许上述情况。

在任何 Python 实现中都有这样的选项吗?

4

2 回答 2

0

直接限制非零系数的数量是一个 NP-hard 问题,这是 LASSO 的优点之一,它渐近地解决了这个 NP-hard 问题。

我不知道 DFMax 在 Matlab 中的实现,但我的建议是执行以下操作:

  1. 使用 LassoCV 找到最佳 alpha 值。
  2. 如果非零系数的数量小于您的限制,请采用此 alpha 值。
  3. 如果非零系数的数量大于您的限制,请使用 Lasso 和以您的 LassoCV 的 alpha 作为最小值的递增 alpha 列表,并在非零系数的数量等于或低于您的阈值时停止。
于 2017-06-30T19:03:21.477 回答
0

我认为接受的答案不是最好的。这是一个找到一定数量的套索系数的例子。

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from scipy.optimize import differential_evolution

X, y = make_classification(n_samples=2000, n_features=50, n_informative=10, random_state=10)
logit = LogisticRegression(penalty='l1', C=1.0)

target = 10

def func(C):
    logit = LogisticRegression(penalty='l1', C=C[0], solver='liblinear')
    logit.fit(X, y)
    n_nonzero = np.sum(logit.coef_ != 0)
    return (target-n_nonzero)**2

differential_evolution(func, bounds=[(0, 2)], tol=0.1, maxiter=20)
     fun: 0.0
 message: 'Optimization terminated successfully.'
    nfev: 212
     nit: 13
 success: True
       x: array([0.03048243])
logit = LogisticRegression(penalty='l1', C=0.03048243, solver='liblinear')
logit.fit(X, y)
np.sum(logit.coef_ != 0)

我们找到了最佳正则化参数,以便恰好有 10 个非零系数。

于 2019-10-15T21:47:55.433 回答