在 DecisionTree 中使用 StringIO 的目的是什么

What is the purpose of using StringIO in DecisionTree

我正在写一个决策树,下面的代码是完整代码的一部分:

def show_tree(tree, features, path):
    f = io.StringIO()
    export_graphviz(tree, out_file=f, feature_names=features)
    pydotplus.graph_from_dot_data(f.getvalue()).write_png(path)
    img = misc.imread(path)
    plt.rcParams['figure.figsize'] = (20,20)
    plt.imshow(img)

谁能告诉我在这里使用 StringIO 的目的是什么?

StringIO 表示内存中的文本文件。它可以像任何文本文件一样使用,因此您可以写入/读取它。访问速度比普通文件快,因为 stringio 缓冲区是在内存中管理的,但另一方面它在磁盘上不是持久的。

在您给出的示例中,您也可以使用常规文本文件。

这是一个常规点文本文件的示例:

def show_tree(tree, features, path):
    f = 'tree.dot'
    export_graphviz(tree, out_file=f, feature_names=features)
    pydotplus.graph_from_dot_file(f).write_png(path)
    img = misc.imread(path)
    plt.rcParams['figure.figsize'] = (20,20)
    plt.imshow(img)

这是另一个没有文件也没有 StringIO 的例子,只使用 export_graphviz()

导出的点文件的字符串内容
def show_tree(tree, features, path):
    dot_data = export_graphviz(tree, out_file=None, feature_names=features)
    pydotplus.graph_from_dot_data(dot_data).write_png(path)
    img = misc.imread(path)
    plt.rcParams['figure.figsize'] = (20,20)
    plt.imshow(img)

Python 不是我的主要语言,但我认为您的问题的答案很简单,不需要大量研究。

这里使用StringIO来维护Input/Output文本流。您的功能显示树,但是要做到这一点,它需要一种方法,某种数据传输高速公路。

这里 f = io.StringIO() 您正在初始化数据流。之后您可以随意使用它,在这种特殊情况下:

  1. export_graphviz(tree, out_file=f, feature_names=features)

此处:out_file=f 您使用 f = io.StringIO(); 之前初始化将数据导出到流中。由于 StringIO 是内存中的文本文件,您基本上将数据放在流对象中以供进一步使用。由于这一点,您不必将数据写入 .dot 文件,而是临时保存它。(临时意味着只要您的流正在使用中)

More about this particular case

  1. pydotplus.graph_from_dot_data(f.getvalue()).write_png(path)

此处:f.getvalue() 您根据 .dot 数据生成图表。在最基本的使用中,您应该确保 .dot 文件的路径,之前生成的数据将存储在该文件中,但您不必这样做!这就是诀窍,您的数据仍在您事先创建和填充的流对象中!所以现在你所要做的就是直接将它指向这个函数,它将用该数据生成你的图形图像并将其保存为 .png 文件。

系统文件和您的程序之间的通信可以通过多种方式建立,但通常您使用流。您在一开始就初始化流,使用它然后关闭。每个 std::coutstd:err(我的主要语言参考,对于非 python 示例感到抱歉)都是那个流。 Stream 允许您在您的程序和指定的 tagret(例如控制台,或在本例中为文件)之间保持数据交换,但是您也可以将它用作临时存储 space,在这种情况下,这将加快图像生成过程,因为您实际上不必将数据写入文件并将其加载到文件中。因此,您所要做的就是按照其他函数接受的顺序将数据写入流,然后使用完全相同的流来读取该数据以生成图像。

More about StringIO