H2O - savefig с ROC "performance.plot()"

avatar
WesternGun
7 апреля 2018 в 22:35
548
1
0

Когда я использую H2O 3.19, я хочу сохранить matplotlib.pyplot график производительности обучающих данных (ROC) на стороне сервера, как мне это сделать?

Здесь мы видим исходный код plot() в h2o/model/metrics_base.py:

def plot(self, type="roc", server=False):
    """
    Produce the desired metric plot.

    :param type: the type of metric plot (currently, only ROC supported).
    :param server: if True, generate plot inline using matplotlib's "Agg" backend.
    :returns: None
    """
    # TODO: add more types (i.e. cutoffs)
    assert_is_type(type, "roc")
    # check for matplotlib. exit if absent.
    try:
        imp.find_module('matplotlib')
        import matplotlib
        if server: matplotlib.use('Agg', warn=False)
        import matplotlib.pyplot as plt
    except ImportError:
        print("matplotlib is required for this function!")
        return

    if type == "roc":
        plt.xlabel('False Positive Rate (FPR)')
        plt.ylabel('True Positive Rate (TPR)')
        plt.title('ROC Curve')
        plt.text(0.5, 0.5, r'AUC={0:.4f}'.format(self._metric_json["AUC"]))
        plt.plot(self.fprs, self.tprs, 'b--')
        plt.axis([0, 1, 0, 1])
        if not server: plt.show()

plot(type="roc", server=False) просто проверяет наличие matplotlib.pyplot и не возвращает объект plt, поэтому я не могу вызвать plt.savefig(). Что я могу сделать?

Источник
Stop harming Monica
7 апреля 2018 в 23:16
0

Что не так с импортом pyplot в собственный код?

WesternGun
7 апреля 2018 в 23:53
0

Я могу импортировать, но не могу получить этот объект с информацией (x.label, ylabel и т. д.), которая мне нужна, если я правильно понимаю (если только вся информация не является общей/статичной?)

Stop harming Monica
8 апреля 2018 в 10:03
1

Вы сказали «Я не могу позвонить plt.savefig()», вы можете это сделать после того, как выполните import matplotlib.pyplot as plt.

WesternGun
10 апреля 2018 в 09:30
0

Хорошо, я пытался, и вы правы, мне не нужно получать возврат изнутри, информация передается через.

Ответы (1)

avatar
WesternGun
7 апреля 2018 в 22:37
0

Как сказано в комментарии @Goyo, вам нужно импортировать matplotlib.pyplot, где вы вызываете метод plot(), и вы можете туда savefig. Похоже, что без возврата это все еще возможно, поэтому я предполагаю, что информация делится между «внутри» и «снаружи», то есть они «статичны», говоря на языке Java.


Наконец-то я должен изменить исходный код, заставив его возвращать plt, когда server is True, затем я вызываю plot(type="roc", server=True) извне. Я думаю, что это не имеет никакого значения, потому что перед изменением по умолчанию возвращается None.

if not server: 
    plt.show()
else:
    return plt # return to use plt.savefig