Я новичок в программировании, и эту проблему может быть довольно легко исправить, но я застрял на ней какое-то время и думаю, что мой подход просто неверен. Как видно из названия, я пытался реализовать поиск сетки в моем прогнозе 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

После некоторой очистки данных и предварительной обработки я сделал такой поиск по сетке, где 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 и т. Д. Все еще были строками и ожидали целые числа. В конечном итоге я хотел получить вывод наиболее важных функций примерно так:

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

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

2
Robert Redisch 15 Апр 2020 в 22:58

1 ответ

Лучший ответ

После того, как вы запустите 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_
1
MaximeKan 15 Апр 2020 в 20:26