我试图使用scikit-learn的随机逻辑回归特征选择方法,但在拟合过程中经常遇到所有特征都被删除的情况,并返回以下错误:
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
或正则化参数越低),我的机器拟合所需的时间就越长。再加上我通常通过一个包含StandardScaler
的管道运行RLR,然后是RLR之后的SVM或RF,并且还使用交叉验证,这使得我在机器上运行所需的总时间呈指数级增长。
回答:
正如我在对Leb的回答的评论中提到的,正确答案是这取决于数据。目前,sklearn.pipeline.Pipeline
或sklearn.grid_search.GridSearchCV
无法捕捉到这种特定情况。如果正则化参数足够严格,以至于删除了输入数据集中的所有特征,并且没有剩余的训练数据,那么当GridSearchCV
在搜索最优参数时,Pipeline
中的后续分类器将(显然)失败。
在我的案例中,我通过在将任何形式的特征选择添加到Pipeline
之前,彻底了解和探索我的数据来处理这种情况。
作为一个使用示例,我将特征选择转换器移出Pipeline
,并在不同的值集上手动拟合它。我特别关注极端情况(非常高的正则化和非常低的正则化)。这让我了解到特征选择转换器何时会删除所有特征,以及何时完全不进行特征选择。然后,我将我的特征选择转换器重新添加到Pipeline
中,并将其放入GridSearchCV
。在这里,我确保为特征选择转换器搜索的参数处于我之前发现的两个极端之间的舒适范围内——这可以防止我的GridSearchCV
遇到零特征情况并崩溃。