Python LASSO最大非零系数个数
Python LASSO maximum number of non-zero coefficients
我有一个非常大的数据集,其中包含 100 多个系数和数千个条目。因此,我想使用 Lasso 方法进行模型训练。
我目前正在查看以下 sci-kit 文档:
虽然实现看起来很简单,但我无法找到允许限制非零系数最大数量的输入参数,例如到 10.
为了更清楚,in the MatLab implementation of Lasso,参数 'DFMax' 允许上述。
在任何 Python 实现中是否有这样的选项?
直接限制非零系数的个数是一个NP-hard问题,这也是LASSO渐近解决这个NP-hard问题的妙处之一。
我不知道 DFMax 在 Matlab 中的实现,但我的建议是执行以下操作:
- 使用 LassoCV 找到最佳 alpha 值。
- 如果非零系数的数量小于您的限制,则采用此 alpha 值。
- 如果非零系数的数量大于您的限制,请使用套索和递增的 alpha 列表,以您的 LassoCV 的 alpha 作为最小值,并在非零系数的数量等于或低于您的阈值时停止。
我认为接受的答案不是最好的。下面是一个求一定数量的Lasso系数的例子。
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 个非零系数。
我有一个非常大的数据集,其中包含 100 多个系数和数千个条目。因此,我想使用 Lasso 方法进行模型训练。
我目前正在查看以下 sci-kit 文档:
虽然实现看起来很简单,但我无法找到允许限制非零系数最大数量的输入参数,例如到 10.
为了更清楚,in the MatLab implementation of Lasso,参数 'DFMax' 允许上述。
在任何 Python 实现中是否有这样的选项?
直接限制非零系数的个数是一个NP-hard问题,这也是LASSO渐近解决这个NP-hard问题的妙处之一。
我不知道 DFMax 在 Matlab 中的实现,但我的建议是执行以下操作:
- 使用 LassoCV 找到最佳 alpha 值。
- 如果非零系数的数量小于您的限制,则采用此 alpha 值。
- 如果非零系数的数量大于您的限制,请使用套索和递增的 alpha 列表,以您的 LassoCV 的 alpha 作为最小值,并在非零系数的数量等于或低于您的阈值时停止。
我认为接受的答案不是最好的。下面是一个求一定数量的Lasso系数的例子。
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 个非零系数。