如何手动选择 Scikit-Learn 模型回归的特征

问题描述 投票:0回答:1

这是一个非常简单的问题,所以我希望得到一个简单的答案。我怀疑我错过了一些明显的东西......

在 Scikit-learn 中,有多种方法可以进行自动特征选择

例如

my_feature_selector = SelectKBest(score_func=f_regression, k=3)
my_feature_selector.fit_transform(X, y)

然后可以使用

检索所选功能
feature_idx = my_feature_selector.get_support(indices=True)
feature_names = X.columns[feature_idx]

(注意,在我的例子中

X
y
是带有命名列的 Pandas 数据框)。

它们也被保存为拟合模型的属性:

feature_names = my_model.feature_names_in_

但是,我想构建一个具有手动(即预先指定)功能集的管道。

显然,每次进行训练或预测时,我都可以从完整数据集中手动选择特征:

model1_feature_names = ['MedInc', 'AveRooms', 'Latitude']
model1.fit(X[model1_feature_names], y)
y_pred1 = model1.predict(X[model1.feature_names_in_])

但我想要一种更方便的方法来构建不同的模型(或管道),每个模型使用一组可能不同的(手动指定的)功能。理想情况下,我会将

feature_names_in_
指定为初始化参数,以便稍后我不必担心转换数据,并且可以在完整数据集上运行我的模型(或管道),如下所示:

model1.fit(X, y)  # uses a pre-defined sub-set of features in X
model2.fit(X, y)  # uses a different sub-set of features
y_pred1 = model1.predict(X)
y_pred2 = model2.predict(X)

我是否需要构建一个自定义功能选择器才能执行此操作?当然有更简单的方法。

我想我期待找到类似内置

FeatureSelector
类的东西,我可以在管道中使用它,如下所示:

my_feature_selector1 = FeatureSelector(feature_names=['MedInc', 'AveRooms', 'Latitude'])
my_feature_selector1.fit_transform(X, y)  # This would do nothing

pipe1 = Pipeline([('feature_selector', my_feature_selector1), ('model', LinearRegression())])
python scikit-learn pipeline feature-selection
1个回答
0
投票

您可以使用

ColumnTransformer
进行列选择。在当前情况下,您想要 passthrough 重要的列并 drop 不重要的列:

my_feature_selector1 = ColumnTransformer([
  ("selector", "passthrough", ['MedInc', 'AveRooms', 'Latitude'])
], remainder = "drop")

值得指出的是,

ColumnTransformer
支持基于名称和基于索引的列选择列表。

© www.soinside.com 2019 - 2024. All rights reserved.