30

我想绘制一个随机森林的决策树。所以,我创建了以下代码:

clf = RandomForestClassifier(n_estimators=100)
import pydotplus
import six
from sklearn import tree
dotfile = six.StringIO()
i_tree = 0
for tree_in_forest in clf.estimators_:
if (i_tree <1):        
    tree.export_graphviz(tree_in_forest, out_file=dotfile)
    pydotplus.graph_from_dot_data(dotfile.getvalue()).write_png('dtree'+ str(i_tree) +'.png')
    i_tree = i_tree + 1

但它不会产生任何东西。你知道如何从随机森林中绘制决策树吗?

谢谢,

4

6 回答 6

38

假设你的随机森林模型已经安装好了,首先你应该首先导入export_graphviz函数:

from sklearn.tree import export_graphviz

在您的 for 循环中,您可以执行以下操作来生成dot文件

export_graphviz(tree_in_forest,
                feature_names=X.columns,
                filled=True,
                rounded=True)

下一行生成一个 png 文件

os.system('dot -Tpng tree.dot -o tree.png')
于 2016-10-21T14:14:50.910 回答
27

在 scikit-learn 中拟合随机森林模型后,您可以可视化随机森林中的单个决策树。下面的代码首先适合随机森林模型。

import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn import tree
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# Load the Breast Cancer Dataset
data = load_breast_cancer()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target

# Arrange Data into Features Matrix and Target Vector
X = df.loc[:, df.columns != 'target']
y = df.loc[:, 'target'].values

# Split the data into training and testing sets
X_train, X_test, Y_train, Y_test = train_test_split(X, y, random_state=0)

# Random Forests in `scikit-learn` (with N = 100)
rf = RandomForestClassifier(n_estimators=100,
                            random_state=0)
rf.fit(X_train, Y_train)

您现在可以可视化单个树。下面的代码可视化了第一个决策树。

fn=data.feature_names
cn=data.target_names
fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (4,4), dpi=800)
tree.plot_tree(rf.estimators_[0],
               feature_names = fn, 
               class_names=cn,
               filled = True);
fig.savefig('rf_individualtree.png')

下图是保存的内容。

在此处输入图像描述

因为这个问题需要树,所以如果您愿意,您可以可视化随机森林中的所有估计器(决策树)。下面的代码可视化了上面随机森林模型拟合的前 5 个。

# This may not the best way to view each estimator as it is small
fn=data.feature_names
cn=data.target_names
fig, axes = plt.subplots(nrows = 1,ncols = 5,figsize = (10,2), dpi=900)
for index in range(0, 5):
    tree.plot_tree(rf.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')

下图是保存的内容。

在此处输入图像描述

代码改编自这篇文章

于 2020-04-05T03:22:53.430 回答
4

要从 scikit-learn 中的随机森林访问单个决策树,请使用estimators_属性:

rf = RandomForestClassifier()
# first decision tree
rf.estimators_[0]

然后您可以使用标准方法来可视化决策树:

  • 您可以使用 sklearn 打印树表示export_text
  • 导出到 graphiviz 并使用 sklearnexport_graphviz方法绘图
  • 使用 matplotlib 和 sklearnplot_tree方法绘图
  • 使用dtreeviz包进行树图绘制

这篇文章中描述了带有示例输出的代码。

在从随机森林中绘制单个决策树时,重要的是它可能已经完全生长(默认超参数)。这意味着树可以非常有深度。对我来说,深度大于 6 的树很难阅读。因此,如果需要树可视化,我将构建max_depth< 7 的随机森林。您可以查看这篇文章中的示例可视化。

于 2020-06-29T16:18:32.837 回答
1

你可以像这样查看每棵树,

i_tree = 0
for tree_in_forest in FT_cls_gini.estimators_:
    if (i_tree ==3):        
        tree.export_graphviz(tree_in_forest, out_file=dotfile)
        graph = pydotplus.graph_from_dot_data(dotfile.getvalue())        
    i_tree = i_tree + 1
Image(graph.create_png())
于 2019-10-30T21:44:26.577 回答
0

您可以绘制一棵树:

from sklearn.tree import export_graphviz
from IPython import display
from sklearn.ensemble import RandomForestRegressor

m = RandomForestRegressor(n_estimators=1, max_depth=3, bootstrap=False, n_jobs=-1)
m.fit(X_train, y_train)

str_tree = export_graphviz(m, 
   out_file=None, 
   feature_names=X_train.columns, # column names
   filled=True,        
   special_characters=True, 
   rotate=True, 
   precision=0.6)

display.display(str_tree)
于 2018-10-01T15:30:56.260 回答
0

除了上面给出的解决方案之外,您还可以尝试这个(希望将来可能需要这个的任何人)。

from sklearn.tree import export_graphviz
from six import StringIO 

i_tree = 0
dot_data = StringIO()
for tree_in_forest in rfc.estimators_:#rfc random forest classifier
    if (i_tree ==3):        
        export_graphviz(tree_in_forest, out_file=dot_data)
        graph = pydotplus.graph_from_dot_data(dot_data.getvalue())        
    i_tree = i_tree + 1
Image(graph.create_png())
于 2021-12-21T18:40:54.227 回答