Hyperparameter Optimization with Hyperopt

Install Hyperopt package


In [1]:
!pip install hyperopt


Collecting hyperopt
  Downloading https://files.pythonhosted.org/packages/0b/4a/79541d4f61e7878f846f68ab31ed709bac6ee99345378c0e02658c3be0d4/hyperopt-0.2.2-py3-none-any.whl (1.9MB)
     |████████████████████████████████| 1.9MB 2.4MB/s eta 0:00:01
Collecting future
  Downloading https://files.pythonhosted.org/packages/45/0b/38b06fd9b92dc2b68d58b75f900e97884c45bedd2ff83203d933cf5851c9/future-0.18.2.tar.gz (829kB)
     |████████████████████████████████| 829kB 4.1MB/s eta 0:00:01
Requirement already satisfied: six in /usr/lib/python3/dist-packages (from hyperopt) (1.11.0)
Requirement already satisfied: tqdm in /usr/local/lib/python3.6/dist-packages (from hyperopt) (4.36.1)
Collecting networkx==2.2
  Downloading https://files.pythonhosted.org/packages/f3/f4/7e20ef40b118478191cec0b58c3192f822cace858c19505c7670961b76b2/networkx-2.2.zip (1.7MB)
     |████████████████████████████████| 1.7MB 4.6MB/s eta 0:00:01     |██████████████▉                 | 788kB 4.6MB/s eta 0:00:01     |███████████████████████████▋    | 1.5MB 4.6MB/s eta 0:00:01
Requirement already satisfied: cloudpickle in /usr/local/lib/python3.6/dist-packages (from hyperopt) (1.2.2)
Requirement already satisfied: scipy in /usr/local/lib/python3.6/dist-packages (from hyperopt) (1.3.1)
Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from hyperopt) (1.17.3)
Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from networkx==2.2->hyperopt) (4.4.1)
Building wheels for collected packages: future, networkx
  Building wheel for future (setup.py) ... done
  Created wheel for future: filename=future-0.18.2-cp36-none-any.whl size=493275 sha256=b3366a5e29d26982cf6022c58c48fc08f51477ce419641863d6f7fad128ff75a
  Stored in directory: /root/.cache/pip/wheels/8b/99/a0/81daf51dcd359a9377b110a8a886b3895921802d2fc1b2397e
  Building wheel for networkx (setup.py) ... done
  Created wheel for networkx: filename=networkx-2.2-py2.py3-none-any.whl size=1527657 sha256=d244b460e509d7853b7b34cab4811d10924c3f8932dacb031b414a001fd01dc7
  Stored in directory: /root/.cache/pip/wheels/68/f8/29/b53346a112a07d30a5a84d53f19aeadaa1a474897c0423af91
Successfully built future networkx
Installing collected packages: future, networkx, hyperopt
  Found existing installation: networkx 2.3
    Uninstalling networkx-2.3:
      Successfully uninstalled networkx-2.3
Successfully installed future-0.18.2 hyperopt-0.2.2 networkx-2.2

Import required libraries


In [2]:
import warnings
warnings.simplefilter('ignore')
from ludwig.api import LudwigModel
from ludwig.utils.data_utils import load_json
from ludwig.visualize import learning_curves
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials
from hyperopt.pyll.stochastic import rng_from_seed
import logging
import shutil
import tempfile


WARNING:tensorflow:
The TensorFlow contrib module will not be included in TensorFlow 2.0.
For more information, please see:
  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md
  * https://github.com/tensorflow/addons
  * https://github.com/tensorflow/io (for I/O related ops)
If you depend on functionality not listed there, please file an issue.

Retrieve data for training


In [3]:
raw_df = pd.read_csv('./data/winequalityN.csv')
raw_df.shape


Out[3]:
(6497, 13)

Standardize column names to replace spaces(" ") with underscore("_")


In [4]:
new_col = []
for i in range(len(raw_df.columns)):
    new_col.append(raw_df.columns[i].replace(' ', '_'))
    
raw_df.columns = new_col

Data Set Overview


In [5]:
raw_df.dtypes


Out[5]:
type                     object
fixed_acidity           float64
volatile_acidity        float64
citric_acid             float64
residual_sugar          float64
chlorides               float64
free_sulfur_dioxide     float64
total_sulfur_dioxide    float64
density                 float64
pH                      float64
sulphates               float64
alcohol                 float64
quality                   int64
dtype: object

Create training and test data sets


In [6]:
train_df, vald_df = train_test_split(raw_df, test_size = 0.2, random_state=13, stratify=raw_df['quality'])
print(train_df.shape, vald_df.shape)


