Имена для выбора функций - PullRequest
1 голос
/ 14 апреля 2020

Я хочу знать названия функций в моей модели RF. Я прочитал здесь , что вывод gs.best_estimator_.named_steps["stepname"].feature_importances_ будет отражать мои столбцы из моих данных. Однако длина gs.best_estimator_.... равна 10, а у меня 13 столбцов. Некоторые столбцы были не важны. Из других ответов ( answer1 , answer2 ) я должен был бы объявить что-то в моем конвейере. Но я не совсем понимаю, что объявлять, потому что оба ответа касаются PCA, а не RF.

Вот что у меня есть.

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn import datasets

# use iris as example
iris = datasets.load_iris()
X = iris.drop(['sepal_length'],axis=1)
y = iris.sepal_length
cats_feats = ['species']
X_train, X_test, y_train, y_test = \
        train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=13)
# Pipeline
categorical_transformer = Pipeline(steps=[
                ('onehot', OneHotEncoder(handle_unknown='ignore',sparse=False))
                                    ])
# Bundle any preprocessing
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', categorical_transformer, cat_feats)
    ])
rf = RandomForestRegressor(random_state = 13)
mymodel = Pipeline(steps = [('preprocessor', preprocessor),
                            ('model', rf)
                            ])
# For this example, I used default values. In reality I do use a dictionary of parameters
gs = GridSearchCV(mymodel
                           ,n_jobs = -1
                           ,cv = 5
                           )
gs.fit(X_train,y_train)

1 Ответ

1 голос
/ 15 апреля 2020

Почему длина списка функций не совпадает

Длина ваших функций не совпадает, поскольку все некатегориальные столбцы отбрасываются при использовании ColumnTransformer. По умолчанию он сохраняет только столбцы, для которых было указано преобразование. В результате, если вы не хотите, чтобы это произошло, вам нужно сделать это

preprocessor = ColumnTransformer(transformers=[('cat', OneHotEncoder(), cat_feats)],
                                 remainder='passthrough')

(я удалил ваш категориальный конвейер, который здесь не нужен)

Также имейте в виду что применение OHE добавит функции, и поэтому общее число функций будет больше, чем у вас было в начале.

Как получить названия функций

После того, как вы все установили вам нужно получить имена элементов для результата OHE и оставшихся числовых столбцов.

Для столбцов OHE:

cat_features = gs.best_estimator_["preprocessor"].named_transformers_["cat"].get_feature_names()

Для числовых столбцов необходимо объявить num_feats где все числовые элементы находятся в том же порядке, что и в исходном кадре данных.

Затем просто выполните:

feature_names = np.concatenate((cat_features, num_feats))

PS: это немного громоздко, и это может быть улучшено в более поздние версии sklearn, но на данный момент это процедура

...