如何将graphviz.dot.Digraph
转换为networkx.Graph
(或其任何子类)?
LightGBM是一种基于树的算法的实现,它有一个返回graphviz.dot.Digraph
对象的函数。这种类型的对象可以表示任何有向图,但我的图特别是树,因此可以通过更简单的嵌套结构用JSON表示:
var tree = {
"name": "parent",
"children": [
{
"name": "child_1"
}
{
"name": "child_2"
}
[
}
上述JSON结构的另一个较长的例子是here。我使用此JSON格式使用d3
中的javascript
创建树形可视化。
总的来说,我需要将这个graphviz.dot.Digraph
对象转换为上面嵌套的JSON格式。
如果我可以将此graphviz.dot.Digraph
对象转换为networkx.Graph
对象,我可以使用this method将其转换为所需的JSON格式。这种中间转换对我来说是个问题。我似乎需要另外转换为networkx
can use。
答案 0 :(得分:1)
将graphviz.dot.Digraph
转换为networkx.Graph
的一种方法是将其转换为pydotplus.graphviz.Dot
对象,并将其转换为networkx.classes.multidigraph.MultiDiGraph
对象,该对象来自graph
}。
#--------------------
# Do whatever it is you do to create the graphviz.Digraph object
import lightgbm as lgbm
# .......
digraph = lgbm.create_tree_digraph(model)
print(type(digraph)) # prints <class 'graphviz.dot.Digraph'>
#--------------------
# Perform the conversion to networkx
import pydotplus
import networkx
dotplus = pydotplus.graph_from_dot_data(digraph.source)
print(type(dotplus)) # prints <class 'pydotplus.graphviz.Dot'>
# if graph doesn't have multiedges, use dotplus.set_strict(true)
nx_graph = networkx.nx_pydot.from_pydot(dotplus)
print(type(nx_graph)) # prints <class 'networkx.classes.multidigraph.MultiDiGraph'>
剩下的就是考虑转换为JSON的人
#--------------------
# Optionally, convert to json
import json
# must specify whatever node is the root of the tree, here its 'split0'
# or you can try list(graph)[0] if you're not sure.
data = networkx.readwrite.json_graph.tree_data(nx_graph,root='split0')
# data is just a dictionary. Dump results in proper json format.
json.dump(data,open(file_path,'w'))
后来我发现LightGBM实际上有一个dump_model方法可以快速切换所有这些...但是我会把它留在这里。