From 3d544135f12f2568f227b7e14b33a8dea8e8cf1c Mon Sep 17 00:00:00 2001 From: Alex Moreo Date: Wed, 28 Apr 2021 11:28:13 +0200 Subject: [PATCH] cleaning new methods from master --- NewMethods/evaluate_results.py | 35 --- NewMethods/experiments.py | 223 ------------------ NewMethods/fgsld/em.py | 116 ---------- NewMethods/fgsld/fglsd_test.py | 51 ----- NewMethods/fgsld/fgsld_quantifiers.py | 37 --- NewMethods/fgsld/fine_grained_sld.py | 112 --------- NewMethods/fgsld/metrics.py | 271 ---------------------- NewMethods/fgsld/plot_fglsd.png | Bin 183592 -> 0 bytes NewMethods/gen_plots.py | 95 -------- NewMethods/gen_tables.py | 161 ------------- NewMethods/settings.py | 5 - NewMethods/show_hyperparams.py | 26 --- NewMethods/tabular.py | 318 -------------------------- NewMethods/util.py | 89 ------- 14 files changed, 1539 deletions(-) delete mode 100644 NewMethods/evaluate_results.py delete mode 100644 NewMethods/experiments.py delete mode 100644 NewMethods/fgsld/em.py delete mode 100644 NewMethods/fgsld/fglsd_test.py delete mode 100644 NewMethods/fgsld/fgsld_quantifiers.py delete mode 100644 NewMethods/fgsld/fine_grained_sld.py delete mode 100644 NewMethods/fgsld/metrics.py delete mode 100644 NewMethods/fgsld/plot_fglsd.png delete mode 100644 NewMethods/gen_plots.py delete mode 100644 NewMethods/gen_tables.py delete mode 100644 NewMethods/settings.py delete mode 100644 NewMethods/show_hyperparams.py delete mode 100644 NewMethods/tabular.py delete mode 100644 NewMethods/util.py diff --git a/NewMethods/evaluate_results.py b/NewMethods/evaluate_results.py deleted file mode 100644 index ae71593..0000000 --- a/NewMethods/evaluate_results.py +++ /dev/null @@ -1,35 +0,0 @@ -import numpy as np -import quapy as qp -import settings -import os -import pickle -from glob import glob -import itertools -import pathlib - -qp.environ['SAMPLE_SIZE'] = settings.SAMPLE_SIZE - -resultdir = './results' -methods = ['*'] - - -def evaluate_results(methods, datasets, error_name): - results_str = [] - all = [] - error = qp.error.from_name(error_name) - for method, dataset in itertools.product(methods, datasets): - for experiment in glob(f'{resultdir}/{dataset}-{method}-{error_name}.pkl'): - true_prevalences, estim_prevalences, tr_prev, te_prev, te_prev_estim, best_params = \ - pickle.load(open(experiment, 'rb')) - result = error(true_prevalences, estim_prevalences) - string = f'{pathlib.Path(experiment).name}: {result:.3f}' - results_str.append(string) - all.append(result) - results_str = sorted(results_str) - for r in results_str: - print(r) - print() - print(f'Ave: {np.mean(all):.3f}') - - -evaluate_results(methods=['*'], datasets=['*'], error_name='mae') diff --git a/NewMethods/experiments.py b/NewMethods/experiments.py deleted file mode 100644 index df18d74..0000000 --- a/NewMethods/experiments.py +++ /dev/null @@ -1,223 +0,0 @@ -from sklearn.linear_model import LogisticRegression -import quapy as qp -from NewMethods.fgsld.fgsld_quantifiers import FakeFGLSD -from classification.methods import PCALR -from method.meta import QuaNet -from method.non_aggregative import MaximumLikelihoodPrevalenceEstimation -from methods import * -from quapy.method.aggregative import CC, ACC, PCC, PACC, EMQ, OneVsAll, SVMQ, SVMKLD, SVMNKLD, SVMAE, SVMRAE, HDy -from quapy.method.meta import EPACC, EEMQ -import quapy.functional as F -import numpy as np -import os -import pickle -import itertools -from joblib import Parallel, delayed -import settings -import argparse -import torch -import shutil - - -qp.environ['SAMPLE_SIZE'] = settings.SAMPLE_SIZE - -def newLR(): - return LogisticRegression(max_iter=1000, solver='lbfgs', n_jobs=-1) - -__C_range = np.logspace(-4, 5, 10) -lr_params = {'C': __C_range, 'class_weight': [None, 'balanced']} -svmperf_params = {'C': __C_range} - - -def experimental_models(): - def newLR(): - return LogisticRegression(max_iter=1000, solver='lbfgs', n_jobs=-1) - __C_range = np.logspace(-4, 5, 10) - lr_params = {'C': __C_range, 'class_weight': [None, 'balanced']} - svmperf_params = {'C': __C_range} - #yield 'paccsld', PACCSLD(newLR()), lr_params - # yield 'hdysld', OneVsAll(HDySLD(newLR())), lr_params # <-- promising! - #yield 'PACC(5)', PACC(newLR(), val_split=5), {} - #yield 'PACC(10)', PACC(newLR(), val_split=10), {} - yield 'FGSLD(3)', FakeFGLSD(newLR(), nbins=3, isomerous=False, recompute_bins=True), {} - yield 'FGSLD(5)', FakeFGLSD(newLR(), nbins=5, isomerous=False, recompute_bins=True), {} - - - -def classic_models(): - # methods tested in Gao & Sebastiani 2016 - yield 'cc', CC(newLR()), lr_params - yield 'acc', ACC(newLR()), lr_params - yield 'pcc', PCC(newLR()), lr_params - yield 'pacc', PACC(newLR()), lr_params - yield 'sld', EMQ(newLR()), lr_params - yield 'svmq', OneVsAll(SVMQ(args.svmperfpath)), svmperf_params - yield 'svmkld', OneVsAll(SVMKLD(args.svmperfpath)), svmperf_params - yield 'svmnkld', OneVsAll(SVMNKLD(args.svmperfpath)), svmperf_params - - # methods added - yield 'svmmae', OneVsAll(SVMAE(args.svmperfpath)), svmperf_params - yield 'svmmrae', OneVsAll(SVMRAE(args.svmperfpath)), svmperf_params - yield 'hdy', OneVsAll(HDy(newLR())), lr_params - - -def cuda_models(): - device = 'cuda' if torch.cuda.is_available() else 'cpu' - print(f'Running QuaNet in {device}') - learner = PCALR(**newLR().get_params()) - yield 'quanet', QuaNet(learner, settings.SAMPLE_SIZE, checkpointdir=args.checkpointdir, device=device), lr_params - - -def ensembles(): - param_mod_sel = { - 'sample_size': settings.SAMPLE_SIZE, - 'n_prevpoints': 21, - 'n_repetitions': 5, - 'verbose': False - } - common={ - 'max_sample_size': 1000, - 'n_jobs': settings.ENSEMBLE_N_JOBS, - 'param_grid': lr_params, - 'param_mod_sel': param_mod_sel, - 'val_split': 0.4, - 'min_pos': 10 - } - - # hyperparameters will be evaluated within each quantifier of the ensemble, and so the typical model selection - # will be skipped (by setting hyperparameters to None) - hyper_none = None - #yield 'epaccmaeptr', EPACC(newLR(), optim='mae', policy='ptr', **common), hyper_none - yield 'epaccmaemae1k', EPACC(newLR(), optim='mae', policy='mae', **common), hyper_none - # yield 'esldmaeptr', EEMQ(newLR(), optim='mae', policy='ptr', **common), hyper_none - # yield 'esldmaemae', EEMQ(newLR(), optim='mae', policy='mae', **common), hyper_none - - #yield 'epaccmraeptr', EPACC(newLR(), optim='mrae', policy='ptr', **common), hyper_none - #yield 'epaccmraemrae', EPACC(newLR(), optim='mrae', policy='mrae', **common), hyper_none - #yield 'esldmraeptr', EEMQ(newLR(), optim='mrae', policy='ptr', **common), hyper_none - #yield 'esldmraemrae', EEMQ(newLR(), optim='mrae', policy='mrae', **common), hyper_none - - -def evaluate_experiment(true_prevalences, estim_prevalences): - print('\nEvaluation Metrics:\n'+'='*22) - for eval_measure in [qp.error.mae, qp.error.mrae]: - err = eval_measure(true_prevalences, estim_prevalences) - print(f'\t{eval_measure.__name__}={err:.4f}') - print() - - -def evaluate_method_point_test(true_prev, estim_prev): - print('\nPoint-Test evaluation:\n' + '=' * 22) - print(f'true-prev={F.strprev(true_prev)}, estim-prev={F.strprev(estim_prev)}') - for eval_measure in [qp.error.mae, qp.error.mrae]: - err = eval_measure(true_prev, estim_prev) - print(f'\t{eval_measure.__name__}={err:.4f}') - - -def result_path(path, dataset_name, model_name, optim_loss): - return os.path.join(path, f'{dataset_name}-{model_name}-{optim_loss}.pkl') - - -def is_already_computed(dataset_name, model_name, optim_loss): - if dataset_name=='semeval': - check_datasets = ['semeval13', 'semeval14', 'semeval15'] - else: - check_datasets = [dataset_name] - return all(os.path.exists(result_path(args.results, name, model_name, optim_loss)) for name in check_datasets) - - -def save_results(dataset_name, model_name, optim_loss, *results): - rpath = result_path(args.results, dataset_name, model_name, optim_loss) - qp.util.create_parent_dir(rpath) - with open(rpath, 'wb') as foo: - pickle.dump(tuple(results), foo, pickle.HIGHEST_PROTOCOL) - - -def run(experiment): - - optim_loss, dataset_name, (model_name, model, hyperparams) = experiment - - if is_already_computed(dataset_name, model_name, optim_loss=optim_loss): - print(f'result for dataset={dataset_name} model={model_name} loss={optim_loss} already computed.') - return - elif (optim_loss == 'mae' and 'mrae' in model_name) or (optim_loss=='mrae' and 'mae' in model_name): - print(f'skipping model={model_name} for optim_loss={optim_loss}') - return - else: - print(f'running dataset={dataset_name} model={model_name} loss={optim_loss}') - - benchmark_devel = qp.datasets.fetch_twitter(dataset_name, for_model_selection=True, min_df=5, pickle=True) - benchmark_devel.stats() - - # model selection (hyperparameter optimization for a quantification-oriented loss) - if hyperparams is not None: - model_selection = qp.model_selection.GridSearchQ( - model, - param_grid=hyperparams, - sample_size=settings.SAMPLE_SIZE, - n_prevpoints=21, - n_repetitions=5, - error=optim_loss, - refit=False, - timeout=60*60, - verbose=True - ) - model_selection.fit(benchmark_devel.training, benchmark_devel.test) - model = model_selection.best_model() - best_params = model_selection.best_params_ - else: - best_params = {} - - # model evaluation - test_names = [dataset_name] if dataset_name != 'semeval' else ['semeval13', 'semeval14', 'semeval15'] - for test_no, test_name in enumerate(test_names): - benchmark_eval = qp.datasets.fetch_twitter(test_name, for_model_selection=False, min_df=5, pickle=True) - if test_no == 0: - print('fitting the selected model') - # fits the model only the first time - model.fit(benchmark_eval.training) - - true_prevalences, estim_prevalences = qp.evaluation.artificial_sampling_prediction( - model, - test=benchmark_eval.test, - sample_size=settings.SAMPLE_SIZE, - n_prevpoints=21, - n_repetitions=25, - n_jobs=-1 if isinstance(model, qp.method.meta.Ensemble) else 1 - ) - test_estim_prevalence = model.quantify(benchmark_eval.test.instances) - test_true_prevalence = benchmark_eval.test.prevalence() - - evaluate_experiment(true_prevalences, estim_prevalences) - evaluate_method_point_test(test_true_prevalence, test_estim_prevalence) - save_results(test_name, model_name, optim_loss, - true_prevalences, estim_prevalences, - benchmark_eval.training.prevalence(), test_true_prevalence, test_estim_prevalence, - best_params) - - #if isinstance(model, QuaNet): - #model.clean_checkpoint_dir() - - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description='Run experiments for Tweeter Sentiment Quantification') - parser.add_argument('results', metavar='RESULT_PATH', type=str, - help='path to the directory where to store the results') - parser.add_argument('--svmperfpath', metavar='SVMPERF_PATH', type=str, default='./svm_perf_quantification', - help='path to the directory with svmperf') - parser.add_argument('--checkpointdir', metavar='PATH', type=str, default='./checkpoint', - help='path to the directory where to dump QuaNet checkpoints') - args = parser.parse_args() - - print(f'Result folder: {args.results}') - np.random.seed(0) - - optim_losses = ['mae'] - datasets = qp.datasets.TWITTER_SENTIMENT_DATASETS_TRAIN - - qp.util.parallel(run, itertools.product(optim_losses, datasets, experimental_models()), n_jobs=settings.N_JOBS) - # qp.util.parallel(run, itertools.product(optim_losses, datasets, classic_models()), n_jobs=settings.N_JOBS) - # qp.util.parallel(run, itertools.product(optim_losses, datasets, cuda_models()), n_jobs=settings.CUDA_N_JOBS) - # qp.util.parallel(run, itertools.product(optim_losses, datasets, ensembles()), n_jobs=1) - - diff --git a/NewMethods/fgsld/em.py b/NewMethods/fgsld/em.py deleted file mode 100644 index 007c41c..0000000 --- a/NewMethods/fgsld/em.py +++ /dev/null @@ -1,116 +0,0 @@ -import numpy as np -import logging -from collections import namedtuple - -from sklearn.metrics import brier_score_loss -from sklearn.preprocessing import MultiLabelBinarizer - -from NewMethods.fgsld.metrics import smoothmacroF1, isometric_brier_decomposition, isomerous_brier_decomposition - -History = namedtuple('History', ('posteriors', 'priors', 'y', 'iteration', 'stopping_criterium')) -MeasureSingleHistory = namedtuple('MeasureSingleHistory', ( - 'soft_acc', 'soft_f1', 'abs_errors', 'test_priors', 'train_priors', 'predict_priors', 'brier', - 'isometric_ref_loss', 'isometric_cal_loss', 'isomerous_ref_loss', 'isomerous_cal_loss' -)) - - -def get_measures_single_history(history: History, multi_class) -> MeasureSingleHistory: - y = history.y - - y_bin = MultiLabelBinarizer(classes=list(range(history.posteriors.shape[1]))).fit_transform(np.expand_dims(y, 1)) - - soft_acc = soft_accuracy(y, history.posteriors) - f1 = smoothmacroF1(y_bin, history.posteriors) - - if multi_class: - test_priors = np.mean(y_bin, 0) - abs_errors = abs(test_priors - history.priors) - train_priors = history.priors - predict_priors = np.mean(history.posteriors, 0) - brier = 0 - else: - test_priors = np.mean(y_bin, 0)[1] - abs_errors = abs(test_priors - history.priors[1]) - train_priors = history.priors[1] - predict_priors = np.mean(history.posteriors[:, 1]) - brier = brier_score_loss(y, history.posteriors[:, 1]) - - isometric_cal_loss, isometric_ref_loss = isometric_brier_decomposition(y, history.posteriors) - isomerous_em_cal_loss, isomerous_em_ref_loss = isomerous_brier_decomposition(y, history.posteriors) - - return MeasureSingleHistory( - soft_acc, f1, abs_errors, test_priors, train_priors, predict_priors, brier, isometric_ref_loss, - isometric_cal_loss, isomerous_em_ref_loss, isomerous_em_cal_loss - ) - - -def soft_accuracy(y, posteriors): - return sum(posteriors[y == c][:, c].sum() for c in range(posteriors.shape[1])) / posteriors.sum() - - -def soft_f1(y, posteriors): - cont_matrix = { - 'TPM': posteriors[y == 1][:, 1].sum(), - 'TNM': posteriors[y == 0][:, 0].sum(), - 'FPM': posteriors[y == 0][:, 1].sum(), - 'FNM': posteriors[y == 1][:, 0].sum() - } - precision = cont_matrix['TPM'] / (cont_matrix['TPM'] + cont_matrix['FPM']) - recall = cont_matrix['TPM'] / (cont_matrix['TPM'] + cont_matrix['FNM']) - return 2 * (precision * recall / (precision + recall)) - - -def em(y, posteriors_zero, priors_zero, epsilon=1e-6, multi_class=False, return_posteriors_hist=False): - """ - Implements the prior correction method based on EM presented in: - "Adjusting the Outputs of a Classifier to New a Priori Probabilities: A Simple Procedure" - Saerens, Latinne and Decaestecker, 2002 - http://www.isys.ucl.ac.be/staff/marco/Publications/Saerens2002a.pdf - - :param y: true labels of test items, to measure accuracy, precision and recall. - :param posteriors_zero: posterior probabilities on test items, as returned by a classifier. A 2D-array with shape - Ø(items, classes). - :param priors_zero: prior probabilities measured on training set. - :param epsilon: stopping threshold. - :param multi_class: whether the algorithm is running in a multi-label multi-class context or not. - :param return_posteriors_hist: whether posteriors for each iteration should be returned or not. If true, the returned - posteriors_s will actually be the list of posteriors for every iteration. - :return: posteriors_s, priors_s, history: final adjusted posteriors, final adjusted priors, a list of length s - where each element is a tuple with the step counter, the current priors (as list), the stopping criterium value, - accuracy, precision and recall. - """ - s = 0 - priors_s = np.copy(priors_zero) - posteriors_s = np.copy(posteriors_zero) - if return_posteriors_hist: - posteriors_hist = [posteriors_s.copy()] - val = 2 * epsilon - history = list() - history.append(get_measures_single_history(History(posteriors_zero, priors_zero, y, s, 1), multi_class)) - while not val < epsilon and s < 999: - # M step - priors_s_minus_one = priors_s.copy() - priors_s = posteriors_s.mean(0) - - # E step - ratios = priors_s / priors_zero - denominators = 0 - for c in range(priors_zero.shape[0]): - denominators += ratios[c] * posteriors_zero[:, c] - for c in range(priors_zero.shape[0]): - posteriors_s[:, c] = ratios[c] * posteriors_zero[:, c] / denominators - - # check for stop - val = 0 - for i in range(len(priors_s_minus_one)): - val += abs(priors_s_minus_one[i] - priors_s[i]) - - logging.debug(f"Em iteration: {s}; Val: {val}") - s += 1 - if return_posteriors_hist: - posteriors_hist.append(posteriors_s.copy()) - history.append(get_measures_single_history(History(posteriors_s, priors_s, y, s, val), multi_class)) - - if return_posteriors_hist: - return posteriors_hist, priors_s, history - return posteriors_s, priors_s, history diff --git a/NewMethods/fgsld/fglsd_test.py b/NewMethods/fgsld/fglsd_test.py deleted file mode 100644 index c8a098c..0000000 --- a/NewMethods/fgsld/fglsd_test.py +++ /dev/null @@ -1,51 +0,0 @@ -from sklearn.calibration import CalibratedClassifierCV -from sklearn.linear_model import LogisticRegression -from sklearn.svm import LinearSVC -from fgsld_quantifiers import FakeFGLSD -from method.aggregative import EMQ, CC -import quapy as qp -import numpy as np - - -qp.environ['SAMPLE_SIZE'] = 500 - -dataset = qp.datasets.fetch_reviews('hp') -qp.data.preprocessing.text2tfidf(dataset, min_df=5, inplace=True) - -training = dataset.training -test = dataset.test - -cls = CalibratedClassifierCV(LinearSVC()) - -#cls = LogisticRegression() - - -method_names, true_prevs, estim_prevs, tr_prevs = [], [], [], [] - -for model, model_name in [ - (CC(cls), 'CC'), -# (FakeFGLSD(cls, nbins=20, isomerous=False, recompute_bins=True), 'FGSLD-isometric-dyn-20'), - #(FakeFGLSD(cls, nbins=11, isomerous=False, recompute_bins=True), 'FGSLD-isometric-dyn-11'), - #(FakeFGLSD(cls, nbins=8, isomerous=False, recompute_bins=True), 'FGSLD-isometric-dyn-8'), - #(FakeFGLSD(cls, nbins=6, isomerous=False, recompute_bins=True), 'FGSLD-isometric-dyn-6'), - (FakeFGLSD(cls, nbins=5, isomerous=False, recompute_bins=True), 'FGSLD-isometric-dyn-5'), - #(FakeFGLSD(cls, nbins=4, isomerous=False, recompute_bins=True), 'FGSLD-isometric-dyn-4'), - #(FakeFGLSD(cls, nbins=3, isomerous=False, recompute_bins=True), 'FGSLD-isometric-dyn-3'), - (FakeFGLSD(cls, nbins=1, isomerous=False, recompute_bins=True), 'FGSLD-isometric-dyn-1'), -# (FakeFGLSD(cls, nbins=3, isomerous=False, recompute_bins=False), 'FGSLD-isometric-sta-3'), - (EMQ(cls), 'SLD'), -]: - print('running ', model_name) - model.fit(training) - true_prev, estim_prev = qp.evaluation.artificial_sampling_prediction( - model, test, qp.environ['SAMPLE_SIZE'], n_repetitions=5, n_prevpoints=11, n_jobs=-1 - ) - method_names.append(model_name) - true_prevs.append(true_prev) - estim_prevs.append(estim_prev) - tr_prevs.append(training.prevalence()) - #if hasattr(model, 'iterations'): - # print(f'iterations ave={np.mean(model.iterations):.3f}, min={np.min(model.iterations):.3f}, max={np.max(model.iterations):.3f}') - - -qp.plot.binary_diagonal(method_names, true_prevs, estim_prevs, train_prev=tr_prevs[0], savepath='./plot_fglsd.png') diff --git a/NewMethods/fgsld/fgsld_quantifiers.py b/NewMethods/fgsld/fgsld_quantifiers.py deleted file mode 100644 index 94c8681..0000000 --- a/NewMethods/fgsld/fgsld_quantifiers.py +++ /dev/null @@ -1,37 +0,0 @@ -from sklearn.calibration import CalibratedClassifierCV -from sklearn.svm import LinearSVC - -from NewMethods.fgsld.fine_grained_sld import FineGrainedSLD -from quapy.method.aggregative import EMQ, CC, training_helper -from quapy.data import LabelledCollection -from quapy.method.base import BaseQuantifier -import quapy.functional as F - - -class FakeFGLSD(BaseQuantifier): - def __init__(self, learner, nbins, isomerous, recompute_bins): - self.learner = learner - self.nbins = nbins - self.isomerous = isomerous - self.recompute_bins = recompute_bins - self.iterations=[] - - def fit(self, data: LabelledCollection): - self.Xtr, self.ytr = data.Xy - self.learner.fit(self.Xtr, self.ytr) - return self - - def quantify(self, instances): - tr_priors = F.prevalence_from_labels(self.ytr, n_classes=2) - fgsld = FineGrainedSLD(self.Xtr, instances, self.ytr, tr_priors, self.learner, n_bins=self.nbins) - priors, posteriors = fgsld.run(self.isomerous, compute_bins_at_every_iter=self.recompute_bins) - self.iterations.append(fgsld.iterations) - return priors - - def get_params(self, deep=True): - pass - - def set_params(self, **parameters): - pass - - diff --git a/NewMethods/fgsld/fine_grained_sld.py b/NewMethods/fgsld/fine_grained_sld.py deleted file mode 100644 index cd3e38f..0000000 --- a/NewMethods/fgsld/fine_grained_sld.py +++ /dev/null @@ -1,112 +0,0 @@ -import numpy as np -from NewMethods.fgsld.metrics import isomerous_bins, isometric_bins -from NewMethods.fgsld.em import History, get_measures_single_history -from sklearn.model_selection import cross_val_predict -import math -from scipy.special import softmax - -class FineGrainedSLD: - def __init__(self, x_tr, x_te, y_tr, tr_priors, clf, n_bins=10): - self.y_tr = y_tr - self.clf = clf - self.tr_priors = tr_priors - self.te_preds = clf.predict_proba(x_te) - self.tr_preds = cross_val_predict(clf, x_tr, y_tr, method='predict_proba', n_jobs=10) - self.n_bins = n_bins - self.history: [History] = [] - self.multi_class = False - - def run(self, isomerous_binning, epsilon=1e-6, compute_bins_at_every_iter=True): - """ - Run the FGSLD algorithm. - - :param isomerous_binning: whether to use isomerous or isometric binning. - :param epsilon: stopping condition. - :param compute_bins_at_every_iter: whether FGSLD should recompute the posterior bins at every iteration or not. - :param return_posteriors_hist: whether to return posteriors at every iteration or not. - :return: If `return_posteriors_hist` is true, the returned posteriors will be a list of numpy arrays, else a single numpy array with posteriors at last iteration. - """ - smoothing_tr = 1e-9 # 1 / (2 * self.tr_preds.shape[0]) - smoothing_te = 1e-9 # 1 / (2 * self.te_preds.shape[0]) - s = 0 - tr_bin_priors = np.zeros((self.n_bins, self.tr_preds.shape[1]), dtype=np.float) - te_bin_priors = np.zeros((self.n_bins, self.te_preds.shape[1]), dtype=np.float) - tr_bins = self.__create_bins(training=True, isomerous_binning=isomerous_binning) - self.__compute_bins_priors(tr_bin_priors, self.tr_preds, tr_bins, smoothing_tr) - - te_preds_cp = self.te_preds.copy() - val = 2 * epsilon - while not val < epsilon and s < 1000: - if compute_bins_at_every_iter or s==0: - te_bins = self.__create_bins(training=False, isomerous_binning=isomerous_binning) - - if s == 0: - te_bin_priors_prev = tr_bin_priors.copy() - else: - te_bin_priors_prev = te_bin_priors.copy() - self.__compute_bins_priors(te_bin_priors, self.te_preds, te_bins, smoothing_te) - - for label_idx, bins in te_bins.items(): - for i, bin_ in enumerate(bins): - if bin_.shape[0] == 0: - continue - alpha = 1 - beta = 0.1 - local_te = te_bin_priors[i][label_idx] - global_te = self.te_preds[:,label_idx].mean() - te = local_te*alpha + global_te*(1-alpha) - local_tr = tr_bin_priors[i][label_idx] - global_tr = self.tr_priors[label_idx] - tr = local_tr*beta + global_tr*(1-beta) - #local_min = (math.floor(tr * self.n_bins) / self.n_bins) - # local_max = local_min + .1 - # trans = lambda l: min(max((l - local_min) / 1, 0), 1) - assert not isomerous_binning, 'not tested' - #trans = lambda l: l - local_min - # trans = lambda l: l - # ratio = (trans(te) / trans(tr)) - #ratio = np.clip(ratio, 0.1, 2) - #ratio = ratio**3 - #self.te_preds[:, label_idx][bin_] = (te_preds_cp[:, label_idx][bin_]) * ratio - old_posterior = te_preds_cp[:, label_idx][bin_] - lr = 1 - #self.te_preds[:, label_idx][bin_] = np.clip(old_posterior + (te-tr)*lr, 0, None) - self.te_preds[:, label_idx][bin_] = np.clip(old_posterior + (te - tr) * lr, 0, None) - #self.te_preds[:, label_idx][bin_] = (te_preds_cp[:, label_idx][bin_]) * ratio - - # Normalization step - self.te_preds = (self.te_preds / self.te_preds.sum(axis=1, keepdims=True)) - #self.te_preds = softmax(self.te_preds, axis=1) - - val = np.max(np.abs(te_bin_priors / te_bin_priors_prev) - 1) - s += 1 - - self.iterations = s - - priors = self.te_preds.mean(axis=0) - posteriors = self.te_preds - - return priors, posteriors - - def __compute_bins_priors(self, bin_priors_placeholder, posteriors, bins, smoothing): - for label_idx, bins in bins.items(): - for i, bin_ in enumerate(bins): - if bin_.shape[0] == 0: - bin_priors_placeholder[i, label_idx] = smoothing - continue - numerator = posteriors[bin_, label_idx].mean() - bin_prior = (numerator + smoothing) / (1 + self.n_bins * smoothing) # normalize priors - bin_priors_placeholder[i, label_idx] = bin_prior - - def __create_bins(self, training: bool, isomerous_binning: bool): - bins = {} - preds = self.tr_preds if training else self.te_preds - if isomerous_binning: - for label_idx in range(preds.shape[1]): - bins[label_idx] = isomerous_bins(label_idx, preds, self.n_bins) - else: - intervals = np.linspace(0., 1., num=self.n_bins, endpoint=False) - for label_idx in range(preds.shape[1]): - bins_ = isometric_bins(label_idx, preds, intervals) - bins[label_idx] = [bins_[i] for i in intervals] - return bins diff --git a/NewMethods/fgsld/metrics.py b/NewMethods/fgsld/metrics.py deleted file mode 100644 index 5a2662e..0000000 --- a/NewMethods/fgsld/metrics.py +++ /dev/null @@ -1,271 +0,0 @@ -import numpy as np - -""" -Scikit learn provides a full set of evaluation metrics, but they treat special cases differently. -I.e., when the number of true positives, false positives, and false negatives ammount to 0, all -affected metrics (precision, recall, and thus f1) output 0 in Scikit learn. -We adhere to the common practice of outputting 1 in this case since the classifier has correctly -classified all examples as negatives. -""" - - -def isometric_brier_decomposition(true_labels, predicted_labels, bin_intervals=np.arange(0., 1.1, 0.1), step=0.1): - """ - The Isometric Brier decomposition or score is obtained by partitioning U into intervals I_1j,...,I_bj that - have equal length, where U is the total size of our test set (i.e., true_labels.shape[0]). This means that, - if b=10 then I_1j = [0.0,0.1), I_2j = [0.2, 0.3),...,I_bj = [0.9,1.0). - - bin_intervals is a numpy.array containing the range of the different intervals. Since it is a single dimensional - array, for every interval I_n we take the posterior probabilities Pr_n(x) such that I_n <= Pr_n(x) < I_n + step. - This variable defaults to np.arange(0., 1.0, 0.1), i.e. an array like [0.1, 0.2, ..., 1.0]. - - :return: a tuple (calibration score, refinement score) - """ - labels = set(true_labels) - calibration_score, refinement_score = 0.0, 0.0 - for i in range(len(labels)): - bins = isometric_bins(i, predicted_labels, bin_intervals, step) - c_score, r_score = brier_decomposition(bins.values(), true_labels, predicted_labels, class_=i) - calibration_score += c_score - refinement_score += r_score - return calibration_score, refinement_score - - -def isomerous_brier_decomposition(true_labels, predicted_labels, n=10): - """ - The Isomerous Brier decomposition or score is obtained by partitioning U into intervals I_1j,...,I_bj such that - the corresponding bins B_1j,...,B_bj have equal size, where U is our test set. This means that, for every x' in - B_sj and x'' in B_tj with s < t, it holds that Pr(c_j|x') <= Pr(c_j|x'') and |B_sj| == |B_tj|, for any s,t in - {1,...,b}. - - The n variable holds the number of bins we want (defaults to 10). Notice that we perform a numpy.array_split on - the predicted_labels, creating l % n sub-arrays of size l//n + 1 and the rest of size l//n, where l is the length - of the array. - - :return: a tuple (calibration score, refinement score) - """ - - labels = set(true_labels) - calibration_score, refinement_score = 0.0, 0.0 - for i in range(len(labels)): - bins = isomerous_bins(i, predicted_labels, n) - c_score, r_score = brier_decomposition(bins, true_labels, predicted_labels, class_=i) - calibration_score += c_score - refinement_score += r_score - return calibration_score, refinement_score - - -def brier_decomposition(bins, true_labels, predicted_labels, class_=1): - """ - :param bins: must be an array of indices - :return: a tuple (calibration_score, refinement_score) - """ - calibration_score = 0 - refinement_score = 0 - for bin_ in bins: - if bin_.size <= 0: - continue - v_x = (bin_.shape[0] / true_labels.shape[0]) - ro_x = np.mean(true_labels[bin_] == class_) - calibration_score += v_x * (predicted_labels[bin_, class_].mean() - ro_x)**2 - refinement_score += (v_x * ro_x) * (1 - ro_x) - labels_len = len(set(true_labels)) - return calibration_score / (labels_len * len(bins)), refinement_score / (labels_len * len(bins)) - - -#def isometric_bins(label_index, predicted_labels, bin_intervals, step): -# predicted_class_label = predicted_labels[:, label_index] -# return {interv: np.where(np.logical_and(interv <= predicted_class_label, predicted_class_label < interv + step))[0] -# for interv in bin_intervals} - -def isometric_bins(label_index, predicted_labels, bin_intervals): - def next_intv(i): - return bin_intervals[i + 1] if (i + 1) < len(bin_intervals) else 1. - predicted_class_label = predicted_labels[:, label_index] - return { - interv: - np.where(np.logical_and(interv <= predicted_class_label, predicted_class_label < next_intv(i)))[ - 0] - for i, interv in enumerate(bin_intervals) - } - - -def isomerous_bins(label_index, predicted_labels, n): - sorted_indices = predicted_labels[:, label_index].argsort() - return np.array_split(sorted_indices, n) - - -# true_labels and predicted_labels are two matrices in sklearn.preprocessing.MultiLabelBinarizer format -def macroF1(true_labels, predicted_labels): - return macro_average(true_labels, predicted_labels, f1) - - -# true_labels and predicted_labels are two matrices in sklearn.preprocessing.MultiLabelBinarizer format -def microF1(true_labels, predicted_labels): - return micro_average(true_labels, predicted_labels, f1) - - -# true_labels and predicted_labels are two matrices in sklearn.preprocessing.MultiLabelBinarizer format -def macroK(true_labels, predicted_labels): - return macro_average(true_labels, predicted_labels, K) - - -# true_labels and predicted_labels are two matrices in sklearn.preprocessing.MultiLabelBinarizer format -def microK(true_labels, predicted_labels): - return micro_average(true_labels, predicted_labels, K) - - -# true_labels is a matrix in sklearn.preprocessing.MultiLabelBinarizer format and posterior_probabilities is a matrix -# of the same shape containing real values in [0,1] -def smoothmacroF1(true_labels, posterior_probabilities): - return macro_average(true_labels, posterior_probabilities, f1, metric_statistics=soft_single_metric_statistics) - - -# true_labels is a matrix in sklearn.preprocessing.MultiLabelBinarizer format and posterior_probabilities is a matrix -# of the same shape containing real values in [0,1] -def smoothmicroF1(true_labels, posterior_probabilities): - return micro_average(true_labels, posterior_probabilities, f1, metric_statistics=soft_single_metric_statistics) - - -# true_labels is a matrix in sklearn.preprocessing.MultiLabelBinarizer format and posterior_probabilities is a matrix -# of the same shape containing real values in [0,1] -def smoothmacroK(true_labels, posterior_probabilities): - return macro_average(true_labels, posterior_probabilities, K, metric_statistics=soft_single_metric_statistics) - - -# true_labels is a matrix in sklearn.preprocessing.MultiLabelBinarizer format and posterior_probabilities is a matrix -# of the same shape containing real values in [0,1] -def smoothmicroK(true_labels, posterior_probabilities): - return micro_average(true_labels, posterior_probabilities, K, metric_statistics=soft_single_metric_statistics) - - -class ContTable: - def __init__(self, tp=0, tn=0, fp=0, fn=0): - self.tp = tp - self.tn = tn - self.fp = fp - self.fn = fn - - def get_d(self): return self.tp + self.tn + self.fp + self.fn - - def get_c(self): return self.tp + self.fn - - def get_not_c(self): return self.tn + self.fp - - def get_f(self): return self.tp + self.fp - - def get_not_f(self): return self.tn + self.fn - - def p_c(self): return (1.0 * self.get_c()) / self.get_d() - - def p_not_c(self): return 1.0 - self.p_c() - - def p_f(self): return (1.0 * self.get_f()) / self.get_d() - - def p_not_f(self): return 1.0 - self.p_f() - - def p_tp(self): return (1.0 * self.tp) / self.get_d() - - def p_tn(self): return (1.0 * self.tn) / self.get_d() - - def p_fp(self): return (1.0 * self.fp) / self.get_d() - - def p_fn(self): return (1.0 * self.fn) / self.get_d() - - def tpr(self): - c = 1.0 * self.get_c() - return self.tp / c if c > 0.0 else 0.0 - - def fpr(self): - _c = 1.0 * self.get_not_c() - return self.fp / _c if _c > 0.0 else 0.0 - - def __add__(self, other): - return ContTable(tp=self.tp + other.tp, tn=self.tn + other.tn, fp=self.fp + other.fp, fn=self.fn + other.fn) - - -def accuracy(cell): - return (cell.tp + cell.tn) * 1.0 / (cell.tp + cell.fp + cell.fn + cell.tn) - - -def f1(cell): - num = 2.0 * cell.tp - den = 2.0 * cell.tp + cell.fp + cell.fn - if den > 0: return num / den - # we define f1 to be 1 if den==0 since the classifier has correctly classified all instances as negative - return 1.0 - - -def K(cell): - specificity, recall = 0., 0. - - AN = cell.tn + cell.fp - if AN != 0: - specificity = cell.tn * 1. / AN - - AP = cell.tp + cell.fn - if AP != 0: - recall = cell.tp * 1. / AP - - if AP == 0: - return 2. * specificity - 1. - elif AN == 0: - return 2. * recall - 1. - else: - return specificity + recall - 1. - - -# computes the (hard) counters tp, fp, fn, and tn fron a true and predicted vectors of hard decisions -# true_labels and predicted_labels are two vectors of shape (number_documents,) -def hard_single_metric_statistics(true_labels, predicted_labels): - assert len(true_labels) == len(predicted_labels), "Format not consistent between true and predicted labels." - nd = len(true_labels) - tp = np.sum(predicted_labels[true_labels == 1]) - fp = np.sum(predicted_labels[true_labels == 0]) - fn = np.sum(true_labels[predicted_labels == 0]) - tn = nd - (tp + fp + fn) - return ContTable(tp=tp, tn=tn, fp=fp, fn=fn) - - -# computes the (soft) contingency table where tp, fp, fn, and tn are the cumulative masses for the posterioir -# probabilitiesfron with respect to the true binary labels -# true_labels and posterior_probabilities are two vectors of shape (number_documents,) -def soft_single_metric_statistics(true_labels, posterior_probabilities): - assert len(true_labels) == len(posterior_probabilities), "Format not consistent between true and predicted labels." - pos_probs = posterior_probabilities[true_labels == 1] - neg_probs = posterior_probabilities[true_labels == 0] - tp = np.sum(pos_probs) - fn = np.sum(1. - pos_probs) - fp = np.sum(neg_probs) - tn = np.sum(1. - neg_probs) - return ContTable(tp=tp, tn=tn, fp=fp, fn=fn) - - -# if the classifier is single class, then the prediction is a vector of shape=(nD,) which causes issues when compared -# to the true labels (of shape=(nD,1)). This method increases the dimensions of the predictions. -def __check_consistency_and_adapt(true_labels, predictions): - if predictions.ndim == 1: - return __check_consistency_and_adapt(true_labels, np.expand_dims(predictions, axis=1)) - if true_labels.ndim == 1: - return __check_consistency_and_adapt(np.expand_dims(true_labels, axis=1), predictions) - if true_labels.shape != predictions.shape: - raise ValueError("True and predicted label matrices shapes are inconsistent %s %s." - % (true_labels.shape, predictions.shape)) - _, nC = true_labels.shape - return true_labels, predictions, nC - - -def macro_average(true_labels, predicted_labels, metric, metric_statistics=hard_single_metric_statistics): - true_labels, predicted_labels, nC = __check_consistency_and_adapt(true_labels, predicted_labels) - return np.mean([metric(metric_statistics(true_labels[:, c], predicted_labels[:, c])) for c in range(nC)]) - - -def micro_average(true_labels, predicted_labels, metric, metric_statistics=hard_single_metric_statistics): - true_labels, predicted_labels, nC = __check_consistency_and_adapt(true_labels, predicted_labels) - - accum = ContTable() - for c in range(nC): - other = metric_statistics(true_labels[:, c], predicted_labels[:, c]) - accum = accum + other - - return metric(accum) diff --git a/NewMethods/fgsld/plot_fglsd.png b/NewMethods/fgsld/plot_fglsd.png deleted file mode 100644 index bc0de3ff48d256c006605c161fc6a6d2890d7812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183592 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 z 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

