在Python中为RFE模型选择功能数量

时间:2019-08-18 10:20:13

标签: python machine-learning scikit-learn

我的数据集包含120多个要素,我想使用RFE选择应该使用的要素/列名。 我有一个问题,因为RFE非常慢。我的代码如下:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

full_df = pd.read_csv('data.csv')

x = full_df.iloc[:,:-1]
y = full_df.iloc[:,-1]

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 42)

model = LogisticRegression(solver ='lbfgs')

for i in range(1,120):

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

    print(acc)
    print(fit.support_)

我的问题是:rfe = RFE(model, i)。我不知道i的最佳号码是多少。这就是为什么我将其放在for i in range(1,120)中的原因。有什么更好的方法吗? scikit learn中是否有更好的功能可以帮助我确定功能的数量和这些功能的名称?

因为这花了很长时间,所以我改变了方法,我想看看您对此有何看法,这是一种好的/正确的方法。

首先,我做了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中使用相同的分类器?

0 个答案:

没有答案