使用带有特征和类名称的 graphviz 可视化随机森林中的树
Posted
技术标签:
【中文标题】使用带有特征和类名称的 graphviz 可视化随机森林中的树【英文标题】:Visualising trees from random forest using graphviz with feature and class names 【发布时间】:2021-08-15 07:19:13 【问题描述】:我已经使用 randomsearch CV 训练了一个随机森林分类器,并且想使用 graphviz 导出前 5 个决策树。我的特征数据是数据框格式,我的类数据是系列格式。
我可以使用下面的代码导出树
from sklearn.pipeline import Pipeline
#define classifier
clf = RandomForestClassifier()
#define the pipeline - chain the column transformer and the classifier
pipe = Pipeline([('ct',column_trans), ('clf',clf)])
#randomised search cv with hyper parameters
#input the parameters for search space
param_grid =
'clf__n_estimators':[500, 1000, 5000],
'clf__max_features':['sqrt','log2'],
'clf__max_depth': [5, 10, 15, 20],
'clf__min_samples_split': [2,5,10,15],
'clf__min_samples_leaf': [2,5,10,15],
'clf__bootstrap': [True, False],
'clf__criterion': ['gini','entropy']
#create the random forest classifier object
rscv_rf = RandomizedSearchCV(estimator = pipe, param_distributions=param_grid, scoring= 'f1_macro', verbose=1, random_state=42)
#fit the rf model with X-train and y_train data
rf_model = rscv_rf.fit(X_train, y_train)
#plot decision trees
fig, axes = plt.subplots(nrows = 1,ncols = 5,figsize = (5,5), dpi=800)
for index in range(0, 5):
tree.plot_tree(rscv_rf.best_estimator_.named_steps['clf'].estimators_[index],filled = True, ax = axes[index])
axes[index].set_title('Estimator: ' + str(index), fontsize = 11)
fig.savefig('rf_5trees.png')
但是,当我尝试使用下面的代码包含功能名称和类名称时,我遇到了索引错误问题。有什么我错过了吗?我猜每棵树都会显示不同的特征,而我的原始数据帧只有 25 个特征,而我管道中的列转换器实际上做了一个热编码来创建 155 个特征,感谢任何形式的帮助。谢谢。
#plot decision trees
fn= list(X.columns)
cn= [str(s) for s in y.unique()]
fig, axes = plt.subplots(nrows = 1,ncols = 5,figsize = (5,5), dpi=800)
for index in range(0, 5):
tree.plot_tree(rscv_rf.best_estimator_.named_steps['clf'].estimators_[index], feature_names = fn, class_names = cn, filled = True,ax = axes[index])
axes[index].set_title('Estimator: ' + str(index), fontsize = 11)
fig.savefig('rf_5trees.png')
【问题讨论】:
【参考方案1】:设法得到一个可行的解决方案,但也很高兴收到其他解决方案
#retrieve the numerical and categorical variables before pipe and put into lists
numerical_columns = X.columns[X.dtypes == 'int64'].tolist()
categorical_columns = X.columns[X.dtypes != 'int64'].tolist()
#get the features that were one-hot encoded
onehot_columns = rscv_rf.best_estimator_.named_steps['ct'].named_transformers_['onehotencoder'].get_feature_names(input_features=categorical_columns)
#create a list of all the feature columns
feature_columns = = numerical_columns + list(onehot_columns)
fn = feature_columns
cn= [str(s) for s in y.unique()]
#plot the chart and save the figure
fig, axes = plt.subplots(nrows = 1,ncols = 5,figsize = (5,5), dpi=800)
for index in range(0, 5):
tree.plot_tree(rscv_rf.best_estimator_.named_steps['clf'].estimators_[index], feature_names = fn, class_names = cn, filled = True,ax = axes[index])
axes[index].set_title('Estimator: ' + str(index), fontsize = 11)
fig.savefig('rf_5trees.png')
【讨论】:
以上是关于使用带有特征和类名称的 graphviz 可视化随机森林中的树的主要内容,如果未能解决你的问题,请参考以下文章