Как я могу получить feature_importances_ от GridsearchCV - PullRequest
2 голосов
/ 15 апреля 2020

Я довольно новичок в программировании, и эту проблему может быть довольно легко решить, но я застрял на ней некоторое время, и я думаю, что мой подход просто ошибочен. Как видно из названия, я пытался реализовать поиск по сетке в моем прогнозе RandomForest, чтобы найти наилучшие возможные параметры для моей модели, а затем увидеть наиболее важные характеристики модели с наилучшими параметрами. Пакеты, которые я использовал:

import nltk
from nltk.corpus import stopwords
import pandas as pd
import string
import re
import pickle
import os
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import KFold, cross_val_score
from sklearn.metrics import precision_recall_fscore_support as score
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV

После некоторой очистки данных и предварительной обработки я создал такой gridsearch, где x_features - это DataFrame с функциями tfidfvectorized моих данных:

param = {'n_estimators':[10, 50, 150], 'max_depth':[10, 30, 50, None], 'min_impurity_decrease':[0, 0.01, 0.05, 0.1], 'class_weight':["balanced", None]}
gs = GridSearchCV(rf, param, cv=5, n_jobs=-1)
gs_fit = gs.fit(x_features, mydata['label'])
optimal_param = pd.DataFrame(gs_fit.cv_results_).sort_values('mean_test_score', ascending = False)[0:5]
optimal_param1 = gs_fit.best_params_

Моя идея заключалась в том, что, возможно, я мог бы упростить для себя и скопировать в optim_param1 в мой RandomForestClassifier (), и разместить его на моих тренировочных данных более или менее следующим образом:

rf = RandomForestClassifier(optimal_param2)
rf_model= rf.fit(x_train, y_train)

, но optim_param2 это диктат. Поэтому я подумал, что преобразование его в строку и избавление от слишком больших знаков (sub: for =, delete {, delete}) заставит его работать. Это явно не удалось, так как числа для n_estimators, max_depth et c. были еще строки, и он ожидал целых чисел. В конце концов я хотел получить вывод о наиболее важных функциях, более или менее подобных этому:

top25_features = sorted(zip(rf_model.feature_importances_, x_train.columns),reverse=True)[0:25]

Я понимаю, что gs уже является полной моделью RF, но в ней нет атрибут feature_importances_, который я искал. Я был бы очень благодарен за любые идеи о том, как заставить это работать.

1 Ответ

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

После того, как вы запустите gs_fit=gs.fit(X,y), у вас есть все, что вам нужно, и вам не нужно проводить переподготовку.

Сначала вы можете получить доступ к лучшей модели, выполнив:

best_estimator = gs_fit.best_estimator_

Возвращает Случайный Лес, который дал лучшие результаты. Затем вы можете получить доступ к важным функциям этой модели, выполнив

best_features = best_estimator.feature_importances_

. Очевидно, вы можете связать их и сразу выполнить:

best_features = gs_fit.best_estimator_.feature_importances_
...