如何在 scikit-learn 中使用随机逻辑回归找到最低的正则化参数 (C)?
How do I found the lowest regularization parameter (C) using Randomized Logistic Regression in scikit-learn?
我正在尝试使用 scikit-learn Randomized Logistic Regression 特征选择方法,但我一直 运行ning 在拟合时杀死所有特征的情况下,并且 returns:
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 的管道进行 RLR,并且还使用交叉验证,使得在我的机器上 运行 所需的总时间激增呈指数增长。
没有代码就很难找出问题所在,原因是我不认为错误与您的 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
值的原因,而是与您将数据呈现给回归的方式有关。同样,没有代码很难看清楚。
正如我在对 Leb 的回答的评论中提到的,正确的答案是它取决于数据。 sklearn.pipeline.Pipeline
或 sklearn.grid_search.GridSearchCV
无法(截至目前)捕获此特定案例。如果正则化参数足够严格以至于它剔除了输入数据集中的所有特征,并且没有任何东西可以训练,那么 Pipeline
中即将到来的分类器将在 GridSearchCV
搜索时失败(显然)以获得最佳参数。
在我的案例中,我处理这种情况的方法是在将任何形式的特征选择添加到 Pipeline
之前彻底理解和探索我的数据。
作为示例用法,我将特征选择转换器放在 Pipeline
之外,并手动将其拟合到一组不同的值上。我特别关注极端情况(非常高的正则化和非常低的正则化)。这让我知道特征选择转换器何时剔除所有特征,以及何时根本不进行特征选择。然后我将我的特征选择转换器添加回 Pipeline
并将其放入 GridSearchCV
。在这里,我确保搜索到的特征选择转换器的参数在我之前发现的两个极端范围内 - 这可以防止我的 GridSearchCV
遇到零特征情况并崩溃。
我正在尝试使用 scikit-learn Randomized Logistic Regression 特征选择方法,但我一直 运行ning 在拟合时杀死所有特征的情况下,并且 returns:
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 的管道进行 RLR,并且还使用交叉验证,使得在我的机器上 运行 所需的总时间激增呈指数增长。
没有代码就很难找出问题所在,原因是我不认为错误与您的 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
值的原因,而是与您将数据呈现给回归的方式有关。同样,没有代码很难看清楚。
正如我在对 Leb 的回答的评论中提到的,正确的答案是它取决于数据。 sklearn.pipeline.Pipeline
或 sklearn.grid_search.GridSearchCV
无法(截至目前)捕获此特定案例。如果正则化参数足够严格以至于它剔除了输入数据集中的所有特征,并且没有任何东西可以训练,那么 Pipeline
中即将到来的分类器将在 GridSearchCV
搜索时失败(显然)以获得最佳参数。
在我的案例中,我处理这种情况的方法是在将任何形式的特征选择添加到 Pipeline
之前彻底理解和探索我的数据。
作为示例用法,我将特征选择转换器放在 Pipeline
之外,并手动将其拟合到一组不同的值上。我特别关注极端情况(非常高的正则化和非常低的正则化)。这让我知道特征选择转换器何时剔除所有特征,以及何时根本不进行特征选择。然后我将我的特征选择转换器添加回 Pipeline
并将其放入 GridSearchCV
。在这里,我确保搜索到的特征选择转换器的参数在我之前发现的两个极端范围内 - 这可以防止我的 GridSearchCV
遇到零特征情况并崩溃。