如何在 scikit-learn 中使用随机逻辑回归找到最低的正则化参数 (C)?

Posted

技术标签:

【中文标题】如何在 scikit-learn 中使用随机逻辑回归找到最低的正则化参数 (C)?【英文标题】:How do I found the lowest regularization parameter (C) using Randomized Logistic Regression in scikit-learn? 【发布时间】:2016-02-21 23:01:08 【问题描述】:

我正在尝试使用 scikit-learn Randomized Logistic Regression 特征选择方法,但我一直遇到它在拟合时杀死所有特征并返回的情况:

ValueError: Found array with 0 feature(s) (shape=(777, 0)) while a minimum of 1 is required.

这与预期的一样,很明显,因为我将正则化参数 - C - 降低到非常低的水平(请注意,这是数学正则化参数 lambda 的倒数,即 C = 1/lambda 所以C越低,正则化越极端)。

我的问题是,如何提前找到我可以选择的最低C,而不需要手动测试多个值并删除引发此错误的值?

就我而言(从大约 250 个功能开始),我知道 C = 0.5 是我能达到的最低值。 0.10.4 甚至 0.49 在他们将我的功能集拉到 0 时抛出一个错误(并给出我在上面粘贴的 shape = (blah, 0) 错误)。

另一方面(也许这应该是一个不同的问题)——我的C 越高(也就是说,我的lambda 或正则化参数越低)——我的机器适应的时间越多。再加上我通常通过管道运行 RLR,在 RLR 之前使用 StandardScaler,之后使用 SVM 或 RF,并且还使用交叉验证,这使得在我的机器上运行所需的总时间呈指数级增长。

【问题讨论】:

【参考方案1】:

没有代码很难查明问题,原因是我不认为错误与您的C 值有关。但要回答这个问题,您需要GridSearchCV。

其中的示例足以让您入门:

>>> from sklearn import svm, grid_search, datasets
>>> iris = datasets.load_iris()
>>> parameters = 'kernel':('linear', 'rbf'), 'C':[1, 10]
>>> svr = svm.SVC()
>>> clf = grid_search.GridSearchCV(svr, parameters)
>>> clf.fit(iris.data, iris.target)
...                             
GridSearchCV(cv=None, error_score=...,
       estimator=SVC(C=1.0, cache_size=..., class_weight=..., coef0=...,
                     decision_function_shape=None, degree=..., gamma=...,
                     kernel='rbf', max_iter=-1, probability=False,
                     random_state=None, shrinking=True, tol=...,
                     verbose=False),
       fit_params=, iid=..., n_jobs=1,
       param_grid=..., pre_dispatch=..., refit=...,
       scoring=..., verbose=...)

您始终可以通过在 cv 变量中指定 cross-validation 来进一步了解它。另外,如果您的数据很大,请不要忘记更改n_jobs,非常有帮助。

现在我认为这不是C 值的原因,而是与您将数据呈现给回归的方式更相关。同样,没有代码很难看清楚。

【讨论】:

是的,我使用n_jobs=-1 进行所有培训。另外,我做了一些测试,错误肯定与C 值有关。 RLR 的不同数量的功能给了我不同的C 值,这可能导致所有变量的挤出。毕竟这是 L1/Lasso 风格的回归,它倾向于积极地将特征系数降低到 0(与 L2 相比,它抑制了所有的有点平坦)。我想答案是它确实取决于输入数据和想要实现的目标。【参考方案2】:

正如我在对 Leb 的回答的评论中提到的,正确的答案是它取决于数据。 sklearn.pipeline.Pipelinesklearn.grid_search.GridSearchCV 没有办法(截至目前)来捕获这种特定情况。如果正则化参数足够紧,可以剔除输入数据集中的所有特征,并且没有什么可训练的,那么当GridSearchCV 搜索最佳参数时,Pipeline 中即将出现的分类器将失败(显然)。

在我的案例中,我处理这种情况的方法是在将任何形式的特征选择添加到 Pipeline 之前彻底理解和探索我的数据。

作为一个示例用法,我将特征选择转换器置于Pipeline 之外,并手动将其拟合到一组不同的值上。我特别关注极端情况(非常高的正则化和非常低的正则化)。这让我知道特征选择转换器何时剔除所有特征,以及何时根本不进行特征选择。然后我将我的特征选择转换器添加回Pipeline 并将其放入GridSearchCV。在这里,我确保特征选择转换器的搜索参数在我之前发现的两个极端范围内 - 这可以防止我的 GridSearchCV 遇到零特征情况并崩溃。

【讨论】:

以上是关于如何在 scikit-learn 中使用随机逻辑回归找到最低的正则化参数 (C)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 scikit-learn 中保存随机森林?

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

Python机器学习中文版

Python机器学习中文版

使用 scikit-learn 并行生成随机森林