我正在尝试使用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和SVM或RF之后通过带有StandardScaler的管道运行RLR,并且还使用交叉验证,使得在我的机器上运行所需的总时间呈指数级爆炸 .
2 回答
没有代码,'s a little hard to pinpoint the problem, the reason is I don' t认为错误与您的
C
值有关 . 但要回答这个问题,你需要GridSearchCV .这里的例子足以让你开始:
您始终可以通过在
cv
变量中指定cross-validation来进一步使用它 . 此外,如果您的数据很大,请不要忘记更改n_jobs
,非常有帮助 .现在我之所以没有
C
的 Value ,但更多地与你很难清楚地看到它的方式有关 .正如我对Leb的回答所说,正确的答案是它取决于数据 . 目前没有办法(截至目前)
sklearn.pipeline.Pipeline
或sklearn.grid_search.GridSearchCV
来捕捉这一具体案例 . 如果正则化参数足够紧以剔除输入数据集中的所有特征,并且没有任何东西需要训练,那么当GridSearchCV
正在搜索最佳参数时,Pipeline
中即将出现的分类器将会失败(显然) .在我的案例中,我处理这种情况的方法是在将任何形式的特征选择添加到_2605660中之前,彻底了解和探索我的数据 .
作为一个示例用法,我将特征选择变换器放在
Pipeline
之外,并手动将其放在一组不同的值上 . 我特别关注极端情况(非常高的正则化和非常低的正则化) . 这让我了解了特征选择变换器何时剔除所有特征,以及什么时候根本没有特征选择 . 然后我将我的特征选择变换器添加回Pipeline
并将其放入GridSearchCV
. 在这里,我确保特征选择变换器的搜索参数在我之前找到的两个极端中很舒服 - 这可以防止我的GridSearchCV
碰到零特征情况并且发生故障 .