Sklearn selectKbest: какие переменные были выбраны?

Я пытаюсь получить sklearn для выбора лучших k переменных (например, k = 1) для линейной регрессии. Это работает, и я могу получить R-квадрат, но он не говорит мне, какие переменные были лучшими. Как я могу это узнать?

У меня есть код следующей формы (список реальных переменных намного длиннее):

X=[]
for i in range(len(df)):
X.append([averageindegree[i],indeg3_sum[i],indeg5_sum[i],indeg10_sum[i])


training=[]
actual=[]
counter=0
for fold in range(500):
    X_train, X_test, y_train, y_test = crossval.train_test_split(X, y, test_size=0.3)
    clf = LinearRegression()
    #clf = RidgeCV()
    #clf = LogisticRegression()
    #clf=ElasticNetCV()

    b = fs.SelectKBest(fs.f_regression, k=1) #k is number of features.
    b.fit(X_train, y_train)
    #print b.get_params

    X_train = X_train[:, b.get_support()]
    X_test = X_test[:, b.get_support()]


    clf.fit(X_train,y_train)
    sc = clf.score(X_train, y_train)
    training.append(sc)
    #print "The training R-Squared for fold " + str(1) + " is " + str(round(sc*100,1))+"%"
    sc = clf.score(X_test, y_test)
    actual.append(sc)
    #print "The actual R-Squared for fold " + str(1) + " is " + str(round(sc*100,1))+"%"

Ответ 1

Попробуйте использовать b.fit_transform() вместо b.tranform(). fit_transform() с подгонкой и преобразовать ваш вход X в новый X с выбранными функциями и вернуть новый X.

...
b = fs.SelectKBest(fs.f_regression, k=1) #k is number of features.
X_train = b.fit_transform(X_train, y_train)
#print b.get_params
...

Ответ 2

Вам нужно использовать get_support:

features_columns = [.......]
fs = SelectKBest(score_func=f_regression, k=5)
print zip(fs.get_support(),features_columns)

Ответ 3

Способ сделать это - настроить SelectKBest с вашей любимой функцией (регрессия в вашем случае), а затем получить из нее параметры. Мой код предполагает, что у вас есть список features_list, который содержит имена всех заголовков X.

    kb = SelectKBest(score_func=f_regression, k=5) # configure SelectKBest
    kb.fit(X, Y)  # fit it to your data
    # get_support gives a vector [False, False, True, False....]
    print(features_list[kb.get_support()])

Конечно, вы можете написать больше pythonic, чем я: -)