Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套索非零系数的最大数目_Python_Matlab_Scipy_Scikit Learn_Lasso Regression - Fatal编程技术网

Python套索非零系数的最大数目

Python套索非零系数的最大数目,python,matlab,scipy,scikit-learn,lasso-regression,Python,Matlab,Scipy,Scikit Learn,Lasso Regression,我有一个相当大的数据集,其中包括100多个系数和数千个条目。因此,我想使用套索方法进行模型训练 我目前正在查阅sci工具包文档,内容包括: 虽然实现看起来很简单,但我无法找到允许限制非零系数最大数量的输入参数,例如限制为10 更清楚地说,参数“DFMax”允许进行上述操作 在任何Python实现中都有这样的选项吗?直接限制非零系数的数量是一个NP难问题,这是LASSO渐近解决这个NP难问题的优点之一 我不知道DFMax在Matlab中的实现,但我的建议是执行以下操作: 使用LassoCV

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

我目前正在查阅sci工具包文档,内容包括:

虽然实现看起来很简单,但我无法找到允许限制非零系数最大数量的输入参数,例如限制为10

更清楚地说,参数“DFMax”允许进行上述操作


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

直接限制非零系数的数量是一个NP难问题,这是LASSO渐近解决这个NP难问题的优点之一

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

  • 使用LassoCV查找最佳alpha值
  • 如果非零系数的数量小于您的限制,则取此alpha值
  • 如果非零系数的数量大于您的限制,请使用Lasso和一系列递增的alpha,其中LassoCV的alpha为最小值,并在非零系数的数量等于或低于阈值时停止
    我认为公认的答案不是最好的。这里是一个寻找一定数量套索系数的示例

    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)
    

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

    +1,因为它似乎也没有DFMax参数。Hmm。只是理论上的一句话:对非零系数数量的硬约束将这个简单的问题(在复杂性类别P中)转化为一个通常不可行的硬问题(NP难)。不确定matlab是如何处理这个问题的(除了分支和边界之外,可能性不大)。我不会感到惊讶,看到一个巨大的性能下降,然后。例如,您可以在cvxpy中将该问题定义为混合整数规划问题。
    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)
    
    logit = LogisticRegression(penalty='l1', C=0.03048243, solver='liblinear')
    logit.fit(X, y)
    np.sum(logit.coef_ != 0)