Я использовал pipeline и grid_search для выбора лучших параметров, а затем использовал эти параметры, чтобы соответствовать лучшему конвейеру ('best_pipe'). Однако, поскольку feature_selection (SelectKBest) находится в стадии разработки, к SelectKBest не применялось соответствие.

Мне нужно знать названия выбранных функций "k". Есть идеи, как их получить? заранее спасибо

from sklearn import (cross_validation, feature_selection, pipeline,
                     preprocessing, linear_model, grid_search)
folds = 5
split = cross_validation.StratifiedKFold(target, n_folds=folds, shuffle = False, random_state = 0)

scores = []
for k, (train, test) in enumerate(split):

    X_train, X_test, y_train, y_test = X.ix[train], X.ix[test], y.ix[train], y.ix[test]

    top_feat = feature_selection.SelectKBest()

    pipe = pipeline.Pipeline([('scaler', preprocessing.StandardScaler()),
                                 ('feat', top_feat),
                                 ('clf', linear_model.LogisticRegression())])

    K = [40, 60, 80, 100]
    C = [1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001]
    penalty = ['l1', 'l2']

    param_grid = [{'feat__k': K,
                  'clf__C': C,
                  'clf__penalty': penalty}]

    scoring = 'precision'

    gs = grid_search.GridSearchCV(estimator=pipe, param_grid = param_grid, scoring = scoring)
    gs.fit(X_train, y_train)

    best_score = gs.best_score_
    scores.append(best_score)

    print "Fold: {} {} {:.4f}".format(k+1, scoring, best_score)
    print gs.best_params_

best_pipe = pipeline.Pipeline([('scale', preprocessing.StandardScaler()),
                          ('feat', feature_selection.SelectKBest(k=80)),
                          ('clf', linear_model.LogisticRegression(C=.0001, penalty='l2'))])

best_pipe.fit(X_train, y_train)
best_pipe.predict(X_test)
9
figgy 27 Окт 2015 в 21:42

3 ответа

Лучший ответ

Вы можете получить доступ к селектору функций по имени в best_pipe:

features = best_pipe.named_steps['feat']

Затем вы можете вызвать transform() в массиве индексов, чтобы получить имена выбранных столбцов:

X.columns[features.transform(np.arange(len(X.columns)))]

Выходными данными здесь будут восемьдесят имен столбцов, выбранных в конвейере.

7
jakevdp 28 Окт 2015 в 12:55

Это может быть поучительной альтернативой: я столкнулся с той же потребностью, которую просил OP. Если кто-то хочет получить показатели k лучших характеристик непосредственно из GridSearchCV:

finalFeatureIndices = gs.best_estimator_.named_steps["feat"].get_support(indices=True)

А с помощью манипуляции с индексом можно получить finalFeatureList:

finalFeatureList = [initialFeatureList[i] for i in finalFeatureIndices]
5
Mogsdad 19 Апр 2016 в 01:36

Ответ Джейка полностью работает. Но в зависимости от того, какой селектор функций вы используете, есть еще один вариант, который, на мой взгляд, чище. Это сработало для меня:

X.columns[features.get_support()]

Это дало мне идентичный ответ на ответ Джейка. И вы можете узнать об этом больше в документы, но get_support возвращает массив истинных / ложных значений в зависимости от того, использовался ли столбец. Также стоит отметить, что X должен иметь форму, идентичную обучающим данным, используемым в селекторе функций.

6
andrew 6 Сен 2017 в 17:23