我刚开始编程,这个问题可能很容易解决,但是我已经坚持了一段时间,而且我认为我的方法显然是错误的。如标题所示,我一直在尝试对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是具有数据tfidfvectorized功能的DataFrame:
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_
我在这里的想法是,也许我可以使自己更轻松,然后将optimum_param1复制到我的RandomForestClassifier()中,然后将其像这样或多或少地适合我的训练数据:
rf = RandomForestClassifier(optimal_param2)
rf_model= rf.fit(x_train, y_train)
但是optimum_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模型,但是它没有我一直在寻找的attribute_importances_属性。对于如何使它起作用的任何想法,我将非常感谢。
运行后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_
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句