(5197, 13) (1300, 13)

In [7]:
train_df['quality'].value_counts().sort_index()


Out[7]:
3      24
4     173
5    1710
6    2269
7     863
8     154
9       4
Name: quality, dtype: int64

In [8]:
vald_df['quality'].value_counts().sort_index()


Out[8]:
3      6
4     43
5    428
6    567
7    216
8     39
9      1
Name: quality, dtype: int64

In [9]:
# isolate the predictor variables only
predictor_vars = list(set(raw_df.columns) - set(['quality']))

#extract categorical variables
categorical_vars = []
for p in predictor_vars:
    if raw_df[p].dtype == 'object':
        categorical_vars.append(p)
        
print("categorical variables:", categorical_vars,'\n')

# get numerical variables
numerical_vars = list(set(predictor_vars) - set(categorical_vars))

print("numerical variables:", numerical_vars,"\n")


categorical variables: ['type'] 

numerical variables: ['density', 'residual_sugar', 'pH', 'total_sulfur_dioxide', 'volatile_acidity', 'sulphates', 'citric_acid', 'alcohol', 'free_sulfur_dioxide', 'fixed_acidity', 'chlorides'] 


In [10]:
train_df.describe().T


Out[10]:
count mean std min 25% 50% 75% max
fixed_acidity 5189.0 7.198824 1.282347 3.80000 6.4000 7.0000 7.7000 15.60000
volatile_acidity 5191.0 0.338963 0.165157 0.08000 0.2300 0.2900 0.4000 1.58000
citric_acid 5194.0 0.319174 0.146128 0.00000 0.2500 0.3100 0.4000 1.66000
residual_sugar 5195.0 5.424562 4.762894 0.60000 1.8000 3.0000 8.0000 65.80000
chlorides 5195.0 0.056116 0.035789 0.00900 0.0380 0.0470 0.0640 0.61100
free_sulfur_dioxide 5197.0 30.656821 17.912418 1.00000 17.0000 29.0000 42.0000 289.00000
total_sulfur_dioxide 5197.0 116.046180 56.504786 6.00000 78.0000 119.0000 156.0000 440.00000
density 5197.0 0.994672 0.003008 0.98711 0.9923 0.9948 0.9969 1.03898
pH 5189.0 3.218979 0.160672 2.72000 3.1100 3.2100 3.3200 4.01000
sulphates 5193.0 0.530924 0.147341 0.22000 0.4300 0.5100 0.6000 2.00000
alcohol 5197.0 10.492117 1.187004 8.00000 9.5000 10.3000 11.3000 14.20000
quality 5197.0 5.818164 0.873126 3.00000 5.0000 6.0000 6.0000 9.00000

In [11]:
for p in categorical_vars:
    print("unique values for",p,"is",train_df[p].nunique())


unique values for type is 2

Create model definition


In [12]:
# template for model definition
model_definition = {'input_features':[], 'output_features': [], 'training':{}}

# setup input features for categorical variables
for p in categorical_vars:
    a_feature = {'name': p.replace(' ','_'), 'type': 'category', 'representation': 'sparse'}
    model_definition['input_features'].append(a_feature)


# setup input features for numerical variables
for p in numerical_vars:
    a_feature = {'name': p.replace(' ','_'), 'type': 'numerical', 
                'preprocessing': {'missing_value_strategy': 'fill_with_mean', 'normalization': 'zscore'}}
    model_definition['input_features'].append(a_feature)

# set up output variable
model_definition['output_features'].append({'name': 'quality', 'type':'category'})

In [13]:
# View the model defintion
print("model definition:")
model_definition


model definition:
Out[13]:
{'input_features': [{'name': 'type',
   'type': 'category',
   'representation': 'sparse'},
  {'name': 'density',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}},
  {'name': 'residual_sugar',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}},
  {'name': 'pH',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}},
  {'name': 'total_sulfur_dioxide',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}},
  {'name': 'volatile_acidity',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}},
  {'name': 'sulphates',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}},
  {'name': 'citric_acid',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}},
  {'name': 'alcohol',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}},
  {'name': 'free_sulfur_dioxide',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}},
  {'name': 'fixed_acidity',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}},
  {'name': 'chlorides',
   'type': 'numerical',
   'preprocessing': {'missing_value_strategy': 'fill_with_mean',
    'normalization': 'zscore'}}],
 'output_features': [{'name': 'quality', 'type': 'category'}],
 'training': {}}

Define objective function for minimization


