如何在 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.1
、0.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.Pipeline
或 sklearn.grid_search.GridSearchCV
没有办法(截至目前)来捕获这种特定情况。如果正则化参数足够紧,可以剔除输入数据集中的所有特征,并且没有什么可训练的,那么当GridSearchCV
搜索最佳参数时,Pipeline
中即将出现的分类器将失败(显然)。
在我的案例中,我处理这种情况的方法是在将任何形式的特征选择添加到 Pipeline
之前彻底理解和探索我的数据。
作为一个示例用法,我将特征选择转换器置于Pipeline
之外,并手动将其拟合到一组不同的值上。我特别关注极端情况(非常高的正则化和非常低的正则化)。这让我知道特征选择转换器何时剔除所有特征,以及何时根本不进行特征选择。然后我将我的特征选择转换器添加回Pipeline
并将其放入GridSearchCV
。在这里,我确保特征选择转换器的搜索参数在我之前发现的两个极端范围内 - 这可以防止我的 GridSearchCV
遇到零特征情况并崩溃。
【讨论】:
以上是关于如何在 scikit-learn 中使用随机逻辑回归找到最低的正则化参数 (C)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?