使用 Python 的 Scikit-Learn 选择最佳特征数量的过程

数据挖掘 机器学习 Python scikit-学习 数据科学模型
2022-02-16 20:19:40

我有一个包含 130 个特征(1000 行)的数据集。我想为我的分类器选择最佳特征。我开始了,RFE但它花了太长时间,我这样做了:

number_of_columns = 130

for i in range(1, number_of_columns):
    rfe = RFE(model, i)
    fit = rfe.fit(x_train, y_train)
    acc = fit.score(x_test, y_test

因为这花了很长时间,我改变了我的方法,我想看看你是怎么想的,这是好的/正确的方法。

首先我做了PCA,我发现除了最后 9 列之外,每列的参与率约为 1-0.4%。最后 9 列的参与率低于 0.00001%,所以我删除了它们。现在我有 121 个特征。

pca = PCA() fit = pca.fit(x)

然后我将我的数据分成训练和测试(具有 121 个特征)。

然后我使用SelectFromModel了 ,并用 4 个不同的分类器对其进行了测试。每个分类器都SelectFromModel减少了列数。我选择了由分类器确定的列数,它给了我最好的准确性:

model = SelectFromModel(clf, prefit=True)
#train_score = clf.score(x_train, y_train)
test_score = clf.score(x_test, y_test)
column_res = model.transform(x_train).shape

最后我使用了“RFE”。我使用了通过“SelectFromModel”获得的列数。

rfe = RFE(model, number_of_columns)
fit = rfe.fit(x_train, y_train)
acc = fit.score(x_test, y_test)

这是一个好方法,还是我做错了什么?

另外,如果我使用一个分类器获得了最大的准确性SelectFromModel,我是否需要在 中使用相同的分类器RFE

2个回答

你可以试试 Lasso(l1 惩罚),它通过“收缩”参数进行自动特征选择。这是处理具有多列和“不多”行的数据的标准方法之一。

sklearn.linear_model.LogisticRegression(penalty=’l1‘,...

另见这篇文章

编辑:

《统计学习导论》一书给出了很好的概述。以下是本书中的 Python 代码示例。第 6.6.2 节介绍了 Lasso。

对于这么多功能,我使用 Selectbest sklearn.feature_selection.SelectKBest

为此,我取所有特征的 1/4、1/3、1/2、2/3、3/4,并分析用于衡量误差的分数如何变化。

其他选项:

我使用 LassoCV sklearn.linear_model.LassoCV

如下:

kfold_on_rf = StratifiedKFold(
    n_splits=10, 
    shuffle=False, 
    random_state=SEED
)

lasso_cv = LassoCV(cv=kfold_on_rf, random_state=SEED, verbose=0)
sfm = SelectFromModel(lasso_cv)