从随机森林获取树

Getting trees from Random Forest

我正在使用 Skleran 的随机森林分类器。 我已经训练和调整了我的模型。

我的数据集包含 40 个样本,每个样本有 4 个特征,并且有两个 类 我想对我的样本进行分类。

现在我的问题是: 我想保存这个模型形成的树,并在另一个脚本中再次加载它来进行预测。

注意 - 我知道 joblib 和 pickle 模块,它们将模型保存在“.sav”文件中,但我不想保存模型的那个实例。

我通过使用 sklearns "tree.export_graphviz" 找到了一种非常有趣的方法。这是我用来保存树木的代码:

from sklearn.ensemble import RandomForestClassifier 
from sklearn.tree import export_graphviz

model=RandomForestClassifier()
model.fit(X, Y)

i_tree=0
for tree in model.estimators_:
    with open('iris_tree_' + str(i_tree) + '.dot', 'w') as my_file:
        my_file = export_graphviz(tree, out_file = my_file)
    i_tree = i_tree + 1

我面临的问题是如何使用这些树进行预测?

保存的文件包含以下格式的树:

digraph Tree {
node [shape=box] ;
0 [label="X[3] <= 0.4\ngini = 0.4387\nsamples = 20\nvalue = [27, 13]"] ;
1 [label="gini = 0.0\nsamples = 7\nvalue = [0, 13]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="gini = 0.0\nsamples = 13\nvalue = [27, 0]"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}

可以使用graphviz的在线门户将数据转换成树。

转换后的数据类似于 this

如何解析这种类型的数据?

我最感兴趣的是树的每个块中的那些 "X[3]<=0.4" 值。我只需要知道在我的树的任何块中是否有类似 "X[3]<=0.4" 的条件(因为树可以嵌套)

如果确实是您要找的那个小片段,您可以考虑使用正则表达式,例如:

\D\[\d+\]\s+<=\s+\d+\.\d+

也就是说,"non-digit character, open bracket, some digits, close bracket, whitespace, <= symbol, whitespace, some digits, decimal point, some digits."我在你的文本上测试了这个正则表达式,它匹配那个片段,没有其他匹配。