In [1]:
import pandas as pd
import numpy as np
import random
import sys
sys.path.append('../../..')
from batchflow.utils import plot_results_by_config
%matplotlib inline
plot_results_by_config allows to draw plots of specified variables for all configs in given results of Research.run().
Generally results can be any pandas.DataFrame that follows certain structure. Such dataframe is constructed below.
In [2]:
# constructing test dataframe
d1 = pd.DataFrame(data={'iteration': np.arange(10), 'val2': np.sin(np.arange(10))})
d1['name'] = 'train'
d2 = pd.DataFrame(data={'iteration': np.arange(10), 'val1': np.arange(10)})
d2['name'] = 'test'
d3 = pd.concat([d1, d2], sort=False)
dfs = []
for rep in range(2):
dft = d3.copy()
dft['val1'] += 0.1 * rep
dft['val2'] += 0.1 * rep
dft['repetition'] = rep
dfs.append(dft)
d4 = pd.concat(dfs, sort=False)
dfs = []
for i, config in enumerate(('conf1', 'conf2', 'conf3', 'conf4')):
for cv_split in range(3):
dft = d4.copy()
dft['val1'] += (0.1 + i * 0.5) * np.random.randn(len(dft))
dft['val2'] += (0.1 + i * 0.5) * np.random.randn(len(dft))
dft['config'] = config
dft['cv_split'] = cv_split
dft['update'] = 0
dft['sample_index'] = str(random.getrandbits(32))
dfs.append(dft)
res = pd.concat(dfs, sort=False)
res.info()
Plotting results for several configs and several variables. If figure size is not specified, it is set to (x, y),
where x = (5 * number of variables), y = (5 * number of configs in results)
Plotting results of research with cross-validation
In [3]:
plot_results_by_config(res, (('train', 'val2'), ('test', 'val1')))
Plotting results of research without cross-validation
In [4]:
plot_results_by_config(res[res.cv_split == 0].drop(columns='cv_split'), (('train', 'val2'), ('test', 'val1')))
By default if only one variable is specified the plots for different configs are arranged vertically
In [5]:
plot_results_by_config(res, ('train', 'val2'))
This can be changed by setting layout='flat'
In [6]:
plot_results_by_config(res, ('train', 'val2'), layout='flat')
Or layout='square'
In [7]:
plot_results_by_config(res, ('train', 'val2'), layout='square')
Variables to plot and their sources can be passed via dict, custom figure size can be specified
In [8]:
plot_results_by_config(res, {'train': 'val2', 'test': 'val1'}, figsize=(20, 20))
Following 2 code cells test plots layouts in marginal situations
In [9]:
plot_results_by_config(res[res.config == 'conf1'], {'train': 'val2', 'test': 'val1'})
In [10]:
plot_results_by_config(res[res.config == 'conf1'], ('train', 'val2'))