In [14]:
# objective for hyperopt to minimize
def score_model(params):
    
    print(params)
    
    model_definition['training']['learning_rate'] = params['learning_rate']
    model_definition['training']['batch_size'] = params['batch_size']
    model_definition['output_features'][0]['num_fc_layers'] = np.int(params['output_fc_num_layers'])
    model_definition['output_features'][0]['fc_size'] = np.int(params['output_fc_size'])
    
    model = LudwigModel(model_definition,
                        logging_level=logging.WARN)

    with tempfile.TemporaryDirectory() as tmpdirname:
        train_stats = model.train(data_train_df = train_df,
                                data_validation_df = vald_df,
                                skip_save_training_description=True, 
                                skip_save_training_statistics=True, 
                                skip_save_model=True, 
                                skip_save_progress=True,                          
                                skip_save_log=True,
                                skip_save_processed_input=True,
                                output_directory=tmpdirname,
                                random_seed=42)



    model.close()
    
    # return validation loss for last epoch as objective function value
    validation_losses = train_stats['validation']['quality']['loss']
    last_epoch = len(validation_losses)
    
    return {'loss': validation_losses[last_epoch - 1], 'status': STATUS_OK}

Define hyperparameter search space


In [15]:
SEED=13

# function to calculate batch size
set_batch_size = lambda n: 2**(n + 5)

space = {'learning_rate':  hp.loguniform('learning_rate', np.log(0.0001), np.log(0.01), rng=rng_from_seed(SEED)),
         'batch_size': set_batch_size(hp.randint('batch_size_exponent',3, rng=rng_from_seed(SEED))),
         'output_fc_num_layers': hp.quniform('output_fc_num_layers',1,5,1, rng=rng_from_seed(SEED)),
         'output_fc_size': hp.quniform('output_fc_size',5,200,1, rng=rng_from_seed(SEED))
        }

Determine optimal hyperparameters


In [16]:
np.random.seed(123)
best = fmin(fn=score_model,
    space=space,
    algo=tpe.suggest,
    max_evals=30)


{'batch_size': 128, 'learning_rate': 0.002121499561203549, 'output_fc_num_layers': 5.0, 'output_fc_size': 38.0}
  0%|          | 0/30 [00:00<?, ?it/s, best loss: ?]WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
WARNING:tensorflow:From /opt/project/ludwig/utils/tf_utils.py:78: The name tf.GPUOptions is deprecated. Please use tf.compat.v1.GPUOptions instead.

