import numpy as np import logging import os class Tunning: def __init__(self, data, domains, Results, Trainer, Tester, sample_size, CURRENT_PATH, CURRENT_TIME, params=None) -> None: self.data = data self.Trainer = Trainer self.Tester = Tester self._DOMAINS = domains self.sample_size = sample_size self.CURRENT_PATH = CURRENT_PATH self.CURRENT_TIME = CURRENT_TIME self.results = Results(os.path.join( self.CURRENT_PATH, "out", str(CURRENT_TIME)), self._DOMAINS) self.params = params def run(self, start_pos_prob=0.0, stop_pos_prob=1.0, start_ner_prob=0.0, stop_ner_prob=1.0): logging.info(f"Start pos_prob={start_pos_prob}, stop_pos_prob={stop_pos_prob}") test_dataset = self.data.load_test_set() for pos_prob in np.arange(start_pos_prob, stop_pos_prob + 0.1, 0.1): for ner_prob in np.arange(start_ner_prob, stop_ner_prob + 0.1, 0.1): for domain in self._DOMAINS: logging.info( f"Running {domain} pos_prob={pos_prob}, ner_prob={ner_prob}") dataset = self.data.load_domain( domain, balance=True, pos_prob=pos_prob, ner_prob=ner_prob, sample_size=self.sample_size) trainer = self.Trainer(dataset, self.params) results, best_model = trainer.train() validation_results = self.Tester( test_dataset, best_model, train_domain=domain).validate() logging.info( f"Cross domain f1 score: {validation_results['f1']} | test_results: {validation_results}") self.results.process(validation_results['f1'], domain, validation_results, results, balance=True, pos_prob=pos_prob, ner_prob=ner_prob)