gZAJ^4uZ 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 diff --git a/NewMethods/gen_plots.py b/NewMethods/gen_plots.py deleted file mode 100644 index 4952999..0000000 --- a/NewMethods/gen_plots.py +++ /dev/null @@ -1,95 +0,0 @@ -import quapy as qp -import settings -import os -import pathlib -import pickle -from glob import glob -import sys -from TweetSentQuant.util import nicename -from os.path import join - - -qp.environ['SAMPLE_SIZE'] = settings.SAMPLE_SIZE -plotext='png' - -resultdir = './results' -plotdir = './plots' -os.makedirs(plotdir, exist_ok=True) - -def gather_results(methods, error_name): - method_names, true_prevs, estim_prevs, tr_prevs = [], [], [], [] - for method in methods: - for experiment in glob(f'{resultdir}/*-{method}-m{error_name}.pkl'): - true_prevalences, estim_prevalences, tr_prev, te_prev, te_prev_estim, best_params = pickle.load(open(experiment, 'rb')) - method_names.append(nicename(method)) - true_prevs.append(true_prevalences) - estim_prevs.append(estim_prevalences) - tr_prevs.append(tr_prev) - return method_names, true_prevs, estim_prevs, tr_prevs - - -def plot_error_by_drift(methods, error_name, logscale=False, path=None): - print('plotting error by drift') - if path is not None: - path = join(path, f'error_by_drift_{error_name}.{plotext}') - method_names, true_prevs, estim_prevs, tr_prevs = gather_results(methods, error_name) - qp.plot.error_by_drift( - method_names, - true_prevs, - estim_prevs, - tr_prevs, - n_bins=20, - error_name=error_name, - show_std=False, - logscale=logscale, - title=f'Quantification error as a function of distribution shift', - savepath=path - ) - - -def diagonal_plot(methods, error_name, path=None): - print('plotting diagonal plots') - if path is not None: - path = join(path, f'diag_{error_name}') - method_names, true_prevs, estim_prevs, tr_prevs = gather_results(methods, error_name) - qp.plot.binary_diagonal(method_names, true_prevs, estim_prevs, pos_class=0, title='Negative', legend=False, show_std=False, savepath=f'{path}_neg.{plotext}') - qp.plot.binary_diagonal(method_names, true_prevs, estim_prevs, pos_class=1, title='Neutral', legend=False, show_std=False, savepath=f'{path}_neu.{plotext}') - qp.plot.binary_diagonal(method_names, true_prevs, estim_prevs, pos_class=2, title='Positive', legend=True, show_std=False, savepath=f'{path}_pos.{plotext}') - - -def binary_bias_global(methods, error_name, path=None): - print('plotting bias global') - if path is not None: - path = join(path, f'globalbias_{error_name}') - method_names, true_prevs, estim_prevs, tr_prevs = gather_results(methods, error_name) - qp.plot.binary_bias_global(method_names, true_prevs, estim_prevs, pos_class=0, title='Negative', savepath=f'{path}_neg.{plotext}') - qp.plot.binary_bias_global(method_names, true_prevs, estim_prevs, pos_class=1, title='Neutral', savepath=f'{path}_neu.{plotext}') - qp.plot.binary_bias_global(method_names, true_prevs, estim_prevs, pos_class=2, title='Positive', savepath=f'{path}_pos.{plotext}') - - -def binary_bias_bins(methods, error_name, path=None): - print('plotting bias local') - if path is not None: - path = join(path, f'localbias_{error_name}') - method_names, true_prevs, estim_prevs, tr_prevs = gather_results(methods, error_name) - qp.plot.binary_bias_bins(method_names, true_prevs, estim_prevs, pos_class=0, title='Negative', legend=False, savepath=f'{path}_neg.{plotext}') - qp.plot.binary_bias_bins(method_names, true_prevs, estim_prevs, pos_class=1, title='Neutral', legend=False, savepath=f'{path}_neu.{plotext}') - qp.plot.binary_bias_bins(method_names, true_prevs, estim_prevs, pos_class=2, title='Positive', legend=True, savepath=f'{path}_pos.{plotext}') - - -gao_seb_methods = ['cc', 'acc', 'pcc', 'pacc', 'sld', 'svmq', 'svmkld', 'svmnkld'] -new_methods_ae = ['svmmae' , 'epaccmaeptr', 'epaccmaemae', 'hdy', 'quanet'] -new_methods_rae = ['svmmrae' , 'epaccmraeptr', 'epaccmraemrae', 'hdy', 'quanet'] - -plot_error_by_drift(gao_seb_methods+new_methods_ae, error_name='ae', path=plotdir) -plot_error_by_drift(gao_seb_methods+new_methods_rae, error_name='rae', logscale=True, path=plotdir) - -diagonal_plot(gao_seb_methods+new_methods_ae, error_name='ae', path=plotdir) -diagonal_plot(gao_seb_methods+new_methods_rae, error_name='rae', path=plotdir) - -binary_bias_global(gao_seb_methods+new_methods_ae, error_name='ae', path=plotdir) -binary_bias_global(gao_seb_methods+new_methods_rae, error_name='rae', path=plotdir) - -#binary_bias_bins(gao_seb_methods+new_methods_ae, error_name='ae', path=plotdir) -#binary_bias_bins(gao_seb_methods+new_methods_rae, error_name='rae', path=plotdir) - diff --git a/NewMethods/gen_tables.py b/NewMethods/gen_tables.py deleted file mode 100644 index 2cf2aab..0000000 --- a/NewMethods/gen_tables.py +++ /dev/null @@ -1,161 +0,0 @@ -import quapy as qp -import numpy as np -from os import makedirs -import sys, os -import pickle -from experiments import result_path -from tabular import Table -import argparse - -tables_path = './tables' -MAXTONE = 50 # sets the intensity of the maximum color reached by the worst (red) and best (green) results - -makedirs(tables_path, exist_ok=True) - -sample_size = 100 -qp.environ['SAMPLE_SIZE'] = sample_size - - -nice = { - 'mae':'AE', - 'mrae':'RAE', - 'ae':'AE', - 'rae':'RAE', - 'svmkld': 'SVM(KLD)', - 'svmnkld': 'SVM(NKLD)', - 'svmq': 'SVM(Q)', - 'svmae': 'SVM(AE)', - 'svmnae': 'SVM(NAE)', - 'svmmae': 'SVM(AE)', - 'svmmrae': 'SVM(RAE)', - 'quanet': 'QuaNet', - 'hdy': 'HDy', - 'hdysld': 'HDy-SLD', - 'dys': 'DyS', - 'svmperf':'', - 'sanders': 'Sanders', - 'semeval13': 'SemEval13', - 'semeval14': 'SemEval14', - 'semeval15': 'SemEval15', - 'semeval16': 'SemEval16', - 'Average': 'Average' -} - -def save_table(path, table): - print(f'saving results in {path}') - with open(path, 'wt') as foo: - foo.write(table) - - -def experiment_errors(path, dataset, method, loss): - path = result_path(path, dataset, method, 'm'+loss if not loss.startswith('m') else loss) - if os.path.exists(path): - true_prevs, estim_prevs, _, _, _, _ = pickle.load(open(path, 'rb')) - err_fn = getattr(qp.error, loss) - errors = err_fn(true_prevs, estim_prevs) - return errors - return None - -def nicerm(key): - return '\mathrm{'+nice[key]+'}' - - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description='Generate tables for Tweeter Sentiment Quantification') - parser.add_argument('results', metavar='RESULT_PATH', type=str, - help='path to the directory containing the results of the methods tested in Gao & Sebastiani') - parser.add_argument('newresults', metavar='RESULT_PATH', type=str, - help='path to the directory containing the results for the experimental methods') - args = parser.parse_args() - - datasets = qp.datasets.TWITTER_SENTIMENT_DATASETS_TEST - evaluation_measures = [qp.error.ae, qp.error.rae] - gao_seb_methods = ['cc', 'acc', 'pcc', 'pacc', 'sld', 'svmq', 'svmkld', 'svmnkld'] - new_methods = ['hdy'] # methods added to the Gao & Sebastiani methods - experimental_methods = ['hdysld'] # experimental - - for i, eval_func in enumerate(evaluation_measures): - - # Tables evaluation scores for AE and RAE (two tables) - # ---------------------------------------------------- - - eval_name = eval_func.__name__ - - added_methods = ['svmm' + eval_name] + new_methods - methods = gao_seb_methods + added_methods + experimental_methods - nold_methods = len(gao_seb_methods) - nnew_methods = len(added_methods) - nexp_methods = len(experimental_methods) - - # fill data table - table = Table(benchmarks=datasets, methods=methods) - for dataset in datasets: - for method in methods: - if method in experimental_methods: - path = args.newresults - else: - path = args.results - table.add(dataset, method, experiment_errors(path, dataset, method, eval_name)) - - # write the latex table - tabular = """ - \\begin{tabularx}{\\textwidth}{|c||""" + ('Y|'*nold_methods) + '|' + ('Y|'*nnew_methods) + '|' + ('Y|'*nexp_methods) + """} \hline - & \multicolumn{"""+str(nold_methods)+"""}{c||}{Methods tested in~\cite{Gao:2016uq}} & - \multicolumn{"""+str(nnew_methods)+"""}{c|}{} & - \multicolumn{"""+str(nexp_methods)+"""}{c|}{}\\\\ \hline - """ - rowreplace={dataset: nice.get(dataset, dataset.upper()) for dataset in datasets} - colreplace={method:'\side{' + nice.get(method, method.upper()) +'$^{' + nicerm(eval_name) + '}$} ' for method in methods} - - tabular += table.latexTabular(benchmark_replace=rowreplace, method_replace=colreplace) - tabular += "\n\end{tabularx}" - - save_table(f'./tables/tab_results_{eval_name}.new.tex', tabular) - - # Tables ranks for AE and RAE (two tables) - # ---------------------------------------------------- - # fill the data table - ranktable = Table(benchmarks=datasets, methods=methods, missing='--') - for dataset in datasets: - for method in methods: - ranktable.add(dataset, method, values=table.get(dataset, method, 'rank')) - - # write the latex table - tabular = """ - \\begin{tabularx}{\\textwidth}{|c||""" + ('Y|'*nold_methods) + '|' + ('Y|'*nnew_methods) + '|' + ('Y|'*nexp_methods) + """} \hline - & \multicolumn{"""+str(nold_methods)+"""}{c||}{Methods tested in~\cite{Gao:2016uq}} & - \multicolumn{"""+str(nnew_methods)+"""}{c|}{} & - \multicolumn{"""+str(nexp_methods)+"""}{c|}{}\\\\ \hline - """ - for method in methods: - tabular += ' & \side{' + nice.get(method, method.upper()) +'$^{' + nicerm(eval_name) + '}$} ' - tabular += '\\\\\hline\n' - - for dataset in datasets: - tabular += nice.get(dataset, dataset.upper()) + ' ' - for method in methods: - newrank = ranktable.get(dataset, method) - if newrank != '--': - newrank = f'{int(newrank)}' - color = ranktable.get_color(dataset, method) - if color == '--': - color = '' - tabular += ' & ' + f'{newrank}' + color - tabular += '\\\\\hline\n' - tabular += '\hline\n' - - tabular += 'Average ' - for method in methods: - newrank = ranktable.get_average(method) - if newrank != '--': - newrank = f'{newrank:.1f}' - color = ranktable.get_average(method, 'color') - if color == '--': - color = '' - tabular += ' & ' + f'{newrank}' + color - tabular += '\\\\\hline\n' - tabular += "\end{tabularx}" - - save_table(f'./tables/tab_rank_{eval_name}.new.tex', tabular) - - print("[Done]") diff --git a/NewMethods/settings.py b/NewMethods/settings.py deleted file mode 100644 index 431e173..0000000 --- a/NewMethods/settings.py +++ /dev/null @@ -1,5 +0,0 @@ -import multiprocessing - -N_JOBS = -2 #multiprocessing.cpu_count() -ENSEMBLE_N_JOBS=1 -SAMPLE_SIZE = 100 diff --git a/NewMethods/show_hyperparams.py b/NewMethods/show_hyperparams.py deleted file mode 100644 index 047ea1a..0000000 --- a/NewMethods/show_hyperparams.py +++ /dev/null @@ -1,26 +0,0 @@ -from glob import glob -import pickle -import numpy as np - -results = './results' - -method_choices = {} -for file in glob(f'{results}/*'): - hyper = pickle.load(open(file, 'rb'))[-1] - if hyper: - dataset,method,optim = file.split('/')[-1].split('-') - key = str(hyper) - if method not in method_choices: - method_choices[method] = {} - if key not in method_choices[method]: - method_choices[method][key] = 0 - method_choices[method][key] = method_choices[method][key]+1 - -for method, hyper_count_dict in method_choices.items(): - hyper, counts = zip(*list(hyper_count_dict.items())) - order = np.argsort(counts) - counts = np.asarray(counts)[order][::-1] - hyper = np.asarray(hyper)[order][::-1] - print(method) - for hyper_i, count_i in zip(hyper, counts): - print('\t', hyper_i, count_i) diff --git a/NewMethods/tabular.py b/NewMethods/tabular.py deleted file mode 100644 index cb90f3f..0000000 --- a/NewMethods/tabular.py +++ /dev/null @@ -1,318 +0,0 @@ -import numpy as np -import itertools -from scipy.stats import ttest_ind_from_stats, wilcoxon - - -class Table: - VALID_TESTS = [None, "wilcoxon", "ttest"] - - def __init__(self, benchmarks, methods, lower_is_better=True, ttest='ttest', prec_mean=3, - clean_zero=False, show_std=False, prec_std=3, average=True, missing=None, missing_str='--', color=True): - assert ttest in self.VALID_TESTS, f'unknown test, valid are {self.VALID_TESTS}' - - self.benchmarks = np.asarray(benchmarks) - self.benchmark_index = {row:i for i, row in enumerate(benchmarks)} - - self.methods = np.asarray(methods) - self.method_index = {col:j for j, col in enumerate(methods)} - - self.map = {} - # keyed (#rows,#cols)-ndarrays holding computations from self.map['values'] - self._addmap('values', dtype=object) - self.lower_is_better = lower_is_better - self.ttest = ttest - self.prec_mean = prec_mean - self.clean_zero = clean_zero - self.show_std = show_std - self.prec_std = prec_std - self.add_average = average - self.missing = missing - self.missing_str = missing_str - self.color = color - - self.touch() - - @property - def nbenchmarks(self): - return len(self.benchmarks) - - @property - def nmethods(self): - return len(self.methods) - - def touch(self): - self._modif = True - - def update(self): - if self._modif: - self.compute() - - def _getfilled(self): - return np.argwhere(self.map['fill']) - - @property - def values(self): - return self.map['values'] - - def _indexes(self): - return itertools.product(range(self.nbenchmarks), range(self.nmethods)) - - def _addmap(self, map, dtype, func=None): - self.map[map] = np.empty((self.nbenchmarks, self.nmethods), dtype=dtype) - if func is None: - return - m = self.map[map] - f = func - indexes = self._indexes() if map == 'fill' else self._getfilled() - for i, j in indexes: - m[i, j] = f(self.values[i, j]) - - def _addrank(self): - for i in range(self.nbenchmarks): - filled_cols_idx = np.argwhere(self.map['fill'][i]).flatten() - col_means = [self.map['mean'][i,j] for j in filled_cols_idx] - ranked_cols_idx = filled_cols_idx[np.argsort(col_means)] - if not self.lower_is_better: - ranked_cols_idx = ranked_cols_idx[::-1] - self.map['rank'][i, ranked_cols_idx] = np.arange(1, len(filled_cols_idx)+1) - - def _addcolor(self): - for i in range(self.nbenchmarks): - filled_cols_idx = np.argwhere(self.map['fill'][i]).flatten() - if filled_cols_idx.size==0: - continue - col_means = [self.map['mean'][i,j] for j in filled_cols_idx] - minval = min(col_means) - maxval = max(col_means) - for col_idx in filled_cols_idx: - val = self.map['mean'][i,col_idx] - norm = (maxval - minval) - if norm > 0: - normval = (val - minval) / norm - else: - normval = 0.5 - if self.lower_is_better: - normval = 1 - normval - self.map['color'][i, col_idx] = color_red2green_01(normval) - - def _run_ttest(self, row, col1, col2): - mean1 = self.map['mean'][row, col1] - std1 = self.map['std'][row, col1] - nobs1 = self.map['nobs'][row, col1] - mean2 = self.map['mean'][row, col2] - std2 = self.map['std'][row, col2] - nobs2 = self.map['nobs'][row, col2] - _, p_val = ttest_ind_from_stats(mean1, std1, nobs1, mean2, std2, nobs2) - return p_val - - def _run_wilcoxon(self, row, col1, col2): - values1 = self.map['values'][row, col1] - values2 = self.map['values'][row, col2] - _, p_val = wilcoxon(values1, values2) - return p_val - - def _add_statistical_test(self): - if self.ttest is None: - return - self.some_similar = [False]*self.nmethods - for i in range(self.nbenchmarks): - filled_cols_idx = np.argwhere(self.map['fill'][i]).flatten() - if len(filled_cols_idx) <= 1: - continue - col_means = [self.map['mean'][i,j] for j in filled_cols_idx] - best_pos = filled_cols_idx[np.argmin(col_means)] - - for j in filled_cols_idx: - if j==best_pos: - continue - if self.ttest == 'ttest': - p_val = self._run_ttest(i, best_pos, j) - else: - p_val = self._run_wilcoxon(i, best_pos, j) - - pval_outcome = pval_interpretation(p_val) - self.map['ttest'][i, j] = pval_outcome - if pval_outcome != 'Diff': - self.some_similar[j] = True - - def compute(self): - self._addmap('fill', dtype=bool, func=lambda x: x is not None) - self._addmap('mean', dtype=float, func=np.mean) - self._addmap('std', dtype=float, func=np.std) - self._addmap('nobs', dtype=float, func=len) - self._addmap('rank', dtype=int, func=None) - self._addmap('color', dtype=object, func=None) - self._addmap('ttest', dtype=object, func=None) - self._addmap('latex', dtype=object, func=None) - self._addrank() - self._addcolor() - self._add_statistical_test() - if self.add_average: - self._addave() - self._modif = False - - def _is_column_full(self, col): - return all(self.map['fill'][:, self.method_index[col]]) - - def _addave(self): - ave = Table(['ave'], self.methods, lower_is_better=self.lower_is_better, ttest=self.ttest, average=False, - missing=self.missing, missing_str=self.missing_str) - for col in self.methods: - values = None - if self._is_column_full(col): - if self.ttest == 'ttest': - values = np.asarray(self.map['mean'][:, self.method_index[col]]) - else: # wilcoxon - values = np.concatenate(self.values[:, self.method_index[col]]) - ave.add('ave', col, values) - self.average = ave - - def add(self, benchmark, method, values): - if values is not None: - values = np.asarray(values) - if values.ndim==0: - values = values.flatten() - rid, cid = self._coordinates(benchmark, method) - self.map['values'][rid, cid] = values - self.touch() - - def get(self, benchmark, method, attr='mean'): - self.update() - assert attr in self.map, f'unknwon attribute {attr}' - rid, cid = self._coordinates(benchmark, method) - if self.map['fill'][rid, cid]: - v = self.map[attr][rid, cid] - if v is None or (isinstance(v,float) and np.isnan(v)): - return self.missing - return v - else: - return self.missing - - def _coordinates(self, benchmark, method): - assert benchmark in self.benchmark_index, f'benchmark {benchmark} out of range' - assert method in self.method_index, f'method {method} out of range' - rid = self.benchmark_index[benchmark] - cid = self.method_index[method] - return rid, cid - - def get_average(self, method, attr='mean'): - self.update() - if self.add_average: - return self.average.get('ave', method, attr=attr) - return None - - def get_color(self, benchmark, method): - color = self.get(benchmark, method, attr='color') - if color is None: - return '' - return color - - def latex(self, benchmark, method): - self.update() - i,j = self._coordinates(benchmark, method) - if self.map['fill'][i,j] == False: - return self.missing_str - - mean = self.map['mean'][i,j] - l = f" {mean:.{self.prec_mean}f}" - if self.clean_zero: - l = l.replace(' 0.', '.') - - isbest = self.map['rank'][i,j] == 1 - if isbest: - l = "\\textbf{"+l.strip()+"}" - - stat = '' - if self.ttest is not None and self.some_similar[j]: - test_label = self.map['ttest'][i,j] - if test_label == 'Sim': - stat = '^{\dag\phantom{\dag}}' - elif test_label == 'Same': - stat = '^{\ddag}' - elif isbest or test_label == 'Diff': - stat = '^{\phantom{\ddag}}' - - std = '' - if self.show_std: - std = self.map['std'][i,j] - std = f" {std:.{self.prec_std}f}" - if self.clean_zero: - std = std.replace(' 0.', '.') - std = f" \pm {std:{self.prec_std}}" - - if stat!='' or std!='': - l = f'{l}${stat}{std}$' - - if self.color: - l += ' ' + self.map['color'][i,j] - - return l - - def latexTabular(self, benchmark_replace={}, method_replace={}, average=True): - tab = ' & ' - tab += ' & '.join([method_replace.get(col, col) for col in self.methods]) - tab += ' \\\\\hline\n' - for row in self.benchmarks: - rowname = benchmark_replace.get(row, row) - tab += rowname + ' & ' - tab += self.latexRow(row) - - if average: - tab += '\hline\n' - tab += 'Average & ' - tab += self.latexAverage() - return tab - - def latexRow(self, benchmark, endl='\\\\\hline\n'): - s = [self.latex(benchmark, col) for col in self.methods] - s = ' & '.join(s) - s += ' ' + endl - return s - - def latexAverage(self, endl='\\\\\hline\n'): - if self.add_average: - return self.average.latexRow('ave', endl=endl) - - def getRankTable(self): - t = Table(benchmarks=self.benchmarks, methods=self.methods, prec_mean=0, average=True) - for rid, cid in self._getfilled(): - row = self.benchmarks[rid] - col = self.methods[cid] - t.add(row, col, self.get(row, col, 'rank')) - t.compute() - return t - - def dropMethods(self, methods): - drop_index = [self.method_index[m] for m in methods] - new_methods = np.delete(self.methods, drop_index) - new_index = {col:j for j, col in enumerate(new_methods)} - - self.map['values'] = self.values[:,np.asarray([self.method_index[m] for m in new_methods], dtype=int)] - self.methods = new_methods - self.method_index = new_index - self.touch() - - -def pval_interpretation(p_val): - if 0.005 >= p_val: - return 'Diff' - elif 0.05 >= p_val > 0.005: - return 'Sim' - elif p_val > 0.05: - return 'Same' - - -def color_red2green_01(val, maxtone=50): - if np.isnan(val): return None - assert 0 <= val <= 1, f'val {val} out of range [0,1]' - - # rescale to [-1,1] - val = val * 2 - 1 - if val < 0: - color = 'red' - tone = maxtone * (-val) - else: - color = 'green' - tone = maxtone * val - return '\cellcolor{' + color + f'!{int(tone)}' + '}' - diff --git a/NewMethods/util.py b/NewMethods/util.py deleted file mode 100644 index fef866e..0000000 --- a/NewMethods/util.py +++ /dev/null @@ -1,89 +0,0 @@ -import numpy as np - - -nice = { - 'mae':'AE', - 'mrae':'RAE', - 'ae':'AE', - 'rae':'RAE', - 'svmkld': 'SVM(KLD)', - 'svmnkld': 'SVM(NKLD)', - 'svmq': 'SVM(Q)', - 'svmae': 'SVM(AE)', - 'svmnae': 'SVM(NAE)', - 'svmmae': 'SVM(AE)', - 'svmmrae': 'SVM(RAE)', - 'quanet': 'QuaNet', - 'hdy': 'HDy', - 'dys': 'DyS', - 'epaccmaeptr': 'E(PACC)$_\mathrm{Ptr}$', - 'epaccmaemae': 'E(PACC)$_\mathrm{AE}$', - 'epaccmraeptr': 'E(PACC)$_\mathrm{Ptr}$', - 'epaccmraemrae': 'E(PACC)$_\mathrm{RAE}$', - 'svmperf':'', - 'sanders': 'Sanders', - 'semeval13': 'SemEval13', - 'semeval14': 'SemEval14', - 'semeval15': 'SemEval15', - 'semeval16': 'SemEval16', - 'Average': 'Average' -} - - -def nicerm(key): - return '\mathrm{'+nice[key]+'}' - - -def nicename(method, eval_name=None, side=False): - m = nice.get(method, method.upper()) - if eval_name is not None: - o = '$^{' + nicerm(eval_name) + '}$' - m = (m+o).replace('$$','') - if side: - m = '\side{'+m+'}' - return m - - -def load_Gao_Sebastiani_previous_results(): - def rename(method): - old2new = { - 'kld': 'svmkld', - 'nkld': 'svmnkld', - 'qbeta2': 'svmq', - 'em': 'sld' - } - return old2new.get(method, method) - - gao_seb_results = {} - with open('./Gao_Sebastiani_results.txt', 'rt') as fin: - lines = fin.readlines() - for line in lines[1:]: - line = line.strip() - parts = line.lower().split() - if len(parts) == 4: - dataset, method, ae, rae = parts - else: - method, ae, rae = parts - learner, method = method.split('-') - method = rename(method) - gao_seb_results[f'{dataset}-{method}-ae'] = float(ae) - gao_seb_results[f'{dataset}-{method}-rae'] = float(rae) - return gao_seb_results - - -def get_ranks_from_Gao_Sebastiani(): - gao_seb_results = load_Gao_Sebastiani_previous_results() - datasets = set([key.split('-')[0] for key in gao_seb_results.keys()]) - methods = np.sort(np.unique([key.split('-')[1] for key in gao_seb_results.keys()])) - ranks = {} - for metric in ['ae', 'rae']: - for dataset in datasets: - scores = [gao_seb_results[f'{dataset}-{method}-{metric}'] for method in methods] - order = np.argsort(scores) - sorted_methods = methods[order] - for i, method in enumerate(sorted_methods): - ranks[f'{dataset}-{method}-{metric}'] = i+1 - for method in methods: - rankave = np.mean([ranks[f'{dataset}-{method}-{metric}'] for dataset in datasets]) - ranks[f'Average-{method}-{metric}'] = rankave - return ranks, gao_seb_results

+t=tj@NY+U2( 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