{'batch_size': 128, 'learning_rate': 0.0001932355473302646, 'output_fc_num_layers': 1.0, 'output_fc_size': 10.0}
{'batch_size': 64, 'learning_rate': 0.0011513381010027587, 'output_fc_num_layers': 4.0, 'output_fc_size': 178.0}
{'batch_size': 128, 'learning_rate': 0.0030349889924213566, 'output_fc_num_layers': 3.0, 'output_fc_size': 47.0}
{'batch_size': 32, 'learning_rate': 0.002983993494062495, 'output_fc_num_layers': 2.0, 'output_fc_size': 93.0}
{'batch_size': 128, 'learning_rate': 0.00036977719556510557, 'output_fc_num_layers': 3.0, 'output_fc_size': 146.0}
{'batch_size': 64, 'learning_rate': 0.003544448527411323, 'output_fc_num_layers': 3.0, 'output_fc_size': 47.0}
{'batch_size': 128, 'learning_rate': 0.00013059206203058915, 'output_fc_num_layers': 4.0, 'output_fc_size': 125.0}
{'batch_size': 128, 'learning_rate': 0.004770174876117405, 'output_fc_num_layers': 3.0, 'output_fc_size': 125.0}
{'batch_size': 32, 'learning_rate': 0.0028099921871339376, 'output_fc_num_layers': 5.0, 'output_fc_size': 6.0}
{'batch_size': 128, 'learning_rate': 0.0003373883766353845, 'output_fc_num_layers': 5.0, 'output_fc_size': 83.0}
{'batch_size': 128, 'learning_rate': 0.0028522132785682944, 'output_fc_num_layers': 4.0, 'output_fc_size': 59.0}
{'batch_size': 32, 'learning_rate': 0.0004985648058438576, 'output_fc_num_layers': 4.0, 'output_fc_size': 96.0}
{'batch_size': 64, 'learning_rate': 0.0018524870197567224, 'output_fc_num_layers': 5.0, 'output_fc_size': 88.0}
{'batch_size': 64, 'learning_rate': 0.0004940368336988511, 'output_fc_num_layers': 1.0, 'output_fc_size': 94.0}
{'batch_size': 64, 'learning_rate': 0.002928134814352245, 'output_fc_num_layers': 1.0, 'output_fc_size': 160.0}
{'batch_size': 32, 'learning_rate': 0.0006792461926911531, 'output_fc_num_layers': 2.0, 'output_fc_size': 27.0}
{'batch_size': 128, 'learning_rate': 0.004316304089115418, 'output_fc_num_layers': 5.0, 'output_fc_size': 175.0}
{'batch_size': 128, 'learning_rate': 0.00028102044681709693, 'output_fc_num_layers': 1.0, 'output_fc_size': 121.0}
{'batch_size': 64, 'learning_rate': 0.0001859993909108718, 'output_fc_num_layers': 3.0, 'output_fc_size': 14.0}
{'batch_size': 128, 'learning_rate': 0.00010793095193641285, 'output_fc_num_layers': 4.0, 'output_fc_size': 72.0}
{'batch_size': 128, 'learning_rate': 0.00011420915477535684, 'output_fc_num_layers': 4.0, 'output_fc_size': 198.0}
{'batch_size': 128, 'learning_rate': 0.00020589898492099276, 'output_fc_num_layers': 5.0, 'output_fc_size': 119.0}
{'batch_size': 128, 'learning_rate': 0.0001292761479211032, 'output_fc_num_layers': 4.0, 'output_fc_size': 138.0}
{'batch_size': 128, 'learning_rate': 0.0011140069142692238, 'output_fc_num_layers': 5.0, 'output_fc_size': 74.0}
{'batch_size': 128, 'learning_rate': 0.00030042700536880406, 'output_fc_num_layers': 4.0, 'output_fc_size': 116.0}
{'batch_size': 32, 'learning_rate': 0.0007752456398075654, 'output_fc_num_layers': 5.0, 'output_fc_size': 109.0}
{'batch_size': 128, 'learning_rate': 0.00014692093508200942, 'output_fc_num_layers': 4.0, 'output_fc_size': 141.0}
{'batch_size': 128, 'learning_rate': 0.0015452350853066895, 'output_fc_num_layers': 5.0, 'output_fc_size': 83.0}
{'batch_size': 128, 'learning_rate': 0.00026690314296376, 'output_fc_num_layers': 2.0, 'output_fc_size': 68.0}
100%|██████████| 30/30 [06:21<00:00, 12.72s/it, best loss: 1.005780498798077]

In [17]:
print('batch size:', set_batch_size(best['batch_size_exponent']),
      ', learning_rate:', best['learning_rate'],
      ', fc_num_layers:', np.int(best['output_fc_num_layers']),
      ', fc_size:', np.int(best['output_fc_size']))


batch size: 128 , learning_rate: 0.00013059206203058915 , fc_num_layers: 4 , fc_size: 125

Train with optimal hyperparameters on the whole data set


In [18]:
# clean out old results
try:
    shutil.rmtree('./results')
except:
    pass

try:
    shutil.rmtree('./visualizations')
except:
    pass

In [19]:
# set optimal hyperparameters for training    
model_definition['training']['learning_rate'] = best['learning_rate']
model_definition['training']['batch_size'] = set_batch_size(best['batch_size_exponent'])
model_definition['output_features'][0]['num_fc_layers'] = np.int(best['output_fc_num_layers'])
model_definition['output_features'][0]['fc_size'] = np.int(best['output_fc_size'])


# Define Ludwig model object that drive model training
model = LudwigModel(model_definition,
                    logging_level=logging.INFO)

# initiate model training
opt_stats = model.train(data_df = raw_df,
                        experiment_name='hyperparameter_training',
                        model_name='optimized_model',                        
                        random_seed=42)



model.close()


Experiment name: hyperparameter_training
Model name: optimized_model
Output path: results/hyperparameter_training_optimized_model


ludwig_version: '0.2.1'
command: ('/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py -f '
 '/root/.local/share/jupyter/runtime/kernel-6a906e2e-843a-4552-a26a-71486d0f3bcc.json')
