我正在尝试使用scikit-learn随机Logistic回归特征选择方法,但我一直遇到这种情况,在拟合时它会杀死所有特征并返回:
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之前通过带有StandardScaler的管道运行RLR,之后再通过SVM或RF运行RLR,并且还使用交叉验证,这使得在我的计算机上运行所需的总时间呈指数增长。
正如我在评论Leb的答案时提到的那样,正确的答案是它取决于数据。(目前为止)sklearn.pipeline.Pipeline
或sklearn.grid_search.GridSearchCV
无法捕获此特定情况。如果正则化参数足够紧,可以剔除输入数据集中的所有特征,并且没有其他需要训练的内容,则搜索最佳参数Pipeline
时,即将出现的分类器将失败(很明显)GridSearchCV
。
在这种情况下,我处理这种情况的方法是在将任何形式的特征选择添加到中前,彻底理解和探索我的数据Pipeline
。
作为示例用法,我将特征选择变换器放在的外部,Pipeline
然后将其手动拟合到一组不同的值上。我特别关注极端(非常高的正则化和非常低的正则化)。这给了我一个关于特征选择转换器何时剔除所有特征以及什么时候根本不选择特征的想法。然后,我将特征选择转换器重新添加到中,Pipeline
然后将其放入中GridSearchCV
。在这里,我确保为特征选择转换器搜索的参数都在我之前发现的两个极限之内,这可以防止我GridSearchCV
碰到零特征的情况并破坏它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句