Какова цель использования StringIO в DecisionTree? - PullRequest
2 голосов
/ 29 апреля 2019

Я пишу дерево решений, и следующий код является частью полного кода:

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?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Python не является моим ведущим языком, однако я думаю, что ответ на ваш вопрос довольно прост и не требует больших исследований.

Здесь используется StringIO для поддержки текстового потока ввода / вывода.Ваша функция показывает дерево, но для этого нужен способ, какой-то транспорт для передачи данных.

Здесь f = io.StringIO() вы инициализируете свой поток данных.После этого вы можете использовать его по своему усмотрению, в данном конкретном случае:

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

Здесь: out_file=f вы экспортируете данные в свой поток, используяинициализируется до f = io.StringIO();.Поскольку StringIO - это текстовый файл в памяти, вы в основном откладываете свои данные в потоковом объекте для дальнейшего использования.Благодаря этому вам не нужно записывать свои данные в файл .dot , вместо этого вы временно удерживаете их (и временно означает, что ваш поток используется)

Подробнее об этом конкретном случае

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

Здесь: f.getvalue() вы генерируете свой график из .dot данных.При наиболее простом использовании вы должны указать путь к файлу .dot , в котором будут храниться ранее сгенерированные данные, но ВЫ НЕ ДОЛЖНЫ!Это хитрость, ваши данные все еще находятся в потоковом объекте, который вы создали и заполнили заранее!Так что теперь все, что вам нужно сделать, это направить его прямо к этой функции, которая сгенерирует ваше графическое изображение с этими данными и сохранит его как .png файл.

Связь между системными файлами и вашей программойможет быть установлен разными способами, но обычно вы используете потоки.Вы инициализируете поток в самом начале, используете его и затем закрываете.Каждый std::cout или std:err (мой основной язык, извините за этот пример не на Python) - это поток.Stream позволяет вам поддерживать обмен данными между вашей программой и назначенным тэгретом (например, консолью, или в данном случае файлом), однако вы можете использовать его также в качестве временного хранилища, что в данном конкретном случае ускорит процесс генерации изображения, поскольку вы этого не делаете.действительно нужно записывать и загружать данные в файл.Все, что вам нужно сделать, это записать данные в поток в порядке, который будет принимать другая функция, а затем использовать тот же поток для чтения этих данных в целях генерации изображения.

Подробнее о StringIO

0 голосов
/ 29 апреля 2019

StringIO представляет текстовый файл в памяти.Он может использоваться точно так же, как любой текстовый файл, поэтому вы можете писать / читать из него.Доступ быстрее, чем к обычному файлу, потому что буфер stringio управляется в памяти, но, с другой стороны, он не является постоянным на диске.

В приведенном вами примере вы могли бы также использовать обычный текстfile.

Это пример с обычным текстовым файлом с точкой:

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)
...