关于Scikit-learn中SequentialFeatureSelector最多返回n_features_in_-1个预测器的原因及相关疑问
Scikit-learn中SequentialFeatureSelector最多返回n_features_in_-1个预测器的原因及相关疑问
我有一个包含6个特征的训练数据集,正在使用SequentialFeatureSelector为线性回归模型寻找“最优”特征子集。以下代码返回了三个特征,我将它们命名为X1, X2, X3。
sfs = SequentialFeatureSelector(LinearRegression(), n_features_to_select='auto', tol=0.05, direction='forward', scoring='neg_root_mean_squared_error', cv=8) sfs.fit_transform(X_train, y_train)
为了验证结果,我决定用特征子集X1, X2, X3代替X_train运行相同的代码。我原本以为会再次得到X1, X2, X3,但结果只返回了X1, X2。同样地,用这两个特征再次运行代码,只返回了X1。看起来SequentialFeatureSelector的行为总是返回输入特征的真子集,最多包含n_features_in_ - 1列,但我在scikit-learn文档里找不到相关说明。这种情况是否正确?如果是的话,不允许返回全部特征的原因是什么?
我还测试了反向选择是否会返回全部特征集。
sfs = SequentialFeatureSelector(LinearRegression(), n_features_to_select='auto', tol=1000, direction='backward', scoring='neg_root_mean_squared_error', cv=8) sfs.fit_transform(X_train, y_train)
我把阈值tol设得很大,希望从X_train的全部特征集出发不会有令人满意的性能提升。但结果并没有返回原来的6个特征,只返回了5个。文档里只提到:
如果连续两次添加或移除特征之间的分数增量不至少达到tol,则停止添加或移除。
看起来全部特征集在交叉验证过程中没有被考虑到,而且SequentialFeatureSelector在向前选择的最后阶段或向后选择的初始阶段的行为有所不同。如果全部特征集的性能优于任何真子集,那我们难道不希望SequentialFeatureSelector返回这个结果吗?有没有标准方法可以用交叉验证来比较选中的特征真子集和全部特征集?
备注:内容来源于stack exchange,提问作者CodingLikeAFox
相关产品推荐
相关产品推荐

