我在SciKit-Learn中结合管道使用特征选择。作为特征选择策略,我使用SelectKBest
。
管道创建和执行如下所示:
select = SelectKBest(k=5)clf = SVC(decision_function_shape='ovo') parameters = dict(feature_selection__k=[1,2,3,4,5,6,7,8], svc__C=[0.01, 0.1, 1], svc__decision_function_shape=['ovo'])steps = [('feature_selection', select), ('svc', clf)]pipeline = sklearn.pipeline.Pipeline(steps)cv = sklearn.grid_search.GridSearchCV(pipeline, param_grid=parameters)cv.fit( features_training, labels_training )
我知道通过cv.best_params_
可以获取最佳参数。然而,这只能告诉我k=4
是最优的。但我想知道这些特征具体是哪些?这该如何实现呢?
回答:
对于你的例子,你可以使用cv.best_estimator_.named_steps['feature_selection'].scores_
来获取所有特征的分数。通过这些分数,你应该能够看到哪些特征被选中了。同样,你也可以通过cv.best_estimator_.named_steps['feature_selection'].pvalues_
来获取p值。
编辑
更好的方法是使用SelectKBest
类的get_support
方法。这将返回一个形状为[# input features]
的布尔数组,其中元素为True表示对应的特征被选中保留。具体如下:
cv.best_estimator_.named_steps['feature_selection'].get_support()