使用带有特征和类名称的 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 可视化随机森林中的树的主要内容,如果未能解决你的问题,请参考以下文章

Java:在抽象类中创建获取扩展类名称的方法

决策树随机森林结果可视化

决策树随机森林结果可视化

Python 决策树 GraphViz

scikit学习决策树导出graphviz - 决策树中的错误类名

getElementsByClassName( )方法