commit_hash: '8a9da7d4e494'
random_seed: 42
model_definition: {   'combiner': {'type': 'concat'},
    'input_features': [   {   'name': 'type',
                              'representation': 'sparse',
                              'tied_weights': None,
                              'type': 'category'},
                          {   'name': 'density',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'},
                          {   'name': 'residual_sugar',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'},
                          {   'name': 'pH',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'},
                          {   'name': 'total_sulfur_dioxide',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'},
                          {   'name': 'volatile_acidity',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'},
                          {   'name': 'sulphates',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'},
                          {   'name': 'citric_acid',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'},
                          {   'name': 'alcohol',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'},
                          {   'name': 'free_sulfur_dioxide',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'},
                          {   'name': 'fixed_acidity',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'},
                          {   'name': 'chlorides',
                              'preprocessing': {   'missing_value_strategy': 'fill_with_mean',
                                                   'normalization': 'zscore'},
                              'tied_weights': None,
                              'type': 'numerical'}],
    'output_features': [   {   'dependencies': [],
                               'fc_size': 125,
                               'loss': {   'class_similarities_temperature': 0,
                                           'class_weights': 1,
                                           'confidence_penalty': 0,
                                           'distortion': 1,
                                           'labels_smoothing': 0,
                                           'negative_samples': 0,
                                           'robust_lambda': 0,
                                           'sampler': None,
                                           'type': 'softmax_cross_entropy',
                                           'unique': False,
                                           'weight': 1},
                               'name': 'quality',
                               'num_fc_layers': 4,
                               'reduce_dependencies': 'sum',
                               'reduce_input': 'sum',
                               'top_k': 3,
                               'type': 'category'}],
    'preprocessing': {   'audio': {   'audio_feature': {'type': 'raw'},
                                      'audio_file_length_limit_in_s': 7.5,
                                      'in_memory': True,
                                      'missing_value_strategy': 'backfill',
                                      'norm': None,
                                      'padding_value': 0},
                         'bag': {   'fill_value': '',
                                    'lowercase': False,
                                    'missing_value_strategy': 'fill_with_const',
                                    'most_common': 10000,
                                    'tokenizer': 'space'},
                         'binary': {   'fill_value': 0,
                                       'missing_value_strategy': 'fill_with_const'},
                         'category': {   'fill_value': '<UNK>',
                                         'lowercase': False,
                                         'missing_value_strategy': 'fill_with_const',
                                         'most_common': 10000},
                         'date': {   'datetime_format': None,
                                     'fill_value': '',
                                     'missing_value_strategy': 'fill_with_const'},
                         'force_split': False,
                         'h3': {   'fill_value': 576495936675512319,
                                   'missing_value_strategy': 'fill_with_const'},
                         'image': {   'in_memory': True,
                                      'missing_value_strategy': 'backfill',
                                      'num_processes': 1,
                                      'resize_method': 'interpolate',
                                      'scaling': 'pixel_normalization'},
                         'numerical': {   'fill_value': 0,
                                          'missing_value_strategy': 'fill_with_const',
                                          'normalization': None},
                         'sequence': {   'fill_value': '',
                                         'lowercase': False,
                                         'missing_value_strategy': 'fill_with_const',
                                         'most_common': 20000,
                                         'padding': 'right',
                                         'padding_symbol': '<PAD>',
                                         'sequence_length_limit': 256,
                                         'tokenizer': 'space',
                                         'unknown_symbol': '<UNK>',
                                         'vocab_file': None},
                         'set': {   'fill_value': '',
                                    'lowercase': False,
                                    'missing_value_strategy': 'fill_with_const',
                                    'most_common': 10000,
                                    'tokenizer': 'space'},
                         'split_probabilities': (0.7, 0.1, 0.2),
                         'stratify': None,
                         'text': {   'char_most_common': 70,
                                     'char_sequence_length_limit': 1024,
                                     'char_tokenizer': 'characters',
                                     'char_vocab_file': None,
                                     'fill_value': '',
                                     'lowercase': True,
                                     'missing_value_strategy': 'fill_with_const',
                                     'padding': 'right',
                                     'padding_symbol': '<PAD>',
                                     'unknown_symbol': '<UNK>',
                                     'word_most_common': 20000,
                                     'word_sequence_length_limit': 256,
                                     'word_tokenizer': 'space_punct',
                                     'word_vocab_file': None},
                         'timeseries': {   'fill_value': '',
                                           'missing_value_strategy': 'fill_with_const',
                                           'padding': 'right',
                                           'padding_value': 0,
                                           'timeseries_length_limit': 256,
                                           'tokenizer': 'space'},
                         'vector': {   'fill_value': '',
                                       'missing_value_strategy': 'fill_with_const'}},
    'training': {   'batch_size': 128,
                    'bucketing_field': None,
                    'decay': False,
                    'decay_rate': 0.96,
                    'decay_steps': 10000,
                    'dropout_rate': 0.0,
                    'early_stop': 5,
                    'epochs': 100,
                    'eval_batch_size': 0,
                    'gradient_clipping': None,
                    'increase_batch_size_on_plateau': 0,
                    'increase_batch_size_on_plateau_max': 512,
                    'increase_batch_size_on_plateau_patience': 5,
                    'increase_batch_size_on_plateau_rate': 2,
                    'learning_rate': 0.00013059206203058915,
                    'learning_rate_warmup_epochs': 1,
                    'optimizer': {   'beta1': 0.9,
                                     'beta2': 0.999,
                                     'epsilon': 1e-08,
                                     'type': 'adam'},
                    'reduce_learning_rate_on_plateau': 0,
                    'reduce_learning_rate_on_plateau_patience': 5,
                    'reduce_learning_rate_on_plateau_rate': 0.5,
                    'regularization_lambda': 0,
                    'regularizer': 'l2',
                    'staircase': False,
                    'validation_field': 'combined',
                    'validation_measure': 'loss'}}


Using full dataframe
Building dataset (it may take a while)
Training set: 4588
Validation set: 612
Test set: 1297

╒══════════╕
│ TRAINING │
╘══════════╛


Epoch   1
Took 0.6718s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.5322 │     0.4370 │      0.8520 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.4503 │     0.4673 │      0.8480 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.5337 │     0.4379 │      0.8597 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch   2
Took 0.3488s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.2979 │     0.4911 │      0.9316 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.2184 │     0.5114 │      0.9428 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.3005 │     0.5035 │      0.9314 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch   3
Took 0.2980s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.2258 │     0.5211 │      0.9374 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.1597 │     0.5310 │      0.9461 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.2346 │     0.5266 │      0.9375 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch   4
Took 0.3144s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.1777 │     0.5349 │      0.9435 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.1230 │     0.5343 │      0.9510 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.1916 │     0.5443 │      0.9429 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch   5
Took 0.2701s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.1425 │     0.5453 │      0.9464 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0972 │     0.5588 │      0.9575 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.1606 │     0.5613 │      0.9483 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch   6
Took 0.2676s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.1152 │     0.5525 │      0.9490 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0778 │     0.5621 │      0.9592 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.1375 │     0.5574 │      0.9491 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch   7
Took 0.2988s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.0924 │     0.5604 │      0.9518 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0628 │     0.5572 │      0.9608 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.1190 │     0.5574 │      0.9522 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch   8
Took 0.2977s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.0730 │     0.5673 │      0.9540 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0508 │     0.5605 │      0.9624 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.1039 │     0.5590 │      0.9561 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch   9
Took 0.2784s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.0560 │     0.5708 │      0.9571 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0415 │     0.5605 │      0.9624 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0915 │     0.5621 │      0.9599 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  10
Took 0.2968s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.0411 │     0.5809 │      0.9586 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0342 │     0.5556 │      0.9624 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0812 │     0.5628 │      0.9622 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  11
Took 0.3113s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.0276 │     0.5833 │      0.9588 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0274 │     0.5637 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0720 │     0.5682 │      0.9622 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  12
Took 0.3066s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.0152 │     0.5883 │      0.9595 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0216 │     0.5654 │      0.9657 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0645 │     0.5713 │      0.9622 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  13
Took 0.3033s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 1.0037 │     0.5898 │      0.9605 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0167 │     0.5654 │      0.9641 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0575 │     0.5806 │      0.9607 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  14
Took 0.2957s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9928 │     0.5959 │      0.9616 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0122 │     0.5703 │      0.9641 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0512 │     0.5783 │      0.9614 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  15
Took 0.3080s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9826 │     0.6022 │      0.9623 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0084 │     0.5719 │      0.9657 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0453 │     0.5821 │      0.9638 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  16
Took 0.2856s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9731 │     0.6066 │      0.9629 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0051 │     0.5686 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0401 │     0.5790 │      0.9653 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  17
Took 0.2788s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9642 │     0.6114 │      0.9632 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 1.0023 │     0.5719 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0354 │     0.5821 │      0.9653 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  18
Took 0.3112s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9557 │     0.6162 │      0.9634 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9999 │     0.5752 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0311 │     0.5821 │      0.9661 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  19
Took 0.2916s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9475 │     0.6190 │      0.9634 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9977 │     0.5735 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0273 │     0.5821 │      0.9653 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  20
Took 0.3009s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9398 │     0.6199 │      0.9636 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9959 │     0.5752 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0238 │     0.5844 │      0.9645 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  21
Took 0.2821s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9324 │     0.6223 │      0.9643 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9946 │     0.5768 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0206 │     0.5837 │      0.9645 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  22
Took 0.2982s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9252 │     0.6238 │      0.9647 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9933 │     0.5801 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0176 │     0.5837 │      0.9638 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  23
Took 0.2854s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9184 │     0.6282 │      0.9649 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9921 │     0.5817 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0148 │     0.5821 │      0.9630 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  24
Took 0.3122s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9116 │     0.6301 │      0.9662 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9911 │     0.5850 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0122 │     0.5813 │      0.9630 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  25
Took 0.3158s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.9053 │     0.6323 │      0.9680 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9898 │     0.5833 │      0.9673 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0100 │     0.5813 │      0.9645 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  26
Took 0.3006s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8992 │     0.6369 │      0.9688 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9889 │     0.5817 │      0.9690 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0080 │     0.5813 │      0.9645 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  27
Took 0.2874s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8933 │     0.6421 │      0.9693 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9877 │     0.5833 │      0.9690 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0064 │     0.5821 │      0.9645 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  28
Took 0.3023s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8873 │     0.6458 │      0.9693 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9864 │     0.5882 │      0.9690 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0044 │     0.5813 │      0.9645 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  29
Took 0.2889s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8817 │     0.6502 │      0.9701 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9852 │     0.5899 │      0.9706 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0028 │     0.5813 │      0.9638 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  30
Took 0.3050s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8762 │     0.6528 │      0.9701 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9841 │     0.5899 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 1.0011 │     0.5837 │      0.9653 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  31
Took 0.2835s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8707 │     0.6550 │      0.9712 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9833 │     0.5931 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9997 │     0.5867 │      0.9653 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  32
Took 0.2941s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8655 │     0.6567 │      0.9717 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9821 │     0.5964 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9983 │     0.5837 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  33
Took 0.3024s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8602 │     0.6587 │      0.9728 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9814 │     0.5948 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9974 │     0.5860 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  34
Took 0.2891s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8549 │     0.6635 │      0.9732 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9803 │     0.5948 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9965 │     0.5898 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  35
Took 0.2798s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8498 │     0.6652 │      0.9738 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9796 │     0.5931 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9954 │     0.5898 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  36
Took 0.2902s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8448 │     0.6652 │      0.9738 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9791 │     0.5931 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9946 │     0.5906 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  37
Took 0.2972s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8398 │     0.6707 │      0.9738 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9785 │     0.5915 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9935 │     0.5906 │      0.9661 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  38
Took 0.2864s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8350 │     0.6713 │      0.9745 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9780 │     0.5899 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9929 │     0.5914 │      0.9661 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  39
Took 0.3003s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8301 │     0.6746 │      0.9747 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9774 │     0.5899 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9922 │     0.5914 │      0.9661 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  40
Took 0.2877s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8254 │     0.6757 │      0.9754 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9766 │     0.5899 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9916 │     0.5929 │      0.9661 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  41
Took 0.3022s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8208 │     0.6774 │      0.9758 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9766 │     0.5915 │      0.9755 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9909 │     0.5921 │      0.9661 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 1 epoch ago


Epoch  42
Took 0.3047s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8161 │     0.6785 │      0.9758 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9760 │     0.5931 │      0.9755 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9906 │     0.5921 │      0.9661 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  43
Took 0.2933s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8116 │     0.6803 │      0.9760 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9757 │     0.5915 │      0.9755 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9903 │     0.5929 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  44
Took 0.2908s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8072 │     0.6824 │      0.9760 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9754 │     0.5915 │      0.9755 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9898 │     0.5944 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  45
Took 0.2885s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.8026 │     0.6857 │      0.9758 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9752 │     0.5915 │      0.9755 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9896 │     0.5929 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  46
Took 0.3088s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7980 │     0.6885 │      0.9758 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9747 │     0.5931 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9892 │     0.5929 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  47
Took 0.2830s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7936 │     0.6916 │      0.9760 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9748 │     0.5931 │      0.9755 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9891 │     0.5944 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 1 epoch ago


Epoch  48
Took 0.2924s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7891 │     0.6951 │      0.9762 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9747 │     0.5948 │      0.9755 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9890 │     0.5960 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  49
Took 0.2913s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7847 │     0.6975 │      0.9762 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9744 │     0.5948 │      0.9755 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9890 │     0.5975 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  50
Took 0.3020s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7804 │     0.6992 │      0.9767 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9739 │     0.5948 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9886 │     0.5983 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  51
Took 0.2864s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7761 │     0.7016 │      0.9765 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9736 │     0.5964 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9885 │     0.6006 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  52
Took 0.2818s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7719 │     0.7027 │      0.9762 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9740 │     0.5931 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9885 │     0.5983 │      0.9668 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 1 epoch ago


Epoch  53
Took 0.2902s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7675 │     0.7042 │      0.9762 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9735 │     0.5899 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9882 │     0.5968 │      0.9676 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  54
Took 0.2958s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7633 │     0.7062 │      0.9765 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9734 │     0.5915 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9878 │     0.5975 │      0.9676 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  55
Took 0.3088s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7591 │     0.7071 │      0.9769 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9730 │     0.5882 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9879 │     0.5960 │      0.9676 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  56
Took 0.2993s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7550 │     0.7121 │      0.9776 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9730 │     0.5899 │      0.9722 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9878 │     0.5960 │      0.9676 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  57
Took 0.4223s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7507 │     0.7121 │      0.9782 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9730 │     0.5915 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9876 │     0.5944 │      0.9676 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 1 epoch ago


Epoch  58
Took 0.3166s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7465 │     0.7147 │      0.9780 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9729 │     0.5899 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9876 │     0.5975 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  59
Took 0.2683s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7424 │     0.7173 │      0.9780 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9728 │     0.5931 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9875 │     0.5983 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  60
Took 0.2856s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7382 │     0.7197 │      0.9782 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9727 │     0.5915 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9872 │     0.5983 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  61
Took 0.2898s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7339 │     0.7221 │      0.9795 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9728 │     0.5899 │      0.9722 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9871 │     0.5983 │      0.9692 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 1 epoch ago


Epoch  62
Took 0.2945s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7299 │     0.7265 │      0.9804 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9727 │     0.5866 │      0.9722 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9873 │     0.6014 │      0.9692 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  63
Took 0.2795s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7259 │     0.7267 │      0.9804 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9726 │     0.5866 │      0.9722 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9873 │     0.5983 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  64
Took 0.2899s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7217 │     0.7289 │      0.9806 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9726 │     0.5882 │      0.9722 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9877 │     0.5998 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 1 epoch ago


Epoch  65
Took 0.3012s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7176 │     0.7297 │      0.9813 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9727 │     0.5882 │      0.9722 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9876 │     0.6022 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 2 epochs ago


Epoch  66
Took 0.3000s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7136 │     0.7319 │      0.9817 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9727 │     0.5850 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9881 │     0.6029 │      0.9692 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 3 epochs ago


Epoch  67
Took 0.2774s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7095 │     0.7332 │      0.9819 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9725 │     0.5850 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9881 │     0.5975 │      0.9692 │
╘═══════════╧════════╧════════════╧═════════════╛
Validation loss on combined improved, model saved


Epoch  68
Took 0.2839s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7054 │     0.7356 │      0.9823 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9725 │     0.5850 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9886 │     0.5991 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 1 epoch ago


Epoch  69
Took 0.3071s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.7014 │     0.7371 │      0.9826 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9726 │     0.5850 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9884 │     0.5983 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 2 epochs ago


Epoch  70
Took 0.2865s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.6974 │     0.7380 │      0.9830 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9728 │     0.5850 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9887 │     0.5975 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 3 epochs ago


Epoch  71
Took 0.3261s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.6934 │     0.7398 │      0.9834 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9730 │     0.5850 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9890 │     0.5975 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 4 epochs ago


Epoch  72
Took 0.2950s
╒═══════════╤════════╤════════════╤═════════════╕
│ quality   │   loss │   accuracy │   hits_at_k │
╞═══════════╪════════╪════════════╪═════════════╡
│ train     │ 0.6893 │     0.7411 │      0.9839 │
├───────────┼────────┼────────────┼─────────────┤
│ vali      │ 0.9727 │     0.5866 │      0.9739 │
├───────────┼────────┼────────────┼─────────────┤
│ test      │ 0.9891 │     0.6006 │      0.9684 │
╘═══════════╧════════╧════════════╧═════════════╛
Last improvement of loss on combined happened 5 epochs ago

EARLY STOPPING due to lack of validation improvement, it has been 5 epochs since last validation accuracy improvement

Best validation model epoch: 67
Best validation model loss on validation set combined: 0.9725200428682215
Best validation model loss on test set combined: 0.9880656865163316

Finished: hyperparameter_training_optimized_model
Saved to: results/hyperparameter_training_optimized_model

In [20]:
# generating learning curves from training
learning_curves([opt_stats], 'quality',
                model_names=['optmized_model'],
                output_directory='./visualizations',
                file_format='png')



In [ ]: