From 25f1cc29a3f5d4d79eda20e08e3eeb5ea0a9caf0 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Sun, 12 Nov 2023 13:04:19 +0100 Subject: [PATCH 001/216] refactoring aggregative quantifiers --- quapy/classification/calibration.py | 4 +- quapy/method/aggregative.py | 156 +++++++++++++++++++++------- 2 files changed, 119 insertions(+), 41 deletions(-) diff --git a/quapy/classification/calibration.py b/quapy/classification/calibration.py index a3f1543..3763b64 100644 --- a/quapy/classification/calibration.py +++ b/quapy/classification/calibration.py @@ -59,7 +59,7 @@ class RecalibratedProbabilisticClassifierBase(BaseEstimator, RecalibratedProbabi elif isinstance(k, float): if not (0 < k < 1): raise ValueError('wrong value for val_split: the proportion of validation documents must be in (0,1)') - return self.fit_cv(X, y) + return self.fit_tr_val(X, y) def fit_cv(self, X, y): """ @@ -94,7 +94,7 @@ class RecalibratedProbabilisticClassifierBase(BaseEstimator, RecalibratedProbabi self.classifier.fit(Xtr, ytr) posteriors = self.classifier.predict_proba(Xva) nclasses = len(np.unique(yva)) - self.calibrator = self.calibrator(posteriors, np.eye(nclasses)[yva], posterior_supplied=True) + self.calibration_function = self.calibrator(posteriors, np.eye(nclasses)[yva], posterior_supplied=True) return self def predict(self, X): diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index 232a92b..a056543 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -1,4 +1,4 @@ -from abc import abstractmethod +from abc import ABC, abstractmethod from copy import deepcopy from typing import Callable, Union import numpy as np @@ -19,25 +19,55 @@ from quapy.method.base import BaseQuantifier, BinaryQuantifier, OneVsAllGeneric # Abstract classes # ------------------------------------ -class AggregativeQuantifier(BaseQuantifier): +class AggregativeQuantifier(ABC, BaseQuantifier): """ Abstract class for quantification methods that base their estimations on the aggregation of classification - results. Aggregative Quantifiers thus implement a :meth:`classify` method and maintain a :attr:`classifier` - attribute. Subclasses of this abstract class must implement the method :meth:`aggregate` which computes the - aggregation of label predictions. The method :meth:`quantify` comes with a default implementation based on - :meth:`classify` and :meth:`aggregate`. + results. Aggregative quantifiers implement a pipeline that consists of generating classification predictions + and aggregating them. For this reason, the training phase is implemented by :meth:`classification_fit` followed + by :meth:`aggregation_fit`, while the testing phase is implemented by :meth:`classify` followed by + :meth:`aggregate`. Subclasses of this abstract class must provide implementations for these methods. + Aggregative quantifiers also maintain a :attr:`classifier` attribute. + + The method :meth:`fit` comes with a default implementation based on :meth:`classification_fit` + and :meth:`aggregation_fit`. + + The method :meth:`quantify` comes with a default implementation based on :meth:`classify` + and :meth:`aggregate`. """ - @abstractmethod def fit(self, data: LabelledCollection, fit_classifier=True): """ - Trains the aggregative quantifier + Trains the aggregative quantifier. This comes down to training a classifier and an aggregation function. :param data: a :class:`quapy.data.base.LabelledCollection` consisting of the training data - :param fit_classifier: whether or not to train the learner (default is True). Set to False if the + :param fit_classifier: whether to train the learner (default is True). Set to False if the learner has been trained outside the quantifier. :return: self """ + classif_predictions = self.classification_fit(data, fit_classifier) + self.aggregation_fit(classif_predictions) + return self + + @abstractmethod + def classification_fit(self, data: LabelledCollection, fit_classifier=True): + """ + Trains the classifier if requested (`fit_classifier=True`) and generate the necessary predictions to + train the aggregation function. + + :param data: a :class:`quapy.data.base.LabelledCollection` consisting of the training data + :param fit_classifier: whether to train the learner (default is True). Set to False if the + learner has been trained outside the quantifier. + """ + ... + + @abstractmethod + def aggregation_fit(self, classif_predictions): + """ + Trains the aggregation function. + + :param classif_predictions: typically an `ndarray` containing the label predictions, but could be a + tuple containing any information needed for fitting the aggregation function + """ ... @property @@ -101,7 +131,7 @@ class AggregativeQuantifier(BaseQuantifier): return self.classifier.classes_ -class AggregativeProbabilisticQuantifier(AggregativeQuantifier): +class AggregativeProbabilisticQuantifier(AggregativeQuantifier, ABC): """ Abstract class for quantification methods that base their estimations on the aggregation of posterior probabilities as returned by a probabilistic classifier. Aggregative Probabilistic Quantifiers thus extend Aggregative @@ -227,9 +257,9 @@ class CC(AggregativeQuantifier): def __init__(self, classifier: BaseEstimator): self.classifier = classifier - def fit(self, data: LabelledCollection, fit_classifier=True): + def classification_fit(self, data: LabelledCollection, fit_classifier=True): """ - Trains the Classify & Count method unless `fit_classifier` is False, in which case, the classifier is assumed to + Trains the classifier unless `fit_classifier` is False, in which case, the classifier is assumed to be already fit and there is nothing else to do. :param data: a :class:`quapy.data.base.LabelledCollection` consisting of the training data @@ -237,7 +267,15 @@ class CC(AggregativeQuantifier): :return: self """ self.classifier, _ = _training_helper(self.classifier, data, fit_classifier) - return self + return None + + def aggregation_fit(self, classif_predictions: np.ndarray): + """ + Nothing to do here! + + :param classif_predictions: this is actually None + """ + pass def aggregate(self, classif_predictions: np.ndarray): """ @@ -269,9 +307,10 @@ class ACC(AggregativeQuantifier): self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) - def fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, int, LabelledCollection] = None): + def classification_fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, int, LabelledCollection] = None): """ - Trains a ACC quantifier. + Trains the classifier and generates, optionally through a cross-validation procedure, the predictions + needed for estimating the misclassification rates matrix. :param data: the training set :param fit_classifier: set to False to bypass the training (the learner is assumed to be already fit) @@ -281,18 +320,24 @@ class ACC(AggregativeQuantifier): cross validation to estimate the parameters :return: self """ - if val_split is None: val_split = self.val_split - self.classifier, y, y_, classes, class_count = cross_generate_predictions( + self.classifier, true_labels, pred_labels, classes, class_count = cross_generate_predictions( data, self.classifier, val_split, probabilistic=False, fit_classifier=fit_classifier, n_jobs=self.n_jobs ) - self.cc = CC(self.classifier) - self.Pte_cond_estim_ = self.getPteCondEstim(self.classifier.classes_, y, y_) + return (true_labels, pred_labels) - return self + def aggregation_fit(self, classif_predictions): + """ + Nothing to do here! + + :param classif_predictions: this is actually None + """ + true_labels, pred_labels = classif_predictions + self.cc = CC(self.classifier) + self.Pte_cond_estim_ = self.getPteCondEstim(self.classifier.classes_, true_labels, pred_labels) @classmethod def getPteCondEstim(cls, classes, y, y_): @@ -348,10 +393,18 @@ class PCC(AggregativeProbabilisticQuantifier): def __init__(self, classifier: BaseEstimator): self.classifier = classifier - def fit(self, data: LabelledCollection, fit_classifier=True): + def classification_fit(self, data: LabelledCollection, fit_classifier=True): self.classifier, _ = _training_helper(self.classifier, data, fit_classifier, ensure_probabilistic=True) return self + def aggregation_fit(self, classif_predictions: np.ndarray): + """ + Nothing to do here! + + :param classif_predictions: this is actually None + """ + pass + def aggregate(self, classif_posteriors): return F.prevalence_from_probabilities(classif_posteriors, binarize=False) @@ -376,30 +429,37 @@ class PACC(AggregativeProbabilisticQuantifier): self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) - def fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, int, LabelledCollection] = None): + def classification_fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, int, LabelledCollection] = None): """ - Trains a PACC quantifier. + Trains the soft classifier and generates, optionally through a cross-validation procedure, the posterior + probabilities needed for estimating the misclassification rates matrix. :param data: the training set :param fit_classifier: set to False to bypass the training (the learner is assumed to be already fit) :param val_split: either a float in (0,1) indicating the proportion of training instances to use for - validation (e.g., 0.3 for using 30% of the training set as validation data), or a LabelledCollection - indicating the validation set itself, or an int indicating the number k of folds to be used in kFCV - to estimate the parameters + validation (e.g., 0.3 for using 30% of the training set as validation data), or a LabelledCollection + indicating the validation set itself, or an int indicating the number `k` of folds to be used in `k`-fold + cross validation to estimate the parameters :return: self """ - if val_split is None: val_split = self.val_split - self.classifier, y, y_, classes, class_count = cross_generate_predictions( + self.classifier, true_labels, posteriors, classes, class_count = cross_generate_predictions( data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs ) - self.pcc = PCC(self.classifier) - self.Pte_cond_estim_ = self.getPteCondEstim(classes, y, y_) + return (true_labels, posteriors) - return self + def aggregation_fit(self, classif_predictions): + """ + Nothing to do here! + + :param classif_predictions: this is actually None + """ + true_labels, posteriors = classif_predictions + self.pcc = PCC(self.classifier) + self.Pte_cond_estim_ = self.getPteCondEstim(self.classifier.classes_, true_labels, posteriors) @classmethod def getPteCondEstim(cls, classes, y, y_): @@ -449,7 +509,13 @@ class EMQ(AggregativeProbabilisticQuantifier): self.exact_train_prev = exact_train_prev self.recalib = recalib - def fit(self, data: LabelledCollection, fit_classifier=True): + def classification_fit(self, data: LabelledCollection, fit_classifier=True): + self.classifier, true_labels, posteriors, classes, class_count = cross_generate_predictions( + data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs + ) + + return (true_labels, posteriors) + if self.recalib is not None: if self.recalib == 'nbvs': self.classifier = NBVSCalibration(self.non_calibrated) @@ -477,7 +543,15 @@ class EMQ(AggregativeProbabilisticQuantifier): nfolds=3, random_state=0 ) - return self + return None + + def aggregation_fit(self, classif_predictions: np.ndarray): + """ + Nothing to do here! + + :param classif_predictions: this is actually None + """ + pass def aggregate(self, classif_posteriors, epsilon=EPSILON): priors, posteriors = self.EM(self.train_prevalence, classif_posteriors, epsilon) @@ -768,7 +842,7 @@ class DMy(AggregativeProbabilisticQuantifier): distributions = np.cumsum(distributions, axis=1) return distributions - def fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): + def classification_fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): """ Trains the classifier (if requested) and generates the validation distributions out of the training data. The validation distributions have shape `(n, ch, nbins)`, with `n` the number of classes, `ch` the number of @@ -787,15 +861,19 @@ class DMy(AggregativeProbabilisticQuantifier): if val_split is None: val_split = self.val_split - self.classifier, y, posteriors, classes, class_count = cross_generate_predictions( + self.classifier, true_labels, posteriors, classes, class_count = cross_generate_predictions( data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs ) - self.validation_distribution = np.asarray( - [self.__get_distributions(posteriors[y==cat]) for cat in range(data.n_classes)] - ) + return (true_labels, posteriors) - return self + def aggregation_fit(self, classif_predictions): + true_labels, posteriors = classif_predictions + n_classes = len(self.classifier.classes_) + + self.validation_distribution = np.asarray( + [self.__get_distributions(posteriors[true_labels == cat]) for cat in range(n_classes)] + ) def aggregate(self, posteriors: np.ndarray): """ From 0a6185d908d7828bc62503ce26ec4caeae936409 Mon Sep 17 00:00:00 2001 From: Alex Moreo Date: Sun, 12 Nov 2023 14:45:03 +0100 Subject: [PATCH 002/216] refactoring the aggregative quantifiers --- quapy/method/aggregative.py | 257 ++++++++++++------------------------ quapy/method/base.py | 2 +- 2 files changed, 85 insertions(+), 174 deletions(-) diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index a056543..8633039 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -44,12 +44,11 @@ class AggregativeQuantifier(ABC, BaseQuantifier): learner has been trained outside the quantifier. :return: self """ - classif_predictions = self.classification_fit(data, fit_classifier) + classif_predictions = self.classifier_fit_predict(data, fit_classifier) self.aggregation_fit(classif_predictions) return self - @abstractmethod - def classification_fit(self, data: LabelledCollection, fit_classifier=True): + def classifier_fit_predict(self, data: LabelledCollection, fit_classifier=True, predict_on=None): """ Trains the classifier if requested (`fit_classifier=True`) and generate the necessary predictions to train the aggregation function. @@ -57,11 +56,62 @@ class AggregativeQuantifier(ABC, BaseQuantifier): :param data: a :class:`quapy.data.base.LabelledCollection` consisting of the training data :param fit_classifier: whether to train the learner (default is True). Set to False if the learner has been trained outside the quantifier. + :param predict_on: specifies the set on which predictions need to be issued. This parameter can + be specified as None (default) to indicate no prediction is needed; a float in (0, 1) to + indicate the proportion of instances to be used for predictions (the remainder is used for + training); an integer >1 to indicate that the predictions must be generated via k-fold + cross-validation, using this integer as k; or the data sample itself on which to generate + the predictions. """ - ... + assert isinstance(fit_classifier, bool), 'unexpected type for "fit_classifier", must be boolean' + + self.__check_classifier() + + if predict_on is None: + if fit_classifier: + self.classifier.fit(*data.Xy) + predictions = None + + elif isinstance(predict_on, float): + if fit_classifier: + if not (0. < predict_on < 1.): + raise ValueError(f'proportion {predict_on=} out of range, must be in (0,1)') + train, val = data.split_stratified(train_prop=(1 - predict_on)) + self.classifier.fit(*train.Xy) + predictions = (self.classify(val.X), val.y) + else: + raise ValueError(f'wrong type for predict_on: since fit_classifier=False, ' + f'the set on which predictions have to be issued must be ' + f'explicitly indicated') + + elif isinstance(predict_on, LabelledCollection): + if fit_classifier: + self.classifier.fit(*data.Xy) + predictions = (self.classify(predict_on.X), predict_on.y) + + elif isinstance(predict_on, int): + if fit_classifier: + if not predict_on > 1: + raise ValueError(f'invalid value {predict_on} in fit. ' + f'Specify a integer >1 for kFCV estimation.') + predictions = cross_val_predict( + classifier, *data.Xy, cv=predict_on, n_jobs=self.n_jobs, method=self.__classifier_method()) + self.classifier.fit(*data.Xy) + else: + raise ValueError(f'wrong type for predict_on: since fit_classifier=False, ' + f'the set on which predictions have to be issued must be ' + f'explicitly indicated') + + else: + raise ValueError( + f'error: param "predict_on" ({type(predict_on)}) not understood; ' + f'use either a float indicating the split proportion, or a ' + f'tuple (X,y) indicating the validation partition') + + return predictions @abstractmethod - def aggregation_fit(self, classif_predictions): + def aggregation_fit(self, classif_predictions: LabelledCollection): """ Trains the aggregation function. @@ -99,6 +149,13 @@ class AggregativeQuantifier(ABC, BaseQuantifier): """ return self.classifier.predict(instances) + @property + def __classifier_method(self): + return 'predict' + + def __check_classifier(self, adapt_if_necessary=False): + assert hasattr(self.classifier, 'predict') + def quantify(self, instances): """ Generate class prevalence estimates for the sample's instances by aggregating the label predictions generated @@ -142,106 +199,20 @@ class AggregativeProbabilisticQuantifier(AggregativeQuantifier, ABC): def classify(self, instances): return self.classifier.predict_proba(instances) + @property + def __classifier_method(self): + return 'predict_proba' -# Helper -# ------------------------------------ -def _ensure_probabilistic(classifier): - if not hasattr(classifier, 'predict_proba'): - print(f'The learner {classifier.__class__.__name__} does not seem to be probabilistic. ' - f'The learner will be calibrated.') - classifier = CalibratedClassifierCV(classifier, cv=5) - return classifier - - -def _training_helper(classifier, - data: LabelledCollection, - fit_classifier: bool = True, - ensure_probabilistic=False, - val_split: Union[LabelledCollection, float] = None): - """ - Training procedure common to all Aggregative Quantifiers. - - :param classifier: the learner to be fit - :param data: the data on which to fit the learner. If requested, the data will be split before fitting the learner. - :param fit_classifier: whether or not to fit the learner (if False, then bypasses any action) - :param ensure_probabilistic: if True, guarantees that the resulting classifier implements predict_proba (if the - learner is not probabilistic, then a CalibratedCV instance of it is trained) - :param val_split: if specified as a float, indicates the proportion of training instances that will define the - validation split (e.g., 0.3 for using 30% of the training set as validation data); if specified as a - LabelledCollection, represents the validation split itself - :return: the learner trained on the training set, and the unused data (a _LabelledCollection_ if train_val_split>0 - or None otherwise) to be used as a validation set for any subsequent parameter fitting - """ - if fit_classifier: - if ensure_probabilistic: - classifier = _ensure_probabilistic(classifier) - if val_split is not None: - if isinstance(val_split, float): - if not (0 < val_split < 1): - raise ValueError(f'train/val split {val_split} out of range, must be in (0,1)') - train, unused = data.split_stratified(train_prop=1 - val_split) - elif isinstance(val_split, LabelledCollection): - train = data - unused = val_split + def __check_classifier(self, adapt_if_necessary=False): + if not hasattr(self.classifier, 'predict_proba'): + if adapt_if_necessary: + print(f'warning: The learner {self.classifier.__class__.__name__} does not seem to be ' + f'probabilistic. The learner will be calibrated (using CalibratedClassifierCV).') + self.classifier = CalibratedClassifierCV(self.classifier, cv=5) else: - raise ValueError( - f'param "val_split" ({type(val_split)}) not understood; use either a float indicating the split ' - 'proportion, or a LabelledCollection indicating the validation split') - else: - train, unused = data, None - - if isinstance(classifier, BaseQuantifier): - classifier.fit(train) - else: - classifier.fit(*train.Xy) - else: - if ensure_probabilistic: - if not hasattr(classifier, 'predict_proba'): - raise AssertionError('error: the learner cannot be calibrated since fit_classifier is set to False') - unused = None - if isinstance(val_split, LabelledCollection): - unused = val_split - - return classifier, unused - - -def cross_generate_predictions( - data, - classifier, - val_split, - probabilistic, - fit_classifier, - n_jobs -): - - n_jobs = qp._get_njobs(n_jobs) - - if isinstance(val_split, int): - assert fit_classifier == True, \ - 'the parameters for the adjustment cannot be estimated with kFCV with fit_classifier=False' - - if probabilistic: - classifier = _ensure_probabilistic(classifier) - predict = 'predict_proba' - else: - predict = 'predict' - y_pred = cross_val_predict(classifier, *data.Xy, cv=val_split, n_jobs=n_jobs, method=predict) - class_count = data.counts() - - # fit the learner on all data - classifier.fit(*data.Xy) - y = data.y - classes = data.classes_ - else: - classifier, val_data = _training_helper( - classifier, data, fit_classifier, ensure_probabilistic=probabilistic, val_split=val_split - ) - y_pred = classifier.predict_proba(val_data.instances) if probabilistic else classifier.predict(val_data.instances) - y = val_data.labels - classes = val_data.classes_ - class_count = val_data.counts() - - return classifier, y, y_pred, classes, class_count + raise AssertionError(f'error: The learner {self.classifier.__class__.__name__} does not ' + f'seem to be probabilistic. The learner cannot be calibrated since ' + f'fit_classifier is set to False') # Methods @@ -257,19 +228,7 @@ class CC(AggregativeQuantifier): def __init__(self, classifier: BaseEstimator): self.classifier = classifier - def classification_fit(self, data: LabelledCollection, fit_classifier=True): - """ - Trains the classifier unless `fit_classifier` is False, in which case, the classifier is assumed to - be already fit and there is nothing else to do. - - :param data: a :class:`quapy.data.base.LabelledCollection` consisting of the training data - :param fit_classifier: if False, the classifier is assumed to be fit - :return: self - """ - self.classifier, _ = _training_helper(self.classifier, data, fit_classifier) - return None - - def aggregation_fit(self, classif_predictions: np.ndarray): + def aggregation_fit(self, classif_predictions: LabelledCollection): """ Nothing to do here! @@ -307,33 +266,11 @@ class ACC(AggregativeQuantifier): self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) - def classification_fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, int, LabelledCollection] = None): + def aggregation_fit(self, classif_predictions: LabelledCollection): """ - Trains the classifier and generates, optionally through a cross-validation procedure, the predictions - needed for estimating the misclassification rates matrix. + Estimates the misclassification rates. - :param data: the training set - :param fit_classifier: set to False to bypass the training (the learner is assumed to be already fit) - :param val_split: either a float in (0,1) indicating the proportion of training instances to use for - validation (e.g., 0.3 for using 30% of the training set as validation data), or a LabelledCollection - indicating the validation set itself, or an int indicating the number `k` of folds to be used in `k`-fold - cross validation to estimate the parameters - :return: self - """ - if val_split is None: - val_split = self.val_split - - self.classifier, true_labels, pred_labels, classes, class_count = cross_generate_predictions( - data, self.classifier, val_split, probabilistic=False, fit_classifier=fit_classifier, n_jobs=self.n_jobs - ) - - return (true_labels, pred_labels) - - def aggregation_fit(self, classif_predictions): - """ - Nothing to do here! - - :param classif_predictions: this is actually None + :param classif_predictions: classifier predictions with true labels """ true_labels, pred_labels = classif_predictions self.cc = CC(self.classifier) @@ -393,11 +330,7 @@ class PCC(AggregativeProbabilisticQuantifier): def __init__(self, classifier: BaseEstimator): self.classifier = classifier - def classification_fit(self, data: LabelledCollection, fit_classifier=True): - self.classifier, _ = _training_helper(self.classifier, data, fit_classifier, ensure_probabilistic=True) - return self - - def aggregation_fit(self, classif_predictions: np.ndarray): + def aggregation_fit(self, classif_predictions: LabelledCollection): """ Nothing to do here! @@ -429,33 +362,11 @@ class PACC(AggregativeProbabilisticQuantifier): self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) - def classification_fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, int, LabelledCollection] = None): + def aggregation_fit(self, classif_predictions: LabelledCollection): """ - Trains the soft classifier and generates, optionally through a cross-validation procedure, the posterior - probabilities needed for estimating the misclassification rates matrix. + Estimates the misclassification rates - :param data: the training set - :param fit_classifier: set to False to bypass the training (the learner is assumed to be already fit) - :param val_split: either a float in (0,1) indicating the proportion of training instances to use for - validation (e.g., 0.3 for using 30% of the training set as validation data), or a LabelledCollection - indicating the validation set itself, or an int indicating the number `k` of folds to be used in `k`-fold - cross validation to estimate the parameters - :return: self - """ - if val_split is None: - val_split = self.val_split - - self.classifier, true_labels, posteriors, classes, class_count = cross_generate_predictions( - data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs - ) - - return (true_labels, posteriors) - - def aggregation_fit(self, classif_predictions): - """ - Nothing to do here! - - :param classif_predictions: this is actually None + :param classif_predictions: classifier predictions with true labels """ true_labels, posteriors = classif_predictions self.pcc = PCC(self.classifier) @@ -509,7 +420,7 @@ class EMQ(AggregativeProbabilisticQuantifier): self.exact_train_prev = exact_train_prev self.recalib = recalib - def classification_fit(self, data: LabelledCollection, fit_classifier=True): + def classifier_fit_predict(self, data: LabelledCollection, fit_classifier=True): self.classifier, true_labels, posteriors, classes, class_count = cross_generate_predictions( data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs ) @@ -842,7 +753,7 @@ class DMy(AggregativeProbabilisticQuantifier): distributions = np.cumsum(distributions, axis=1) return distributions - def classification_fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): + def classifier_fit_predict(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): """ Trains the classifier (if requested) and generates the validation distributions out of the training data. The validation distributions have shape `(n, ch, nbins)`, with `n` the number of classes, `ch` the number of diff --git a/quapy/method/base.py b/quapy/method/base.py index e0363f1..f34acf6 100644 --- a/quapy/method/base.py +++ b/quapy/method/base.py @@ -63,7 +63,7 @@ def newOneVsAll(binary_quantifier, n_jobs=None): return OneVsAllGeneric(binary_quantifier, n_jobs) -class OneVsAllGeneric(OneVsAll,BaseQuantifier): +class OneVsAllGeneric(OneVsAll, BaseQuantifier): """ Allows any binary quantifier to perform quantification on single-label datasets. The method maintains one binary quantifier for each class, and then l1-normalizes the outputs so that the class prevelence values sum up to 1. From 44bfc7921feb58d47a9cd5e3999ff52808b6bea6 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Mon, 13 Nov 2023 09:57:34 +0100 Subject: [PATCH 003/216] refactoring agg quantifiers --- quapy/method/aggregative.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index 8633039..4cbe728 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -65,7 +65,7 @@ class AggregativeQuantifier(ABC, BaseQuantifier): """ assert isinstance(fit_classifier, bool), 'unexpected type for "fit_classifier", must be boolean' - self.__check_classifier() + self.__check_classifier(adapt_if_necessary=(self.__classifier_method=='predict_proba')) if predict_on is None: if fit_classifier: From c9c4511c0df2d0f5e3b75d31b002936319f99ee9 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Mon, 13 Nov 2023 12:42:57 +0100 Subject: [PATCH 004/216] hierarchical class problem? --- quapy/method/aggregative.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index 4cbe728..ad96e53 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -7,6 +7,8 @@ from sklearn.base import BaseEstimator from sklearn.calibration import CalibratedClassifierCV from sklearn.metrics import confusion_matrix from sklearn.model_selection import cross_val_predict +from typing_extensions import override + import quapy as qp import quapy.functional as F from functional import get_divergence @@ -19,7 +21,7 @@ from quapy.method.base import BaseQuantifier, BinaryQuantifier, OneVsAllGeneric # Abstract classes # ------------------------------------ -class AggregativeQuantifier(ABC, BaseQuantifier): +class AggregativeQuantifier(BaseQuantifier, ABC): """ Abstract class for quantification methods that base their estimations on the aggregation of classification results. Aggregative quantifiers implement a pipeline that consists of generating classification predictions @@ -65,7 +67,8 @@ class AggregativeQuantifier(ABC, BaseQuantifier): """ assert isinstance(fit_classifier, bool), 'unexpected type for "fit_classifier", must be boolean' - self.__check_classifier(adapt_if_necessary=(self.__classifier_method=='predict_proba')) + print(type(self)) + self.__check_classifier(adapt_if_necessary=(self.__classifier_method()=='predict_proba')) if predict_on is None: if fit_classifier: @@ -149,12 +152,12 @@ class AggregativeQuantifier(ABC, BaseQuantifier): """ return self.classifier.predict(instances) - @property def __classifier_method(self): + print('using predict') return 'predict' def __check_classifier(self, adapt_if_necessary=False): - assert hasattr(self.classifier, 'predict') + assert hasattr(self.classifier, self.__classifier_method()) def quantify(self, instances): """ @@ -199,12 +202,12 @@ class AggregativeProbabilisticQuantifier(AggregativeQuantifier, ABC): def classify(self, instances): return self.classifier.predict_proba(instances) - @property def __classifier_method(self): + print('using predict_proba') return 'predict_proba' def __check_classifier(self, adapt_if_necessary=False): - if not hasattr(self.classifier, 'predict_proba'): + if not hasattr(self.classifier, self.__check_classifier()): if adapt_if_necessary: print(f'warning: The learner {self.classifier.__class__.__name__} does not seem to be ' f'probabilistic. The learner will be calibrated (using CalibratedClassifierCV).') From c2544b50ce4fabc6beff7f2ae039aac552dbe478 Mon Sep 17 00:00:00 2001 From: Andrea Esuli Date: Mon, 13 Nov 2023 14:45:34 +0100 Subject: [PATCH 005/216] Removed private method --- quapy/method/aggregative.py | 13 ++++++------- quapy/method/non_aggregative.py | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index ad96e53..1b8d1e6 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -7,11 +7,10 @@ from sklearn.base import BaseEstimator from sklearn.calibration import CalibratedClassifierCV from sklearn.metrics import confusion_matrix from sklearn.model_selection import cross_val_predict -from typing_extensions import override import quapy as qp import quapy.functional as F -from functional import get_divergence +from quapy.functional import get_divergence from quapy.classification.calibration import NBVSCalibration, BCTSCalibration, TSCalibration, VSCalibration from quapy.classification.svmperf import SVMperf from quapy.data import LabelledCollection @@ -68,7 +67,7 @@ class AggregativeQuantifier(BaseQuantifier, ABC): assert isinstance(fit_classifier, bool), 'unexpected type for "fit_classifier", must be boolean' print(type(self)) - self.__check_classifier(adapt_if_necessary=(self.__classifier_method()=='predict_proba')) + self.__check_classifier(adapt_if_necessary=(self._classifier_method()=='predict_proba')) if predict_on is None: if fit_classifier: @@ -98,7 +97,7 @@ class AggregativeQuantifier(BaseQuantifier, ABC): raise ValueError(f'invalid value {predict_on} in fit. ' f'Specify a integer >1 for kFCV estimation.') predictions = cross_val_predict( - classifier, *data.Xy, cv=predict_on, n_jobs=self.n_jobs, method=self.__classifier_method()) + classifier, *data.Xy, cv=predict_on, n_jobs=self.n_jobs, method=self._classifier_method()) self.classifier.fit(*data.Xy) else: raise ValueError(f'wrong type for predict_on: since fit_classifier=False, ' @@ -152,12 +151,12 @@ class AggregativeQuantifier(BaseQuantifier, ABC): """ return self.classifier.predict(instances) - def __classifier_method(self): + def _classifier_method(self): print('using predict') return 'predict' def __check_classifier(self, adapt_if_necessary=False): - assert hasattr(self.classifier, self.__classifier_method()) + assert hasattr(self.classifier, self._classifier_method()) def quantify(self, instances): """ @@ -202,7 +201,7 @@ class AggregativeProbabilisticQuantifier(AggregativeQuantifier, ABC): def classify(self, instances): return self.classifier.predict_proba(instances) - def __classifier_method(self): + def _classifier_method(self): print('using predict_proba') return 'predict_proba' diff --git a/quapy/method/non_aggregative.py b/quapy/method/non_aggregative.py index 87e59fb..6048bf6 100644 --- a/quapy/method/non_aggregative.py +++ b/quapy/method/non_aggregative.py @@ -1,7 +1,7 @@ from typing import Union, Callable import numpy as np -from functional import get_divergence +from quapy.functional import get_divergence from quapy.data import LabelledCollection from quapy.method.base import BaseQuantifier, BinaryQuantifier import quapy.functional as F From 173db83c28d84586bbb767b8313be229d8ee17e0 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Mon, 13 Nov 2023 17:03:24 +0100 Subject: [PATCH 006/216] solved __ issue in hierarchical classes --- quapy/method/aggregative.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index 1b8d1e6..78ff40b 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -67,7 +67,7 @@ class AggregativeQuantifier(BaseQuantifier, ABC): assert isinstance(fit_classifier, bool), 'unexpected type for "fit_classifier", must be boolean' print(type(self)) - self.__check_classifier(adapt_if_necessary=(self._classifier_method()=='predict_proba')) + self._check_classifier(adapt_if_necessary=(self._classifier_method() == 'predict_proba')) if predict_on is None: if fit_classifier: @@ -155,7 +155,7 @@ class AggregativeQuantifier(BaseQuantifier, ABC): print('using predict') return 'predict' - def __check_classifier(self, adapt_if_necessary=False): + def _check_classifier(self, adapt_if_necessary=False): assert hasattr(self.classifier, self._classifier_method()) def quantify(self, instances): @@ -205,8 +205,8 @@ class AggregativeProbabilisticQuantifier(AggregativeQuantifier, ABC): print('using predict_proba') return 'predict_proba' - def __check_classifier(self, adapt_if_necessary=False): - if not hasattr(self.classifier, self.__check_classifier()): + def _check_classifier(self, adapt_if_necessary=False): + if not hasattr(self.classifier, self._classifier_method()): if adapt_if_necessary: print(f'warning: The learner {self.classifier.__class__.__name__} does not seem to be ' f'probabilistic. The learner will be calibrated (using CalibratedClassifierCV).') @@ -274,7 +274,7 @@ class ACC(AggregativeQuantifier): :param classif_predictions: classifier predictions with true labels """ - true_labels, pred_labels = classif_predictions + pred_labels, true_labels = classif_predictions.Xy self.cc = CC(self.classifier) self.Pte_cond_estim_ = self.getPteCondEstim(self.classifier.classes_, true_labels, pred_labels) From e870d798b7150bc926ad88c296e49a89bfa1cb35 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Wed, 15 Nov 2023 10:55:13 +0100 Subject: [PATCH 007/216] fango --- examples/custom_quantifier.py | 4 +- quapy/classification/calibration.py | 3 +- quapy/method/aggregative.py | 534 +++++++++++++++++++++------- quapy/method/meta.py | 130 ++++++- quapy/method/neural.py | 2 +- quapy/model_selection.py | 51 ++- quapy/tests/test_hierarchy.py | 4 +- quapy/util.py | 7 +- 8 files changed, 571 insertions(+), 164 deletions(-) diff --git a/examples/custom_quantifier.py b/examples/custom_quantifier.py index 31a69cd..fa014de 100644 --- a/examples/custom_quantifier.py +++ b/examples/custom_quantifier.py @@ -2,7 +2,7 @@ import quapy as qp from quapy.data import LabelledCollection from quapy.method.base import BinaryQuantifier from quapy.model_selection import GridSearchQ -from quapy.method.aggregative import AggregativeProbabilisticQuantifier +from quapy.method.aggregative import AggregativeSoftQuantifier from quapy.protocol import APP import numpy as np from sklearn.linear_model import LogisticRegression @@ -15,7 +15,7 @@ from sklearn.linear_model import LogisticRegression # internal hyperparameter (let say, alpha) which is the decision threshold. Let's also assume the quantifier # is binary, for simplicity. -class MyQuantifier(AggregativeProbabilisticQuantifier, BinaryQuantifier): +class MyQuantifier(AggregativeSoftQuantifier, BinaryQuantifier): def __init__(self, classifier, alpha=0.5): self.alpha = alpha # aggregative quantifiers have an internal self.classifier attribute diff --git a/quapy/classification/calibration.py b/quapy/classification/calibration.py index 3763b64..0f5e9f7 100644 --- a/quapy/classification/calibration.py +++ b/quapy/classification/calibration.py @@ -24,7 +24,8 @@ class RecalibratedProbabilisticClassifier: class RecalibratedProbabilisticClassifierBase(BaseEstimator, RecalibratedProbabilisticClassifier): """ Applies a (re)calibration method from `abstention.calibration`, as defined in - `Alexandari et al. paper `_: + `Alexandari et al. paper `_. + :param classifier: a scikit-learn probabilistic classifier :param calibrator: the calibration object (an instance of abstention.calibration.CalibratorFactory) diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index 78ff40b..a8a7bb2 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -2,6 +2,7 @@ from abc import ABC, abstractmethod from copy import deepcopy from typing import Callable, Union import numpy as np +from abstention.calibration import NoBiasVectorScaling, TempScaling, VectorScaling from scipy import optimize from sklearn.base import BaseEstimator from sklearn.calibration import CalibratedClassifierCV @@ -46,7 +47,7 @@ class AggregativeQuantifier(BaseQuantifier, ABC): :return: self """ classif_predictions = self.classifier_fit_predict(data, fit_classifier) - self.aggregation_fit(classif_predictions) + self.aggregation_fit(classif_predictions, data) return self def classifier_fit_predict(self, data: LabelledCollection, fit_classifier=True, predict_on=None): @@ -66,7 +67,6 @@ class AggregativeQuantifier(BaseQuantifier, ABC): """ assert isinstance(fit_classifier, bool), 'unexpected type for "fit_classifier", must be boolean' - print(type(self)) self._check_classifier(adapt_if_necessary=(self._classifier_method() == 'predict_proba')) if predict_on is None: @@ -80,7 +80,7 @@ class AggregativeQuantifier(BaseQuantifier, ABC): raise ValueError(f'proportion {predict_on=} out of range, must be in (0,1)') train, val = data.split_stratified(train_prop=(1 - predict_on)) self.classifier.fit(*train.Xy) - predictions = (self.classify(val.X), val.y) + predictions = LabelledCollection(self.classify(val.X), val.y, classes=data.classes_) else: raise ValueError(f'wrong type for predict_on: since fit_classifier=False, ' f'the set on which predictions have to be issued must be ' @@ -89,15 +89,17 @@ class AggregativeQuantifier(BaseQuantifier, ABC): elif isinstance(predict_on, LabelledCollection): if fit_classifier: self.classifier.fit(*data.Xy) - predictions = (self.classify(predict_on.X), predict_on.y) + predictions = LabelledCollection(self.classify(predict_on.X), predict_on.y, classes=predict_on.classes_) elif isinstance(predict_on, int): if fit_classifier: - if not predict_on > 1: + if predict_on <= 1: raise ValueError(f'invalid value {predict_on} in fit. ' f'Specify a integer >1 for kFCV estimation.') + else: predictions = cross_val_predict( - classifier, *data.Xy, cv=predict_on, n_jobs=self.n_jobs, method=self._classifier_method()) + self.classifier, *data.Xy, cv=predict_on, n_jobs=self.n_jobs, method=self._classifier_method()) + predictions = LabelledCollection(predictions, data.y, classes=data.classes_) self.classifier.fit(*data.Xy) else: raise ValueError(f'wrong type for predict_on: since fit_classifier=False, ' @@ -113,12 +115,13 @@ class AggregativeQuantifier(BaseQuantifier, ABC): return predictions @abstractmethod - def aggregation_fit(self, classif_predictions: LabelledCollection): + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Trains the aggregation function. - :param classif_predictions: typically an `ndarray` containing the label predictions, but could be a - tuple containing any information needed for fitting the aggregation function + :param classif_predictions: a LabelledCollection containing the label predictions issued + by the classifier + :param data: a :class:`quapy.data.base.LabelledCollection` consisting of the training data """ ... @@ -140,23 +143,36 @@ class AggregativeQuantifier(BaseQuantifier, ABC): """ self.classifier_ = classifier + @abstractmethod def classify(self, instances): """ Provides the label predictions for the given instances. The predictions should respect the format expected by - :meth:`aggregate`, i.e., posterior probabilities for probabilistic quantifiers, or crisp predictions for + :meth:`aggregate`, e.g., posterior probabilities for probabilistic quantifiers, or crisp predictions for non-probabilistic quantifiers - :param instances: array-like + :param instances: array-like of shape `(n_instances, n_features,)` :return: np.ndarray of shape `(n_instances,)` with label predictions """ - return self.classifier.predict(instances) + ... + @abstractmethod def _classifier_method(self): - print('using predict') - return 'predict' + """ + Name of the method that must be used for issuing label predictions. + :return: string + """ + ... + + @abstractmethod def _check_classifier(self, adapt_if_necessary=False): - assert hasattr(self.classifier, self._classifier_method()) + """ + Guarantees that the underlying classifier implements the method required for issuing predictions, i.e., + the method indicated by the :meth:`_classifier_method` + + :param adapt_if_necessary: if True, the method will try to comply with the required specifications + """ + ... def quantify(self, instances): """ @@ -190,22 +206,77 @@ class AggregativeQuantifier(BaseQuantifier, ABC): return self.classifier.classes_ -class AggregativeProbabilisticQuantifier(AggregativeQuantifier, ABC): +class AggregativeCrispQuantifier(AggregativeQuantifier, ABC): """ - Abstract class for quantification methods that base their estimations on the aggregation of posterior probabilities - as returned by a probabilistic classifier. Aggregative Probabilistic Quantifiers thus extend Aggregative - Quantifiers by implementing a _posterior_probabilities_ method returning values in [0,1] -- the posterior - probabilities. + Abstract class for quantification methods that base their estimations on the aggregation of crips decisions + as returned by a hard classifier. Aggregative crisp quantifiers thus extend Aggregative + Quantifiers by implementing specifications about crisp predictions. """ def classify(self, instances): + """ + Provides the label (crisp) predictions for the given instances. + + :param instances: array-like of shape `(n_instances, n_dimensions,)` + :return: np.ndarray of shape `(n_instances,)` with label predictions + """ + return self.classifier.predict(instances) + + def _classifier_method(self): + """ + Name of the method that must be used for issuing label predictions. + + :return: the string "predict", i.e., the standard method name for scikit-learn hard predictions + """ + print('using predict') + return 'predict' + + def _check_classifier(self, adapt_if_necessary=False): + """ + Guarantees that the underlying classifier implements the method indicated by the :meth:`_classifier_method` + + :param adapt_if_necessary: unused, added for compatibility + """ + assert hasattr(self.classifier, self._classifier_method()), \ + f"the method does not implement the required {self._classifier_method()} method" + + +class AggregativeSoftQuantifier(AggregativeQuantifier, ABC): + """ + Abstract class for quantification methods that base their estimations on the aggregation of posterior + probabilities as returned by a probabilistic classifier. + Aggregative soft quantifiers thus extend Aggregative Quantifiers by implementing specifications + about soft predictions. + """ + + def classify(self, instances): + """ + Provides the posterior probabilities for the given instances. + + :param instances: array-like of shape `(n_instances, n_dimensions,)` + :return: np.ndarray of shape `(n_instances, n_classes,)` with posterior probabilities + """ return self.classifier.predict_proba(instances) def _classifier_method(self): + """ + Name of the method that must be used for issuing label predictions. + + :return: the string "predict_proba", i.e., the standard method name for scikit-learn soft predictions + """ print('using predict_proba') return 'predict_proba' def _check_classifier(self, adapt_if_necessary=False): + """ + Guarantees that the underlying classifier implements the method indicated by the :meth:`_classifier_method`. + In case it does not, the classifier is calibrated (by means of the Platt's calibration method implemented by + scikit-learn in CalibratedClassifierCV, with cv=5). This calibration is only allowed if `adapt_if_necessary` + is set to True. If otherwise (i.e., the classifier is not probabilistic, and `adapt_if_necessary` is set + to False), an exception will be raised. + + :param adapt_if_necessary: a hard classifier is turned into a soft classifier if `adapt_if_necessary==True` + """ if not hasattr(self.classifier, self._classifier_method()): if adapt_if_necessary: print(f'warning: The learner {self.classifier.__class__.__name__} does not seem to be ' @@ -217,9 +288,42 @@ class AggregativeProbabilisticQuantifier(AggregativeQuantifier, ABC): f'fit_classifier is set to False') + +class CorrectionbasedAggregativeQuantifier(AggregativeQuantifier): + """ + Abstract class for quantification methods that carry out an adjustment (or correction) that requires, + at training time, the predictions to be issued in validation mode, i.e., on a set of held-out data that + is not the training set. There are three ways in which this distinction can be made, depending on how + the internal parameter `val_split` is specified, namely, (i) a float in (0, 1) indicating the proportion + of training instances that should be devoted to validate, or (ii) an integer indicating the + number of folds to consider in a k-fold cross-validation mode, or (iii) the specific set of data to + use for validation. + """ + + @property + def val_split(self): + return self.val_split_ + + @val_split.setter + def val_split(self, val_split): + if isinstance(val_split, LabelledCollection): + print('warning: setting val_split with a LabelledCollection will be inefficient in' + 'model selection. Rather pass the LabelledCollection at fit time') + self.val_split_ = val_split + + def fit(self, data: LabelledCollection, fit_classifier=True, predict_on=None): + print('method from CorrectionbasedAggregativeQuantifier') + if predict_on is None: + predict_on = self.val_split + classif_predictions = self.classifier_fit_predict(data, fit_classifier, predict_on) + self.aggregation_fit(classif_predictions, data) + return self + + + # Methods # ------------------------------------ -class CC(AggregativeQuantifier): +class CC(AggregativeCrispQuantifier): """ The most basic Quantification method. One that simply classifies all instances and counts how many have been attributed to each of the classes in order to compute class prevalence estimates. @@ -230,7 +334,7 @@ class CC(AggregativeQuantifier): def __init__(self, classifier: BaseEstimator): self.classifier = classifier - def aggregation_fit(self, classif_predictions: LabelledCollection): + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Nothing to do here! @@ -248,19 +352,21 @@ class CC(AggregativeQuantifier): return F.prevalence_from_labels(classif_predictions, self.classes_) -class ACC(AggregativeQuantifier): +class ACC(AggregativeCrispQuantifier, CorrectionbasedAggregativeQuantifier): """ `Adjusted Classify & Count `_, the "adjusted" variant of :class:`CC`, that corrects the predictions of CC according to the `misclassification rates`. :param classifier: a sklearn's Estimator that generates a classifier - :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the - misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1, default 0.4), representing a proportion of - validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`), or as a - :class:`quapy.data.base.LabelledCollection` (the split itself). + :param val_split: specifies the data used for generating classifier predictions. This specification + can be made as float in (0, 1) indicating the proportion of stratified held-out validation set to + be extracted from the training set (default 0.4); or as an integer, indicating that the predictions + are to be generated in a `k`-fold cross-validation manner (with this integer indicating the value + for `k`); or as a collection defining the specific set of data to use for validation. + Alternatively, this set can be specified at fit time by indicating the exact set of data + on which the predictions are to be generated. + :param n_jobs: number of parallel workers """ def __init__(self, classifier: BaseEstimator, val_split=0.4, n_jobs=None): @@ -268,7 +374,7 @@ class ACC(AggregativeQuantifier): self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) - def aggregation_fit(self, classif_predictions: LabelledCollection): + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Estimates the misclassification rates. @@ -292,9 +398,6 @@ class ACC(AggregativeQuantifier): conf[:, i] /= class_counts[i] return conf - def classify(self, data): - return self.cc.classify(data) - def aggregate(self, classif_predictions): prevs_estim = self.cc.aggregate(classif_predictions) return ACC.solve_adjustment(self.Pte_cond_estim_, prevs_estim) @@ -321,7 +424,7 @@ class ACC(AggregativeQuantifier): return adjusted_prevs -class PCC(AggregativeProbabilisticQuantifier): +class PCC(AggregativeSoftQuantifier): """ `Probabilistic Classify & Count `_, the probabilistic variant of CC that relies on the posterior probabilities returned by a probabilistic classifier. @@ -332,7 +435,7 @@ class PCC(AggregativeProbabilisticQuantifier): def __init__(self, classifier: BaseEstimator): self.classifier = classifier - def aggregation_fit(self, classif_predictions: LabelledCollection): + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Nothing to do here! @@ -344,18 +447,18 @@ class PCC(AggregativeProbabilisticQuantifier): return F.prevalence_from_probabilities(classif_posteriors, binarize=False) -class PACC(AggregativeProbabilisticQuantifier): +class PACC(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier): """ `Probabilistic Adjusted Classify & Count `_, the probabilistic variant of ACC that relies on the posterior probabilities returned by a probabilistic classifier. :param classifier: a sklearn's Estimator that generates a classifier - :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the - misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1, default 0.4), representing a proportion of - validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`), or as a - :class:`quapy.data.base.LabelledCollection` (the split itself). + :param val_split: specifies the data used for generating classifier predictions. This specification + can be made as float in (0, 1) indicating the proportion of stratified held-out validation set to + be extracted from the training set (default 0.4); or as an integer, indicating that the predictions + are to be generated in a `k`-fold cross-validation manner (with this integer indicating the value + for `k`). Alternatively, this set can be specified at fit time by indicating the exact set of data + on which the predictions are to be generated. :param n_jobs: number of parallel workers """ @@ -364,16 +467,20 @@ class PACC(AggregativeProbabilisticQuantifier): self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) - def aggregation_fit(self, classif_predictions: LabelledCollection): + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Estimates the misclassification rates - :param classif_predictions: classifier predictions with true labels + :param classif_predictions: classifier soft predictions with true labels """ - true_labels, posteriors = classif_predictions + posteriors, true_labels = classif_predictions.Xy self.pcc = PCC(self.classifier) self.Pte_cond_estim_ = self.getPteCondEstim(self.classifier.classes_, true_labels, posteriors) + def aggregate(self, classif_posteriors): + prevs_estim = self.pcc.aggregate(classif_posteriors) + return ACC.solve_adjustment(self.Pte_cond_estim_, prevs_estim) + @classmethod def getPteCondEstim(cls, classes, y, y_): # estimate the matrix with entry (i,j) being the estimate of P(yi|yj), that is, the probability that a @@ -387,15 +494,8 @@ class PACC(AggregativeProbabilisticQuantifier): return confusion.T - def aggregate(self, classif_posteriors): - prevs_estim = self.pcc.aggregate(classif_posteriors) - return ACC.solve_adjustment(self.Pte_cond_estim_, prevs_estim) - def classify(self, data): - return self.pcc.classify(data) - - -class EMQ(AggregativeProbabilisticQuantifier): +class EMQ(AggregativeSoftQuantifier): """ `Expectation Maximization for Quantification `_ (EMQ), aka `Saerens-Latinne-Decaestecker` (SLD) algorithm. @@ -404,74 +504,30 @@ class EMQ(AggregativeProbabilisticQuantifier): maximum-likelihood estimation, in a mutually recursive way, until convergence. :param classifier: a sklearn's Estimator that generates a classifier - :param exact_train_prev: set to True (default) for using, as the initial observation, the true training prevalence; - or set to False for computing the training prevalence as an estimate, akin to PCC, i.e., as the expected - value of the posterior probabilities of the training instances as suggested in - `Alexandari et al. paper `_: - :param recalib: a string indicating the method of recalibration. Available choices include "nbvs" (No-Bias Vector - Scaling), "bcts" (Bias-Corrected Temperature Scaling), "ts" (Temperature Scaling), and "vs" (Vector Scaling). - The default value is None, indicating no recalibration. """ MAX_ITER = 1000 EPSILON = 1e-4 - def __init__(self, classifier: BaseEstimator, exact_train_prev=True, recalib=None): + def __init__(self, classifier: BaseEstimator): self.classifier = classifier - self.non_calibrated = classifier - self.exact_train_prev = exact_train_prev - self.recalib = recalib - def classifier_fit_predict(self, data: LabelledCollection, fit_classifier=True): - self.classifier, true_labels, posteriors, classes, class_count = cross_generate_predictions( - data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs - ) - - return (true_labels, posteriors) - - if self.recalib is not None: - if self.recalib == 'nbvs': - self.classifier = NBVSCalibration(self.non_calibrated) - elif self.recalib == 'bcts': - self.classifier = BCTSCalibration(self.non_calibrated) - elif self.recalib == 'ts': - self.classifier = TSCalibration(self.non_calibrated) - elif self.recalib == 'vs': - self.classifier = VSCalibration(self.non_calibrated) - elif self.recalib == 'platt': - self.classifier = CalibratedClassifierCV(self.classifier, ensemble=False) - else: - raise ValueError('invalid param argument for recalibration method; available ones are ' - '"nbvs", "bcts", "ts", and "vs".') - self.recalib = None - else: - self.classifier = self.non_calibrated - self.classifier, _ = _training_helper(self.classifier, data, fit_classifier, ensure_probabilistic=True) - if self.exact_train_prev: - self.train_prevalence = F.prevalence_from_labels(data.labels, self.classes_) - else: - self.train_prevalence = qp.model_selection.cross_val_predict( - quantifier=PCC(deepcopy(self.classifier)), - data=data, - nfolds=3, - random_state=0 - ) - return None - - def aggregation_fit(self, classif_predictions: np.ndarray): - """ - Nothing to do here! - - :param classif_predictions: this is actually None - """ - pass + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): + self.train_prevalence = data.prevalence() def aggregate(self, classif_posteriors, epsilon=EPSILON): priors, posteriors = self.EM(self.train_prevalence, classif_posteriors, epsilon) return priors def predict_proba(self, instances, epsilon=EPSILON): - classif_posteriors = self.classifier.predict_proba(instances) + """ + Returns the posterior probabilities updated by the EM algorithm. + + :param instances: np.ndarray of shape `(n_instances, n_dimensions)` + :param epsilon: error tolerance + :return: np.ndarray of shape `(n_instances, n_classes)` + """ + classif_posteriors = self.classify(instances) priors, posteriors = self.EM(self.train_prevalence, classif_posteriors, epsilon) return posteriors @@ -514,7 +570,94 @@ class EMQ(AggregativeProbabilisticQuantifier): return qs, ps -class HDy(AggregativeProbabilisticQuantifier, BinaryQuantifier): +class EMQrecalib(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier): + """ + `Expectation Maximization for Quantification `_ (EMQ), + aka `Saerens-Latinne-Decaestecker` (SLD) algorithm, with the heuristics proposed by + `Alexandari et al. paper `_. + + These heuristics consist of using, as the training prevalence, an estimate of it obtained via k-fold cross + validation (instead of the true training prevalence), and to recalibrate the posterior probabilities of + the classifier. + + :param classifier: a sklearn's Estimator that generates a classifier + :param val_split: specifies the data used for generating classifier predictions. This specification + can be made as float in (0, 1) indicating the proportion of stratified held-out validation set to + be extracted from the training set (default 0.4); or as an integer, indicating that the predictions + are to be generated in a `k`-fold cross-validation manner (with this integer indicating the value + for `k`); or as a collection defining the specific set of data to use for validation. + Alternatively, this set can be specified at fit time by indicating the exact set of data + on which the predictions are to be generated. + :param exact_train_prev: set to True (default) for using, as the initial observation, the true training prevalence; + or set to False for computing the training prevalence as an estimate of it, i.e., as the expected + value of the posterior probabilities of the training instances + :param recalib: a string indicating the method of recalibration. + Available choices include "nbvs" (No-Bias Vector Scaling), "bcts" (Bias-Corrected Temperature Scaling, + default), "ts" (Temperature Scaling), and "vs" (Vector Scaling). + :param n_jobs: number of parallel workers + """ + + MAX_ITER = 1000 + EPSILON = 1e-4 + + def __init__(self, classifier: BaseEstimator, val_split=5, exact_train_prev=False, recalib='bcts', n_jobs=None): + self.classifier = classifier + self.val_split = val_split + self.exact_train_prev = exact_train_prev + self.recalib = recalib + self.n_jobs = n_jobs + + def classify(self, instances): + """ + Provides the posterior probabilities for the given instances. If the classifier is + recalibrated, then these posteriors will be recalibrated accordingly. + + :param instances: array-like of shape `(n_instances, n_dimensions,)` + :return: np.ndarray of shape `(n_instances, n_classes,)` with posterior probabilities + """ + posteriors = self.classifier.predict_proba(instances) + if hasattr(self, 'calibration_function') and self.calibration_function is not None: + posteriors = self.calibration_function(posteriors) + return posteriors + + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): + if self.recalib is not None: + P, y = classif_predictions.Xy + if self.recalib == 'nbvs': + calibrator = NoBiasVectorScaling() + elif self.recalib == 'bcts': + calibrator = TempScaling(bias_positions='all') + elif self.recalib == 'ts': + calibrator = TempScaling() + elif self.recalib == 'vs': + calibrator = VectorScaling() + else: + raise ValueError('invalid param argument for recalibration method; available ones are ' + '"nbvs", "bcts", "ts", and "vs".') + + self.calibration_function = calibrator(P, np.eye(data.n_classes)[y], posterior_supplied=True) + + if self.exact_train_prev: + self.train_prevalence = F.prevalence_from_labels(data.labels, self.classes_) + else: + if self.recalib is not None: + train_posteriors = self.classify(data.X) + else: + train_posteriors = classif_predictions.X + + self.train_prevalence = np.mean(train_posteriors, axis=0) + + def aggregate(self, classif_posteriors, epsilon=EPSILON): + priors, posteriors = EMQ.EM(self.train_prevalence, classif_posteriors, epsilon) + return priors + + def predict_proba(self, instances, epsilon=EPSILON): + classif_posteriors = self.classify(instances) + priors, posteriors = EMQ.EM(self.train_prevalence, classif_posteriors, epsilon) + return posteriors + + +class HDy(AggregativeSoftQuantifier, BinaryQuantifier, CorrectionbasedAggregativeQuantifier): """ `Hellinger Distance y `_ (HDy). HDy is a probabilistic method for training binary quantifiers, that models quantification as the problem of @@ -533,7 +676,7 @@ class HDy(AggregativeProbabilisticQuantifier, BinaryQuantifier): self.classifier = classifier self.val_split = val_split - def fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Trains a HDy quantifier. @@ -544,22 +687,23 @@ class HDy(AggregativeProbabilisticQuantifier, BinaryQuantifier): :class:`quapy.data.base.LabelledCollection` indicating the validation set itself :return: self """ - if val_split is None: - val_split = self.val_split self._check_binary(data, self.__class__.__name__) - self.classifier, validation = _training_helper( - self.classifier, data, fit_classifier, ensure_probabilistic=True, val_split=val_split) - Px = self.classify(validation.instances)[:, 1] # takes only the P(y=+1|x) - self.Pxy1 = Px[validation.labels == self.classifier.classes_[1]] - self.Pxy0 = Px[validation.labels == self.classifier.classes_[0]] + P, y = classif_predictions.Xy + Px = P[:, 1] # takes only the P(y=+1|x) + self.Pxy1 = Px[y == self.classifier.classes_[1]] + self.Pxy0 = Px[y == self.classifier.classes_[0]] + # pre-compute the histogram for positive and negative examples self.bins = np.linspace(10, 110, 11, dtype=int) # [10, 20, 30, ..., 100, 110] + def hist(P, bins): h = np.histogram(P, bins=bins, range=(0, 1), density=True)[0] return h / h.sum() + self.Pxy1_density = {bins: hist(self.Pxy1, bins) for bins in self.bins} self.Pxy0_density = {bins: hist(self.Pxy0, bins) for bins in self.bins} + return self def aggregate(self, classif_posteriors): @@ -583,7 +727,7 @@ class HDy(AggregativeProbabilisticQuantifier, BinaryQuantifier): # at small steps (modern implementations resort to an optimization procedure, # see class DistributionMatching) prev_selected, min_dist = None, None - for prev in F.prevalence_linspace(n_prevalences=100, repeats=1, smooth_limits_epsilon=0.0): + for prev in F.prevalence_linspace(n_prevalences=101, repeats=1, smooth_limits_epsilon=0.0): Px_train = prev * Pxy1_density + (1 - prev) * Pxy0_density hdy = F.HellingerDistance(Px_train, Px_test) if prev_selected is None or hdy < min_dist: @@ -594,7 +738,7 @@ class HDy(AggregativeProbabilisticQuantifier, BinaryQuantifier): return np.asarray([1 - class1_prev, class1_prev]) -class DyS(AggregativeProbabilisticQuantifier, BinaryQuantifier): +class DyS(AggregativeSoftQuantifier, BinaryQuantifier): """ `DyS framework `_ (DyS). DyS is a generalization of HDy method, using a Ternary Search in order to find the prevalence that @@ -661,7 +805,7 @@ class DyS(AggregativeProbabilisticQuantifier, BinaryQuantifier): return np.asarray([1 - class1_prev, class1_prev]) -class SMM(AggregativeProbabilisticQuantifier, BinaryQuantifier): +class SMM(AggregativeSoftQuantifier, BinaryQuantifier): """ `SMM method `_ (SMM). SMM is a simplification of matching distribution methods where the representation of the examples @@ -700,7 +844,7 @@ class SMM(AggregativeProbabilisticQuantifier, BinaryQuantifier): return np.asarray([1 - class1_prev, class1_prev]) -class DMy(AggregativeProbabilisticQuantifier): +class DMy(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier): """ Generic Distribution Matching quantifier for binary or multiclass quantification based on the space of posterior probabilities. This implementation takes the number of bins, the divergence, and the possibility to work on CDF @@ -736,7 +880,7 @@ class DMy(AggregativeProbabilisticQuantifier): from quapy.method.meta import MedianEstimator hdy = DMy(classifier=classifier, val_split=val_split, search='linear_search', divergence='HD') - hdy = MedianEstimator(hdy, param_grid={'nbins': np.linspace(10, 110, 11).astype(int)}, n_jobs=n_jobs) + hdy = AggregativeMedianEstimator(hdy, param_grid={'nbins': np.linspace(10, 110, 11).astype(int)}, n_jobs=n_jobs) return hdy def __get_distributions(self, posteriors): @@ -755,7 +899,7 @@ class DMy(AggregativeProbabilisticQuantifier): distributions = np.cumsum(distributions, axis=1) return distributions - def classifier_fit_predict(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Trains the classifier (if requested) and generates the validation distributions out of the training data. The validation distributions have shape `(n, ch, nbins)`, with `n` the number of classes, `ch` the number of @@ -771,21 +915,13 @@ class DMy(AggregativeProbabilisticQuantifier): indicating the validation set itself, or an int indicating the number k of folds to be used in kFCV to estimate the parameters """ - if val_split is None: - val_split = self.val_split - - self.classifier, true_labels, posteriors, classes, class_count = cross_generate_predictions( - data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs - ) - - return (true_labels, posteriors) - - def aggregation_fit(self, classif_predictions): - true_labels, posteriors = classif_predictions + posteriors, true_labels = classif_predictions.Xy n_classes = len(self.classifier.classes_) - self.validation_distribution = np.asarray( - [self.__get_distributions(posteriors[true_labels == cat]) for cat in range(n_classes)] + self.validation_distribution = qp.util.parallel( + func=self.__get_distributions, + args=[posteriors[true_labels==cat] for cat in range(n_classes)], + n_jobs=self.n_jobs ) def aggregate(self, posteriors: np.ndarray): @@ -1252,7 +1388,7 @@ class OneVsAllAggregative(OneVsAllGeneric, AggregativeQuantifier): """ classif_predictions = self._parallel(self._delayed_binary_classification, instances) - if isinstance(self.binary_quantifier, AggregativeProbabilisticQuantifier): + if isinstance(self.binary_quantifier, AggregativeSoftQuantifier): return np.swapaxes(classif_predictions, 0, 1) else: return classif_predictions.T @@ -1269,6 +1405,130 @@ class OneVsAllAggregative(OneVsAllGeneric, AggregativeQuantifier): return self.dict_binary_quantifiers[c].aggregate(classif_predictions[:, c])[1] +class AggregativeMedianEstimator(BinaryQuantifier): + """ + This method is a meta-quantifier that returns, as the estimated class prevalence values, the median of the + estimation returned by differently (hyper)parameterized base quantifiers. + The median of unit-vectors is only guaranteed to be a unit-vector for n=2 dimensions, + i.e., in cases of binary quantification. + + :param base_quantifier: the base, binary quantifier + :param random_state: a seed to be set before fitting any base quantifier (default None) + :param param_grid: the grid or parameters towards which the median will be computed + :param n_jobs: number of parllel workes + """ + def __init__(self, base_quantifier: AggregativeQuantifier, param_grid: dict, random_state=None, n_jobs=None): + self.base_quantifier = base_quantifier + self.param_grid = param_grid + self.random_state = random_state + self.n_jobs = qp._get_njobs(n_jobs) + + def get_params(self, deep=True): + return self.base_quantifier.get_params(deep) + + def set_params(self, **params): + self.base_quantifier.set_params(**params) + + def _delayed_fit(self, args): + with qp.util.temp_seed(self.random_state): + params, training = args + model = deepcopy(self.base_quantifier) + model.set_params(**params) + model.fit(training) + return model + + def _delayed_fit_classifier(self, args): + with qp.util.temp_seed(self.random_state): + print('enter job') + cls_params, training, kwargs = args + model = deepcopy(self.base_quantifier) + model.set_params(**cls_params) + predictions = model.classifier_fit_predict(training, **kwargs) + print('exit job') + return (model, predictions) + + def _delayed_fit_aggregation(self, args): + with qp.util.temp_seed(self.random_state): + print('\tenter job') + ((model, predictions), q_params), training = args + model = deepcopy(model) + print('fitaggr', model, predictions, len(predictions), print(self.training)) + model.set_params(**q_params) + model.aggregation_fit(predictions, training) + print('\texit job') + return model + + + def fit(self, training: LabelledCollection, **kwargs): + import itertools + + self._check_binary(training, self.__class__.__name__) + + if isinstance(self.base_quantifier, AggregativeQuantifier): + cls_configs, q_configs = qp.model_selection.group_params(self.param_grid) + + if len(cls_configs) > 1: + models_preds = qp.util.parallel( + self._delayed_fit_classifier, + ((params, training, kwargs) for params in cls_configs), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs, + asarray=False + ) + else: + print('only 1') + model = self.base_quantifier + model.set_params(**cls_configs[0]) + predictions = model.classifier_fit_predict(training, **kwargs) + models_preds = [(model, predictions)] + + self.training = training + + self.models = [] + print('WITHOUT PARALLEL JOBS') + for ((model, predictions), q_params) in itertools.product(models_preds, q_configs): + print('\tenter job') + model = deepcopy(model) + print('fitaggr', model, predictions, len(predictions), print(self.training)) + model.set_params(**q_params) + model.aggregation_fit(predictions, training) + self.models.append(model) + print('\texit job') + + + # self.models = qp.util.parallel( + # self._delayed_fit_aggregation, + # ((setup, training) for setup in itertools.product(models_preds, q_configs)), + # seed=qp.environ.get('_R_SEED', None), + # n_jobs=self.n_jobs, + # asarray=False + # ) + else: + configs = qp.model_selection.expand_grid(self.param_grid) + self.models = qp.util.parallel( + self._delayed_fit, + ((params, training) for params in configs), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs, + asarray=False + ) + return self + + def _delayed_predict(self, args): + model, instances = args + return model.quantify(instances) + + def quantify(self, instances): + prev_preds = qp.util.parallel( + self._delayed_predict, + ((model, instances) for model in self.models), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs, + asarray=False + ) + prev_preds = np.asarray(prev_preds) + return np.median(prev_preds, axis=0) + #--------------------------------------------------------------- # aliases #--------------------------------------------------------------- diff --git a/quapy/method/meta.py b/quapy/method/meta.py index 7f111c0..d29433e 100644 --- a/quapy/method/meta.py +++ b/quapy/method/meta.py @@ -12,7 +12,7 @@ from quapy import functional as F from quapy.data import LabelledCollection from quapy.model_selection import GridSearchQ from quapy.method.base import BaseQuantifier, BinaryQuantifier -from quapy.method.aggregative import CC, ACC, PACC, HDy, EMQ +from quapy.method.aggregative import CC, ACC, PACC, HDy, EMQ, AggregativeQuantifier try: from . import neural @@ -26,6 +26,65 @@ else: QuaNet = "QuaNet is not available due to missing torch package" +class MedianEstimator2(BinaryQuantifier): + """ + This method is a meta-quantifier that returns, as the estimated class prevalence values, the median of the + estimation returned by differently (hyper)parameterized base quantifiers. + The median of unit-vectors is only guaranteed to be a unit-vector for n=2 dimensions, + i.e., in cases of binary quantification. + + :param base_quantifier: the base, binary quantifier + :param random_state: a seed to be set before fitting any base quantifier (default None) + :param param_grid: the grid or parameters towards which the median will be computed + :param n_jobs: number of parllel workes + """ + def __init__(self, base_quantifier: BinaryQuantifier, param_grid: dict, random_state=None, n_jobs=None): + self.base_quantifier = base_quantifier + self.param_grid = param_grid + self.random_state = random_state + self.n_jobs = qp._get_njobs(n_jobs) + + def get_params(self, deep=True): + return self.base_quantifier.get_params(deep) + + def set_params(self, **params): + self.base_quantifier.set_params(**params) + + def _delayed_fit(self, args): + with qp.util.temp_seed(self.random_state): + params, training = args + model = deepcopy(self.base_quantifier) + model.set_params(**params) + model.fit(training) + return model + + def fit(self, training: LabelledCollection): + self._check_binary(training, self.__class__.__name__) + + configs = qp.model_selection.expand_grid(self.param_grid) + self.models = qp.util.parallel( + self._delayed_fit, + ((params, training) for params in configs), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs + ) + return self + + def _delayed_predict(self, args): + model, instances = args + return model.quantify(instances) + + def quantify(self, instances): + prev_preds = qp.util.parallel( + self._delayed_predict, + ((model, instances) for model in self.models), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs + ) + prev_preds = np.asarray(prev_preds) + return np.median(prev_preds, axis=0) + + class MedianEstimator(BinaryQuantifier): """ This method is a meta-quantifier that returns, as the estimated class prevalence values, the median of the @@ -58,17 +117,64 @@ class MedianEstimator(BinaryQuantifier): model.fit(training) return model + def _delayed_fit_classifier(self, args): + with qp.util.temp_seed(self.random_state): + print('enter job') + cls_params, training = args + model = deepcopy(self.base_quantifier) + model.set_params(**cls_params) + predictions = model.classifier_fit_predict(training, predict_on=model.val_split) + print('exit job') + return (model, predictions) + + def _delayed_fit_aggregation(self, args): + with qp.util.temp_seed(self.random_state): + print('\tenter job') + ((model, predictions), q_params), training = args + model = deepcopy(model) + model.set_params(**q_params) + model.aggregation_fit(predictions, training) + print('\texit job') + return model + + def fit(self, training: LabelledCollection): self._check_binary(training, self.__class__.__name__) - params_keys = list(self.param_grid.keys()) - params_values = list(self.param_grid.values()) - hyper = [dict({k: val[i] for i, k in enumerate(params_keys)}) for val in itertools.product(*params_values)] - self.models = qp.util.parallel( - self._delayed_fit, - ((params, training) for params in hyper), - seed=qp.environ.get('_R_SEED', None), - n_jobs=self.n_jobs - ) + + if isinstance(self.base_quantifier, AggregativeQuantifier): + cls_configs, q_configs = qp.model_selection.group_params(self.param_grid) + + if len(cls_configs) > 1: + models_preds = qp.util.parallel( + self._delayed_fit_classifier, + ((params, training) for params in cls_configs), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs, + asarray=False + ) + else: + print('only 1') + model = self.base_quantifier + model.set_params(**cls_configs[0]) + predictions = model.classifier_fit_predict(training, predict_on=model.val_split) + models_preds = [(model, predictions)] + + self.models = qp.util.parallel( + self._delayed_fit_aggregation, + ((setup, training) for setup in itertools.product(models_preds, q_configs)), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs, + asarray=False + ) + else: + configs = qp.model_selection.expand_grid(self.param_grid) + self.models = qp.util.parallel( + self._delayed_fit, + ((params, training) for params in configs), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs, + asarray=False + ) return self def _delayed_predict(self, args): @@ -80,13 +186,13 @@ class MedianEstimator(BinaryQuantifier): self._delayed_predict, ((model, instances) for model in self.models), seed=qp.environ.get('_R_SEED', None), - n_jobs=self.n_jobs + n_jobs=self.n_jobs, + asarray=False ) prev_preds = np.asarray(prev_preds) return np.median(prev_preds, axis=0) - class Ensemble(BaseQuantifier): VALID_POLICIES = {'ave', 'ptr', 'ds'} | qp.error.QUANTIFICATION_ERROR_NAMES diff --git a/quapy/method/neural.py b/quapy/method/neural.py index 2478055..330ac60 100644 --- a/quapy/method/neural.py +++ b/quapy/method/neural.py @@ -194,7 +194,7 @@ class QuaNetTrainer(BaseQuantifier): label_predictions = np.argmax(posteriors, axis=-1) prevs_estim = [] for quantifier in self.quantifiers.values(): - predictions = posteriors if isinstance(quantifier, AggregativeProbabilisticQuantifier) else label_predictions + predictions = posteriors if isinstance(quantifier, AggregativeSoftQuantifier) else label_predictions prevs_estim.extend(quantifier.aggregate(predictions)) # there is no real need for adding static estims like the TPR or FPR from training since those are constant diff --git a/quapy/model_selection.py b/quapy/model_selection.py index f02d9dc..2378777 100644 --- a/quapy/model_selection.py +++ b/quapy/model_selection.py @@ -76,8 +76,6 @@ class GridSearchQ(BaseQuantifier): :param training: the training set on which to optimize the hyperparameters :return: self """ - params_keys = list(self.param_grid.keys()) - params_values = list(self.param_grid.values()) protocol = self.protocol @@ -86,12 +84,13 @@ class GridSearchQ(BaseQuantifier): tinit = time() - hyper = [dict({k: val[i] for i, k in enumerate(params_keys)}) for val in itertools.product(*params_values)] + configs = expand_grid(self.param_grid) + self._sout(f'starting model selection with {self.n_jobs =}') - #pass a seed to parallel so it is set in clild processes + #pass a seed to parallel so it is set in child processes scores = qp.util.parallel( self._delayed_eval, - ((params, training) for params in hyper), + ((params, training) for params in configs), seed=qp.environ.get('_R_SEED', None), n_jobs=self.n_jobs ) @@ -204,8 +203,6 @@ class GridSearchQ(BaseQuantifier): raise ValueError('best_model called before fit') - - def cross_val_predict(quantifier: BaseQuantifier, data: LabelledCollection, nfolds=3, random_state=0): """ Akin to `scikit-learn's cross_val_predict `_ @@ -229,3 +226,43 @@ def cross_val_predict(quantifier: BaseQuantifier, data: LabelledCollection, nfol return total_prev +def expand_grid(param_grid: dict): + """ + Expands a param_grid dictionary as a list of configurations. + Example: + + >>> combinations = expand_grid({'A': [1, 10, 100], 'B': [True, False]}) + >>> print(combinations) + >>> [{'A': 1, 'B': True}, {'A': 1, 'B': False}, {'A': 10, 'B': True}, {'A': 10, 'B': False}, {'A': 100, 'B': True}, {'A': 100, 'B': False}] + + :param param_grid: dictionary with keys representing hyper-parameter names, and values representing the range + to explore for that hyper-parameter + :return: a list of configurations, i.e., combinations of hyper-parameter assignments in the grid. + """ + params_keys = list(param_grid.keys()) + params_values = list(param_grid.values()) + configs = [{k: combs[i] for i, k in enumerate(params_keys)} for combs in itertools.product(*params_values)] + return configs + + +def group_params(param_grid: dict): + """ + Partitions a param_grid dictionary as two lists of configurations, one for the classifier-specific + hyper-parameters, and another for que quantifier-specific hyper-parameters + + :param param_grid: dictionary with keys representing hyper-parameter names, and values representing the range + to explore for that hyper-parameter + :return: two expanded grids of configurations, one for the classifier, another for the quantifier + """ + classifier_params, quantifier_params = {}, {} + for key, values in param_grid.items(): + if key.startswith('classifier__') or key == 'val_split': + classifier_params[key] = values + else: + quantifier_params[key] = values + + classifier_configs = expand_grid(classifier_params) + quantifier_configs = expand_grid(quantifier_params) + + return classifier_configs, quantifier_configs + diff --git a/quapy/tests/test_hierarchy.py b/quapy/tests/test_hierarchy.py index 2ea3af5..b0842e5 100644 --- a/quapy/tests/test_hierarchy.py +++ b/quapy/tests/test_hierarchy.py @@ -22,9 +22,9 @@ class HierarchyTestCase(unittest.TestCase): def test_probabilistic(self): lr = LogisticRegression() for m in [CC(lr), ACC(lr)]: - self.assertEqual(isinstance(m, AggregativeProbabilisticQuantifier), False) + self.assertEqual(isinstance(m, AggregativeSoftQuantifier), False) for m in [PCC(lr), PACC(lr)]: - self.assertEqual(isinstance(m, AggregativeProbabilisticQuantifier), True) + self.assertEqual(isinstance(m, AggregativeSoftQuantifier), True) if __name__ == '__main__': diff --git a/quapy/util.py b/quapy/util.py index 733fbb8..c1d9f0d 100644 --- a/quapy/util.py +++ b/quapy/util.py @@ -38,7 +38,7 @@ def map_parallel(func, args, n_jobs): return list(itertools.chain.from_iterable(results)) -def parallel(func, args, n_jobs, seed=None): +def parallel(func, args, n_jobs, seed=None, asarray=True): """ A wrapper of multiprocessing: @@ -58,9 +58,12 @@ def parallel(func, args, n_jobs, seed=None): stack.enter_context(qp.util.temp_seed(seed)) return func(*args) - return Parallel(n_jobs=n_jobs)( + out = Parallel(n_jobs=n_jobs)( delayed(func_dec)(qp.environ, None if seed is None else seed+i, args_i) for i, args_i in enumerate(args) ) + if asarray: + out = np.asarray(out) + return out @contextlib.contextmanager From 513c78f1f30e97c8ff59c76527ea3bef02f9571a Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Thu, 16 Nov 2023 14:29:34 +0100 Subject: [PATCH 008/216] model seletion in two levels, classifier oriented and quantifier oriented --- examples/model_selection.py | 67 ++++++----- quapy/method/aggregative.py | 154 +++++++++++++------------ quapy/model_selection.py | 218 +++++++++++++++++++++++++++++------- quapy/util.py | 4 +- 4 files changed, 296 insertions(+), 147 deletions(-) diff --git a/examples/model_selection.py b/examples/model_selection.py index ae7fb6a..df051a0 100644 --- a/examples/model_selection.py +++ b/examples/model_selection.py @@ -2,7 +2,9 @@ import quapy as qp from quapy.protocol import APP from quapy.method.aggregative import DMy from sklearn.linear_model import LogisticRegression +from examples.comparing_gridsearch import OLD_GridSearchQ import numpy as np +from time import time """ In this example, we show how to perform model selection on a DistributionMatching quantifier. @@ -15,35 +17,44 @@ qp.environ['N_JOBS'] = -1 training, test = qp.datasets.fetch_reviews('imdb', tfidf=True, min_df=5).train_test -# The model will be returned by the fit method of GridSearchQ. -# Every combination of hyper-parameters will be evaluated by confronting the -# quantifier thus configured against a series of samples generated by means -# of a sample generation protocol. For this example, we will use the -# artificial-prevalence protocol (APP), that generates samples with prevalence -# values in the entire range of values from a grid (e.g., [0, 0.1, 0.2, ..., 1]). -# We devote 30% of the dataset for this exploration. -training, validation = training.split_stratified(train_prop=0.7) -protocol = APP(validation) +with qp.util.temp_seed(0): -# We will explore a classification-dependent hyper-parameter (e.g., the 'C' -# hyper-parameter of LogisticRegression) and a quantification-dependent hyper-parameter -# (e.g., the number of bins in a DistributionMatching quantifier. -# Classifier-dependent hyper-parameters have to be marked with a prefix "classifier__" -# in order to let the quantifier know this hyper-parameter belongs to its underlying -# classifier. -param_grid = { - 'classifier__C': np.logspace(-3,3,7), - 'nbins': [8, 16, 32, 64], -} + # The model will be returned by the fit method of GridSearchQ. + # Every combination of hyper-parameters will be evaluated by confronting the + # quantifier thus configured against a series of samples generated by means + # of a sample generation protocol. For this example, we will use the + # artificial-prevalence protocol (APP), that generates samples with prevalence + # values in the entire range of values from a grid (e.g., [0, 0.1, 0.2, ..., 1]). + # We devote 30% of the dataset for this exploration. + training, validation = training.split_stratified(train_prop=0.7) + protocol = APP(validation) -model = qp.model_selection.GridSearchQ( - model=model, - param_grid=param_grid, - protocol=protocol, - error='mae', # the error to optimize is the MAE (a quantification-oriented loss) - refit=True, # retrain on the whole labelled set once done - verbose=True # show information as the process goes on -).fit(training) + # We will explore a classification-dependent hyper-parameter (e.g., the 'C' + # hyper-parameter of LogisticRegression) and a quantification-dependent hyper-parameter + # (e.g., the number of bins in a DistributionMatching quantifier. + # Classifier-dependent hyper-parameters have to be marked with a prefix "classifier__" + # in order to let the quantifier know this hyper-parameter belongs to its underlying + # classifier. + param_grid = { + 'classifier__C': np.logspace(-3,3,7), + 'classifier__class_weight': ['balanced', None], + 'nbins': [8, 16, 32, 64], + } + + tinit = time() + + + # model = OLD_GridSearchQ( + model = qp.model_selection.GridSearchQ( + model=model, + param_grid=param_grid, + protocol=protocol, + error='mae', # the error to optimize is the MAE (a quantification-oriented loss) + refit=False, # retrain on the whole labelled set once done + verbose=True # show information as the process goes on + ).fit(training) + +tend = time() print(f'model selection ended: best hyper-parameters={model.best_params_}') model = model.best_model_ @@ -53,5 +64,5 @@ model = model.best_model_ mae_score = qp.evaluation.evaluate(model, protocol=APP(test), error_metric='mae') print(f'MAE={mae_score:.5f}') - +print(f'model selection took {tend-tinit}s') diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index a8a7bb2..f3779be 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -37,7 +37,20 @@ class AggregativeQuantifier(BaseQuantifier, ABC): and :meth:`aggregate`. """ - def fit(self, data: LabelledCollection, fit_classifier=True): + val_split_ = None + + @property + def val_split(self): + return self.val_split_ + + @val_split.setter + def val_split(self, val_split): + if isinstance(val_split, LabelledCollection): + print('warning: setting val_split with a LabelledCollection will be inefficient in' + 'model selection. Rather pass the LabelledCollection at fit time') + self.val_split_ = val_split + + def fit(self, data: LabelledCollection, fit_classifier=True, val_split=None): """ Trains the aggregative quantifier. This comes down to training a classifier and an aggregation function. @@ -46,7 +59,7 @@ class AggregativeQuantifier(BaseQuantifier, ABC): learner has been trained outside the quantifier. :return: self """ - classif_predictions = self.classifier_fit_predict(data, fit_classifier) + classif_predictions = self.classifier_fit_predict(data, fit_classifier, predict_on=val_split) self.aggregation_fit(classif_predictions, data) return self @@ -69,6 +82,9 @@ class AggregativeQuantifier(BaseQuantifier, ABC): self._check_classifier(adapt_if_necessary=(self._classifier_method() == 'predict_proba')) + if predict_on is None: + predict_on = self.val_split + if predict_on is None: if fit_classifier: self.classifier.fit(*data.Xy) @@ -228,7 +244,6 @@ class AggregativeCrispQuantifier(AggregativeQuantifier, ABC): :return: the string "predict", i.e., the standard method name for scikit-learn hard predictions """ - print('using predict') return 'predict' def _check_classifier(self, adapt_if_necessary=False): @@ -264,7 +279,6 @@ class AggregativeSoftQuantifier(AggregativeQuantifier, ABC): :return: the string "predict_proba", i.e., the standard method name for scikit-learn soft predictions """ - print('using predict_proba') return 'predict_proba' def _check_classifier(self, adapt_if_necessary=False): @@ -289,35 +303,35 @@ class AggregativeSoftQuantifier(AggregativeQuantifier, ABC): -class CorrectionbasedAggregativeQuantifier(AggregativeQuantifier): - """ - Abstract class for quantification methods that carry out an adjustment (or correction) that requires, - at training time, the predictions to be issued in validation mode, i.e., on a set of held-out data that - is not the training set. There are three ways in which this distinction can be made, depending on how - the internal parameter `val_split` is specified, namely, (i) a float in (0, 1) indicating the proportion - of training instances that should be devoted to validate, or (ii) an integer indicating the - number of folds to consider in a k-fold cross-validation mode, or (iii) the specific set of data to - use for validation. - """ - - @property - def val_split(self): - return self.val_split_ - - @val_split.setter - def val_split(self, val_split): - if isinstance(val_split, LabelledCollection): - print('warning: setting val_split with a LabelledCollection will be inefficient in' - 'model selection. Rather pass the LabelledCollection at fit time') - self.val_split_ = val_split - - def fit(self, data: LabelledCollection, fit_classifier=True, predict_on=None): - print('method from CorrectionbasedAggregativeQuantifier') - if predict_on is None: - predict_on = self.val_split - classif_predictions = self.classifier_fit_predict(data, fit_classifier, predict_on) - self.aggregation_fit(classif_predictions, data) - return self +# class CorrectionbasedAggregativeQuantifier(AggregativeQuantifier): +# """ +# Abstract class for quantification methods that carry out an adjustment (or correction) that requires, +# at training time, the predictions to be issued in validation mode, i.e., on a set of held-out data that +# is not the training set. There are three ways in which this distinction can be made, depending on how +# the internal parameter `val_split` is specified, namely, (i) a float in (0, 1) indicating the proportion +# of training instances that should be devoted to validate, or (ii) an integer indicating the +# number of folds to consider in a k-fold cross-validation mode, or (iii) the specific set of data to +# use for validation. +# """ +# +# @property +# def val_split(self): +# return self.val_split_ +# +# @val_split.setter +# def val_split(self, val_split): +# if isinstance(val_split, LabelledCollection): +# print('warning: setting val_split with a LabelledCollection will be inefficient in' +# 'model selection. Rather pass the LabelledCollection at fit time') +# self.val_split_ = val_split +# +# def fit(self, data: LabelledCollection, fit_classifier=True, predict_on=None): +# print('method from CorrectionbasedAggregativeQuantifier') +# if predict_on is None: +# predict_on = self.val_split +# classif_predictions = self.classifier_fit_predict(data, fit_classifier, predict_on) +# self.aggregation_fit(classif_predictions, data) +# return self @@ -352,7 +366,7 @@ class CC(AggregativeCrispQuantifier): return F.prevalence_from_labels(classif_predictions, self.classes_) -class ACC(AggregativeCrispQuantifier, CorrectionbasedAggregativeQuantifier): +class ACC(AggregativeCrispQuantifier): """ `Adjusted Classify & Count `_, the "adjusted" variant of :class:`CC`, that corrects the predictions of CC @@ -447,7 +461,7 @@ class PCC(AggregativeSoftQuantifier): return F.prevalence_from_probabilities(classif_posteriors, binarize=False) -class PACC(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier): +class PACC(AggregativeSoftQuantifier): """ `Probabilistic Adjusted Classify & Count `_, the probabilistic variant of ACC that relies on the posterior probabilities returned by a probabilistic classifier. @@ -570,7 +584,7 @@ class EMQ(AggregativeSoftQuantifier): return qs, ps -class EMQrecalib(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier): +class EMQrecalib(AggregativeSoftQuantifier): """ `Expectation Maximization for Quantification `_ (EMQ), aka `Saerens-Latinne-Decaestecker` (SLD) algorithm, with the heuristics proposed by @@ -657,7 +671,7 @@ class EMQrecalib(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier return posteriors -class HDy(AggregativeSoftQuantifier, BinaryQuantifier, CorrectionbasedAggregativeQuantifier): +class HDy(AggregativeSoftQuantifier, BinaryQuantifier): """ `Hellinger Distance y `_ (HDy). HDy is a probabilistic method for training binary quantifiers, that models quantification as the problem of @@ -844,7 +858,7 @@ class SMM(AggregativeSoftQuantifier, BinaryQuantifier): return np.asarray([1 - class1_prev, class1_prev]) -class DMy(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier): +class DMy(AggregativeSoftQuantifier): """ Generic Distribution Matching quantifier for binary or multiclass quantification based on the space of posterior probabilities. This implementation takes the number of bins, the divergence, and the possibility to work on CDF @@ -865,7 +879,7 @@ class DMy(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier): :param n_jobs: number of parallel workers (default None) """ - def __init__(self, classifier, val_split=0.4, nbins=8, divergence: Union[str, Callable]='HD', + def __init__(self, classifier, val_split=5, nbins=8, divergence: Union[str, Callable]='HD', cdf=False, search='optim_minimize', n_jobs=None): self.classifier = classifier self.val_split = val_split @@ -875,15 +889,15 @@ class DMy(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier): self.search = search self.n_jobs = n_jobs - @classmethod - def HDy(cls, classifier, val_split=0.4, n_jobs=None): - from quapy.method.meta import MedianEstimator + # @classmethod + # def HDy(cls, classifier, val_split=0.4, n_jobs=None): + # from quapy.method.meta import MedianEstimator + # + # hdy = DMy(classifier=classifier, val_split=val_split, search='linear_search', divergence='HD') + # hdy = AggregativeMedianEstimator(hdy, param_grid={'nbins': np.linspace(10, 110, 11).astype(int)}, n_jobs=n_jobs) + # return hdy - hdy = DMy(classifier=classifier, val_split=val_split, search='linear_search', divergence='HD') - hdy = AggregativeMedianEstimator(hdy, param_grid={'nbins': np.linspace(10, 110, 11).astype(int)}, n_jobs=n_jobs) - return hdy - - def __get_distributions(self, posteriors): + def _get_distributions(self, posteriors): histograms = [] post_dims = posteriors.shape[1] if post_dims == 2: @@ -919,9 +933,10 @@ class DMy(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier): n_classes = len(self.classifier.classes_) self.validation_distribution = qp.util.parallel( - func=self.__get_distributions, + func=self._get_distributions, args=[posteriors[true_labels==cat] for cat in range(n_classes)], - n_jobs=self.n_jobs + n_jobs=self.n_jobs, + backend='threading' ) def aggregate(self, posteriors: np.ndarray): @@ -935,7 +950,7 @@ class DMy(AggregativeSoftQuantifier, CorrectionbasedAggregativeQuantifier): :param posteriors: posterior probabilities of the instances in the sample :return: a vector of class prevalence estimates """ - test_distribution = self.__get_distributions(posteriors) + test_distribution = self._get_distributions(posteriors) divergence = get_divergence(self.divergence) n_classes, n_channels, nbins = self.validation_distribution.shape def loss(prev): @@ -1449,13 +1464,10 @@ class AggregativeMedianEstimator(BinaryQuantifier): def _delayed_fit_aggregation(self, args): with qp.util.temp_seed(self.random_state): - print('\tenter job') ((model, predictions), q_params), training = args model = deepcopy(model) - print('fitaggr', model, predictions, len(predictions), print(self.training)) model.set_params(**q_params) model.aggregation_fit(predictions, training) - print('\texit job') return model @@ -1473,7 +1485,8 @@ class AggregativeMedianEstimator(BinaryQuantifier): ((params, training, kwargs) for params in cls_configs), seed=qp.environ.get('_R_SEED', None), n_jobs=self.n_jobs, - asarray=False + asarray=False, + backend='threading' ) else: print('only 1') @@ -1482,27 +1495,13 @@ class AggregativeMedianEstimator(BinaryQuantifier): predictions = model.classifier_fit_predict(training, **kwargs) models_preds = [(model, predictions)] - self.training = training - - self.models = [] - print('WITHOUT PARALLEL JOBS') - for ((model, predictions), q_params) in itertools.product(models_preds, q_configs): - print('\tenter job') - model = deepcopy(model) - print('fitaggr', model, predictions, len(predictions), print(self.training)) - model.set_params(**q_params) - model.aggregation_fit(predictions, training) - self.models.append(model) - print('\texit job') - - - # self.models = qp.util.parallel( - # self._delayed_fit_aggregation, - # ((setup, training) for setup in itertools.product(models_preds, q_configs)), - # seed=qp.environ.get('_R_SEED', None), - # n_jobs=self.n_jobs, - # asarray=False - # ) + self.models = qp.util.parallel( + self._delayed_fit_aggregation, + ((setup, training) for setup in itertools.product(models_preds, q_configs)), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs, + backend='threading' + ) else: configs = qp.model_selection.expand_grid(self.param_grid) self.models = qp.util.parallel( @@ -1510,7 +1509,7 @@ class AggregativeMedianEstimator(BinaryQuantifier): ((params, training) for params in configs), seed=qp.environ.get('_R_SEED', None), n_jobs=self.n_jobs, - asarray=False + backend='threading' ) return self @@ -1524,9 +1523,8 @@ class AggregativeMedianEstimator(BinaryQuantifier): ((model, instances) for model in self.models), seed=qp.environ.get('_R_SEED', None), n_jobs=self.n_jobs, - asarray=False + backend='threading' ) - prev_preds = np.asarray(prev_preds) return np.median(prev_preds, axis=0) #--------------------------------------------------------------- diff --git a/quapy/model_selection.py b/quapy/model_selection.py index 2378777..5448d4d 100644 --- a/quapy/model_selection.py +++ b/quapy/model_selection.py @@ -1,6 +1,7 @@ import itertools import signal from copy import deepcopy +from enum import Enum from typing import Union, Callable import numpy as np @@ -10,10 +11,16 @@ import quapy as qp from quapy import evaluation from quapy.protocol import AbstractProtocol, OnLabelledCollectionProtocol from quapy.data.base import LabelledCollection -from quapy.method.aggregative import BaseQuantifier +from quapy.method.aggregative import BaseQuantifier, AggregativeQuantifier from time import time +class Status(Enum): + SUCCESS = 1 + TIMEOUT = 2 + INVALID = 3 + ERROR = 4 + class GridSearchQ(BaseQuantifier): """Grid Search optimization targeting a quantification-oriented metric. @@ -69,21 +76,7 @@ class GridSearchQ(BaseQuantifier): raise ValueError(f'unexpected error type; must either be a callable function or a str representing\n' f'the name of an error function in {qp.error.QUANTIFICATION_ERROR_NAMES}') - def fit(self, training: LabelledCollection): - """ Learning routine. Fits methods with all combinations of hyperparameters and selects the one minimizing - the error metric. - - :param training: the training set on which to optimize the hyperparameters - :return: self - """ - - protocol = self.protocol - - self.param_scores_ = {} - self.best_score_ = None - - tinit = time() - + def _fit_nonaggregative(self, training): configs = expand_grid(self.param_grid) self._sout(f'starting model selection with {self.n_jobs =}') @@ -94,34 +87,106 @@ class GridSearchQ(BaseQuantifier): seed=qp.environ.get('_R_SEED', None), n_jobs=self.n_jobs ) + return scores - for params, score, model in scores: - if score is not None: - if self.best_score_ is None or score < self.best_score_: - self.best_score_ = score - self.best_params_ = params - self.best_model_ = model - self.param_scores_[str(params)] = score - else: - self.param_scores_[str(params)] = 'timeout' + def _delayed_fit_classifier(self, args): + cls_params, training = args + model = deepcopy(self.model) + model.set_params(**cls_params) + predictions = model.classifier_fit_predict(training) + return (model, predictions, cls_params) - tend = time()-tinit + def _eval_aggregative(self, args): + ((model, predictions, cls_params), q_params), training = args + model = deepcopy(model) + # overrides default parameters with the parameters being explored at this iteration + model.set_params(**q_params) + model.aggregation_fit(predictions, training) + params = {**cls_params, **q_params} + return model, params - if self.best_score_ is None: - raise TimeoutError('no combination of hyperparameters seem to work') + def _delayed_evaluation__(self, args): - self._sout(f'optimization finished: best params {self.best_params_} (score={self.best_score_:.5f}) ' - f'[took {tend:.4f}s]') + exit_status = Status.SUCCESS - if self.refit: - if isinstance(protocol, OnLabelledCollectionProtocol): - self._sout(f'refitting on the whole development set') - self.best_model_.fit(training + protocol.get_labelled_collection()) - else: - raise RuntimeWarning(f'"refit" was requested, but the protocol does not ' - f'implement the {OnLabelledCollectionProtocol.__name__} interface') + tinit = time() + if self.timeout > 0: + def handler(signum, frame): + raise TimeoutError() - return self + signal.signal(signal.SIGALRM, handler) + signal.alarm(self.timeout) + + try: + model, params = self._eval_aggregative(args) + + score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) + + ttime = time() - tinit + self._sout(f'hyperparams=[{params}]\t got {self.error.__name__} score {score:.5f} [took {ttime:.4f}s]') + + if self.timeout > 0: + signal.alarm(0) + + except TimeoutError: + self._sout(f'timeout ({self.timeout}s) reached for config {params}') + score = None + exit_status = Status.TIMEOUT + + except ValueError as e: + self._sout(f'the combination of hyperparameters {params} is invalid') + score = None + exit_status = Status.INVALID + + except Exception as e: + self._sout(f'something went wrong for config {params}; skipping:') + self._sout(f'\tException: {e}') + score = None + exit_status = Status.ERROR + + + return params, score, model, exit_status + + # def _delayed_fit_aggregation_and_eval(self, args): + # + # ((model, predictions, cls_params), q_params), training = args + # exit_status = Status.SUCCESS + # + # tinit = time() + # if self.timeout > 0: + # def handler(signum, frame): + # raise TimeoutError() + # signal.signal(signal.SIGALRM, handler) + # signal.alarm(self.timeout) + # + # try: + # model = deepcopy(model) + # # overrides default parameters with the parameters being explored at this iteration + # model.set_params(**q_params) + # model.aggregation_fit(predictions, training) + # score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) + # + # ttime = time() - tinit + # self._sout(f'hyperparams=[cls:{cls_params}, q:{q_params}]\t got {self.error.__name__} score {score:.5f} [took {ttime:.4f}s]') + # + # if self.timeout > 0: + # signal.alarm(0) + # except TimeoutError: + # self._sout(f'timeout ({self.timeout}s) reached for config {q_params}') + # score = None + # exit_status = Status.TIMEOUT + # except ValueError as e: + # self._sout(f'the combination of hyperparameters {q_params} is invalid') + # score = None + # exit_status = Status.INVALID + # except Exception as e: + # self._sout(f'something went wrong for config {q_params}; skipping:') + # self._sout(f'\tException: {e}') + # score = None + # exit_status = Status.ERROR + # + # params = {**cls_params, **q_params} + # return params, score, model, exit_status def _delayed_eval(self, args): params, training = args @@ -163,8 +228,83 @@ class GridSearchQ(BaseQuantifier): self._sout(f'\tException: {e}') score = None - return params, score, model + return params, score, model, status + def _fit_aggregative(self, training): + + # break down the set of hyperparameters into two: classifier-specific, quantifier-specific + cls_configs, q_configs = group_params(self.param_grid) + + # train all classifiers and get the predictions + models_preds_clsconfigs = qp.util.parallel( + self._delayed_fit_classifier, + ((params, training) for params in cls_configs), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs, + asarray=False, + ) + + # explore the quantifier-specific hyperparameters for each training configuration + scores = qp.util.parallel( + self._delayed_fit_aggregation_and_eval, + ((setup, training) for setup in itertools.product(models_preds_clsconfigs, q_configs)), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs + ) + + return scores + + + def fit(self, training: LabelledCollection): + """ Learning routine. Fits methods with all combinations of hyperparameters and selects the one minimizing + the error metric. + + :param training: the training set on which to optimize the hyperparameters + :return: self + """ + + if self.refit and not isinstance(self.protocol, OnLabelledCollectionProtocol): + raise RuntimeWarning(f'"refit" was requested, but the protocol does not ' + f'implement the {OnLabelledCollectionProtocol.__name__} interface') + + tinit = time() + + if isinstance(self.model, AggregativeQuantifier): + self.results = self._fit_aggregative(training) + else: + self.results = self._fit_nonaggregative(training) + + self.param_scores_ = {} + self.best_score_ = None + for params, score, model in self.results: + if score is not None: + if self.best_score_ is None or score < self.best_score_: + self.best_score_ = score + self.best_params_ = params + self.best_model_ = model + self.param_scores_[str(params)] = score + else: + self.param_scores_[str(params)] = 'timeout' + + tend = time()-tinit + + if self.best_score_ is None: + raise TimeoutError('no combination of hyperparameters seem to work') + + self._sout(f'optimization finished: best params {self.best_params_} (score={self.best_score_:.5f}) ' + f'[took {tend:.4f}s]') + + if self.refit: + if isinstance(self.protocol, OnLabelledCollectionProtocol): + tinit = time() + self._sout(f'refitting on the whole development set') + self.best_model_.fit(training + self.protocol.get_labelled_collection()) + tend = time() - tinit + self.refit_time_ = tend + else: + raise RuntimeWarning(f'the model cannot be refit on the whole dataset') + + return self def quantify(self, instances): """Estimate class prevalence values using the best model found after calling the :meth:`fit` method. diff --git a/quapy/util.py b/quapy/util.py index c1d9f0d..51c2a41 100644 --- a/quapy/util.py +++ b/quapy/util.py @@ -38,7 +38,7 @@ def map_parallel(func, args, n_jobs): return list(itertools.chain.from_iterable(results)) -def parallel(func, args, n_jobs, seed=None, asarray=True): +def parallel(func, args, n_jobs, seed=None, asarray=True, backend='loky'): """ A wrapper of multiprocessing: @@ -58,7 +58,7 @@ def parallel(func, args, n_jobs, seed=None, asarray=True): stack.enter_context(qp.util.temp_seed(seed)) return func(*args) - out = Parallel(n_jobs=n_jobs)( + out = Parallel(n_jobs=n_jobs, backend=backend)( delayed(func_dec)(qp.environ, None if seed is None else seed+i, args_i) for i, args_i in enumerate(args) ) if asarray: From f785a4eeef1b34103cdb9b401f86b894ecc5ff54 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Thu, 16 Nov 2023 19:56:30 +0100 Subject: [PATCH 009/216] model selection with error handling --- examples/model_selection.py | 3 +- quapy/model_selection.py | 322 ++++++++++++++++-------------------- 2 files changed, 146 insertions(+), 179 deletions(-) diff --git a/examples/model_selection.py b/examples/model_selection.py index df051a0..141cf91 100644 --- a/examples/model_selection.py +++ b/examples/model_selection.py @@ -1,4 +1,5 @@ import quapy as qp +from quapy.method.non_aggregative import DMx from quapy.protocol import APP from quapy.method.aggregative import DMy from sklearn.linear_model import LogisticRegression @@ -38,7 +39,7 @@ with qp.util.temp_seed(0): param_grid = { 'classifier__C': np.logspace(-3,3,7), 'classifier__class_weight': ['balanced', None], - 'nbins': [8, 16, 32, 64], + 'nbins': [8, 16, 32, 64, 'poooo'], } tinit = time() diff --git a/quapy/model_selection.py b/quapy/model_selection.py index 5448d4d..9bd0985 100644 --- a/quapy/model_selection.py +++ b/quapy/model_selection.py @@ -3,6 +3,7 @@ import signal from copy import deepcopy from enum import Enum from typing import Union, Callable +from functools import wraps import numpy as np from sklearn import clone @@ -21,6 +22,56 @@ class Status(Enum): INVALID = 3 ERROR = 4 +def check_status(func): + @wraps(func) + def wrapper(*args, **kwargs): + obj = args[0] + tinit = time() + + job_descriptor = dict(args[1]) + params = {**job_descriptor.get('cls-params', {}), **job_descriptor.get('q-params', {})} + + if obj.timeout > 0: + def handler(signum, frame): + raise TimeoutError() + + signal.signal(signal.SIGALRM, handler) + signal.alarm(obj.timeout) + + try: + job_descriptor = func(*args, **kwargs) + + ttime = time() - tinit + + score = job_descriptor.get('score', None) + if score is not None: + obj._sout(f'hyperparams=[{params}]\t got {obj.error.__name__} = {score:.5f} [took {ttime:.4f}s]') + + if obj.timeout > 0: + signal.alarm(0) + + exit_status = Status.SUCCESS + + except TimeoutError: + obj._sout(f'timeout ({obj.timeout}s) reached for config {params}') + exit_status = Status.TIMEOUT + + except ValueError as e: + obj._sout(f'the combination of hyperparameters {params} is invalid') + obj._sout(f'\tException: {e}') + exit_status = Status.INVALID + + except Exception as e: + obj._sout(f'something went wrong for config {params}; skipping:') + obj._sout(f'\tException: {e}') + exit_status = Status.ERROR + + job_descriptor['status'] = exit_status + job_descriptor['params'] = params + return job_descriptor + return wrapper + + class GridSearchQ(BaseQuantifier): """Grid Search optimization targeting a quantification-oriented metric. @@ -76,184 +127,97 @@ class GridSearchQ(BaseQuantifier): raise ValueError(f'unexpected error type; must either be a callable function or a str representing\n' f'the name of an error function in {qp.error.QUANTIFICATION_ERROR_NAMES}') - def _fit_nonaggregative(self, training): + @check_status + def _prepare_classifier(self, args): + cls_params = args['cls-params'] + training = args['training'] + model = deepcopy(self.model) + model.set_params(**cls_params) + predictions = model.classifier_fit_predict(training) + return {'model': model, 'predictions': predictions, 'cls-params': cls_params} + + @check_status + def _prepare_aggregation(self, args): + # (partial_setup, q_params), training = args + model = args['model'] + predictions = args['predictions'] + cls_params = args['cls-params'] + q_params = args['q-params'] + training = args['training'] + + params = {**cls_params, **q_params} + + model = deepcopy(model) + # overrides default parameters with the parameters being explored at this iteration + model.set_params(**q_params) + model.aggregation_fit(predictions, training) + score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) + + return {'model': model, 'cls-params':cls_params, 'q-params': q_params, 'params': params, 'score': score} + + @check_status + def _prepare_model(self, args): + params, training = args + model = deepcopy(self.model) + # overrides default parameters with the parameters being explored at this iteration + model.set_params(**params) + model.fit(training) + score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) + return {'model': model, 'params': params, 'score': score} + + + def _compute_scores_aggregative(self, training): + + # break down the set of hyperparameters into two: classifier-specific, quantifier-specific + cls_configs, q_configs = group_params(self.param_grid) + + # train all classifiers and get the predictions + partial_setups = qp.util.parallel( + self._prepare_classifier, + ({'cls-params':params, 'training':training} for params in cls_configs), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs, + asarray=False, + ) + + # filter out classifier configurations that yield any error + for setup in partial_setups: + if setup['status'] != Status.SUCCESS: + self._sout(f'-> classifier hyperparemters {setup["params"]} caused ' + f'error {setup["status"]} and will be ignored') + + partial_setups = [setup for setup in partial_setups if setup['status']==Status.SUCCESS] + + if len(partial_setups) == 0: + raise ValueError('No valid configuration found for the classifier.') + + # explore the quantifier-specific hyperparameters for each training configuration + scores = qp.util.parallel( + self._prepare_aggregation, + ({'q-params': setup[1], 'training': training, **setup[0]} for setup in itertools.product(partial_setups, q_configs)), + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs + ) + + return scores + + def _compute_scores_nonaggregative(self, training): configs = expand_grid(self.param_grid) - self._sout(f'starting model selection with {self.n_jobs =}') - #pass a seed to parallel so it is set in child processes + # pass a seed to parallel, so it is set in child processes scores = qp.util.parallel( - self._delayed_eval, + self._prepare_model, ((params, training) for params in configs), seed=qp.environ.get('_R_SEED', None), n_jobs=self.n_jobs ) return scores - def _delayed_fit_classifier(self, args): - cls_params, training = args - model = deepcopy(self.model) - model.set_params(**cls_params) - predictions = model.classifier_fit_predict(training) - return (model, predictions, cls_params) - - def _eval_aggregative(self, args): - ((model, predictions, cls_params), q_params), training = args - model = deepcopy(model) - # overrides default parameters with the parameters being explored at this iteration - model.set_params(**q_params) - model.aggregation_fit(predictions, training) - params = {**cls_params, **q_params} - return model, params - - def _delayed_evaluation__(self, args): - - exit_status = Status.SUCCESS - - tinit = time() - if self.timeout > 0: - def handler(signum, frame): - raise TimeoutError() - - signal.signal(signal.SIGALRM, handler) - signal.alarm(self.timeout) - - try: - model, params = self._eval_aggregative(args) - - score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) - - ttime = time() - tinit - self._sout(f'hyperparams=[{params}]\t got {self.error.__name__} score {score:.5f} [took {ttime:.4f}s]') - - if self.timeout > 0: - signal.alarm(0) - - except TimeoutError: - self._sout(f'timeout ({self.timeout}s) reached for config {params}') - score = None - exit_status = Status.TIMEOUT - - except ValueError as e: - self._sout(f'the combination of hyperparameters {params} is invalid') - score = None - exit_status = Status.INVALID - - except Exception as e: - self._sout(f'something went wrong for config {params}; skipping:') - self._sout(f'\tException: {e}') - score = None - exit_status = Status.ERROR - - - return params, score, model, exit_status - - # def _delayed_fit_aggregation_and_eval(self, args): - # - # ((model, predictions, cls_params), q_params), training = args - # exit_status = Status.SUCCESS - # - # tinit = time() - # if self.timeout > 0: - # def handler(signum, frame): - # raise TimeoutError() - # signal.signal(signal.SIGALRM, handler) - # signal.alarm(self.timeout) - # - # try: - # model = deepcopy(model) - # # overrides default parameters with the parameters being explored at this iteration - # model.set_params(**q_params) - # model.aggregation_fit(predictions, training) - # score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) - # - # ttime = time() - tinit - # self._sout(f'hyperparams=[cls:{cls_params}, q:{q_params}]\t got {self.error.__name__} score {score:.5f} [took {ttime:.4f}s]') - # - # if self.timeout > 0: - # signal.alarm(0) - # except TimeoutError: - # self._sout(f'timeout ({self.timeout}s) reached for config {q_params}') - # score = None - # exit_status = Status.TIMEOUT - # except ValueError as e: - # self._sout(f'the combination of hyperparameters {q_params} is invalid') - # score = None - # exit_status = Status.INVALID - # except Exception as e: - # self._sout(f'something went wrong for config {q_params}; skipping:') - # self._sout(f'\tException: {e}') - # score = None - # exit_status = Status.ERROR - # - # params = {**cls_params, **q_params} - # return params, score, model, exit_status - - def _delayed_eval(self, args): - params, training = args - - protocol = self.protocol - error = self.error - - if self.timeout > 0: - def handler(signum, frame): - raise TimeoutError() - - signal.signal(signal.SIGALRM, handler) - - tinit = time() - - if self.timeout > 0: - signal.alarm(self.timeout) - - try: - model = deepcopy(self.model) - # overrides default parameters with the parameters being explored at this iteration - model.set_params(**params) - model.fit(training) - score = evaluation.evaluate(model, protocol=protocol, error_metric=error) - - ttime = time()-tinit - self._sout(f'hyperparams={params}\t got {error.__name__} score {score:.5f} [took {ttime:.4f}s]') - - if self.timeout > 0: - signal.alarm(0) - except TimeoutError: - self._sout(f'timeout ({self.timeout}s) reached for config {params}') - score = None - except ValueError as e: - self._sout(f'the combination of hyperparameters {params} is invalid') - raise e - except Exception as e: - self._sout(f'something went wrong for config {params}; skipping:') - self._sout(f'\tException: {e}') - score = None - - return params, score, model, status - - def _fit_aggregative(self, training): - - # break down the set of hyperparameters into two: classifier-specific, quantifier-specific - cls_configs, q_configs = group_params(self.param_grid) - - # train all classifiers and get the predictions - models_preds_clsconfigs = qp.util.parallel( - self._delayed_fit_classifier, - ((params, training) for params in cls_configs), - seed=qp.environ.get('_R_SEED', None), - n_jobs=self.n_jobs, - asarray=False, - ) - - # explore the quantifier-specific hyperparameters for each training configuration - scores = qp.util.parallel( - self._delayed_fit_aggregation_and_eval, - ((setup, training) for setup in itertools.product(models_preds_clsconfigs, q_configs)), - seed=qp.environ.get('_R_SEED', None), - n_jobs=self.n_jobs - ) - - return scores - + def _compute_scores(self, training): + if isinstance(self.model, AggregativeQuantifier): + return self._compute_scores_aggregative(training) + else: + return self._compute_scores_nonaggregative(training) def fit(self, training: LabelledCollection): """ Learning routine. Fits methods with all combinations of hyperparameters and selects the one minimizing @@ -264,27 +228,29 @@ class GridSearchQ(BaseQuantifier): """ if self.refit and not isinstance(self.protocol, OnLabelledCollectionProtocol): - raise RuntimeWarning(f'"refit" was requested, but the protocol does not ' - f'implement the {OnLabelledCollectionProtocol.__name__} interface') + raise RuntimeWarning( + f'"refit" was requested, but the protocol does not implement ' + f'the {OnLabelledCollectionProtocol.__name__} interface' + ) tinit = time() - if isinstance(self.model, AggregativeQuantifier): - self.results = self._fit_aggregative(training) - else: - self.results = self._fit_nonaggregative(training) + self._sout(f'starting model selection with n_jobs={self.n_jobs}') + results = self._compute_scores(training) self.param_scores_ = {} self.best_score_ = None - for params, score, model in self.results: + for job_result in results: + score = job_result.get('score', None) + params = job_result['params'] if score is not None: if self.best_score_ is None or score < self.best_score_: self.best_score_ = score self.best_params_ = params - self.best_model_ = model + self.best_model_ = job_result['model'] self.param_scores_[str(params)] = score else: - self.param_scores_[str(params)] = 'timeout' + self.param_scores_[str(params)] = job_result['status'] tend = time()-tinit From 6663b4c91d01c0edb5735da637cb2416433d031c Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Mon, 20 Nov 2023 22:05:26 +0100 Subject: [PATCH 010/216] context timeout --- quapy/model_selection.py | 54 ++++++++++++++++++++++++++++++++-------- quapy/util.py | 34 +++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 10 deletions(-) diff --git a/quapy/model_selection.py b/quapy/model_selection.py index 9bd0985..6637d62 100644 --- a/quapy/model_selection.py +++ b/quapy/model_selection.py @@ -13,6 +13,7 @@ from quapy import evaluation from quapy.protocol import AbstractProtocol, OnLabelledCollectionProtocol from quapy.data.base import LabelledCollection from quapy.method.aggregative import BaseQuantifier, AggregativeQuantifier +from quapy.util import timeout from time import time @@ -127,7 +128,6 @@ class GridSearchQ(BaseQuantifier): raise ValueError(f'unexpected error type; must either be a callable function or a str representing\n' f'the name of an error function in {qp.error.QUANTIFICATION_ERROR_NAMES}') - @check_status def _prepare_classifier(self, args): cls_params = args['cls-params'] training = args['training'] @@ -136,9 +136,8 @@ class GridSearchQ(BaseQuantifier): predictions = model.classifier_fit_predict(training) return {'model': model, 'predictions': predictions, 'cls-params': cls_params} - @check_status def _prepare_aggregation(self, args): - # (partial_setup, q_params), training = args + model = args['model'] predictions = args['predictions'] cls_params = args['cls-params'] @@ -147,15 +146,32 @@ class GridSearchQ(BaseQuantifier): params = {**cls_params, **q_params} - model = deepcopy(model) - # overrides default parameters with the parameters being explored at this iteration - model.set_params(**q_params) - model.aggregation_fit(predictions, training) - score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) + def job(model): + tinit = time() + model = deepcopy(model) + # overrides default parameters with the parameters being explored at this iteration + model.set_params(**q_params) + model.aggregation_fit(predictions, training) + score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) + ttime = time()-tinit + + return { + 'model': model, + 'cls-params':cls_params, + 'q-params': q_params, + 'params': params, + 'score': score, + 'ttime':ttime + } + + out, status = self._error_handler(job, args) + if status == Status.SUCCESS: + self._sout(f'hyperparams=[{params}]\t got {self.error.__name__} = {out["score"]:.5f} [took {out["time"]:.4f}s]') + elif status == Status.INVALID: + self._sout(f'the combination of hyperparameters {params} is invalid') + elif status == Status. - return {'model': model, 'cls-params':cls_params, 'q-params': q_params, 'params': params, 'score': score} - @check_status def _prepare_model(self, args): params, training = args model = deepcopy(self.model) @@ -309,6 +325,24 @@ class GridSearchQ(BaseQuantifier): raise ValueError('best_model called before fit') + def _error_handler(self, func, *args, **kwargs): + + try: + with timeout(self.timeout): + output = func(*args, **kwargs) + return output, Status.SUCCESS + + except TimeoutError: + return None, Status.TIMEOUT + + except ValueError: + return None, Status.INVALID + + except Exception: + return None, Status.ERROR + + + def cross_val_predict(quantifier: BaseQuantifier, data: LabelledCollection, nfolds=3, random_state=0): """ Akin to `scikit-learn's cross_val_predict `_ diff --git a/quapy/util.py b/quapy/util.py index 51c2a41..de5c131 100644 --- a/quapy/util.py +++ b/quapy/util.py @@ -10,6 +10,8 @@ import quapy as qp import numpy as np from joblib import Parallel, delayed +from time import time +import signal def _get_parallel_slices(n_tasks, n_jobs): @@ -257,3 +259,35 @@ class EarlyStop: if self.patience <= 0: self.STOP = True + +@contextlib.contextmanager +def timeout(seconds): + """ + Opens a context that will launch an exception if not closed after a given number of seconds + + >>> def func(start_msg, end_msg): + >>> print(start_msg) + >>> sleep(2) + >>> print(end_msg) + >>> + >>> with timeout(1): + >>> func('begin function', 'end function') + >>> Out[] + >>> begin function + >>> TimeoutError + + + :param seconds: number of seconds, set to <=0 to ignore the timer + """ + if seconds > 0: + def handler(signum, frame): + raise TimeoutError() + + signal.signal(signal.SIGALRM, handler) + signal.alarm(seconds) + + yield + + if seconds > 0: + signal.alarm(0) + From eb9a3dde2a77f280eb95a1c07c9503660971cb64 Mon Sep 17 00:00:00 2001 From: Alex Moreo Date: Tue, 21 Nov 2023 18:59:36 +0100 Subject: [PATCH 011/216] grid search almost complete --- examples/model_selection.py | 12 +- quapy/model_selection.py | 260 +++++++++++++++++------------------- 2 files changed, 131 insertions(+), 141 deletions(-) diff --git a/examples/model_selection.py b/examples/model_selection.py index 141cf91..559de27 100644 --- a/examples/model_selection.py +++ b/examples/model_selection.py @@ -3,7 +3,7 @@ from quapy.method.non_aggregative import DMx from quapy.protocol import APP from quapy.method.aggregative import DMy from sklearn.linear_model import LogisticRegression -from examples.comparing_gridsearch import OLD_GridSearchQ +#from examples.comparing_gridsearch import OLD_GridSearchQ import numpy as np from time import time @@ -37,14 +37,13 @@ with qp.util.temp_seed(0): # in order to let the quantifier know this hyper-parameter belongs to its underlying # classifier. param_grid = { - 'classifier__C': np.logspace(-3,3,7), - 'classifier__class_weight': ['balanced', None], - 'nbins': [8, 16, 32, 64, 'poooo'], + 'classifier__C': np.logspace(-2, 2, 5), + 'classifier__class_weight': ['balanced', None, 'ch'], + 'nbins': [8, 16, 32, 64, 'po'], } tinit = time() - # model = OLD_GridSearchQ( model = qp.model_selection.GridSearchQ( model=model, @@ -52,6 +51,7 @@ with qp.util.temp_seed(0): protocol=protocol, error='mae', # the error to optimize is the MAE (a quantification-oriented loss) refit=False, # retrain on the whole labelled set once done + raise_errors=False, verbose=True # show information as the process goes on ).fit(training) @@ -65,5 +65,5 @@ model = model.best_model_ mae_score = qp.evaluation.evaluate(model, protocol=APP(test), error_metric='mae') print(f'MAE={mae_score:.5f}') -print(f'model selection took {tend-tinit}s') +print(f'model selection took {tend-tinit:.1f}s') diff --git a/quapy/model_selection.py b/quapy/model_selection.py index 6637d62..9017b99 100644 --- a/quapy/model_selection.py +++ b/quapy/model_selection.py @@ -23,54 +23,24 @@ class Status(Enum): INVALID = 3 ERROR = 4 -def check_status(func): - @wraps(func) - def wrapper(*args, **kwargs): - obj = args[0] - tinit = time() - job_descriptor = dict(args[1]) - params = {**job_descriptor.get('cls-params', {}), **job_descriptor.get('q-params', {})} +class ConfigStatus: + def __init__(self, params, status, msg=''): + self.params = params + self.status = status + self.msg = msg - if obj.timeout > 0: - def handler(signum, frame): - raise TimeoutError() + def __str__(self): + return f':params:{self.params} :status:{self.status} ' + self.msg - signal.signal(signal.SIGALRM, handler) - signal.alarm(obj.timeout) + def __repr__(self): + return str(self) - try: - job_descriptor = func(*args, **kwargs) + def success(self): + return self.status == Status.SUCCESS - ttime = time() - tinit - - score = job_descriptor.get('score', None) - if score is not None: - obj._sout(f'hyperparams=[{params}]\t got {obj.error.__name__} = {score:.5f} [took {ttime:.4f}s]') - - if obj.timeout > 0: - signal.alarm(0) - - exit_status = Status.SUCCESS - - except TimeoutError: - obj._sout(f'timeout ({obj.timeout}s) reached for config {params}') - exit_status = Status.TIMEOUT - - except ValueError as e: - obj._sout(f'the combination of hyperparameters {params} is invalid') - obj._sout(f'\tException: {e}') - exit_status = Status.INVALID - - except Exception as e: - obj._sout(f'something went wrong for config {params}; skipping:') - obj._sout(f'\tException: {e}') - exit_status = Status.ERROR - - job_descriptor['status'] = exit_status - job_descriptor['params'] = params - return job_descriptor - return wrapper + def failed(self): + return self.status != Status.SUCCESS class GridSearchQ(BaseQuantifier): @@ -85,11 +55,14 @@ class GridSearchQ(BaseQuantifier): :param protocol: a sample generation protocol, an instance of :class:`quapy.protocol.AbstractProtocol` :param error: an error function (callable) or a string indicating the name of an error function (valid ones are those in :class:`quapy.error.QUANTIFICATION_ERROR` - :param refit: whether or not to refit the model on the whole labelled collection (training+validation) with + :param refit: whether to refit the model on the whole labelled collection (training+validation) with the best chosen hyperparameter combination. Ignored if protocol='gen' :param timeout: establishes a timer (in seconds) for each of the hyperparameters configurations being tested. Whenever a run takes longer than this timer, that configuration will be ignored. If all configurations end up being ignored, a TimeoutError exception is raised. If -1 (default) then no time bound is set. + :param raise_errors: boolean, if True then raises an exception when a param combination yields any error, if + otherwise is False (default), then the combination is marked with an error status, but the process goes on. + However, if no configuration yields a valid model, then a ValueError exception will be raised. :param verbose: set to True to get information through the stdout """ @@ -101,6 +74,7 @@ class GridSearchQ(BaseQuantifier): refit=True, timeout=-1, n_jobs=None, + raise_errors=False, verbose=False): self.model = model @@ -109,6 +83,7 @@ class GridSearchQ(BaseQuantifier): self.refit = refit self.timeout = timeout self.n_jobs = qp._get_njobs(n_jobs) + self.raise_errors = raise_errors self.verbose = verbose self.__check_error(error) assert isinstance(protocol, AbstractProtocol), 'unknown protocol' @@ -128,112 +103,97 @@ class GridSearchQ(BaseQuantifier): raise ValueError(f'unexpected error type; must either be a callable function or a str representing\n' f'the name of an error function in {qp.error.QUANTIFICATION_ERROR_NAMES}') - def _prepare_classifier(self, args): - cls_params = args['cls-params'] - training = args['training'] + def _prepare_classifier(self, cls_params): model = deepcopy(self.model) - model.set_params(**cls_params) - predictions = model.classifier_fit_predict(training) - return {'model': model, 'predictions': predictions, 'cls-params': cls_params} + + def job(cls_params): + model.set_params(**cls_params) + predictions = model.classifier_fit_predict(self._training) + return predictions + + predictions, status, took = self._error_handler(job, cls_params) + self._sout(f'[classifier fit] hyperparams={cls_params} status={status} [took {took:.3f}s]') + return model, predictions, status, took def _prepare_aggregation(self, args): - - model = args['model'] - predictions = args['predictions'] - cls_params = args['cls-params'] - q_params = args['q-params'] - training = args['training'] - + model, predictions, cls_took, cls_params, q_params = args + model = deepcopy(model) params = {**cls_params, **q_params} - def job(model): - tinit = time() - model = deepcopy(model) - # overrides default parameters with the parameters being explored at this iteration + def job(q_params): model.set_params(**q_params) - model.aggregation_fit(predictions, training) + model.aggregation_fit(predictions, self._training) score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) - ttime = time()-tinit + return score - return { - 'model': model, - 'cls-params':cls_params, - 'q-params': q_params, - 'params': params, - 'score': score, - 'ttime':ttime - } + score, status, aggr_took = self._error_handler(job, q_params) + self._print_status(params, score, status, aggr_took) + return model, params, score, status, (cls_took+aggr_took) - out, status = self._error_handler(job, args) - if status == Status.SUCCESS: - self._sout(f'hyperparams=[{params}]\t got {self.error.__name__} = {out["score"]:.5f} [took {out["time"]:.4f}s]') - elif status == Status.INVALID: - self._sout(f'the combination of hyperparameters {params} is invalid') - elif status == Status. - - - def _prepare_model(self, args): - params, training = args + def _prepare_nonaggr_model(self, params): model = deepcopy(self.model) - # overrides default parameters with the parameters being explored at this iteration - model.set_params(**params) - model.fit(training) - score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) - return {'model': model, 'params': params, 'score': score} + def job(params): + model.set_params(**params) + model.fit(self._training) + score = evaluation.evaluate(model, protocol=self.protocol, error_metric=self.error) + return score + + score, status, took = self._error_handler(job, params) + self._print_status(params, score, status, took) + return model, params, score, status, took def _compute_scores_aggregative(self, training): - # break down the set of hyperparameters into two: classifier-specific, quantifier-specific cls_configs, q_configs = group_params(self.param_grid) # train all classifiers and get the predictions - partial_setups = qp.util.parallel( + self._training = training + cls_outs = qp.util.parallel( self._prepare_classifier, - ({'cls-params':params, 'training':training} for params in cls_configs), - seed=qp.environ.get('_R_SEED', None), - n_jobs=self.n_jobs, - asarray=False, - ) - - # filter out classifier configurations that yield any error - for setup in partial_setups: - if setup['status'] != Status.SUCCESS: - self._sout(f'-> classifier hyperparemters {setup["params"]} caused ' - f'error {setup["status"]} and will be ignored') - - partial_setups = [setup for setup in partial_setups if setup['status']==Status.SUCCESS] - - if len(partial_setups) == 0: - raise ValueError('No valid configuration found for the classifier.') - - # explore the quantifier-specific hyperparameters for each training configuration - scores = qp.util.parallel( - self._prepare_aggregation, - ({'q-params': setup[1], 'training': training, **setup[0]} for setup in itertools.product(partial_setups, q_configs)), + cls_configs, seed=qp.environ.get('_R_SEED', None), n_jobs=self.n_jobs ) - return scores + # filter out classifier configurations that yielded any error + success_outs = [] + for (model, predictions, status, took), cls_config in zip(cls_outs, cls_configs): + if status.success(): + success_outs.append((model, predictions, took, cls_config)) + else: + self.error_collector.append(status) + + if len(success_outs) == 0: + raise ValueError('No valid configuration found for the classifier!') + + # explore the quantifier-specific hyperparameters for each valid training configuration + aggr_configs = [(*out, q_config) for out, q_config in itertools.product(success_outs, q_configs)] + aggr_outs = qp.util.parallel( + self._prepare_aggregation, + aggr_configs, + seed=qp.environ.get('_R_SEED', None), + n_jobs=self.n_jobs + ) + + return aggr_outs def _compute_scores_nonaggregative(self, training): configs = expand_grid(self.param_grid) - - # pass a seed to parallel, so it is set in child processes + self._training = training scores = qp.util.parallel( - self._prepare_model, - ((params, training) for params in configs), + self._prepare_nonaggr_model, + configs, seed=qp.environ.get('_R_SEED', None), n_jobs=self.n_jobs ) return scores - def _compute_scores(self, training): - if isinstance(self.model, AggregativeQuantifier): - return self._compute_scores_aggregative(training) + def _print_status(self, params, score, status, took): + if status.success(): + self._sout(f'hyperparams=[{params}]\t got {self.error.__name__} = {score:.5f} [took {took:.3f}s]') else: - return self._compute_scores_nonaggregative(training) + self._sout(f'error={status}') def fit(self, training: LabelledCollection): """ Learning routine. Fits methods with all combinations of hyperparameters and selects the one minimizing @@ -251,31 +211,41 @@ class GridSearchQ(BaseQuantifier): tinit = time() + self.error_collector = [] + self._sout(f'starting model selection with n_jobs={self.n_jobs}') - results = self._compute_scores(training) + if isinstance(self.model, AggregativeQuantifier): + results = self._compute_scores_aggregative(training) + else: + results = self._compute_scores_nonaggregative(training) self.param_scores_ = {} self.best_score_ = None - for job_result in results: - score = job_result.get('score', None) - params = job_result['params'] - if score is not None: + for model, params, score, status, took in results: + if status.success(): if self.best_score_ is None or score < self.best_score_: self.best_score_ = score self.best_params_ = params - self.best_model_ = job_result['model'] + self.best_model_ = model self.param_scores_[str(params)] = score else: - self.param_scores_[str(params)] = job_result['status'] + self.param_scores_[str(params)] = status.status + self.error_collector.append(status) tend = time()-tinit if self.best_score_ is None: - raise TimeoutError('no combination of hyperparameters seem to work') + raise ValueError('no combination of hyperparameters seemed to work') self._sout(f'optimization finished: best params {self.best_params_} (score={self.best_score_:.5f}) ' f'[took {tend:.4f}s]') + no_errors = len(self.error_collector) + if no_errors>0: + self._sout(f'warning: {no_errors} errors found') + for err in self.error_collector: + self._sout(f'\t{str(err)}') + if self.refit: if isinstance(self.protocol, OnLabelledCollectionProtocol): tinit = time() @@ -284,6 +254,7 @@ class GridSearchQ(BaseQuantifier): tend = time() - tinit self.refit_time_ = tend else: + # already checked raise RuntimeWarning(f'the model cannot be refit on the whole dataset') return self @@ -324,23 +295,42 @@ class GridSearchQ(BaseQuantifier): return self.best_model_ raise ValueError('best_model called before fit') + def _error_handler(self, func, params): + """ + Endorses one job with two returned values: the status, and the time of execution - def _error_handler(self, func, *args, **kwargs): + :param func: the function to be called + :param params: parameters of the function + :return: `tuple(out, status, time)` where `out` is the function output, + `status` is an enum value from `Status`, and `time` is the time it + took to complete the call + """ + + output = None + + def _handle(status, exception): + if self.raise_errors: + raise exception + else: + return ConfigStatus(params, status, str(e)) try: with timeout(self.timeout): - output = func(*args, **kwargs) - return output, Status.SUCCESS + tinit = time() + output = func(params) + status = ConfigStatus(params, Status.SUCCESS) - except TimeoutError: - return None, Status.TIMEOUT + except TimeoutError as e: + status = _handle(Status.TIMEOUT, str(e)) - except ValueError: - return None, Status.INVALID + except ValueError as e: + status = _handle(Status.INVALID, str(e)) - except Exception: - return None, Status.ERROR + except Exception as e: + status = _handle(Status.ERROR, str(e)) + took = time() - tinit + return output, status, took def cross_val_predict(quantifier: BaseQuantifier, data: LabelledCollection, nfolds=3, random_state=0): From 5caf555d65e37c0e6a1040be296c75a96d4eaa7b Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Mon, 18 Dec 2023 10:24:36 +0100 Subject: [PATCH 012/216] mergin --- examples/model_selection.py | 13 +- quapy/method/kdey.py | 234 ++++++++++++++++++++++++++++++++++++ 2 files changed, 241 insertions(+), 6 deletions(-) create mode 100644 quapy/method/kdey.py diff --git a/examples/model_selection.py b/examples/model_selection.py index 141cf91..50460fe 100644 --- a/examples/model_selection.py +++ b/examples/model_selection.py @@ -1,4 +1,5 @@ import quapy as qp +from method.kdey import KDEyML from quapy.method.non_aggregative import DMx from quapy.protocol import APP from quapy.method.aggregative import DMy @@ -11,12 +12,13 @@ from time import time In this example, we show how to perform model selection on a DistributionMatching quantifier. """ -model = DMy(LogisticRegression()) +model = KDEyML(LogisticRegression()) qp.environ['SAMPLE_SIZE'] = 100 qp.environ['N_JOBS'] = -1 -training, test = qp.datasets.fetch_reviews('imdb', tfidf=True, min_df=5).train_test +# training, test = qp.datasets.fetch_reviews('imdb', tfidf=True, min_df=5).train_test +training, test = qp.datasets.fetch_UCIMulticlassDataset('dry-bean').train_test with qp.util.temp_seed(0): @@ -39,14 +41,13 @@ with qp.util.temp_seed(0): param_grid = { 'classifier__C': np.logspace(-3,3,7), 'classifier__class_weight': ['balanced', None], - 'nbins': [8, 16, 32, 64, 'poooo'], + 'bandwidth': np.linspace(0.01, 0.2, 20), } tinit = time() - - # model = OLD_GridSearchQ( - model = qp.model_selection.GridSearchQ( + model = OLD_GridSearchQ( + # model = qp.model_selection.GridSearchQ( model=model, param_grid=param_grid, protocol=protocol, diff --git a/quapy/method/kdey.py b/quapy/method/kdey.py new file mode 100644 index 0000000..c6f9794 --- /dev/null +++ b/quapy/method/kdey.py @@ -0,0 +1,234 @@ +from typing import Union +import numpy as np +from sklearn.base import BaseEstimator +from sklearn.neighbors import KernelDensity + +import quapy as qp +from quapy.data import LabelledCollection +from quapy.method.aggregative import AggregativeProbabilisticQuantifier, cross_generate_predictions +import quapy.functional as F + +from sklearn.metrics.pairwise import rbf_kernel + + +class KDEBase: + + BANDWIDTH_METHOD = ['scott', 'silverman'] + + @classmethod + def _check_bandwidth(cls, bandwidth): + assert bandwidth in KDEBase.BANDWIDTH_METHOD or isinstance(bandwidth, float), \ + f'invalid bandwidth, valid ones are {KDEBase.BANDWIDTH_METHOD} or float values' + if isinstance(bandwidth, float): + assert 0 < bandwidth < 1, "the bandwith for KDEy should be in (0,1), since this method models the unit simplex" + + def get_kde_function(self, X, bandwidth): + return KernelDensity(bandwidth=bandwidth).fit(X) + + def pdf(self, kde, X): + return np.exp(kde.score_samples(X)) + + def get_mixture_components(self, X, y, n_classes, bandwidth): + return [self.get_kde_function(X[y == cat], bandwidth) for cat in range(n_classes)] + + + +class KDEyML(AggregativeProbabilisticQuantifier, KDEBase): + + def __init__(self, classifier: BaseEstimator, val_split=10, bandwidth=0.1, n_jobs=None, random_state=0): + self._check_bandwidth(bandwidth) + self.classifier = classifier + self.val_split = val_split + self.bandwidth = bandwidth + self.n_jobs = n_jobs + self.random_state=random_state + + def fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): + if val_split is None: + val_split = self.val_split + + self.classifier, y, posteriors, _, _ = cross_generate_predictions( + data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs + ) + + self.mix_densities = self.get_mixture_components(posteriors, y, data.n_classes, self.bandwidth) + + return self + + def aggregate(self, posteriors: np.ndarray): + """ + Searches for the mixture model parameter (the sought prevalence values) that maximizes the likelihood + of the data (i.e., that minimizes the negative log-likelihood) + + :param posteriors: instances in the sample converted into posterior probabilities + :return: a vector of class prevalence estimates + """ + np.random.RandomState(self.random_state) + epsilon = 1e-10 + n_classes = len(self.mix_densities) + test_densities = [self.pdf(kde_i, posteriors) for kde_i in self.mix_densities] + + def neg_loglikelihood(prev): + test_mixture_likelihood = sum(prev_i * dens_i for prev_i, dens_i in zip (prev, test_densities)) + test_loglikelihood = np.log(test_mixture_likelihood + epsilon) + return -np.sum(test_loglikelihood) + + return F.optim_minimize(neg_loglikelihood, n_classes) + + +class KDEyHD(AggregativeProbabilisticQuantifier, KDEBase): + + def __init__(self, classifier: BaseEstimator, val_split=10, divergence: str='HD', + bandwidth=0.1, n_jobs=None, random_state=0, montecarlo_trials=10000): + + self._check_bandwidth(bandwidth) + self.classifier = classifier + self.val_split = val_split + self.divergence = divergence + self.bandwidth = bandwidth + self.n_jobs = n_jobs + self.random_state=random_state + self.montecarlo_trials = montecarlo_trials + + def fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): + if val_split is None: + val_split = self.val_split + + self.classifier, y, posteriors, _, _ = cross_generate_predictions( + data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs + ) + + self.mix_densities = self.get_mixture_components(posteriors, y, data.n_classes, self.bandwidth) + + N = self.montecarlo_trials + rs = self.random_state + n = data.n_classes + self.reference_samples = np.vstack([kde_i.sample(N//n, random_state=rs) for kde_i in self.mix_densities]) + self.reference_classwise_densities = np.asarray([self.pdf(kde_j, self.reference_samples) for kde_j in self.mix_densities]) + self.reference_density = np.mean(self.reference_classwise_densities, axis=0) # equiv. to (uniform @ self.reference_classwise_densities) + + return self + + def aggregate(self, posteriors: np.ndarray): + # we retain all n*N examples (sampled from a mixture with uniform parameter), and then + # apply importance sampling (IS). In this version we compute D(p_alpha||q) with IS + n_classes = len(self.mix_densities) + + test_kde = self.get_kde_function(posteriors, self.bandwidth) + test_densities = self.pdf(test_kde, self.reference_samples) + + def f_squared_hellinger(u): + return (np.sqrt(u)-1)**2 + + # todo: this will fail when self.divergence is a callable, and is not the right place to do it anyway + if self.divergence.lower() == 'hd': + f = f_squared_hellinger + else: + raise ValueError('only squared HD is currently implemented') + + epsilon = 1e-10 + qs = test_densities + epsilon + rs = self.reference_density + epsilon + iw = qs/rs #importance weights + p_class = self.reference_classwise_densities + epsilon + fracs = p_class/qs + + def divergence(prev): + # ps / qs = (prev @ p_class) / qs = prev @ (p_class / qs) = prev @ fracs + ps_div_qs = prev @ fracs + return np.mean( f(ps_div_qs) * iw ) + + return F.optim_minimize(divergence, n_classes) + + +class KDEyCS(AggregativeProbabilisticQuantifier): + + def __init__(self, classifier: BaseEstimator, val_split=10, bandwidth=0.1, n_jobs=None, random_state=0): + KDEBase._check_bandwidth(bandwidth) + self.classifier = classifier + self.val_split = val_split + self.bandwidth = bandwidth + self.n_jobs = n_jobs + self.random_state=random_state + + def gram_matrix_mix_sum(self, X, Y=None): + # this adapts the output of the rbf_kernel function (pairwise evaluations of Gaussian kernels k(x,y)) + # to contain pairwise evaluations of N(x|mu,Sigma1+Sigma2) with mu=y and Sigma1 and Sigma2 are + # two "scalar matrices" (h^2)*I each, so Sigma1+Sigma2 has scalar 2(h^2) (h is the bandwidth) + h = self.bandwidth + variance = 2 * (h**2) + nD = X.shape[1] + gamma = 1/(2*variance) + norm_factor = 1/np.sqrt(((2*np.pi)**nD) * (variance**(nD))) + gram = norm_factor * rbf_kernel(X, Y, gamma=gamma) + return gram.sum() + + def fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): + if val_split is None: + val_split = self.val_split + + self.classifier, y, posteriors, _, _ = cross_generate_predictions( + data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs + ) + + assert all(sorted(np.unique(y)) == np.arange(data.n_classes)), \ + 'label name gaps not allowed in current implementation' + + n = data.n_classes + P = posteriors + + # counts_inv keeps track of the relative weight of each datapoint within its class + # (i.e., the weight in its KDE model) + counts_inv = 1 / (data.counts()) + + # tr_tr_sums corresponds to symbol \overline{B} in the paper + tr_tr_sums = np.zeros(shape=(n,n), dtype=float) + for i in range(n): + for j in range(n): + if i > j: + tr_tr_sums[i,j] = tr_tr_sums[j,i] + else: + block = self.gram_matrix_mix_sum(P[y == i], P[y == j] if i!=j else None) + tr_tr_sums[i, j] = block + + # keep track of these data structures for the test phase + self.Ptr = P + self.ytr = y + self.tr_tr_sums = tr_tr_sums + self.counts_inv = counts_inv + + return self + + + def aggregate(self, posteriors: np.ndarray): + Ptr = self.Ptr + Pte = posteriors + y = self.ytr + tr_tr_sums = self.tr_tr_sums + + M, nD = Pte.shape + Minv = (1/M) # t in the paper + n = Ptr.shape[1] + + + # becomes a constant that does not affect the optimization, no need to compute it + # partC = 0.5*np.log(self.gram_matrix_mix_sum(Pte) * Kinv * Kinv) + + # tr_te_sums corresponds to \overline{a}*(1/Li)*(1/M) in the paper (note the constants + # are already aggregated to tr_te_sums, so these multiplications are not carried out + # at each iteration of the optimization phase) + tr_te_sums = np.zeros(shape=n, dtype=float) + for i in range(n): + tr_te_sums[i] = self.gram_matrix_mix_sum(Ptr[y==i], Pte) + + def divergence(alpha): + # called \overline{r} in the paper + alpha_ratio = alpha * self.counts_inv + + # recal that tr_te_sums already accounts for the constant terms (1/Li)*(1/M) + partA = -np.log((alpha_ratio @ tr_te_sums) * Minv) + partB = 0.5 * np.log(alpha_ratio @ tr_tr_sums @ alpha_ratio) + return partA + partB #+ partC + + return F.optim_minimize(divergence, n) + From b882c234770af43cc6a1dc57ad6acedd7dae5f19 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Mon, 18 Dec 2023 15:43:36 +0100 Subject: [PATCH 013/216] kdey within the new grid search --- examples/model_selection.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/model_selection.py b/examples/model_selection.py index 3145005..485acd8 100644 --- a/examples/model_selection.py +++ b/examples/model_selection.py @@ -1,7 +1,7 @@ import quapy as qp from method.kdey import KDEyML from quapy.method.non_aggregative import DMx -from quapy.protocol import APP +from quapy.protocol import APP, UPP from quapy.method.aggregative import DMy from sklearn.linear_model import LogisticRegression from examples.comparing_gridsearch import OLD_GridSearchQ @@ -18,7 +18,7 @@ qp.environ['SAMPLE_SIZE'] = 100 qp.environ['N_JOBS'] = -1 # training, test = qp.datasets.fetch_reviews('imdb', tfidf=True, min_df=5).train_test -training, test = qp.datasets.fetch_UCIMulticlassDataset('dry-bean').train_test +training, test = qp.datasets.fetch_UCIMulticlassDataset('letter').train_test with qp.util.temp_seed(0): @@ -30,7 +30,7 @@ with qp.util.temp_seed(0): # values in the entire range of values from a grid (e.g., [0, 0.1, 0.2, ..., 1]). # We devote 30% of the dataset for this exploration. training, validation = training.split_stratified(train_prop=0.7) - protocol = APP(validation) + protocol = UPP(validation) # We will explore a classification-dependent hyper-parameter (e.g., the 'C' # hyper-parameter of LogisticRegression) and a quantification-dependent hyper-parameter @@ -53,7 +53,7 @@ with qp.util.temp_seed(0): protocol=protocol, error='mae', # the error to optimize is the MAE (a quantification-oriented loss) refit=False, # retrain on the whole labelled set once done - raise_errors=False, + # raise_errors=False, verbose=True # show information as the process goes on ).fit(training) @@ -64,7 +64,7 @@ model = model.best_model_ # evaluation in terms of MAE # we use the same evaluation protocol (APP) on the test set -mae_score = qp.evaluation.evaluate(model, protocol=APP(test), error_metric='mae') +mae_score = qp.evaluation.evaluate(model, protocol=UPP(test), error_metric='mae') print(f'MAE={mae_score:.5f}') print(f'model selection took {tend-tinit:.1f}s') From 2d12ce12b94f1f325062bf74f8f5a78e59f05643 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Mon, 18 Dec 2023 17:15:53 +0100 Subject: [PATCH 014/216] bugfix in APP --- examples/model_selection.py | 4 ++-- quapy/protocol.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/model_selection.py b/examples/model_selection.py index 485acd8..4e52784 100644 --- a/examples/model_selection.py +++ b/examples/model_selection.py @@ -46,8 +46,8 @@ with qp.util.temp_seed(0): tinit = time() - model = OLD_GridSearchQ( - # model = qp.model_selection.GridSearchQ( + # model = OLD_GridSearchQ( + model = qp.model_selection.GridSearchQ( model=model, param_grid=param_grid, protocol=protocol, diff --git a/quapy/protocol.py b/quapy/protocol.py index 7d7d1df..36362a9 100644 --- a/quapy/protocol.py +++ b/quapy/protocol.py @@ -257,8 +257,9 @@ class APP(AbstractStochasticSeededProtocol, OnLabelledCollectionProtocol): """ dimensions = self.data.n_classes s = F.prevalence_linspace(self.n_prevalences, repeats=1, smooth_limits_epsilon=self.smooth_limits_epsilon) + eps = (s[1]-s[0])/2 # handling floating rounding s = [s] * (dimensions - 1) - prevs = [p for p in itertools.product(*s, repeat=1) if (sum(p) <= 1.0)] + prevs = [p for p in itertools.product(*s, repeat=1) if (sum(p) < (1.+eps))] prevs = np.asarray(prevs).reshape(len(prevs), -1) if self.repeats > 1: prevs = np.repeat(prevs, self.repeats, axis=0) From 5047fc5c1b119b39044d69ff977eb6fb3db429ff Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Mon, 18 Dec 2023 17:17:09 +0100 Subject: [PATCH 015/216] bugfix in APP --- quapy/protocol.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quapy/protocol.py b/quapy/protocol.py index 7d7d1df..36362a9 100644 --- a/quapy/protocol.py +++ b/quapy/protocol.py @@ -257,8 +257,9 @@ class APP(AbstractStochasticSeededProtocol, OnLabelledCollectionProtocol): """ dimensions = self.data.n_classes s = F.prevalence_linspace(self.n_prevalences, repeats=1, smooth_limits_epsilon=self.smooth_limits_epsilon) + eps = (s[1]-s[0])/2 # handling floating rounding s = [s] * (dimensions - 1) - prevs = [p for p in itertools.product(*s, repeat=1) if (sum(p) <= 1.0)] + prevs = [p for p in itertools.product(*s, repeat=1) if (sum(p) < (1.+eps))] prevs = np.asarray(prevs).reshape(len(prevs), -1) if self.repeats > 1: prevs = np.repeat(prevs, self.repeats, axis=0) From 9af062937e1b3700112a1b431a6db9297c18b93c Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Mon, 18 Dec 2023 17:17:59 +0100 Subject: [PATCH 016/216] bugfix in APP --- quapy/protocol.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quapy/protocol.py b/quapy/protocol.py index 9bb716a..c718368 100644 --- a/quapy/protocol.py +++ b/quapy/protocol.py @@ -257,8 +257,9 @@ class APP(AbstractStochasticSeededProtocol, OnLabelledCollectionProtocol): """ dimensions = self.data.n_classes s = F.prevalence_linspace(self.n_prevalences, repeats=1, smooth_limits_epsilon=self.smooth_limits_epsilon) + eps = (s[1]-s[0])/2 # handling floating rounding s = [s] * (dimensions - 1) - prevs = [p for p in itertools.product(*s, repeat=1) if (sum(p) <= 1.0)] + prevs = [p for p in itertools.product(*s, repeat=1) if (sum(p) < (1.+eps))] prevs = np.asarray(prevs).reshape(len(prevs), -1) if self.repeats > 1: prevs = np.repeat(prevs, self.repeats, axis=0) From 6d53b68d7ffd77b4424dd4a7ffdcb7d8a7d34d96 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Wed, 10 Jan 2024 15:39:27 +0100 Subject: [PATCH 017/216] refactoring aggregative --- .gitignore | 28 +++++ quapy/method/aggregative.py | 198 +++++++++++++++--------------------- 2 files changed, 108 insertions(+), 118 deletions(-) diff --git a/.gitignore b/.gitignore index b9703a3..f3a0a16 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,31 @@ dmypy.json .pyre/ *__pycache__* +*.pdf +*.zip +*.png +*.csv +*.pkl +*.dataframe + + +# other projects +LeQua2022 +MultiLabel +NewMethods +Ordinal +Retrieval +eDiscovery +poster-cikm +slides-cikm +slides-short-cikm +quick_experiment +svm_perf_quantification/svm_struct +svm_perf_quantification/svm_light +TweetSentQuant + + + + + + diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index f3779be..15e1463 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -302,36 +302,20 @@ class AggregativeSoftQuantifier(AggregativeQuantifier, ABC): f'fit_classifier is set to False') +class BinaryAggregativeQuantifier(AggregativeQuantifier, BinaryQuantifier): + + @property + def pos_label(self): + return self.classifier.classes_[1] -# class CorrectionbasedAggregativeQuantifier(AggregativeQuantifier): -# """ -# Abstract class for quantification methods that carry out an adjustment (or correction) that requires, -# at training time, the predictions to be issued in validation mode, i.e., on a set of held-out data that -# is not the training set. There are three ways in which this distinction can be made, depending on how -# the internal parameter `val_split` is specified, namely, (i) a float in (0, 1) indicating the proportion -# of training instances that should be devoted to validate, or (ii) an integer indicating the -# number of folds to consider in a k-fold cross-validation mode, or (iii) the specific set of data to -# use for validation. -# """ -# -# @property -# def val_split(self): -# return self.val_split_ -# -# @val_split.setter -# def val_split(self, val_split): -# if isinstance(val_split, LabelledCollection): -# print('warning: setting val_split with a LabelledCollection will be inefficient in' -# 'model selection. Rather pass the LabelledCollection at fit time') -# self.val_split_ = val_split -# -# def fit(self, data: LabelledCollection, fit_classifier=True, predict_on=None): -# print('method from CorrectionbasedAggregativeQuantifier') -# if predict_on is None: -# predict_on = self.val_split -# classif_predictions = self.classifier_fit_predict(data, fit_classifier, predict_on) -# self.aggregation_fit(classif_predictions, data) -# return self + @property + def neg_label(self): + return self.classifier.classes_[0] + + def fit(self, data: LabelledCollection, fit_classifier=True, val_split=None): + self._check_binary(data, self.__class__.__name__) + return super().fit(data, fit_classifier, val_split) + @@ -383,7 +367,7 @@ class ACC(AggregativeCrispQuantifier): :param n_jobs: number of parallel workers """ - def __init__(self, classifier: BaseEstimator, val_split=0.4, n_jobs=None): + def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None): self.classifier = classifier self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) @@ -476,7 +460,7 @@ class PACC(AggregativeSoftQuantifier): :param n_jobs: number of parallel workers """ - def __init__(self, classifier: BaseEstimator, val_split=0.4, n_jobs=None): + def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None): self.classifier = classifier self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) @@ -599,7 +583,7 @@ class EMQrecalib(AggregativeSoftQuantifier): can be made as float in (0, 1) indicating the proportion of stratified held-out validation set to be extracted from the training set (default 0.4); or as an integer, indicating that the predictions are to be generated in a `k`-fold cross-validation manner (with this integer indicating the value - for `k`); or as a collection defining the specific set of data to use for validation. + for `k`, default 5); or as a collection defining the specific set of data to use for validation. Alternatively, this set can be specified at fit time by indicating the exact set of data on which the predictions are to be generated. :param exact_train_prev: set to True (default) for using, as the initial observation, the true training prevalence; @@ -671,7 +655,7 @@ class EMQrecalib(AggregativeSoftQuantifier): return posteriors -class HDy(AggregativeSoftQuantifier, BinaryQuantifier): +class HDy(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): """ `Hellinger Distance y `_ (HDy). HDy is a probabilistic method for training binary quantifiers, that models quantification as the problem of @@ -683,10 +667,10 @@ class HDy(AggregativeSoftQuantifier, BinaryQuantifier): :param classifier: a sklearn's Estimator that generates a binary classifier :param val_split: a float in range (0,1) indicating the proportion of data to be used as a stratified held-out - validation distribution, or a :class:`quapy.data.base.LabelledCollection` (the split itself). + validation distribution, or a :class:`quapy.data.base.LabelledCollection` (the split itself), or an integer indicating the number of folds (default 5).. """ - def __init__(self, classifier: BaseEstimator, val_split=0.4): + def __init__(self, classifier: BaseEstimator, val_split=5): self.classifier = classifier self.val_split = val_split @@ -701,12 +685,10 @@ class HDy(AggregativeSoftQuantifier, BinaryQuantifier): :class:`quapy.data.base.LabelledCollection` indicating the validation set itself :return: self """ - - self._check_binary(data, self.__class__.__name__) P, y = classif_predictions.Xy - Px = P[:, 1] # takes only the P(y=+1|x) - self.Pxy1 = Px[y == self.classifier.classes_[1]] - self.Pxy0 = Px[y == self.classifier.classes_[0]] + Px = P[:, self.pos_label] # takes only the P(y=+1|x) + self.Pxy1 = Px[y == self.pos_label] + self.Pxy0 = Px[y == self.neg_label] # pre-compute the histogram for positive and negative examples self.bins = np.linspace(10, 110, 11, dtype=int) # [10, 20, 30, ..., 100, 110] @@ -725,7 +707,7 @@ class HDy(AggregativeSoftQuantifier, BinaryQuantifier): # and the final estimated a priori probability was taken as the median of these 11 estimates." # (González-Castro, et al., 2013). - Px = classif_posteriors[:, 1] # takes only the P(y=+1|x) + Px = classif_posteriors[:, self.pos_label] # takes only the P(y=+1|x) prev_estimations = [] # for bins in np.linspace(10, 110, 11, dtype=int): #[10, 20, 30, ..., 100, 110] @@ -752,7 +734,7 @@ class HDy(AggregativeSoftQuantifier, BinaryQuantifier): return np.asarray([1 - class1_prev, class1_prev]) -class DyS(AggregativeSoftQuantifier, BinaryQuantifier): +class DyS(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): """ `DyS framework `_ (DyS). DyS is a generalization of HDy method, using a Ternary Search in order to find the prevalence that @@ -761,14 +743,14 @@ class DyS(AggregativeSoftQuantifier, BinaryQuantifier): :param classifier: a sklearn's Estimator that generates a binary classifier :param val_split: a float in range (0,1) indicating the proportion of data to be used as a stratified held-out - validation distribution, or a :class:`quapy.data.base.LabelledCollection` (the split itself). + validation distribution, or a :class:`quapy.data.base.LabelledCollection` (the split itself), or an integer indicating the number of folds (default 5).. :param n_bins: an int with the number of bins to use to compute the histograms. :param divergence: a str indicating the name of divergence (currently supported ones are "HD" or "topsoe"), or a callable function computes the divergence between two distributions (two equally sized arrays). :param tol: a float with the tolerance for the ternary search algorithm. """ - def __init__(self, classifier: BaseEstimator, val_split=0.4, n_bins=8, divergence: Union[str, Callable]= 'HD', tol=1e-05): + def __init__(self, classifier: BaseEstimator, val_split=5, n_bins=8, divergence: Union[str, Callable]= 'HD', tol=1e-05): self.classifier = classifier self.val_split = val_split self.tol = tol @@ -791,22 +773,17 @@ class DyS(AggregativeSoftQuantifier, BinaryQuantifier): # Left and right are the current bounds; the maximum is between them return (left + right) / 2 - def fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): - if val_split is None: - val_split = self.val_split - - self._check_binary(data, self.__class__.__name__) - self.classifier, validation = _training_helper( - self.classifier, data, fit_classifier, ensure_probabilistic=True, val_split=val_split) - Px = self.classify(validation.instances)[:, 1] # takes only the P(y=+1|x) - self.Pxy1 = Px[validation.labels == self.classifier.classes_[1]] - self.Pxy0 = Px[validation.labels == self.classifier.classes_[0]] + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): + Px, y = classif_predictions.Xy + Px = Px[:, self.pos_label] # takes only the P(y=+1|x) + self.Pxy1 = Px[y == self.pos_label] + self.Pxy0 = Px[y == self.neg_label] self.Pxy1_density = np.histogram(self.Pxy1, bins=self.n_bins, range=(0, 1), density=True)[0] self.Pxy0_density = np.histogram(self.Pxy0, bins=self.n_bins, range=(0, 1), density=True)[0] return self def aggregate(self, classif_posteriors): - Px = classif_posteriors[:, 1] # takes only the P(y=+1|x) + Px = classif_posteriors[:, self.pos_label] # takes only the P(y=+1|x) Px_test = np.histogram(Px, bins=self.n_bins, range=(0, 1), density=True)[0] divergence = get_divergence(self.divergence) @@ -819,37 +796,32 @@ class DyS(AggregativeSoftQuantifier, BinaryQuantifier): return np.asarray([1 - class1_prev, class1_prev]) -class SMM(AggregativeSoftQuantifier, BinaryQuantifier): +class SMM(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): """ `SMM method `_ (SMM). SMM is a simplification of matching distribution methods where the representation of the examples - is created using the mean instead of a histogram. + is created using the mean instead of a histogram (conceptually equivalent to PACC). :param classifier: a sklearn's Estimator that generates a binary classifier. :param val_split: a float in range (0,1) indicating the proportion of data to be used as a stratified held-out - validation distribution, or a :class:`quapy.data.base.LabelledCollection` (the split itself). + validation distribution, or a :class:`quapy.data.base.LabelledCollection` (the split itself), or an integer indicating the number of folds (default 5).. """ - def __init__(self, classifier: BaseEstimator, val_split=0.4): + def __init__(self, classifier: BaseEstimator, val_split=5): self.classifier = classifier self.val_split = val_split - def fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, LabelledCollection] = None): - if val_split is None: - val_split = self.val_split - - self._check_binary(data, self.__class__.__name__) - self.classifier, validation = _training_helper( - self.classifier, data, fit_classifier, ensure_probabilistic=True, val_split=val_split) - Px = self.classify(validation.instances)[:, 1] # takes only the P(y=+1|x) - self.Pxy1 = Px[validation.labels == self.classifier.classes_[1]] - self.Pxy0 = Px[validation.labels == self.classifier.classes_[0]] - self.Pxy1_mean = np.mean(self.Pxy1) - self.Pxy0_mean = np.mean(self.Pxy0) + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): + Px, y = classif_predictions.Xy + Px = Px[:, self.pos_label] # takes only the P(y=+1|x) + self.Pxy1 = Px[y == self.pos_label] + self.Pxy0 = Px[y == self.neg_label] + self.Pxy1_mean = np.mean(self.Pxy1) # equiv. TPR + self.Pxy0_mean = np.mean(self.Pxy0) # equiv. FPR return self def aggregate(self, classif_posteriors): - Px = classif_posteriors[:, 1] # takes only the P(y=+1|x) + Px = classif_posteriors[:, self.pos_label] # takes only the P(y=+1|x) Px_mean = np.mean(Px) class1_prev = (Px_mean - self.Pxy0_mean)/(self.Pxy1_mean - self.Pxy0_mean) @@ -867,9 +839,9 @@ class DMy(AggregativeSoftQuantifier): :param classifier: a `sklearn`'s Estimator that generates a probabilistic classifier :param val_split: indicates the proportion of data to be used as a stratified held-out validation set to model the validation distribution. - This parameter can be indicated as a real value (between 0 and 1, default 0.4), representing a proportion of + This parameter can be indicated as a real value (between 0 and 1), representing a proportion of validation data, or as an integer, indicating that the validation distribution should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`), or as a + `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a :class:`quapy.data.base.LabelledCollection` (the split itself). :param nbins: number of bins used to discretize the distributions (default 8) :param divergence: a string representing a divergence measure (currently, "HD" and "topsoe" are implemented) @@ -890,7 +862,7 @@ class DMy(AggregativeSoftQuantifier): self.n_jobs = n_jobs # @classmethod - # def HDy(cls, classifier, val_split=0.4, n_jobs=None): + # def HDy(cls, classifier, val_split=5, n_jobs=None): # from quapy.method.meta import MedianEstimator # # hdy = DMy(classifier=classifier, val_split=val_split, search='linear_search', divergence='HD') @@ -1114,7 +1086,7 @@ def newSVMRAE(svmperf_base=None, C=1): return newELM(svmperf_base, loss='mrae', C=C) -class ThresholdOptimization(AggregativeQuantifier, BinaryQuantifier): +class ThresholdOptimization(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): """ Abstract class of Threshold Optimization variants for :class:`ACC` as proposed by `Forman 2006 `_ and @@ -1127,31 +1099,20 @@ class ThresholdOptimization(AggregativeQuantifier, BinaryQuantifier): :param classifier: a sklearn's Estimator that generates a classifier :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1, default 0.4), representing a proportion of + This parameter can be indicated as a real value (between 0 and 1), representing a proportion of validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`), or as a + `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a :class:`quapy.data.base.LabelledCollection` (the split itself). """ - def __init__(self, classifier: BaseEstimator, val_split=0.4, n_jobs=None): + def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None): self.classifier = classifier self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) - def fit(self, data: LabelledCollection, fit_classifier=True, val_split: Union[float, int, LabelledCollection] = None): - self._check_binary(data, "Threshold Optimization") - - if val_split is None: - val_split = self.val_split - - self.classifier, y, y_, classes, class_count = cross_generate_predictions( - data, self.classifier, val_split, probabilistic=True, fit_classifier=fit_classifier, n_jobs=self.n_jobs - ) - - self.cc = CC(self.classifier) - - self.tpr, self.fpr = self._optimize_threshold(y, y_) - + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): + P, y = classif_predictions.Xy + self.tpr, self.fpr, self.threshold = self._optimize_threshold(y, P) return self @abstractmethod @@ -1173,14 +1134,15 @@ class ThresholdOptimization(AggregativeQuantifier, BinaryQuantifier): :param y: predicted labels for the validation set (or for the training set via `k`-fold cross validation) :param probabilities: array-like with the posterior probabilities - :return: best `tpr` and `fpr` according to `_condition` + :return: best `tpr` and `fpr` and `threshold` according to `_condition` """ best_candidate_threshold_score = None best_tpr = 0 best_fpr = 0 - candidate_thresholds = np.unique(probabilities[:, 1]) + candidate_thresholds = np.unique(probabilities[:, self.pos_label]) for candidate_threshold in candidate_thresholds: - y_ = [self.classes_[1] if p > candidate_threshold else self.classes_[0] for p in probabilities[:, 1]] + y_ = self.classes_[1*(probabilities[:,1]>candidate_threshold)] + #y_ = [self.pos_label if p > candidate_threshold else self.neg_label for p in probabilities[:, 1]] TP, FP, FN, TN = self._compute_table(y, y_) tpr = self._compute_tpr(TP, FP) fpr = self._compute_fpr(FP, TN) @@ -1190,15 +1152,15 @@ class ThresholdOptimization(AggregativeQuantifier, BinaryQuantifier): best_tpr = tpr best_fpr = fpr - return best_tpr, best_fpr + return best_tpr, best_fpr, best_candidate_threshold_score def aggregate(self, classif_predictions): - prevs_estim = self.cc.aggregate(classif_predictions) - if self.tpr - self.fpr == 0: - return prevs_estim - adjusted_prevs_estim = np.clip((prevs_estim[1] - self.fpr) / (self.tpr - self.fpr), 0, 1) - adjusted_prevs_estim = np.array((1 - adjusted_prevs_estim, adjusted_prevs_estim)) - return adjusted_prevs_estim + class_scores = classif_predictions[:, self.pos_label] + prev_estim = np.mean(class_scores > self.threshold) + if self.tpr - self.fpr != 0: + prevs_estim = np.clip((prev_estim - self.fpr) / (self.tpr - self.fpr), 0, 1) + prevs_estim = np.array((1 - prevs_estim, prevs_estim)) + return prevs_estim def _compute_table(self, y, y_): TP = np.logical_and(y == y_, y == self.classes_[1]).sum() @@ -1229,13 +1191,13 @@ class T50(ThresholdOptimization): :param classifier: a sklearn's Estimator that generates a classifier :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1, default 0.4), representing a proportion of + This parameter can be indicated as a real value (between 0 and 1), representing a proportion of validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`), or as a + `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a :class:`quapy.data.base.LabelledCollection` (the split itself). """ - def __init__(self, classifier: BaseEstimator, val_split=0.4): + def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) def _condition(self, tpr, fpr) -> float: @@ -1253,13 +1215,13 @@ class MAX(ThresholdOptimization): :param classifier: a sklearn's Estimator that generates a classifier :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1, default 0.4), representing a proportion of + This parameter can be indicated as a real value (between 0 and 1), representing a proportion of validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`), or as a + `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a :class:`quapy.data.base.LabelledCollection` (the split itself). """ - def __init__(self, classifier: BaseEstimator, val_split=0.4): + def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) def _condition(self, tpr, fpr) -> float: @@ -1278,13 +1240,13 @@ class X(ThresholdOptimization): :param classifier: a sklearn's Estimator that generates a classifier :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1, default 0.4), representing a proportion of + This parameter can be indicated as a real value (between 0 and 1), representing a proportion of validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`), or as a + `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a :class:`quapy.data.base.LabelledCollection` (the split itself). """ - def __init__(self, classifier: BaseEstimator, val_split=0.4): + def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) def _condition(self, tpr, fpr) -> float: @@ -1302,12 +1264,12 @@ class MS(ThresholdOptimization): :param classifier: a sklearn's Estimator that generates a classifier :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1, default 0.4), representing a proportion of + This parameter can be indicated as a real value (between 0 and 1), representing a proportion of validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`), or as a + `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a :class:`quapy.data.base.LabelledCollection` (the split itself). """ - def __init__(self, classifier: BaseEstimator, val_split=0.4): + def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) def _condition(self, tpr, fpr) -> float: @@ -1339,12 +1301,12 @@ class MS2(MS): :param classifier: a sklearn's Estimator that generates a classifier :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1, default 0.4), representing a proportion of + This parameter can be indicated as a real value (between 0 and 1), representing a proportion of validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`), or as a + `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a :class:`quapy.data.base.LabelledCollection` (the split itself). """ - def __init__(self, classifier: BaseEstimator, val_split=0.4): + def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) def _optimize_threshold(self, y, probabilities): From 896fa042d6c62181ba72f2065ea7ee86b55b43c1 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Wed, 17 Jan 2024 09:33:39 +0100 Subject: [PATCH 018/216] fixing threshold optimization-based techniques --- .gitignore | 1 + ..._checking_optim_threshold_modifications.py | 136 +++++++++++++ quapy/functional.py | 17 ++ quapy/method/aggregative.py | 190 ++++++++---------- 4 files changed, 241 insertions(+), 103 deletions(-) create mode 100644 examples/_uci_experiments_checking_optim_threshold_modifications.py diff --git a/.gitignore b/.gitignore index f3a0a16..8eaff3e 100644 --- a/.gitignore +++ b/.gitignore @@ -158,3 +158,4 @@ TweetSentQuant +*.png diff --git a/examples/_uci_experiments_checking_optim_threshold_modifications.py b/examples/_uci_experiments_checking_optim_threshold_modifications.py new file mode 100644 index 0000000..51e5912 --- /dev/null +++ b/examples/_uci_experiments_checking_optim_threshold_modifications.py @@ -0,0 +1,136 @@ +from copy import deepcopy + +import quapy as qp +from sklearn.calibration import CalibratedClassifierCV +from sklearn.linear_model import LogisticRegression +from quapy.classification.methods import LowRankLogisticRegression +from quapy.method.meta import QuaNet +from quapy.protocol import APP +from quapy.method.aggregative import CC, ACC, PCC, PACC, MAX, MS, MS2, EMQ, HDy, newSVMAE, T50, X +from quapy.method.meta import EHDy +import numpy as np +import os +import pickle +import itertools +import argparse +import torch +import shutil + + +N_JOBS = -1 +CUDA_N_JOBS = 2 +ENSEMBLE_N_JOBS = -1 + +qp.environ['SAMPLE_SIZE'] = 100 + + +def newLR(): + return LogisticRegression(max_iter=1000, solver='lbfgs', n_jobs=-1) + + +def calibratedLR(): + return CalibratedClassifierCV(LogisticRegression(max_iter=1000, solver='lbfgs', n_jobs=-1)) + + +__C_range = np.logspace(-3, 3, 7) +lr_params = {'classifier__C': __C_range, 'classifier__class_weight': [None, 'balanced']} +svmperf_params = {'classifier__C': __C_range} + + +def quantification_models(): + yield 'acc', ACC(newLR()), lr_params + yield 'T50', T50(newLR()), lr_params + yield 'X', X(newLR()), lr_params + yield 'MAX', MAX(newLR()), lr_params + yield 'MS', MS(newLR()), lr_params + yield 'MS2', MS2(newLR()), lr_params + + +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 result_path(path, dataset_name, model_name, run, optim_loss): + return os.path.join(path, f'{dataset_name}-{model_name}-run{run}-{optim_loss}.pkl') + + +def is_already_computed(dataset_name, model_name, run, optim_loss): + return os.path.exists(result_path(args.results, dataset_name, model_name, run, optim_loss)) + + +def save_results(dataset_name, model_name, run, optim_loss, *results): + rpath = result_path(args.results, dataset_name, model_name, run, 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 dataset_name in ['acute.a', 'acute.b', 'iris.1']: return + + collection = qp.datasets.fetch_UCILabelledCollection(dataset_name) + for run, data in enumerate(qp.data.Dataset.kFCV(collection, nfolds=5, nrepeats=1)): + if is_already_computed(dataset_name, model_name, run=run, optim_loss=optim_loss): + print(f'result for dataset={dataset_name} model={model_name} loss={optim_loss} run={run+1}/5 already computed.') + continue + + print(f'running dataset={dataset_name} model={model_name} loss={optim_loss} run={run+1}/5') + # model selection (hyperparameter optimization for a quantification-oriented loss) + train, test = data.train_test + train, val = train.split_stratified() + if hyperparams is not None: + model_selection = qp.model_selection.GridSearchQ( + deepcopy(model), + param_grid=hyperparams, + protocol=APP(val, n_prevalences=21, repeats=25), + error=optim_loss, + refit=True, + timeout=60*60, + verbose=True + ) + model_selection.fit(data.training) + model = model_selection.best_model() + best_params = model_selection.best_params_ + else: + model.fit(data.training) + best_params = {} + + # model evaluation + true_prevalences, estim_prevalences = qp.evaluation.prediction( + model, + protocol=APP(test, n_prevalences=21, repeats=100) + ) + test_true_prevalence = data.test.prevalence() + + evaluate_experiment(true_prevalences, estim_prevalences) + save_results(dataset_name, model_name, run, optim_loss, + true_prevalences, estim_prevalences, + data.training.prevalence(), test_true_prevalence, + best_params) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Run experiments for Tweeter Sentiment Quantification') + parser.add_argument('--results', metavar='RESULT_PATH', type=str, default='results_tmp', + 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') + args = parser.parse_args() + + print(f'Result folder: {args.results}') + np.random.seed(0) + + qp.environ['SVMPERF_HOME'] = args.svmperfpath + + optim_losses = ['mae'] + datasets = qp.datasets.UCI_DATASETS + + models = quantification_models() + qp.util.parallel(run, itertools.product(optim_losses, datasets, models), n_jobs=N_JOBS) + + shutil.rmtree(args.checkpointdir, ignore_errors=True) diff --git a/quapy/functional.py b/quapy/functional.py index e29466f..d39b306 100644 --- a/quapy/functional.py +++ b/quapy/functional.py @@ -66,6 +66,23 @@ def prevalence_from_probabilities(posteriors, binarize: bool = False): return prevalences +def as_binary_prevalence(positive_prevalence: float, clip_if_necessary=False): + """ + Helper that, given a float representing the prevalence for the positive class, returns a np.ndarray of two + values representing a binary distribution. + + :param positive_prevalence: prevalence for the positive class + :param clip_if_necessary: if True, clips the value in [0,1] in order to guarantee the resulting distribution + is valid. If False, it then checks that the value is in the valid range, and raises an error if not. + :return: np.ndarray of shape `(2,)` + """ + if clip_if_necessary: + positive_prevalence = np.clip(positive_prevalence, 0, 1) + else: + assert 0 <= positive_prevalence <= 1, 'the value provided is not a valid prevalence for the positive class' + return np.asarray([1-positive_prevalence, positive_prevalence]) + + def HellingerDistance(P, Q) -> float: """ Computes the Hellingher Distance (HD) between (discretized) distributions `P` and `Q`. diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index 15e1463..6696402 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -159,28 +159,25 @@ class AggregativeQuantifier(BaseQuantifier, ABC): """ self.classifier_ = classifier - @abstractmethod def classify(self, instances): """ Provides the label predictions for the given instances. The predictions should respect the format expected by :meth:`aggregate`, e.g., posterior probabilities for probabilistic quantifiers, or crisp predictions for - non-probabilistic quantifiers + non-probabilistic quantifiers. The default one is "decision_function". :param instances: array-like of shape `(n_instances, n_features,)` :return: np.ndarray of shape `(n_instances,)` with label predictions """ - ... + return getattr(self, self._classifier_method())(instances) - @abstractmethod def _classifier_method(self): """ - Name of the method that must be used for issuing label predictions. + Name of the method that must be used for issuing label predictions. The default one is "decision_function". :return: string """ - ... + return 'decision_function' - @abstractmethod def _check_classifier(self, adapt_if_necessary=False): """ Guarantees that the underlying classifier implements the method required for issuing predictions, i.e., @@ -188,7 +185,8 @@ class AggregativeQuantifier(BaseQuantifier, ABC): :param adapt_if_necessary: if True, the method will try to comply with the required specifications """ - ... + assert hasattr(self.classifier, self._classifier_method()), \ + f"the method does not implement the required {self._classifier_method()} method" def quantify(self, instances): """ @@ -229,32 +227,15 @@ class AggregativeCrispQuantifier(AggregativeQuantifier, ABC): Quantifiers by implementing specifications about crisp predictions. """ - def classify(self, instances): - """ - Provides the label (crisp) predictions for the given instances. - - :param instances: array-like of shape `(n_instances, n_dimensions,)` - :return: np.ndarray of shape `(n_instances,)` with label predictions - """ - return self.classifier.predict(instances) - def _classifier_method(self): """ - Name of the method that must be used for issuing label predictions. + Name of the method that must be used for issuing label predictions. For crisp quantifiers, the method + is 'predict', that returns an array of shape `(n_instances,)` of label predictions. :return: the string "predict", i.e., the standard method name for scikit-learn hard predictions """ return 'predict' - def _check_classifier(self, adapt_if_necessary=False): - """ - Guarantees that the underlying classifier implements the method indicated by the :meth:`_classifier_method` - - :param adapt_if_necessary: unused, added for compatibility - """ - assert hasattr(self.classifier, self._classifier_method()), \ - f"the method does not implement the required {self._classifier_method()} method" - class AggregativeSoftQuantifier(AggregativeQuantifier, ABC): """ @@ -264,18 +245,11 @@ class AggregativeSoftQuantifier(AggregativeQuantifier, ABC): about soft predictions. """ - def classify(self, instances): - """ - Provides the posterior probabilities for the given instances. - - :param instances: array-like of shape `(n_instances, n_dimensions,)` - :return: np.ndarray of shape `(n_instances, n_classes,)` with posterior probabilities - """ - return self.classifier.predict_proba(instances) - def _classifier_method(self): """ - Name of the method that must be used for issuing label predictions. + Name of the method that must be used for issuing label predictions. For probabilistic quantifiers, the method + is 'predict_proba', that returns an array of shape `(n_instances, n_dimensions,)` with posterior + probabilities. :return: the string "predict_proba", i.e., the standard method name for scikit-learn soft predictions """ @@ -731,7 +705,7 @@ class HDy(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): prev_estimations.append(prev_selected) class1_prev = np.median(prev_estimations) - return np.asarray([1 - class1_prev, class1_prev]) + return F.as_binary_prevalence(class1_prev) class DyS(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): @@ -793,7 +767,7 @@ class DyS(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): return divergence(Px_train, Px_test) class1_prev = self._ternary_search(f=distribution_distance, left=0, right=1, tol=self.tol) - return np.asarray([1 - class1_prev, class1_prev]) + return F.as_binary_prevalence(class1_prev) class SMM(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): @@ -825,9 +799,7 @@ class SMM(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): Px_mean = np.mean(Px) class1_prev = (Px_mean - self.Pxy0_mean)/(self.Pxy1_mean - self.Pxy0_mean) - class1_prev = np.clip(class1_prev, 0, 1) - - return np.asarray([1 - class1_prev, class1_prev]) + return F.as_binary_prevalence(class1_prev, clip_if_necessary=True) class DMy(AggregativeSoftQuantifier): @@ -1086,7 +1058,7 @@ def newSVMRAE(svmperf_base=None, C=1): return newELM(svmperf_base, loss='mrae', C=C) -class ThresholdOptimization(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): +class ThresholdOptimization(BinaryAggregativeQuantifier): """ Abstract class of Threshold Optimization variants for :class:`ACC` as proposed by `Forman 2006 `_ and @@ -1110,13 +1082,8 @@ class ThresholdOptimization(AggregativeSoftQuantifier, BinaryAggregativeQuantifi self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): - P, y = classif_predictions.Xy - self.tpr, self.fpr, self.threshold = self._optimize_threshold(y, P) - return self - @abstractmethod - def _condition(self, tpr, fpr) -> float: + def condition(self, tpr, fpr) -> float: """ Implements the criterion according to which the threshold should be selected. This function should return the (float) score to be minimized. @@ -1127,46 +1094,63 @@ class ThresholdOptimization(AggregativeSoftQuantifier, BinaryAggregativeQuantifi """ ... - def _optimize_threshold(self, y, probabilities): + def discard(self, tpr, fpr) -> bool: + """ + Indicates whether a combination of tpr and fpr should be discarded + + :param tpr: float, true positive rate + :param fpr: float, false positive rate + :return: true if the combination is to be discarded, false otherwise + """ + return (tpr + fpr) == 0 + + + def _eval_candidate_thresholds(self, decision_scores, y): """ Seeks for the best `tpr` and `fpr` according to the score obtained at different decision thresholds. The scoring function is implemented in function `_condition`. + :param decision_scores: array-like with the classification scores :param y: predicted labels for the validation set (or for the training set via `k`-fold cross validation) - :param probabilities: array-like with the posterior probabilities :return: best `tpr` and `fpr` and `threshold` according to `_condition` """ - best_candidate_threshold_score = None - best_tpr = 0 - best_fpr = 0 - candidate_thresholds = np.unique(probabilities[:, self.pos_label]) + candidate_thresholds = np.unique(decision_scores) + + candidates = [] + scores = [] for candidate_threshold in candidate_thresholds: - y_ = self.classes_[1*(probabilities[:,1]>candidate_threshold)] - #y_ = [self.pos_label if p > candidate_threshold else self.neg_label for p in probabilities[:, 1]] + y_ = self.classes_[1 * (decision_scores > candidate_threshold)] TP, FP, FN, TN = self._compute_table(y, y_) tpr = self._compute_tpr(TP, FP) fpr = self._compute_fpr(FP, TN) - condition_score = self._condition(tpr, fpr) - if best_candidate_threshold_score is None or condition_score < best_candidate_threshold_score: - best_candidate_threshold_score = condition_score - best_tpr = tpr - best_fpr = fpr + if not self.discard(tpr, fpr): + candidate_score = self.condition(tpr, fpr) + candidates.append([tpr, fpr, candidate_threshold]) + scores.append(candidate_score) - return best_tpr, best_fpr, best_candidate_threshold_score + if len(candidates) == 0: + # if no candidate gives rise to a valid combination of tpr and fpr, this method defaults to the standard + # classify & count; this is akin to assign tpr=1, fpr=0, threshold=0 + tpr, fpr, threshold, score = 1, 0, 0, 0 + candidates.append([tpr, fpr, threshold, score]) - def aggregate(self, classif_predictions): - class_scores = classif_predictions[:, self.pos_label] - prev_estim = np.mean(class_scores > self.threshold) - if self.tpr - self.fpr != 0: - prevs_estim = np.clip((prev_estim - self.fpr) / (self.tpr - self.fpr), 0, 1) + candidates = np.asarray(candidates) + candidates = candidates[np.argsort(scores)] # sort candidates by candidate_score + + return candidates + + def aggregate_with_threshold(self, classif_predictions, tpr, fpr, threshold): + prevs_estim = np.mean(classif_predictions > threshold) + if tpr - fpr != 0: + prevs_estim = np.clip((prevs_estim - fpr) / (tpr - fpr), 0, 1) prevs_estim = np.array((1 - prevs_estim, prevs_estim)) return prevs_estim def _compute_table(self, y, y_): - TP = np.logical_and(y == y_, y == self.classes_[1]).sum() - FP = np.logical_and(y != y_, y == self.classes_[0]).sum() - FN = np.logical_and(y != y_, y == self.classes_[1]).sum() - TN = np.logical_and(y == y_, y == self.classes_[0]).sum() + TP = np.logical_and(y == y_, y == self.pos_label).sum() + FP = np.logical_and(y != y_, y == self.neg_label).sum() + FN = np.logical_and(y != y_, y == self.pos_label).sum() + TN = np.logical_and(y == y_, y == self.neg_label).sum() return TP, FP, FN, TN def _compute_tpr(self, TP, FP): @@ -1179,13 +1163,23 @@ class ThresholdOptimization(AggregativeSoftQuantifier, BinaryAggregativeQuantifi return 0 return FP / (FP + TN) + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): + # the standard behavior is to keep the best threshold only + decision_scores, y = classif_predictions.Xy + self.tpr, self.fpr, self.threshold = self._eval_candidate_thresholds(decision_scores, y)[0] + return self + + def aggregate(self, classif_predictions: np.ndarray): + # the standard behavior is to compute the adjusted count using the best threshold found + return self.aggregate_with_threshold(classif_predictions, self.tpr, self.fpr, self.threshold) + class T50(ThresholdOptimization): """ Threshold Optimization variant for :class:`ACC` as proposed by `Forman 2006 `_ and `Forman 2008 `_ that looks - for the threshold that makes `tpr` cosest to 0.5. + for the threshold that makes `tpr` closest to 0.5. The goal is to bring improved stability to the denominator of the adjustment. :param classifier: a sklearn's Estimator that generates a classifier @@ -1200,7 +1194,7 @@ class T50(ThresholdOptimization): def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) - def _condition(self, tpr, fpr) -> float: + def condition(self, tpr, fpr) -> float: return abs(tpr - 0.5) @@ -1224,7 +1218,7 @@ class MAX(ThresholdOptimization): def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) - def _condition(self, tpr, fpr) -> float: + def condition(self, tpr, fpr) -> float: # MAX strives to maximize (tpr - fpr), which is equivalent to minimize (fpr - tpr) return (fpr - tpr) @@ -1249,7 +1243,7 @@ class X(ThresholdOptimization): def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) - def _condition(self, tpr, fpr) -> float: + def condition(self, tpr, fpr) -> float: return abs(1 - (tpr + fpr)) @@ -1272,21 +1266,22 @@ class MS(ThresholdOptimization): def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) - def _condition(self, tpr, fpr) -> float: - pass + def condition(self, tpr, fpr) -> float: + return 1 - def _optimize_threshold(self, y, probabilities): - tprs = [] - fprs = [] - candidate_thresholds = np.unique(probabilities[:, 1]) - for candidate_threshold in candidate_thresholds: - y_ = [self.classes_[1] if p > candidate_threshold else self.classes_[0] for p in probabilities[:, 1]] - TP, FP, FN, TN = self._compute_table(y, y_) - tpr = self._compute_tpr(TP, FP) - fpr = self._compute_fpr(FP, TN) - tprs.append(tpr) - fprs.append(fpr) - return np.median(tprs), np.median(fprs) + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): + # keeps all candidates + decision_scores, y = classif_predictions.Xy + self.tprs_fprs_thresholds = self._eval_candidate_thresholds(decision_scores, y) + return self + + def aggregate(self, classif_predictions: np.ndarray): + prevalences = [] + for tpr, fpr, threshold in self.tprs_fprs_thresholds: + pos_prev = self.aggregate_with_threshold(classif_predictions, tpr, fpr, threshold)[1] + prevalences.append(pos_prev) + median = np.median(prevalences) + return F.as_binary_prevalence(median) class MS2(MS): @@ -1309,19 +1304,8 @@ class MS2(MS): def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) - def _optimize_threshold(self, y, probabilities): - tprs = [0, 1] - fprs = [0, 1] - candidate_thresholds = np.unique(probabilities[:, 1]) - for candidate_threshold in candidate_thresholds: - y_ = [self.classes_[1] if p > candidate_threshold else self.classes_[0] for p in probabilities[:, 1]] - TP, FP, FN, TN = self._compute_table(y, y_) - tpr = self._compute_tpr(TP, FP) - fpr = self._compute_fpr(FP, TN) - if (tpr - fpr) > 0.25: - tprs.append(tpr) - fprs.append(fpr) - return np.median(tprs), np.median(fprs) + def discard(self, tpr, fpr) -> bool: + return (tpr-fpr) <= 0.25 class OneVsAllAggregative(OneVsAllGeneric, AggregativeQuantifier): From 9b2470c992e5a786c9d8ea98f08e8c6b5b03dd3f Mon Sep 17 00:00:00 2001 From: Alex Moreo Date: Wed, 17 Jan 2024 19:15:50 +0100 Subject: [PATCH 019/216] testing optimization threshold variants, not working --- ..._checking_optim_threshold_modifications.py | 107 +++++++++--------- examples/uci_experiments.py | 2 +- quapy/method/aggregative.py | 6 +- quapy/model_selection.py | 2 +- 4 files changed, 56 insertions(+), 61 deletions(-) diff --git a/examples/_uci_experiments_checking_optim_threshold_modifications.py b/examples/_uci_experiments_checking_optim_threshold_modifications.py index 51e5912..e5ae184 100644 --- a/examples/_uci_experiments_checking_optim_threshold_modifications.py +++ b/examples/_uci_experiments_checking_optim_threshold_modifications.py @@ -13,13 +13,11 @@ import os import pickle import itertools import argparse -import torch -import shutil +from glob import glob +import pandas as pd N_JOBS = -1 -CUDA_N_JOBS = 2 -ENSEMBLE_N_JOBS = -1 qp.environ['SAMPLE_SIZE'] = 100 @@ -40,30 +38,23 @@ svmperf_params = {'classifier__C': __C_range} def quantification_models(): yield 'acc', ACC(newLR()), lr_params yield 'T50', T50(newLR()), lr_params - yield 'X', X(newLR()), lr_params - yield 'MAX', MAX(newLR()), lr_params + #yield 'X', X(newLR()), lr_params + #yield 'MAX', MAX(newLR()), lr_params yield 'MS', MS(newLR()), lr_params yield 'MS2', MS2(newLR()), lr_params -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 result_path(path, dataset_name, model_name, optim_loss): + return os.path.join(path, f'{dataset_name}-{model_name}-{optim_loss}.pkl') -def result_path(path, dataset_name, model_name, run, optim_loss): - return os.path.join(path, f'{dataset_name}-{model_name}-run{run}-{optim_loss}.pkl') +def is_already_computed(dataset_name, model_name, optim_loss): + return os.path.exists(result_path(args.results, dataset_name, model_name, optim_loss)) -def is_already_computed(dataset_name, model_name, run, optim_loss): - return os.path.exists(result_path(args.results, dataset_name, model_name, run, optim_loss)) - - -def save_results(dataset_name, model_name, run, optim_loss, *results): - rpath = result_path(args.results, dataset_name, model_name, run, optim_loss) +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) @@ -73,45 +64,39 @@ def run(experiment): optim_loss, dataset_name, (model_name, model, hyperparams) = experiment if dataset_name in ['acute.a', 'acute.b', 'iris.1']: return - collection = qp.datasets.fetch_UCILabelledCollection(dataset_name) - for run, data in enumerate(qp.data.Dataset.kFCV(collection, nfolds=5, nrepeats=1)): - if is_already_computed(dataset_name, model_name, run=run, optim_loss=optim_loss): - print(f'result for dataset={dataset_name} model={model_name} loss={optim_loss} run={run+1}/5 already computed.') - continue + 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 - print(f'running dataset={dataset_name} model={model_name} loss={optim_loss} run={run+1}/5') - # model selection (hyperparameter optimization for a quantification-oriented loss) - train, test = data.train_test - train, val = train.split_stratified() - if hyperparams is not None: - model_selection = qp.model_selection.GridSearchQ( - deepcopy(model), - param_grid=hyperparams, - protocol=APP(val, n_prevalences=21, repeats=25), - error=optim_loss, - refit=True, - timeout=60*60, - verbose=True - ) - model_selection.fit(data.training) - model = model_selection.best_model() - best_params = model_selection.best_params_ - else: - model.fit(data.training) - best_params = {} + dataset = qp.datasets.fetch_UCIDataset(dataset_name) - # model evaluation - true_prevalences, estim_prevalences = qp.evaluation.prediction( - model, - protocol=APP(test, n_prevalences=21, repeats=100) + print(f'running dataset={dataset_name} model={model_name} loss={optim_loss}') + # model selection (hyperparameter optimization for a quantification-oriented loss) + train, test = dataset.train_test + train, val = train.split_stratified() + if hyperparams is not None: + model_selection = qp.model_selection.GridSearchQ( + deepcopy(model), + param_grid=hyperparams, + protocol=APP(val, n_prevalences=21, repeats=25), + error=optim_loss, + refit=True, + timeout=60*60, + verbose=True ) - test_true_prevalence = data.test.prevalence() + model_selection.fit(train) + model = model_selection.best_model() + else: + model.fit(dataset.training) - evaluate_experiment(true_prevalences, estim_prevalences) - save_results(dataset_name, model_name, run, optim_loss, - true_prevalences, estim_prevalences, - data.training.prevalence(), test_true_prevalence, - best_params) + # model evaluation + true_prevalences, estim_prevalences = qp.evaluation.prediction( + model, + protocol=APP(test, n_prevalences=21, repeats=100) + ) + + mae = qp.error.mae(true_prevalences, estim_prevalences) + save_results(dataset_name, model_name, optim_loss, mae) if __name__ == '__main__': @@ -133,4 +118,14 @@ if __name__ == '__main__': models = quantification_models() qp.util.parallel(run, itertools.product(optim_losses, datasets, models), n_jobs=N_JOBS) - shutil.rmtree(args.checkpointdir, ignore_errors=True) + # open all results and show + df = pd.DataFrame(columns=('method', 'dataset', 'mae')) + for i, file in enumerate(glob(f'{args.results}/*.pkl')): + mae = float(pickle.load(open(file, 'rb'))[0]) + *dataset, method, _ = file.split('/')[-1].split('-') + dataset = '-'.join(dataset) + df.loc[i] = [method, dataset, mae] + + print(df.pivot_table(index='dataset', columns='method', values='mae')) + + diff --git a/examples/uci_experiments.py b/examples/uci_experiments.py index 2cf5bac..09efe5d 100644 --- a/examples/uci_experiments.py +++ b/examples/uci_experiments.py @@ -104,7 +104,7 @@ def run(experiment): timeout=60*60, verbose=True ) - model_selection.fit(data.training) + model_selection.fit(train) model = model_selection.best_model() best_params = model_selection.best_params_ else: diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index 6696402..8053d47 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -168,7 +168,7 @@ class AggregativeQuantifier(BaseQuantifier, ABC): :param instances: array-like of shape `(n_instances, n_features,)` :return: np.ndarray of shape `(n_instances,)` with label predictions """ - return getattr(self, self._classifier_method())(instances) + return getattr(self.classifier, self._classifier_method())(instances) def _classifier_method(self): """ @@ -1142,8 +1142,8 @@ class ThresholdOptimization(BinaryAggregativeQuantifier): def aggregate_with_threshold(self, classif_predictions, tpr, fpr, threshold): prevs_estim = np.mean(classif_predictions > threshold) if tpr - fpr != 0: - prevs_estim = np.clip((prevs_estim - fpr) / (tpr - fpr), 0, 1) - prevs_estim = np.array((1 - prevs_estim, prevs_estim)) + prevs_estim = (prevs_estim - fpr) / (tpr - fpr) + prevs_estim = F.as_binary_prevalence(prevs_estim, clip_if_necessary=True) return prevs_estim def _compute_table(self, y, y_): diff --git a/quapy/model_selection.py b/quapy/model_selection.py index 9017b99..307e7d3 100644 --- a/quapy/model_selection.py +++ b/quapy/model_selection.py @@ -112,7 +112,7 @@ class GridSearchQ(BaseQuantifier): return predictions predictions, status, took = self._error_handler(job, cls_params) - self._sout(f'[classifier fit] hyperparams={cls_params} status={status} [took {took:.3f}s]') + self._sout(f'[classifier fit] hyperparams={cls_params} [took {took:.3f}s]') return model, predictions, status, took def _prepare_aggregation(self, args): From c0d92a2083cc961f42702815278a5688d51eaab9 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Thu, 18 Jan 2024 18:22:22 +0100 Subject: [PATCH 020/216] optimization threshold variants fixed --- ..._checking_optim_threshold_modifications.py | 15 +++++++----- quapy/functional.py | 5 ++-- quapy/method/aggregative.py | 24 ++++++++++++------- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/examples/_uci_experiments_checking_optim_threshold_modifications.py b/examples/_uci_experiments_checking_optim_threshold_modifications.py index e5ae184..79f7208 100644 --- a/examples/_uci_experiments_checking_optim_threshold_modifications.py +++ b/examples/_uci_experiments_checking_optim_threshold_modifications.py @@ -15,7 +15,7 @@ import itertools import argparse from glob import glob import pandas as pd - +from time import time N_JOBS = -1 @@ -38,10 +38,11 @@ svmperf_params = {'classifier__C': __C_range} def quantification_models(): yield 'acc', ACC(newLR()), lr_params yield 'T50', T50(newLR()), lr_params - #yield 'X', X(newLR()), lr_params - #yield 'MAX', MAX(newLR()), lr_params + yield 'X', X(newLR()), lr_params + yield 'MAX', MAX(newLR()), lr_params yield 'MS', MS(newLR()), lr_params - yield 'MS2', MS2(newLR()), lr_params + yield 'MS+', MS(newLR()), lr_params + # yield 'MS2', MS2(newLR()), lr_params @@ -115,8 +116,10 @@ if __name__ == '__main__': optim_losses = ['mae'] datasets = qp.datasets.UCI_DATASETS + tstart = time() models = quantification_models() qp.util.parallel(run, itertools.product(optim_losses, datasets, models), n_jobs=N_JOBS) + tend = time() # open all results and show df = pd.DataFrame(columns=('method', 'dataset', 'mae')) @@ -126,6 +129,6 @@ if __name__ == '__main__': dataset = '-'.join(dataset) df.loc[i] = [method, dataset, mae] - print(df.pivot_table(index='dataset', columns='method', values='mae')) - + print(df.pivot_table(index='dataset', columns='method', values='mae', margins=True)) + print(f'took {(tend-tstart)}s') diff --git a/quapy/functional.py b/quapy/functional.py index d39b306..c6dc351 100644 --- a/quapy/functional.py +++ b/quapy/functional.py @@ -66,7 +66,7 @@ def prevalence_from_probabilities(posteriors, binarize: bool = False): return prevalences -def as_binary_prevalence(positive_prevalence: float, clip_if_necessary=False): +def as_binary_prevalence(positive_prevalence: Union[float, np.ndarray], clip_if_necessary=False): """ Helper that, given a float representing the prevalence for the positive class, returns a np.ndarray of two values representing a binary distribution. @@ -80,7 +80,8 @@ def as_binary_prevalence(positive_prevalence: float, clip_if_necessary=False): positive_prevalence = np.clip(positive_prevalence, 0, 1) else: assert 0 <= positive_prevalence <= 1, 'the value provided is not a valid prevalence for the positive class' - return np.asarray([1-positive_prevalence, positive_prevalence]) + return np.asarray([1-positive_prevalence, positive_prevalence]).T + def HellingerDistance(P, Q) -> float: diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index 8053d47..066f480 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -1102,7 +1102,7 @@ class ThresholdOptimization(BinaryAggregativeQuantifier): :param fpr: float, false positive rate :return: true if the combination is to be discarded, false otherwise """ - return (tpr + fpr) == 0 + return (tpr - fpr) == 0 def _eval_candidate_thresholds(self, decision_scores, y): @@ -1119,9 +1119,9 @@ class ThresholdOptimization(BinaryAggregativeQuantifier): candidates = [] scores = [] for candidate_threshold in candidate_thresholds: - y_ = self.classes_[1 * (decision_scores > candidate_threshold)] + y_ = self.classes_[1 * (decision_scores >= candidate_threshold)] TP, FP, FN, TN = self._compute_table(y, y_) - tpr = self._compute_tpr(TP, FP) + tpr = self._compute_tpr(TP, FN) fpr = self._compute_fpr(FP, TN) if not self.discard(tpr, fpr): candidate_score = self.condition(tpr, fpr) @@ -1139,12 +1139,18 @@ class ThresholdOptimization(BinaryAggregativeQuantifier): return candidates - def aggregate_with_threshold(self, classif_predictions, tpr, fpr, threshold): - prevs_estim = np.mean(classif_predictions > threshold) - if tpr - fpr != 0: - prevs_estim = (prevs_estim - fpr) / (tpr - fpr) - prevs_estim = F.as_binary_prevalence(prevs_estim, clip_if_necessary=True) - return prevs_estim + # def aggregate_with_threshold(self, classif_predictions, tpr, fpr, threshold): + # prevs_estim = np.mean(classif_predictions >= threshold) + # if tpr - fpr != 0: + # prevs_estim = (prevs_estim - fpr) / (tpr - fpr) + # prevs_estim = F.as_binary_prevalence(prevs_estim, clip_if_necessary=True) + # return prevs_estim + + def aggregate_with_threshold(self, classif_predictions, tprs, fprs, thresholds): + prevs_estims = np.mean(classif_predictions[:, None] >= thresholds, axis=0) + prevs_estims = (prevs_estims - fprs) / (tprs - fprs) + prevs_estims = F.as_binary_prevalence(prevs_estims, clip_if_necessary=True) + return prevs_estims.squeeze() def _compute_table(self, y, y_): TP = np.logical_and(y == y_, y == self.pos_label).sum() From b68b58ad113bd9cb54c8aa73df2be7d35aaa4911 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Thu, 18 Jan 2024 18:26:40 +0100 Subject: [PATCH 021/216] fixed optimization threshold methods (again) --- quapy/method/aggregative.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index 066f480..c6293c9 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -1278,16 +1278,21 @@ class MS(ThresholdOptimization): def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): # keeps all candidates decision_scores, y = classif_predictions.Xy - self.tprs_fprs_thresholds = self._eval_candidate_thresholds(decision_scores, y) + tprs_fprs_thresholds = self._eval_candidate_thresholds(decision_scores, y) + self.tprs = tprs_fprs_thresholds[:, 0] + self.fprs = tprs_fprs_thresholds[:, 1] + self.thresholds = tprs_fprs_thresholds[:, 2] return self def aggregate(self, classif_predictions: np.ndarray): - prevalences = [] - for tpr, fpr, threshold in self.tprs_fprs_thresholds: - pos_prev = self.aggregate_with_threshold(classif_predictions, tpr, fpr, threshold)[1] - prevalences.append(pos_prev) - median = np.median(prevalences) - return F.as_binary_prevalence(median) + prevalences = self.aggregate_with_threshold(classif_predictions, self.tprs, self.fprs, self.thresholds) + return np.median(prevalences, axis=0) + # prevalences = [] + # for tpr, fpr, threshold in self.tprs_fprs_thresholds: + # pos_prev = self.aggregate_with_threshold(classif_predictions, tpr, fpr, threshold)[1] + # prevalences.append(pos_prev) + # median = np.median(prevalences) + # return F.as_binary_prevalence(median) class MS2(MS): From 8d22ba39f41fb82d8d08c3a45504cc0ae2651b28 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Fri, 19 Jan 2024 18:11:22 +0100 Subject: [PATCH 022/216] method MS2 (Medium Sweep 2) fixed --- ..._checking_optim_threshold_modifications.py | 134 ------------------ quapy/method/aggregative.py | 22 +-- 2 files changed, 6 insertions(+), 150 deletions(-) delete mode 100644 examples/_uci_experiments_checking_optim_threshold_modifications.py diff --git a/examples/_uci_experiments_checking_optim_threshold_modifications.py b/examples/_uci_experiments_checking_optim_threshold_modifications.py deleted file mode 100644 index 79f7208..0000000 --- a/examples/_uci_experiments_checking_optim_threshold_modifications.py +++ /dev/null @@ -1,134 +0,0 @@ -from copy import deepcopy - -import quapy as qp -from sklearn.calibration import CalibratedClassifierCV -from sklearn.linear_model import LogisticRegression -from quapy.classification.methods import LowRankLogisticRegression -from quapy.method.meta import QuaNet -from quapy.protocol import APP -from quapy.method.aggregative import CC, ACC, PCC, PACC, MAX, MS, MS2, EMQ, HDy, newSVMAE, T50, X -from quapy.method.meta import EHDy -import numpy as np -import os -import pickle -import itertools -import argparse -from glob import glob -import pandas as pd -from time import time - -N_JOBS = -1 - -qp.environ['SAMPLE_SIZE'] = 100 - - -def newLR(): - return LogisticRegression(max_iter=1000, solver='lbfgs', n_jobs=-1) - - -def calibratedLR(): - return CalibratedClassifierCV(LogisticRegression(max_iter=1000, solver='lbfgs', n_jobs=-1)) - - -__C_range = np.logspace(-3, 3, 7) -lr_params = {'classifier__C': __C_range, 'classifier__class_weight': [None, 'balanced']} -svmperf_params = {'classifier__C': __C_range} - - -def quantification_models(): - yield 'acc', ACC(newLR()), lr_params - yield 'T50', T50(newLR()), lr_params - yield 'X', X(newLR()), lr_params - yield 'MAX', MAX(newLR()), lr_params - yield 'MS', MS(newLR()), lr_params - yield 'MS+', MS(newLR()), lr_params - # yield 'MS2', MS2(newLR()), lr_params - - - -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): - return os.path.exists(result_path(args.results, dataset_name, model_name, optim_loss)) - - -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 dataset_name in ['acute.a', 'acute.b', 'iris.1']: return - - 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 - - dataset = qp.datasets.fetch_UCIDataset(dataset_name) - - print(f'running dataset={dataset_name} model={model_name} loss={optim_loss}') - # model selection (hyperparameter optimization for a quantification-oriented loss) - train, test = dataset.train_test - train, val = train.split_stratified() - if hyperparams is not None: - model_selection = qp.model_selection.GridSearchQ( - deepcopy(model), - param_grid=hyperparams, - protocol=APP(val, n_prevalences=21, repeats=25), - error=optim_loss, - refit=True, - timeout=60*60, - verbose=True - ) - model_selection.fit(train) - model = model_selection.best_model() - else: - model.fit(dataset.training) - - # model evaluation - true_prevalences, estim_prevalences = qp.evaluation.prediction( - model, - protocol=APP(test, n_prevalences=21, repeats=100) - ) - - mae = qp.error.mae(true_prevalences, estim_prevalences) - save_results(dataset_name, model_name, optim_loss, mae) - - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description='Run experiments for Tweeter Sentiment Quantification') - parser.add_argument('--results', metavar='RESULT_PATH', type=str, default='results_tmp', - 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') - args = parser.parse_args() - - print(f'Result folder: {args.results}') - np.random.seed(0) - - qp.environ['SVMPERF_HOME'] = args.svmperfpath - - optim_losses = ['mae'] - datasets = qp.datasets.UCI_DATASETS - - tstart = time() - models = quantification_models() - qp.util.parallel(run, itertools.product(optim_losses, datasets, models), n_jobs=N_JOBS) - tend = time() - - # open all results and show - df = pd.DataFrame(columns=('method', 'dataset', 'mae')) - for i, file in enumerate(glob(f'{args.results}/*.pkl')): - mae = float(pickle.load(open(file, 'rb'))[0]) - *dataset, method, _ = file.split('/')[-1].split('-') - dataset = '-'.join(dataset) - df.loc[i] = [method, dataset, mae] - - print(df.pivot_table(index='dataset', columns='method', values='mae', margins=True)) - - print(f'took {(tend-tstart)}s') diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index c6293c9..c3e24db 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -1131,21 +1131,15 @@ class ThresholdOptimization(BinaryAggregativeQuantifier): if len(candidates) == 0: # if no candidate gives rise to a valid combination of tpr and fpr, this method defaults to the standard # classify & count; this is akin to assign tpr=1, fpr=0, threshold=0 - tpr, fpr, threshold, score = 1, 0, 0, 0 - candidates.append([tpr, fpr, threshold, score]) + tpr, fpr, threshold = 1, 0, 0 + candidates.append([tpr, fpr, threshold]) + scores.append(0) candidates = np.asarray(candidates) candidates = candidates[np.argsort(scores)] # sort candidates by candidate_score return candidates - # def aggregate_with_threshold(self, classif_predictions, tpr, fpr, threshold): - # prevs_estim = np.mean(classif_predictions >= threshold) - # if tpr - fpr != 0: - # prevs_estim = (prevs_estim - fpr) / (tpr - fpr) - # prevs_estim = F.as_binary_prevalence(prevs_estim, clip_if_necessary=True) - # return prevs_estim - def aggregate_with_threshold(self, classif_predictions, tprs, fprs, thresholds): prevs_estims = np.mean(classif_predictions[:, None] >= thresholds, axis=0) prevs_estims = (prevs_estims - fprs) / (tprs - fprs) @@ -1286,13 +1280,9 @@ class MS(ThresholdOptimization): def aggregate(self, classif_predictions: np.ndarray): prevalences = self.aggregate_with_threshold(classif_predictions, self.tprs, self.fprs, self.thresholds) - return np.median(prevalences, axis=0) - # prevalences = [] - # for tpr, fpr, threshold in self.tprs_fprs_thresholds: - # pos_prev = self.aggregate_with_threshold(classif_predictions, tpr, fpr, threshold)[1] - # prevalences.append(pos_prev) - # median = np.median(prevalences) - # return F.as_binary_prevalence(median) + if prevalences.ndim==2: + prevalences = np.median(prevalences, axis=0) + return prevalences class MS2(MS): From 7137e7ac401798202439e3b741894738c18b853c Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Fri, 19 Jan 2024 18:18:38 +0100 Subject: [PATCH 023/216] updating change log file to give credit to T.Schumacher and colleagues for pointing out the errors in the threshold optimization methods --- quapy/CHANGE_LOG.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/quapy/CHANGE_LOG.txt b/quapy/CHANGE_LOG.txt index 1534038..43f4fdf 100644 --- a/quapy/CHANGE_LOG.txt +++ b/quapy/CHANGE_LOG.txt @@ -1,6 +1,9 @@ Change Log 0.1.8 ---------------- +- Fixed ThresholdOptimization methods (X, T50, MAX, MS and MS2). Thanks to Tobias Schumacher and colleagues for pointing + this out in Appendix A of "Schumacher, T., Strohmaier, M., & Lemmerich, F. (2021). A comparative evaluation of + quantification methods. arXiv:2103.03223v3 [cs.LG]" - Added HDx and DistributionMatchingX to non-aggregative quantifiers (see also the new example "comparing_HDy_HDx.py") - New UCI multiclass datasets added (thanks to Pablo González). The 5 UCI multiclass datasets are those corresponding to the following criteria: From ff00de18cbf0396c8d1ad2f12bb96bb3fe12fb2b Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Fri, 19 Jan 2024 18:24:38 +0100 Subject: [PATCH 024/216] updating documentation a bit --- quapy/method/aggregative.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index c3e24db..b7b7409 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -1141,6 +1141,8 @@ class ThresholdOptimization(BinaryAggregativeQuantifier): return candidates def aggregate_with_threshold(self, classif_predictions, tprs, fprs, thresholds): + # This function performs the adjusted count for given tpr, fpr, and threshold. + # Note that, due to broadcasting, tprs, fprs, and thresholds could be arrays of length > 1 prevs_estims = np.mean(classif_predictions[:, None] >= thresholds, axis=0) prevs_estims = (prevs_estims - fprs) / (tprs - fprs) prevs_estims = F.as_binary_prevalence(prevs_estims, clip_if_necessary=True) @@ -1164,8 +1166,8 @@ class ThresholdOptimization(BinaryAggregativeQuantifier): return FP / (FP + TN) def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): - # the standard behavior is to keep the best threshold only decision_scores, y = classif_predictions.Xy + # the standard behavior is to keep the best threshold only self.tpr, self.fpr, self.threshold = self._eval_candidate_thresholds(decision_scores, y)[0] return self @@ -1270,8 +1272,8 @@ class MS(ThresholdOptimization): return 1 def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): - # keeps all candidates decision_scores, y = classif_predictions.Xy + # keeps all candidates tprs_fprs_thresholds = self._eval_candidate_thresholds(decision_scores, y) self.tprs = tprs_fprs_thresholds[:, 0] self.fprs = tprs_fprs_thresholds[:, 1] From 7ac834bd2c525badd0ce821eafe3ecc8235a296e Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Thu, 25 Jan 2024 14:33:41 +0100 Subject: [PATCH 025/216] refactoring aggregation methods --- README.md | 5 +- examples/model_selection.py | 2 +- quapy/CHANGE_LOG.txt | 5 + quapy/method/__init__.py | 3 + quapy/method/{kdey.py => _kdey.py} | 5 +- quapy/method/{neural.py => _neural.py} | 0 quapy/method/aggregative.py | 511 ++++++++----------------- quapy/method/meta.py | 8 +- quapy/tests/test_methods.py | 12 +- 9 files changed, 178 insertions(+), 373 deletions(-) rename quapy/method/{kdey.py => _kdey.py} (98%) rename quapy/method/{neural.py => _neural.py} (100%) diff --git a/README.md b/README.md index e48f87e..12164a3 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ for facilitating the analysis and interpretation of the experimental results. ### Last updates: -* Version 0.1.7 is released! major changes can be consulted [here](quapy/CHANGE_LOG.txt). +* Version 0.1.8 is released! major changes can be consulted [here](quapy/CHANGE_LOG.txt). * A detailed documentation is now available [here](https://hlt-isti.github.io/QuaPy/) * The developer API documentation is available [here](https://hlt-isti.github.io/QuaPy/build/html/modules.html) @@ -96,6 +96,9 @@ quantification methods based on structured output learning, HDy, QuaNet, quantif * pandas, xlrd * matplotlib +## Contributing + +In case you want to contribute improvements to quapy, please generate pull request to the "devel" branch. ## Documentation diff --git a/examples/model_selection.py b/examples/model_selection.py index 4e52784..08fbe34 100644 --- a/examples/model_selection.py +++ b/examples/model_selection.py @@ -1,5 +1,5 @@ import quapy as qp -from method.kdey import KDEyML +from method._kdey import KDEyML from quapy.method.non_aggregative import DMx from quapy.protocol import APP, UPP from quapy.method.aggregative import DMy diff --git a/quapy/CHANGE_LOG.txt b/quapy/CHANGE_LOG.txt index 43f4fdf..8b2e38f 100644 --- a/quapy/CHANGE_LOG.txt +++ b/quapy/CHANGE_LOG.txt @@ -4,15 +4,20 @@ Change Log 0.1.8 - Fixed ThresholdOptimization methods (X, T50, MAX, MS and MS2). Thanks to Tobias Schumacher and colleagues for pointing this out in Appendix A of "Schumacher, T., Strohmaier, M., & Lemmerich, F. (2021). A comparative evaluation of quantification methods. arXiv:2103.03223v3 [cs.LG]" + - Added HDx and DistributionMatchingX to non-aggregative quantifiers (see also the new example "comparing_HDy_HDx.py") + - New UCI multiclass datasets added (thanks to Pablo González). The 5 UCI multiclass datasets are those corresponding to the following criteria: - >1000 instances - >2 classes - classification datasets - Python API available + - New IFCB (plankton) dataset added. See fetch_IFCB. + - Added new evaluation measures NAE, NRAE + - Added new meta method "MedianEstimator"; an ensemble of binary base quantifiers that receives as input a dictionary of hyperparameters that will explore exhaustively, fitting and generating predictions for each combination of hyperparameters, and that returns, as the prevalence estimates, the median across all predictions. diff --git a/quapy/method/__init__.py b/quapy/method/__init__.py index 89ffcfc..de57d96 100644 --- a/quapy/method/__init__.py +++ b/quapy/method/__init__.py @@ -17,6 +17,9 @@ AGGREGATIVE_METHODS = { aggregative.MAX, aggregative.MS, aggregative.MS2, + aggregative.KDEyML, + aggregative.KDEyCS, + aggregative.KDEyHD, } diff --git a/quapy/method/kdey.py b/quapy/method/_kdey.py similarity index 98% rename from quapy/method/kdey.py rename to quapy/method/_kdey.py index b3cdf0e..c066ec8 100644 --- a/quapy/method/kdey.py +++ b/quapy/method/_kdey.py @@ -12,6 +12,9 @@ from sklearn.metrics.pairwise import rbf_kernel class KDEBase: + """ + Common ancestor for KDE-based methods. Implements some common routines. + """ BANDWIDTH_METHOD = ['scott', 'silverman'] @@ -156,7 +159,6 @@ class KDEyCS(AggregativeSoftQuantifier): assert all(sorted(np.unique(y)) == np.arange(n)), \ 'label name gaps not allowed in current implementation' - # counts_inv keeps track of the relative weight of each datapoint within its class # (i.e., the weight in its KDE model) counts_inv = 1 / (data.counts()) @@ -190,7 +192,6 @@ class KDEyCS(AggregativeSoftQuantifier): Minv = (1/M) # t in the paper n = Ptr.shape[1] - # becomes a constant that does not affect the optimization, no need to compute it # partC = 0.5*np.log(self.gram_matrix_mix_sum(Pte) * Kinv * Kinv) diff --git a/quapy/method/neural.py b/quapy/method/_neural.py similarity index 100% rename from quapy/method/neural.py rename to quapy/method/_neural.py diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index b7b7409..dd277e0 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -50,6 +50,16 @@ class AggregativeQuantifier(BaseQuantifier, ABC): 'model selection. Rather pass the LabelledCollection at fit time') self.val_split_ = val_split + def _check_init_parameters(self): + """ + Implements any check to be performed in the parameters of the init method before undertaking + the training of the quantifier. This is made as to allow for a quick execution stop when the + parameters are not valid. + + :return: Nothing. May raise an exception. + """ + pass + def fit(self, data: LabelledCollection, fit_classifier=True, val_split=None): """ Trains the aggregative quantifier. This comes down to training a classifier and an aggregation function. @@ -59,6 +69,7 @@ class AggregativeQuantifier(BaseQuantifier, ABC): learner has been trained outside the quantifier. :return: self """ + self._check_init_parameters() classif_predictions = self.classifier_fit_predict(data, fit_classifier, predict_on=val_split) self.aggregation_fit(classif_predictions, data) return self @@ -113,8 +124,9 @@ class AggregativeQuantifier(BaseQuantifier, ABC): raise ValueError(f'invalid value {predict_on} in fit. ' f'Specify a integer >1 for kFCV estimation.') else: + n_jobs = self.n_jobs if hasattr(self, 'n_jobs') else qp._get_njobs(None) predictions = cross_val_predict( - self.classifier, *data.Xy, cv=predict_on, n_jobs=self.n_jobs, method=self._classifier_method()) + self.classifier, *data.Xy, cv=predict_on, n_jobs=n_jobs, method=self._classifier_method()) predictions = LabelledCollection(predictions, data.y, classes=data.classes_) self.classifier.fit(*data.Xy) else: @@ -289,8 +301,6 @@ class BinaryAggregativeQuantifier(AggregativeQuantifier, BinaryQuantifier): def fit(self, data: LabelledCollection, fit_classifier=True, val_split=None): self._check_binary(data, self.__class__.__name__) return super().fit(data, fit_classifier, val_split) - - # Methods @@ -333,18 +343,28 @@ class ACC(AggregativeCrispQuantifier): :param classifier: a sklearn's Estimator that generates a classifier :param val_split: specifies the data used for generating classifier predictions. This specification can be made as float in (0, 1) indicating the proportion of stratified held-out validation set to - be extracted from the training set (default 0.4); or as an integer, indicating that the predictions + be extracted from the training set; or as an integer (default 5), indicating that the predictions are to be generated in a `k`-fold cross-validation manner (with this integer indicating the value for `k`); or as a collection defining the specific set of data to use for validation. Alternatively, this set can be specified at fit time by indicating the exact set of data on which the predictions are to be generated. :param n_jobs: number of parallel workers + :param solver: indicates the method to be used for obtaining the final esimates. The default choice + is 'exact', which comes down to solving the system of linear equations `Ax=B` where `A` is a + matrix containing the class-conditional probabilities of the predictions (e.g., the tpr and fpr in + binary) and `B` is the vector of prevalence values estimated via CC, as $x=A^{-1}B$. This solution + might not exist for degenerated classifiers, in which case the method defaults to classify and count + (i.e., does not attempt any adjustment). + Another option is to search for the prevalence vector that minimizes the loss |Ax-B|. The latter is + achieved by indicating solver='minimize'. """ - def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None): + def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None, solver='exact'): self.classifier = classifier self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) + assert solver in ['exact', 'minimize'], "unknown solver; valid ones are 'exact', 'minimize'" + self.solver = solver def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ @@ -358,7 +378,7 @@ class ACC(AggregativeCrispQuantifier): @classmethod def getPteCondEstim(cls, classes, y, y_): - # estimate the matrix with entry (i,j) being the estimate of P(yi|yj), that is, the probability that a + # estimate the matrix with entry (i,j) being the estimate of P(hat_yi|yj), that is, the probability that a # document that belongs to yj ends up being classified as belonging to yi conf = confusion_matrix(y, y_, labels=classes).T conf = conf.astype(float) @@ -372,10 +392,10 @@ class ACC(AggregativeCrispQuantifier): def aggregate(self, classif_predictions): prevs_estim = self.cc.aggregate(classif_predictions) - return ACC.solve_adjustment(self.Pte_cond_estim_, prevs_estim) + return ACC.solve_adjustment(self.Pte_cond_estim_, prevs_estim, solver=self.solver) @classmethod - def solve_adjustment(cls, PteCondEstim, prevs_estim): + def solve_adjustment(cls, PteCondEstim, prevs_estim, solver='exact'): """ Solves the system linear system :math:`Ax = B` with :math:`A` = `PteCondEstim` and :math:`B` = `prevs_estim` @@ -383,16 +403,24 @@ class ACC(AggregativeCrispQuantifier): of :math:`P(y_i|y_j)`, that is, the probability that an instance that belongs to :math:`y_j` ends up being classified as belonging to :math:`y_i` :param prevs_estim: a `np.ndarray` of shape `(n_classes,)` with the class prevalence estimates + :param solver: indicates the method to use for solving the system of linear equations. Valid options are + 'exact' (tries to solve the system --may fail if the misclassificatin matrix has rank < n_classes) or + 'optim_minimize' (minimizes a norm --always exists). :return: an adjusted `np.ndarray` of shape `(n_classes,)` with the corrected class prevalence estimates """ A = PteCondEstim B = prevs_estim - try: - adjusted_prevs = np.linalg.solve(A, B) - adjusted_prevs = np.clip(adjusted_prevs, 0, 1) - adjusted_prevs /= adjusted_prevs.sum() - except np.linalg.LinAlgError: - adjusted_prevs = prevs_estim # no way to adjust them! + if solver == 'exact': + try: + adjusted_prevs = np.linalg.solve(A, B) + adjusted_prevs = np.clip(adjusted_prevs, 0, 1) + adjusted_prevs /= adjusted_prevs.sum() + except np.linalg.LinAlgError: + adjusted_prevs = prevs_estim # no way to adjust them! + elif solver == 'minimize': + def loss(prev): + return np.linalg.norm(A@prev - B) + return F.optim_minimize(loss, n_classes=A.shape[0]) return adjusted_prevs @@ -427,7 +455,7 @@ class PACC(AggregativeSoftQuantifier): :param classifier: a sklearn's Estimator that generates a classifier :param val_split: specifies the data used for generating classifier predictions. This specification can be made as float in (0, 1) indicating the proportion of stratified held-out validation set to - be extracted from the training set (default 0.4); or as an integer, indicating that the predictions + be extracted from the training set; or as an integer (default 5), indicating that the predictions are to be generated in a `k`-fold cross-validation manner (with this integer indicating the value for `k`). Alternatively, this set can be specified at fit time by indicating the exact set of data on which the predictions are to be generated. @@ -455,7 +483,7 @@ class PACC(AggregativeSoftQuantifier): @classmethod def getPteCondEstim(cls, classes, y, y_): - # estimate the matrix with entry (i,j) being the estimate of P(yi|yj), that is, the probability that a + # estimate the matrix with entry (i,j) being the estimate of P(hat_yi|yj), that is, the probability that a # document that belongs to yj ends up being classified as belonging to yi n_classes = len(classes) confusion = np.eye(n_classes) @@ -475,17 +503,100 @@ class EMQ(AggregativeSoftQuantifier): probabilities generated by a probabilistic classifier and the class prevalence estimates obtained via maximum-likelihood estimation, in a mutually recursive way, until convergence. + This implementation also gives access to the heuristics proposed by `Alexandari et al. paper + `_. These heuristics consist of using, as the training + prevalence, an estimate of it obtained via k-fold cross validation (instead of the true training prevalence), + and to recalibrate the posterior probabilities of the classifier. + :param classifier: a sklearn's Estimator that generates a classifier + :param val_split: specifies the data used for generating classifier predictions. This specification + can be made as float in (0, 1) indicating the proportion of stratified held-out validation set to + be extracted from the training set; or as an integer, indicating that the predictions + are to be generated in a `k`-fold cross-validation manner (with this integer indicating the value + for `k`, default 5); or as a collection defining the specific set of data to use for validation. + Alternatively, this set can be specified at fit time by indicating the exact set of data + on which the predictions are to be generated. This hyperparameter is only meant to be used when the + heuristics are to be applied, i.e., if a recalibration is required. The default value is None (meaning + the recalibration is not required). In case this hyperparameter is set to a value other than None, but + the recalibration is not required (recalib=None), a warning message will be raised. + :param exact_train_prev: set to True (default) for using the true training prevalence as the initial observation; + set to False for computing the training prevalence as an estimate of it, i.e., as the expected + value of the posterior probabilities of the training instances. + :param recalib: a string indicating the method of recalibration. + Available choices include "nbvs" (No-Bias Vector Scaling), "bcts" (Bias-Corrected Temperature Scaling, + default), "ts" (Temperature Scaling), and "vs" (Vector Scaling). Default is None (no recalibration). + :param n_jobs: number of parallel workers. Only used for recalibrating the classifier if `val_split` is set to + an integer `k` --the number of folds. """ MAX_ITER = 1000 EPSILON = 1e-4 - def __init__(self, classifier: BaseEstimator): + def __init__(self, classifier: BaseEstimator, val_split=None, exact_train_prev=True, recalib=None, n_jobs=None): self.classifier = classifier + self.val_split = val_split + self.exact_train_prev = exact_train_prev + self.recalib = recalib + self.n_jobs = n_jobs + + @classmethod + def EMQ_BCTS(cls, classifier: BaseEstimator, n_jobs=None): + """ + Constructs an instance of EMQ using the best configuration found in the `Alexandari et al. paper + `_, i.e., one that relies on Bias-Corrected Temperature + Scaling (BCTS) as a recalibration function, and that uses an estimate of the training prevalence instead of + the true training prevalence. + + :param classifier: a sklearn's Estimator that generates a classifier + :param n_jobs: number of parallel workers. + :return: An instance of EMQ with BCTS + """ + return EMQ(classifier, val_split=5, exact_train_prev=False, recalib='bcts', n_jobs=n_jobs) + + def _check_init_parameters(self): + if self.val_split is not None: + if self.exact_train_prev and self.recalib is None: + raise RuntimeWarning(f'The parameter {self.val_split=} was specified for EMQ, while the parameters ' + f'{self.exact_train_prev=} and {self.recalib=}. This has no effect and causes an unnecessary ' + f'overload.') + + def classify(self, instances): + """ + Provides the posterior probabilities for the given instances. If the classifier was required + to be recalibrated, then these posteriors are recalibrated accordingly. + + :param instances: array-like of shape `(n_instances, n_dimensions,)` + :return: np.ndarray of shape `(n_instances, n_classes,)` with posterior probabilities + """ + posteriors = self.classifier.predict_proba(instances) + if hasattr(self, 'calibration_function') and self.calibration_function is not None: + posteriors = self.calibration_function(posteriors) + return posteriors def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): - self.train_prevalence = data.prevalence() + if self.recalib is not None: + P, y = classif_predictions.Xy + if self.recalib == 'nbvs': + calibrator = NoBiasVectorScaling() + elif self.recalib == 'bcts': + calibrator = TempScaling(bias_positions='all') + elif self.recalib == 'ts': + calibrator = TempScaling() + elif self.recalib == 'vs': + calibrator = VectorScaling() + else: + raise ValueError('invalid param argument for recalibration method; available ones are ' + '"nbvs", "bcts", "ts", and "vs".') + + self.calibration_function = calibrator(P, np.eye(data.n_classes)[y], posterior_supplied=True) + + if self.exact_train_prev: + self.train_prevalence = data.prevalence() + else: + train_posteriors = classif_predictions.X + if self.recalib is not None: + train_posteriors = self.calibration_function(train_posteriors) + self.train_prevalence = F.prevalence_from_probabilities(train_posteriors) def aggregate(self, classif_posteriors, epsilon=EPSILON): priors, posteriors = self.EM(self.train_prevalence, classif_posteriors, epsilon) @@ -542,93 +653,6 @@ class EMQ(AggregativeSoftQuantifier): return qs, ps -class EMQrecalib(AggregativeSoftQuantifier): - """ - `Expectation Maximization for Quantification `_ (EMQ), - aka `Saerens-Latinne-Decaestecker` (SLD) algorithm, with the heuristics proposed by - `Alexandari et al. paper `_. - - These heuristics consist of using, as the training prevalence, an estimate of it obtained via k-fold cross - validation (instead of the true training prevalence), and to recalibrate the posterior probabilities of - the classifier. - - :param classifier: a sklearn's Estimator that generates a classifier - :param val_split: specifies the data used for generating classifier predictions. This specification - can be made as float in (0, 1) indicating the proportion of stratified held-out validation set to - be extracted from the training set (default 0.4); or as an integer, indicating that the predictions - are to be generated in a `k`-fold cross-validation manner (with this integer indicating the value - for `k`, default 5); or as a collection defining the specific set of data to use for validation. - Alternatively, this set can be specified at fit time by indicating the exact set of data - on which the predictions are to be generated. - :param exact_train_prev: set to True (default) for using, as the initial observation, the true training prevalence; - or set to False for computing the training prevalence as an estimate of it, i.e., as the expected - value of the posterior probabilities of the training instances - :param recalib: a string indicating the method of recalibration. - Available choices include "nbvs" (No-Bias Vector Scaling), "bcts" (Bias-Corrected Temperature Scaling, - default), "ts" (Temperature Scaling), and "vs" (Vector Scaling). - :param n_jobs: number of parallel workers - """ - - MAX_ITER = 1000 - EPSILON = 1e-4 - - def __init__(self, classifier: BaseEstimator, val_split=5, exact_train_prev=False, recalib='bcts', n_jobs=None): - self.classifier = classifier - self.val_split = val_split - self.exact_train_prev = exact_train_prev - self.recalib = recalib - self.n_jobs = n_jobs - - def classify(self, instances): - """ - Provides the posterior probabilities for the given instances. If the classifier is - recalibrated, then these posteriors will be recalibrated accordingly. - - :param instances: array-like of shape `(n_instances, n_dimensions,)` - :return: np.ndarray of shape `(n_instances, n_classes,)` with posterior probabilities - """ - posteriors = self.classifier.predict_proba(instances) - if hasattr(self, 'calibration_function') and self.calibration_function is not None: - posteriors = self.calibration_function(posteriors) - return posteriors - - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): - if self.recalib is not None: - P, y = classif_predictions.Xy - if self.recalib == 'nbvs': - calibrator = NoBiasVectorScaling() - elif self.recalib == 'bcts': - calibrator = TempScaling(bias_positions='all') - elif self.recalib == 'ts': - calibrator = TempScaling() - elif self.recalib == 'vs': - calibrator = VectorScaling() - else: - raise ValueError('invalid param argument for recalibration method; available ones are ' - '"nbvs", "bcts", "ts", and "vs".') - - self.calibration_function = calibrator(P, np.eye(data.n_classes)[y], posterior_supplied=True) - - if self.exact_train_prev: - self.train_prevalence = F.prevalence_from_labels(data.labels, self.classes_) - else: - if self.recalib is not None: - train_posteriors = self.classify(data.X) - else: - train_posteriors = classif_predictions.X - - self.train_prevalence = np.mean(train_posteriors, axis=0) - - def aggregate(self, classif_posteriors, epsilon=EPSILON): - priors, posteriors = EMQ.EM(self.train_prevalence, classif_posteriors, epsilon) - return priors - - def predict_proba(self, instances, epsilon=EPSILON): - classif_posteriors = self.classify(instances) - priors, posteriors = EMQ.EM(self.train_prevalence, classif_posteriors, epsilon) - return posteriors - - class HDy(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): """ `Hellinger Distance y `_ (HDy). @@ -722,14 +746,16 @@ class DyS(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): :param divergence: a str indicating the name of divergence (currently supported ones are "HD" or "topsoe"), or a callable function computes the divergence between two distributions (two equally sized arrays). :param tol: a float with the tolerance for the ternary search algorithm. + :param n_jobs: number of parallel workers. """ - def __init__(self, classifier: BaseEstimator, val_split=5, n_bins=8, divergence: Union[str, Callable]= 'HD', tol=1e-05): + def __init__(self, classifier: BaseEstimator, val_split=5, n_bins=8, divergence: Union[str, Callable]= 'HD', tol=1e-05, n_jobs=None): self.classifier = classifier self.val_split = val_split self.tol = tol self.divergence = divergence self.n_bins = n_bins + self.n_jobs = n_jobs def _ternary_search(self, f, left, right, tol): """ @@ -1058,259 +1084,6 @@ def newSVMRAE(svmperf_base=None, C=1): return newELM(svmperf_base, loss='mrae', C=C) -class ThresholdOptimization(BinaryAggregativeQuantifier): - """ - Abstract class of Threshold Optimization variants for :class:`ACC` as proposed by - `Forman 2006 `_ and - `Forman 2008 `_. - The goal is to bring improved stability to the denominator of the adjustment. - The different variants are based on different heuristics for choosing a decision threshold - that would allow for more true positives and many more false positives, on the grounds this - would deliver larger denominators. - - :param classifier: a sklearn's Estimator that generates a classifier - :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the - misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1), representing a proportion of - validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a - :class:`quapy.data.base.LabelledCollection` (the split itself). - """ - - def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None): - self.classifier = classifier - self.val_split = val_split - self.n_jobs = qp._get_njobs(n_jobs) - - @abstractmethod - def condition(self, tpr, fpr) -> float: - """ - Implements the criterion according to which the threshold should be selected. - This function should return the (float) score to be minimized. - - :param tpr: float, true positive rate - :param fpr: float, false positive rate - :return: float, a score for the given `tpr` and `fpr` - """ - ... - - def discard(self, tpr, fpr) -> bool: - """ - Indicates whether a combination of tpr and fpr should be discarded - - :param tpr: float, true positive rate - :param fpr: float, false positive rate - :return: true if the combination is to be discarded, false otherwise - """ - return (tpr - fpr) == 0 - - - def _eval_candidate_thresholds(self, decision_scores, y): - """ - Seeks for the best `tpr` and `fpr` according to the score obtained at different - decision thresholds. The scoring function is implemented in function `_condition`. - - :param decision_scores: array-like with the classification scores - :param y: predicted labels for the validation set (or for the training set via `k`-fold cross validation) - :return: best `tpr` and `fpr` and `threshold` according to `_condition` - """ - candidate_thresholds = np.unique(decision_scores) - - candidates = [] - scores = [] - for candidate_threshold in candidate_thresholds: - y_ = self.classes_[1 * (decision_scores >= candidate_threshold)] - TP, FP, FN, TN = self._compute_table(y, y_) - tpr = self._compute_tpr(TP, FN) - fpr = self._compute_fpr(FP, TN) - if not self.discard(tpr, fpr): - candidate_score = self.condition(tpr, fpr) - candidates.append([tpr, fpr, candidate_threshold]) - scores.append(candidate_score) - - if len(candidates) == 0: - # if no candidate gives rise to a valid combination of tpr and fpr, this method defaults to the standard - # classify & count; this is akin to assign tpr=1, fpr=0, threshold=0 - tpr, fpr, threshold = 1, 0, 0 - candidates.append([tpr, fpr, threshold]) - scores.append(0) - - candidates = np.asarray(candidates) - candidates = candidates[np.argsort(scores)] # sort candidates by candidate_score - - return candidates - - def aggregate_with_threshold(self, classif_predictions, tprs, fprs, thresholds): - # This function performs the adjusted count for given tpr, fpr, and threshold. - # Note that, due to broadcasting, tprs, fprs, and thresholds could be arrays of length > 1 - prevs_estims = np.mean(classif_predictions[:, None] >= thresholds, axis=0) - prevs_estims = (prevs_estims - fprs) / (tprs - fprs) - prevs_estims = F.as_binary_prevalence(prevs_estims, clip_if_necessary=True) - return prevs_estims.squeeze() - - def _compute_table(self, y, y_): - TP = np.logical_and(y == y_, y == self.pos_label).sum() - FP = np.logical_and(y != y_, y == self.neg_label).sum() - FN = np.logical_and(y != y_, y == self.pos_label).sum() - TN = np.logical_and(y == y_, y == self.neg_label).sum() - return TP, FP, FN, TN - - def _compute_tpr(self, TP, FP): - if TP + FP == 0: - return 1 - return TP / (TP + FP) - - def _compute_fpr(self, FP, TN): - if FP + TN == 0: - return 0 - return FP / (FP + TN) - - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): - decision_scores, y = classif_predictions.Xy - # the standard behavior is to keep the best threshold only - self.tpr, self.fpr, self.threshold = self._eval_candidate_thresholds(decision_scores, y)[0] - return self - - def aggregate(self, classif_predictions: np.ndarray): - # the standard behavior is to compute the adjusted count using the best threshold found - return self.aggregate_with_threshold(classif_predictions, self.tpr, self.fpr, self.threshold) - - -class T50(ThresholdOptimization): - """ - Threshold Optimization variant for :class:`ACC` as proposed by - `Forman 2006 `_ and - `Forman 2008 `_ that looks - for the threshold that makes `tpr` closest to 0.5. - The goal is to bring improved stability to the denominator of the adjustment. - - :param classifier: a sklearn's Estimator that generates a classifier - :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the - misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1), representing a proportion of - validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a - :class:`quapy.data.base.LabelledCollection` (the split itself). - """ - - def __init__(self, classifier: BaseEstimator, val_split=5): - super().__init__(classifier, val_split) - - def condition(self, tpr, fpr) -> float: - return abs(tpr - 0.5) - - -class MAX(ThresholdOptimization): - """ - Threshold Optimization variant for :class:`ACC` as proposed by - `Forman 2006 `_ and - `Forman 2008 `_ that looks - for the threshold that maximizes `tpr-fpr`. - The goal is to bring improved stability to the denominator of the adjustment. - - :param classifier: a sklearn's Estimator that generates a classifier - :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the - misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1), representing a proportion of - validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a - :class:`quapy.data.base.LabelledCollection` (the split itself). - """ - - def __init__(self, classifier: BaseEstimator, val_split=5): - super().__init__(classifier, val_split) - - def condition(self, tpr, fpr) -> float: - # MAX strives to maximize (tpr - fpr), which is equivalent to minimize (fpr - tpr) - return (fpr - tpr) - - -class X(ThresholdOptimization): - """ - Threshold Optimization variant for :class:`ACC` as proposed by - `Forman 2006 `_ and - `Forman 2008 `_ that looks - for the threshold that yields `tpr=1-fpr`. - The goal is to bring improved stability to the denominator of the adjustment. - - :param classifier: a sklearn's Estimator that generates a classifier - :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the - misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1), representing a proportion of - validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a - :class:`quapy.data.base.LabelledCollection` (the split itself). - """ - - def __init__(self, classifier: BaseEstimator, val_split=5): - super().__init__(classifier, val_split) - - def condition(self, tpr, fpr) -> float: - return abs(1 - (tpr + fpr)) - - -class MS(ThresholdOptimization): - """ - Median Sweep. Threshold Optimization variant for :class:`ACC` as proposed by - `Forman 2006 `_ and - `Forman 2008 `_ that generates - class prevalence estimates for all decision thresholds and returns the median of them all. - The goal is to bring improved stability to the denominator of the adjustment. - - :param classifier: a sklearn's Estimator that generates a classifier - :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the - misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1), representing a proportion of - validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a - :class:`quapy.data.base.LabelledCollection` (the split itself). - """ - def __init__(self, classifier: BaseEstimator, val_split=5): - super().__init__(classifier, val_split) - - def condition(self, tpr, fpr) -> float: - return 1 - - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): - decision_scores, y = classif_predictions.Xy - # keeps all candidates - tprs_fprs_thresholds = self._eval_candidate_thresholds(decision_scores, y) - self.tprs = tprs_fprs_thresholds[:, 0] - self.fprs = tprs_fprs_thresholds[:, 1] - self.thresholds = tprs_fprs_thresholds[:, 2] - return self - - def aggregate(self, classif_predictions: np.ndarray): - prevalences = self.aggregate_with_threshold(classif_predictions, self.tprs, self.fprs, self.thresholds) - if prevalences.ndim==2: - prevalences = np.median(prevalences, axis=0) - return prevalences - - -class MS2(MS): - """ - Median Sweep 2. Threshold Optimization variant for :class:`ACC` as proposed by - `Forman 2006 `_ and - `Forman 2008 `_ that generates - class prevalence estimates for all decision thresholds and returns the median of for cases in - which `tpr-fpr>0.25` - The goal is to bring improved stability to the denominator of the adjustment. - - :param classifier: a sklearn's Estimator that generates a classifier - :param val_split: indicates the proportion of data to be used as a stratified held-out validation set in which the - misclassification rates are to be estimated. - This parameter can be indicated as a real value (between 0 and 1), representing a proportion of - validation data, or as an integer, indicating that the misclassification rates should be estimated via - `k`-fold cross validation (this integer stands for the number of folds `k`, defaults 5), or as a - :class:`quapy.data.base.LabelledCollection` (the split itself). - """ - def __init__(self, classifier: BaseEstimator, val_split=5): - super().__init__(classifier, val_split) - - def discard(self, tpr, fpr) -> bool: - return (tpr-fpr) <= 0.25 - - class OneVsAllAggregative(OneVsAllGeneric, AggregativeQuantifier): """ Allows any binary quantifier to perform quantification on single-label datasets. @@ -1476,6 +1249,26 @@ class AggregativeMedianEstimator(BinaryQuantifier): ) return np.median(prev_preds, axis=0) + +#--------------------------------------------------------------- +# imports +#--------------------------------------------------------------- + +from . import _threshold_optim + +T50 = _threshold_optim.T50 +MAX = _threshold_optim.MAX +X = _threshold_optim.X +MS = _threshold_optim.MS +MS2 = _threshold_optim.MS2 + + +from . import _kdey + +KDEyML = _kdey.KDEyML +KDEyHD = _kdey.KDEyHD +KDEyCS = _kdey.KDEyCS + #--------------------------------------------------------------- # aliases #--------------------------------------------------------------- diff --git a/quapy/method/meta.py b/quapy/method/meta.py index d29433e..25248cd 100644 --- a/quapy/method/meta.py +++ b/quapy/method/meta.py @@ -15,13 +15,13 @@ from quapy.method.base import BaseQuantifier, BinaryQuantifier from quapy.method.aggregative import CC, ACC, PACC, HDy, EMQ, AggregativeQuantifier try: - from . import neural + from . import _neural except ModuleNotFoundError: - neural = None + _neural = None -if neural: - QuaNet = neural.QuaNetTrainer +if _neural: + QuaNet = _neural.QuaNetTrainer else: QuaNet = "QuaNet is not available due to missing torch package" diff --git a/quapy/tests/test_methods.py b/quapy/tests/test_methods.py index bca34e3..43c5c99 100644 --- a/quapy/tests/test_methods.py +++ b/quapy/tests/test_methods.py @@ -3,6 +3,7 @@ import pytest from sklearn.linear_model import LogisticRegression from sklearn.svm import LinearSVC +import method.aggregative import quapy as qp from quapy.model_selection import GridSearchQ from quapy.method.base import BinaryQuantifier @@ -13,8 +14,8 @@ from quapy.protocol import APP from quapy.method.aggregative import DMy from quapy.method.meta import MedianEstimator -datasets = [pytest.param(qp.datasets.fetch_twitter('hcr', pickle=True), id='hcr'), - pytest.param(qp.datasets.fetch_UCIDataset('ionosphere'), id='ionosphere')] +# datasets = [pytest.param(qp.datasets.fetch_twitter('hcr', pickle=True), id='hcr'), +# pytest.param(qp.datasets.fetch_UCIDataset('ionosphere'), id='ionosphere')] tinydatasets = [pytest.param(qp.datasets.fetch_twitter('hcr', pickle=True).reduce(), id='tiny_hcr'), pytest.param(qp.datasets.fetch_UCIDataset('ionosphere').reduce(), id='tiny_ionosphere')] @@ -22,7 +23,7 @@ tinydatasets = [pytest.param(qp.datasets.fetch_twitter('hcr', pickle=True).reduc learners = [LogisticRegression, LinearSVC] -@pytest.mark.parametrize('dataset', datasets) +@pytest.mark.parametrize('dataset', tinydatasets) @pytest.mark.parametrize('aggregative_method', AGGREGATIVE_METHODS) @pytest.mark.parametrize('learner', learners) def test_aggregative_methods(dataset: Dataset, aggregative_method, learner): @@ -42,7 +43,7 @@ def test_aggregative_methods(dataset: Dataset, aggregative_method, learner): assert type(error) == np.float64 -@pytest.mark.parametrize('dataset', datasets) +@pytest.mark.parametrize('dataset', tinydatasets) @pytest.mark.parametrize('non_aggregative_method', NON_AGGREGATIVE_METHODS) def test_non_aggregative_methods(dataset: Dataset, non_aggregative_method): model = non_aggregative_method() @@ -61,7 +62,7 @@ def test_non_aggregative_methods(dataset: Dataset, non_aggregative_method): assert type(error) == np.float64 -@pytest.mark.parametrize('base_method', AGGREGATIVE_METHODS) +@pytest.mark.parametrize('base_method', [method.aggregative.ACC, method.aggregative.PACC]) @pytest.mark.parametrize('learner', [LogisticRegression]) @pytest.mark.parametrize('dataset', tinydatasets) @pytest.mark.parametrize('policy', Ensemble.VALID_POLICIES) @@ -93,7 +94,6 @@ def test_quanet_method(): print('skipping QuaNet test due to missing torch package') return - qp.environ['SAMPLE_SIZE'] = 100 # load the kindle dataset as text, and convert words to numerical indexes From 74efa9751d8d1f1202f85a3f9cccecd095b7eb17 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Thu, 25 Jan 2024 16:43:00 +0100 Subject: [PATCH 026/216] adding the approximate solution to ACC and PACC as suggested by Mirko Bunse --- quapy/CHANGE_LOG.txt | 7 +++++++ quapy/method/aggregative.py | 33 ++++++++++++++++++++++++--------- quapy/model_selection.py | 17 ++++++++++++++++- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/quapy/CHANGE_LOG.txt b/quapy/CHANGE_LOG.txt index 8b2e38f..ced7dd9 100644 --- a/quapy/CHANGE_LOG.txt +++ b/quapy/CHANGE_LOG.txt @@ -1,6 +1,13 @@ Change Log 0.1.8 ---------------- +- Added different solvers for ACC and PACC quantifiers. In quapy < 0.1.8 these quantifiers try to solve the system + of equations Ax=B exactly (by means of np.linalg.solve). As noted by Mirko Bunse (thanks!), such an exact solution + does sometimes not exist. In cases like this, quapy < 0.1.8 resorted to CC for providing a plausible solution. + ACC and PACC now resorts to an approximated solution in such cases (minimizing the L2-norm of the difference + between Ax-B) as proposed by Mirko Bunse. A quick experiment reveals this heuristic greatly improves the results + of ACC and PACC in T2A@LeQua. + - Fixed ThresholdOptimization methods (X, T50, MAX, MS and MS2). Thanks to Tobias Schumacher and colleagues for pointing this out in Appendix A of "Schumacher, T., Strohmaier, M., & Lemmerich, F. (2021). A comparative evaluation of quantification methods. arXiv:2103.03223v3 [cs.LG]" diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index dd277e0..1fb693c 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -349,23 +349,25 @@ class ACC(AggregativeCrispQuantifier): Alternatively, this set can be specified at fit time by indicating the exact set of data on which the predictions are to be generated. :param n_jobs: number of parallel workers - :param solver: indicates the method to be used for obtaining the final esimates. The default choice - is 'exact', which comes down to solving the system of linear equations `Ax=B` where `A` is a + :param solver: indicates the method to be used for obtaining the final estimates. The choice + 'exact' comes down to solving the system of linear equations `Ax=B` where `A` is a matrix containing the class-conditional probabilities of the predictions (e.g., the tpr and fpr in binary) and `B` is the vector of prevalence values estimated via CC, as $x=A^{-1}B$. This solution might not exist for degenerated classifiers, in which case the method defaults to classify and count (i.e., does not attempt any adjustment). Another option is to search for the prevalence vector that minimizes the loss |Ax-B|. The latter is - achieved by indicating solver='minimize'. + achieved by indicating solver='minimize'. This one generally works better, and is the default parameter. """ - def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None, solver='exact'): + def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None, solver='minimize'): self.classifier = classifier self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) - assert solver in ['exact', 'minimize'], "unknown solver; valid ones are 'exact', 'minimize'" self.solver = solver + def _check_init_parameters(self): + assert self.solver in ['exact', 'minimize'], "unknown solver; valid ones are 'exact', 'minimize'" + def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Estimates the misclassification rates. @@ -408,20 +410,29 @@ class ACC(AggregativeCrispQuantifier): 'optim_minimize' (minimizes a norm --always exists). :return: an adjusted `np.ndarray` of shape `(n_classes,)` with the corrected class prevalence estimates """ + A = PteCondEstim B = prevs_estim + if solver == 'exact': + # attempts an exact solution of the linear system (may fail) + try: adjusted_prevs = np.linalg.solve(A, B) adjusted_prevs = np.clip(adjusted_prevs, 0, 1) adjusted_prevs /= adjusted_prevs.sum() except np.linalg.LinAlgError: adjusted_prevs = prevs_estim # no way to adjust them! + + return adjusted_prevs + elif solver == 'minimize': + # poses the problem as an optimization one, and tries to minimize the norm of the differences + def loss(prev): - return np.linalg.norm(A@prev - B) + return np.linalg.norm(A @ prev - B) + return F.optim_minimize(loss, n_classes=A.shape[0]) - return adjusted_prevs class PCC(AggregativeSoftQuantifier): @@ -462,10 +473,14 @@ class PACC(AggregativeSoftQuantifier): :param n_jobs: number of parallel workers """ - def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None): + def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None, solver='minimize'): self.classifier = classifier self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) + self.solver = solver + + def _check_init_parameters(self): + assert self.solver in ['exact', 'minimize'], "unknown solver; valid ones are 'exact', 'minimize'" def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ @@ -479,7 +494,7 @@ class PACC(AggregativeSoftQuantifier): def aggregate(self, classif_posteriors): prevs_estim = self.pcc.aggregate(classif_posteriors) - return ACC.solve_adjustment(self.Pte_cond_estim_, prevs_estim) + return ACC.solve_adjustment(self.Pte_cond_estim_, prevs_estim, solver=self.solver) @classmethod def getPteCondEstim(cls, classes, y, y_): diff --git a/quapy/model_selection.py b/quapy/model_selection.py index 307e7d3..9baace9 100644 --- a/quapy/model_selection.py +++ b/quapy/model_selection.py @@ -143,6 +143,21 @@ class GridSearchQ(BaseQuantifier): self._print_status(params, score, status, took) return model, params, score, status, took + def _break_down_fit(self): + """ + Decides whether to break down the fit phase in two (classifier-fit followed by aggregation-fit). + In order to do so, some conditions should be met: a) the quantifier is of type aggregative, + b) the set of hyperparameters can be split into two disjoint non-empty groups. + + :return: True if the conditions are met, False otherwise + """ + if not isinstance(self.model, AggregativeQuantifier): + return False + cls_configs, q_configs = group_params(self.param_grid) + if (len(cls_configs) == 1) or (len(q_configs)==1): + return False + return True + def _compute_scores_aggregative(self, training): # break down the set of hyperparameters into two: classifier-specific, quantifier-specific cls_configs, q_configs = group_params(self.param_grid) @@ -214,7 +229,7 @@ class GridSearchQ(BaseQuantifier): self.error_collector = [] self._sout(f'starting model selection with n_jobs={self.n_jobs}') - if isinstance(self.model, AggregativeQuantifier): + if self._break_down_fit(): results = self._compute_scores_aggregative(training) else: results = self._compute_scores_nonaggregative(training) From e6dcfbced1e9c6f41323c1d8469d7b822ef99ac0 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Thu, 25 Jan 2024 18:03:35 +0100 Subject: [PATCH 027/216] adding M.Bunse's reference for the solver='minimize' option of ACC, PACC --- quapy/CHANGE_LOG.txt => CHANGE_LOG.txt | 0 README.md | 2 +- quapy/method/aggregative.py | 17 ++++++++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) rename quapy/CHANGE_LOG.txt => CHANGE_LOG.txt (100%) diff --git a/quapy/CHANGE_LOG.txt b/CHANGE_LOG.txt similarity index 100% rename from quapy/CHANGE_LOG.txt rename to CHANGE_LOG.txt diff --git a/README.md b/README.md index 12164a3..d9f697c 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ for facilitating the analysis and interpretation of the experimental results. ### Last updates: -* Version 0.1.8 is released! major changes can be consulted [here](quapy/CHANGE_LOG.txt). +* Version 0.1.8 is released! major changes can be consulted [here](CHANGE_LOG.txt). * A detailed documentation is now available [here](https://hlt-isti.github.io/QuaPy/) * The developer API documentation is available [here](https://hlt-isti.github.io/QuaPy/build/html/modules.html) diff --git a/quapy/method/aggregative.py b/quapy/method/aggregative.py index 1fb693c..e07213d 100644 --- a/quapy/method/aggregative.py +++ b/quapy/method/aggregative.py @@ -355,8 +355,11 @@ class ACC(AggregativeCrispQuantifier): binary) and `B` is the vector of prevalence values estimated via CC, as $x=A^{-1}B$. This solution might not exist for degenerated classifiers, in which case the method defaults to classify and count (i.e., does not attempt any adjustment). - Another option is to search for the prevalence vector that minimizes the loss |Ax-B|. The latter is + Another option is to search for the prevalence vector that minimizes the L2 norm of |Ax-B|. The latter is achieved by indicating solver='minimize'. This one generally works better, and is the default parameter. + More details about this can be consulted in `Bunse, M. "On Multi-Class Extensions of Adjusted Classify and + Count", on proceedings of the 2nd International Workshop on Learning to Quantify: Methods and Applications + (LQ 2022), ECML/PKDD 2022, Grenoble (France) `_. """ def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None, solver='minimize'): @@ -471,6 +474,18 @@ class PACC(AggregativeSoftQuantifier): for `k`). Alternatively, this set can be specified at fit time by indicating the exact set of data on which the predictions are to be generated. :param n_jobs: number of parallel workers + :param solver: indicates the method to be used for obtaining the final estimates. The choice + 'exact' comes down to solving the system of linear equations `Ax=B` where `A` is a + matrix containing the class-conditional probabilities of the predictions (e.g., the tpr and fpr in + binary) and `B` is the vector of prevalence values estimated via CC, as $x=A^{-1}B$. This solution + might not exist for degenerated classifiers, in which case the method defaults to classify and count + (i.e., does not attempt any adjustment). + Another option is to search for the prevalence vector that minimizes the L2 norm of |Ax-B|. The latter is + achieved by indicating solver='minimize'. This one generally works better, and is the default parameter. + More details about this can be consulted in `Bunse, M. "On Multi-Class Extensions of Adjusted Classify and + Count", on proceedings of the 2nd International Workshop on Learning to Quantify: Methods and Applications + (LQ 2022), ECML/PKDD 2022, Grenoble (France) `_. + """ def __init__(self, classifier: BaseEstimator, val_split=5, n_jobs=None, solver='minimize'): From 2f2e48d86ab82c6f89b78d5a08ac6d185656e21b Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Mon, 29 Jan 2024 09:43:29 +0100 Subject: [PATCH 028/216] passing pytests --- CHANGE_LOG.txt | 6 ++++- quapy/method/meta.py | 39 ++++++++++++++++--------------- quapy/tests/test_datasets.py | 13 +++++++++-- quapy/tests/test_hierarchy.py | 6 ++--- quapy/tests/test_methods.py | 13 +++++------ quapy/tests/test_replicability.py | 37 +++++++++++++++++++++++++++-- 6 files changed, 79 insertions(+), 35 deletions(-) diff --git a/CHANGE_LOG.txt b/CHANGE_LOG.txt index ced7dd9..34dbb14 100644 --- a/CHANGE_LOG.txt +++ b/CHANGE_LOG.txt @@ -1,6 +1,10 @@ Change Log 0.1.8 ---------------- +- Added Kernel Density Estimation methods (KDEyML, KDEyCS, KDEyHD) as proposed in the paper: + Moreo, A., González, P., & del Coz, J. J. Kernel Density Estimation for Multiclass Quantification. + arXiv preprint arXiv:2401.00490, 2024 + - Added different solvers for ACC and PACC quantifiers. In quapy < 0.1.8 these quantifiers try to solve the system of equations Ax=B exactly (by means of np.linalg.solve). As noted by Mirko Bunse (thanks!), such an exact solution does sometimes not exist. In cases like this, quapy < 0.1.8 resorted to CC for providing a plausible solution. @@ -21,7 +25,7 @@ Change Log 0.1.8 - classification datasets - Python API available -- New IFCB (plankton) dataset added. See fetch_IFCB. +- New IFCB (plankton) dataset added (thanks to Pablo González). See qp.datasets.fetch_IFCB. - Added new evaluation measures NAE, NRAE diff --git a/quapy/method/meta.py b/quapy/method/meta.py index 25248cd..3a98dd0 100644 --- a/quapy/method/meta.py +++ b/quapy/method/meta.py @@ -119,22 +119,18 @@ class MedianEstimator(BinaryQuantifier): def _delayed_fit_classifier(self, args): with qp.util.temp_seed(self.random_state): - print('enter job') cls_params, training = args model = deepcopy(self.base_quantifier) model.set_params(**cls_params) predictions = model.classifier_fit_predict(training, predict_on=model.val_split) - print('exit job') return (model, predictions) def _delayed_fit_aggregation(self, args): with qp.util.temp_seed(self.random_state): - print('\tenter job') ((model, predictions), q_params), training = args model = deepcopy(model) model.set_params(**q_params) model.aggregation_fit(predictions, training) - print('\texit job') return model @@ -153,7 +149,6 @@ class MedianEstimator(BinaryQuantifier): asarray=False ) else: - print('only 1') model = self.base_quantifier model.set_params(**cls_configs[0]) predictions = model.classifier_fit_predict(training, predict_on=model.val_split) @@ -263,9 +258,10 @@ class Ensemble(BaseQuantifier): print('[Ensemble]' + msg) def fit(self, data: qp.data.LabelledCollection, val_split: Union[qp.data.LabelledCollection, float] = None): - self._sout('Fit') + if self.policy == 'ds' and not data.binary: raise ValueError(f'ds policy is only defined for binary quantification, but this dataset is not binary') + if val_split is None: val_split = self.val_split @@ -288,6 +284,7 @@ class Ensemble(BaseQuantifier): self.ensemble = qp.util.parallel( _delayed_new_instance, tqdm(args, desc='fitting ensamble', total=self.size) if self.verbose else args, + asarray=False, n_jobs=self.n_jobs) # static selection policy (the name of a quantification-oriented error function to minimize) @@ -369,30 +366,31 @@ class Ensemble(BaseQuantifier): def _ds_policy_get_posteriors(self, data: LabelledCollection): """ - In the original article, this procedure is not described in a sufficient level of detail. The paper only says + In the original article, there are some aspects regarding this method that are not mentioned. The paper says that the distribution of posterior probabilities from training and test examples is compared by means of the Hellinger Distance. However, how these posterior probabilities are generated is not specified. In the article, a Logistic Regressor (LR) is used as the classifier device and that could be used for this purpose. However, in general, a Quantifier is not necessarily an instance of Aggreggative Probabilistic Quantifiers, and so, that the quantifier builds on top of a probabilistic classifier cannot be given for granted. Additionally, it would not - be correct to generate the posterior probabilities for training documents that have concurred in training the + be correct to generate the posterior probabilities for training instances that have concurred in training the classifier that generates them. + This function thus generates the posterior probabilities for all training documents in a cross-validation way, - using a LR with hyperparameters that have previously been optimized via grid search in 5FCV. - :return P,f, where P is a ndarray containing the posterior probabilities of the training data, generated via - cross-validation and using an optimized LR, and the function to be used in order to generate posterior - probabilities for test instances. + using LR with hyperparameters that have previously been optimized via grid search in 5FCV. + + :param data: a LabelledCollection + :return: (P,f,) where P is an ndarray containing the posterior probabilities of the training data, generated via + cross-validation and using an optimized LR, and the function to be used in order to generate posterior + probabilities for test instances. """ + X, y = data.Xy lr_base = LogisticRegression(class_weight='balanced', max_iter=1000) - optim = GridSearchCV( - lr_base, param_grid={'C': np.logspace(-4, 4, 9)}, cv=5, n_jobs=self.n_jobs, refit=True - ).fit(X, y) + param_grid = {'C': np.logspace(-4, 4, 9)} + optim = GridSearchCV(lr_base, param_grid=param_grid, cv=5, n_jobs=self.n_jobs, refit=True).fit(X, y) - posteriors = cross_val_predict( - optim.best_estimator_, X, y, cv=5, n_jobs=self.n_jobs, method='predict_proba' - ) + posteriors = cross_val_predict(optim.best_estimator_, X, y, cv=5, n_jobs=self.n_jobs, method='predict_proba') posteriors_generator = optim.best_estimator_.predict_proba return posteriors, posteriors_generator @@ -463,8 +461,10 @@ def _delayed_new_instance(args): tr_prevalence = sample.prevalence() tr_distribution = get_probability_distribution(posteriors[sample_index]) if (posteriors is not None) else None + if verbose: print(f'\t\--fit-ended for prev {F.strprev(prev)}') + return (model, tr_prevalence, tr_distribution, sample if keep_samples else None) @@ -475,8 +475,9 @@ def _delayed_quantify(args): def _draw_simplex(ndim, min_val, max_trials=100): """ - returns a uniform sampling from the ndim-dimensional simplex but guarantees that all dimensions + Returns a uniform sampling from the ndim-dimensional simplex but guarantees that all dimensions are >= min_class_prev (for min_val>0, this makes the sampling not truly uniform) + :param ndim: number of dimensions of the simplex :param min_val: minimum class prevalence allowed. If less than 1/ndim a ValueError will be throw since there is no possible solution. diff --git a/quapy/tests/test_datasets.py b/quapy/tests/test_datasets.py index b0c2f7a..e90a502 100644 --- a/quapy/tests/test_datasets.py +++ b/quapy/tests/test_datasets.py @@ -1,8 +1,8 @@ import pytest from quapy.data.datasets import REVIEWS_SENTIMENT_DATASETS, TWITTER_SENTIMENT_DATASETS_TEST, \ - TWITTER_SENTIMENT_DATASETS_TRAIN, UCI_DATASETS, LEQUA2022_TASKS, \ - fetch_reviews, fetch_twitter, fetch_UCIDataset, fetch_lequa2022 + TWITTER_SENTIMENT_DATASETS_TRAIN, UCI_DATASETS, LEQUA2022_TASKS, UCI_MULTICLASS_DATASETS,\ + fetch_reviews, fetch_twitter, fetch_UCIDataset, fetch_lequa2022, fetch_UCIMulticlassLabelledCollection @pytest.mark.parametrize('dataset_name', REVIEWS_SENTIMENT_DATASETS) @@ -44,6 +44,15 @@ def test_fetch_UCIDataset(dataset_name): print('Test set stats') +@pytest.mark.parametrize('dataset_name', UCI_MULTICLASS_DATASETS) +def test_fetch_UCIMultiDataset(dataset_name): + dataset = fetch_UCIMulticlassLabelledCollection(dataset_name) + print(f'Dataset {dataset_name}') + print('Training set stats') + dataset.stats() + print('Test set stats') + + @pytest.mark.parametrize('dataset_name', LEQUA2022_TASKS) def test_fetch_lequa2022(dataset_name): train, gen_val, gen_test = fetch_lequa2022(dataset_name) diff --git a/quapy/tests/test_hierarchy.py b/quapy/tests/test_hierarchy.py index b0842e5..33af5da 100644 --- a/quapy/tests/test_hierarchy.py +++ b/quapy/tests/test_hierarchy.py @@ -1,12 +1,8 @@ import unittest - from sklearn.linear_model import LogisticRegression - -import quapy as qp from quapy.method.aggregative import * - class HierarchyTestCase(unittest.TestCase): def test_aggregative(self): @@ -22,8 +18,10 @@ class HierarchyTestCase(unittest.TestCase): def test_probabilistic(self): lr = LogisticRegression() for m in [CC(lr), ACC(lr)]: + self.assertEqual(isinstance(m, AggregativeCrispQuantifier), True) self.assertEqual(isinstance(m, AggregativeSoftQuantifier), False) for m in [PCC(lr), PACC(lr)]: + self.assertEqual(isinstance(m, AggregativeCrispQuantifier), False) self.assertEqual(isinstance(m, AggregativeSoftQuantifier), True) diff --git a/quapy/tests/test_methods.py b/quapy/tests/test_methods.py index 43c5c99..2139e8d 100644 --- a/quapy/tests/test_methods.py +++ b/quapy/tests/test_methods.py @@ -67,15 +67,16 @@ def test_non_aggregative_methods(dataset: Dataset, non_aggregative_method): @pytest.mark.parametrize('dataset', tinydatasets) @pytest.mark.parametrize('policy', Ensemble.VALID_POLICIES) def test_ensemble_method(base_method, learner, dataset: Dataset, policy): + qp.environ['SAMPLE_SIZE'] = 20 + base_quantifier=base_method(learner()) - if isinstance(base_quantifier, BinaryQuantifier) and not dataset.binary: - print(f'skipping the test of binary model {base_quantifier} on non-binary dataset {dataset}') - return + if not dataset.binary and policy=='ds': print(f'skipping the test of binary policy ds on non-binary dataset {dataset}') return - model = Ensemble(quantifier=base_quantifier, size=5, policy=policy, n_jobs=-1) + + model = Ensemble(quantifier=base_quantifier, size=3, policy=policy, n_jobs=-1) model.fit(dataset.training) @@ -97,9 +98,7 @@ def test_quanet_method(): qp.environ['SAMPLE_SIZE'] = 100 # load the kindle dataset as text, and convert words to numerical indexes - dataset = qp.datasets.fetch_reviews('kindle', pickle=True) - dataset = Dataset(dataset.training.sampling(200, *dataset.training.prevalence()), - dataset.test.sampling(200, *dataset.test.prevalence())) + dataset = qp.datasets.fetch_reviews('kindle', pickle=True).reduce(200, 200) qp.data.preprocessing.index(dataset, min_df=5, inplace=True) from quapy.classification.neural import CNNnet diff --git a/quapy/tests/test_replicability.py b/quapy/tests/test_replicability.py index e89531a..871f519 100644 --- a/quapy/tests/test_replicability.py +++ b/quapy/tests/test_replicability.py @@ -3,11 +3,13 @@ import quapy as qp from quapy.data import LabelledCollection from quapy.functional import strprev from sklearn.linear_model import LogisticRegression - +import numpy as np from quapy.method.aggregative import PACC +import quapy.functional as F class MyTestCase(unittest.TestCase): + def test_prediction_replicability(self): dataset = qp.datasets.fetch_UCIDataset('yeast') @@ -26,8 +28,8 @@ class MyTestCase(unittest.TestCase): self.assertEqual(str_prev1, str_prev2) # add assertion here + def test_samping_replicability(self): - import numpy as np def equal_collections(c1, c2, value=True): self.assertEqual(np.all(c1.X == c2.X), value) @@ -74,5 +76,36 @@ class MyTestCase(unittest.TestCase): equal_collections(sample1_te, sample2_te, True) + def test_parallel_replicability(self): + + train, test = qp.datasets.fetch_UCIMulticlassDataset('dry-bean').train_test + + test = test.sampling(500, *[0.1, 0.0, 0.1, 0.1, 0.2, 0.5, 0.0]) + + with qp.util.temp_seed(10): + pacc = PACC(LogisticRegression(), val_split=2, n_jobs=2) + pacc.fit(train, val_split=0.5) + prev1 = F.strprev(pacc.quantify(test.instances)) + + with qp.util.temp_seed(0): + pacc = PACC(LogisticRegression(), val_split=2, n_jobs=2) + pacc.fit(train, val_split=0.5) + prev2 = F.strprev(pacc.quantify(test.instances)) + + with qp.util.temp_seed(0): + pacc = PACC(LogisticRegression(), val_split=2, n_jobs=2) + pacc.fit(train, val_split=0.5) + prev3 = F.strprev(pacc.quantify(test.instances)) + + print(prev1) + print(prev2) + print(prev3) + + self.assertNotEqual(prev1, prev2) + self.assertEqual(prev2, prev3) + + + + if __name__ == '__main__': unittest.main() From fcc3f8a0d9602dc50f39a1e439c4ca292240eb1b Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Wed, 7 Feb 2024 18:31:34 +0100 Subject: [PATCH 029/216] fixing sphinx doc --- docs/build/html/Datasets.html | 831 ------ docs/build/html/Evaluation.html | 281 -- docs/build/html/Installation.html | 178 -- docs/build/html/Methods.html | 539 ---- docs/build/html/Model-Selection.html | 268 -- docs/build/html/Plotting.html | 350 --- docs/build/html/_images/bin_bias.png | Bin 63858 -> 0 bytes docs/build/html/_images/bin_bias_bin_cc.png | Bin 110404 -> 0 bytes docs/build/html/_images/bin_bias_cc.png | Bin 72541 -> 0 bytes docs/build/html/_images/bin_diag.png | Bin 189871 -> 0 bytes docs/build/html/_images/bin_diag_cc.png | Bin 344915 -> 0 bytes docs/build/html/_images/err_drift.png | Bin 248874 -> 0 bytes docs/build/html/_sources/Datasets.md.txt | 356 --- docs/build/html/_sources/Evaluation.md.txt | 169 -- docs/build/html/_sources/Installation.rst.txt | 56 - docs/build/html/_sources/Methods.md.txt | 438 --- .../html/_sources/Model-Selection.md.txt | 150 -- docs/build/html/_sources/Plotting.md.txt | 250 -- docs/build/html/_sources/index.rst.txt | 83 +- .../_sources/quapy.classification.rst.txt | 19 +- docs/build/html/_sources/quapy.data.rst.txt | 19 +- docs/build/html/_sources/quapy.method.rst.txt | 42 +- docs/build/html/_sources/quapy.rst.txt | 66 +- docs/build/html/_static/background_b01.png | Bin 78 -> 0 bytes docs/build/html/_static/basic.css | 29 +- docs/build/html/_static/bizstyle.css | 508 ---- docs/build/html/_static/bizstyle.js | 30 - docs/build/html/_static/css3-mediaqueries.js | 1 - .../html/_static/css3-mediaqueries_src.js | 1104 -------- docs/build/html/_static/doctools.js | 2 +- .../html/_static/documentation_options.js | 5 +- docs/build/html/_static/language_data.js | 2 +- docs/build/html/_static/pygments.css | 122 +- docs/build/html/_static/searchtools.js | 34 +- docs/build/html/_static/underscore-1.13.1.js | 2042 -------------- docs/build/html/_static/underscore.js | 6 - docs/build/html/genindex.html | 510 ++-- docs/build/html/index.html | 871 ++++-- docs/build/html/modules.html | 404 ++- docs/build/html/objects.inv | Bin 2922 -> 3343 bytes docs/build/html/py-modindex.html | 188 +- docs/build/html/quapy.classification.html | 396 ++- docs/build/html/quapy.data.html | 470 ++-- docs/build/html/quapy.html | 2232 ++++++++++----- docs/build/html/quapy.method.html | 2392 +++++++++++------ docs/build/html/search.html | 194 +- docs/build/html/searchindex.js | 2 +- docs/index.html | 1 - examples/comparing_HDy_HDx.py | 4 +- examples/uci_experiments.py | 4 +- quapy/data/datasets.py | 42 +- quapy/method/_kdey.py | 152 +- quapy/method/_neural.py | 2 +- quapy/method/aggregative.py | 18 +- quapy/model_selection.py | 2 +- quapy/tests/test_datasets.py | 8 +- quapy/tests/test_methods.py | 2 +- quapy/tests/test_replicability.py | 6 +- quapy/util.py | 10 +- 59 files changed, 5537 insertions(+), 10353 deletions(-) delete mode 100644 docs/build/html/Datasets.html delete mode 100644 docs/build/html/Evaluation.html delete mode 100644 docs/build/html/Installation.html delete mode 100644 docs/build/html/Methods.html delete mode 100644 docs/build/html/Model-Selection.html delete mode 100644 docs/build/html/Plotting.html delete mode 100644 docs/build/html/_images/bin_bias.png delete mode 100644 docs/build/html/_images/bin_bias_bin_cc.png delete mode 100644 docs/build/html/_images/bin_bias_cc.png delete mode 100644 docs/build/html/_images/bin_diag.png delete mode 100644 docs/build/html/_images/bin_diag_cc.png delete mode 100644 docs/build/html/_images/err_drift.png delete mode 100644 docs/build/html/_sources/Datasets.md.txt delete mode 100644 docs/build/html/_sources/Evaluation.md.txt delete mode 100644 docs/build/html/_sources/Installation.rst.txt delete mode 100644 docs/build/html/_sources/Methods.md.txt delete mode 100644 docs/build/html/_sources/Model-Selection.md.txt delete mode 100644 docs/build/html/_sources/Plotting.md.txt delete mode 100644 docs/build/html/_static/background_b01.png delete mode 100644 docs/build/html/_static/bizstyle.css delete mode 100644 docs/build/html/_static/bizstyle.js delete mode 100644 docs/build/html/_static/css3-mediaqueries.js delete mode 100644 docs/build/html/_static/css3-mediaqueries_src.js delete mode 100644 docs/build/html/_static/underscore-1.13.1.js delete mode 100644 docs/build/html/_static/underscore.js delete mode 100644 docs/index.html diff --git a/docs/build/html/Datasets.html b/docs/build/html/Datasets.html deleted file mode 100644 index 775690d..0000000 --- a/docs/build/html/Datasets.html +++ /dev/null @@ -1,831 +0,0 @@ - - - - - - - - - - Datasets — QuaPy 0.1.7 documentation - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Datasets

-

QuaPy makes available several datasets that have been used in -quantification literature, as well as an interface to allow -anyone import their custom datasets.

-

A Dataset object in QuaPy is roughly a pair of LabelledCollection objects, -one playing the role of the training set, another the test set. -LabelledCollection is a data class consisting of the (iterable) -instances and labels. This class handles most of the sampling functionality in QuaPy. -Take a look at the following code:

-
import quapy as qp
-import quapy.functional as F
-
-instances = [
-    '1st positive document', '2nd positive document',
-    'the only negative document',
-    '1st neutral document', '2nd neutral document', '3rd neutral document'
-]
-labels = [2, 2, 0, 1, 1, 1]
-
-data = qp.data.LabelledCollection(instances, labels)
-print(F.strprev(data.prevalence(), prec=2))
-
-
-

Output the class prevalences (showing 2 digit precision):

-
[0.17, 0.50, 0.33]
-
-
-

One can easily produce new samples at desired class prevalence values:

-
sample_size = 10
-prev = [0.4, 0.1, 0.5]
-sample = data.sampling(sample_size, *prev)
-
-print('instances:', sample.instances)
-print('labels:', sample.labels)
-print('prevalence:', F.strprev(sample.prevalence(), prec=2))
-
-
-

Which outputs:

-
instances: ['the only negative document' '2nd positive document'
- '2nd positive document' '2nd neutral document' '1st positive document'
- 'the only negative document' 'the only negative document'
- 'the only negative document' '2nd positive document'
- '1st positive document']
-labels: [0 2 2 1 2 0 0 0 2 2]
-prevalence: [0.40, 0.10, 0.50]
-
-
-

Samples can be made consistent across different runs (e.g., to test -different methods on the same exact samples) by sampling and retaining -the indexes, that can then be used to generate the sample:

-
index = data.sampling_index(sample_size, *prev)
-for method in methods:
-    sample = data.sampling_from_index(index)
-    ...
-
-
-

However, generating samples for evaluation purposes is tackled in QuaPy -by means of the evaluation protocols (see the dedicated entries in the Wiki -for evaluation and -protocols).

-
-

Reviews Datasets

-

Three datasets of reviews about Kindle devices, Harry Potter’s series, and -the well-known IMDb movie reviews can be fetched using a unified interface. -For example:

-
import quapy as qp
-data = qp.datasets.fetch_reviews('kindle')
-
-
-

These datasets have been used in:

-
Esuli, A., Moreo, A., & Sebastiani, F. (2018, October). 
-A recurrent neural network for sentiment quantification. 
-In Proceedings of the 27th ACM International Conference on 
-Information and Knowledge Management (pp. 1775-1778).
-
-
-

The list of reviews ids is available in:

-
qp.datasets.REVIEWS_SENTIMENT_DATASETS
-
-
-

Some statistics of the fhe available datasets are summarized below:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Dataset

classes

train size

test size

train prev

test prev

type

hp

2

9533

18399

[0.018, 0.982]

[0.065, 0.935]

text

kindle

2

3821

21591

[0.081, 0.919]

[0.063, 0.937]

text

imdb

2

25000

25000

[0.500, 0.500]

[0.500, 0.500]

text

-
-
-

Twitter Sentiment Datasets

-

11 Twitter datasets for sentiment analysis. -Text is not accessible, and the documents were made available -in tf-idf format. Each dataset presents two splits: a train/val -split for model selection purposes, and a train+val/test split -for model evaluation. The following code exemplifies how to load -a twitter dataset for model selection.

-
import quapy as qp
-data = qp.datasets.fetch_twitter('gasp', for_model_selection=True)
-
-
-

The datasets were used in:

-
Gao, W., & Sebastiani, F. (2015, August). 
-Tweet sentiment: From classification to quantification. 
-In 2015 IEEE/ACM International Conference on Advances in 
-Social Networks Analysis and Mining (ASONAM) (pp. 97-104). IEEE.
-
-
-

Three of the datasets (semeval13, semeval14, and semeval15) share the -same training set (semeval), meaning that the training split one would get -when requesting any of them is the same. The dataset “semeval” can only -be requested with “for_model_selection=True”. -The lists of the Twitter dataset’s ids can be consulted in:

-
# a list of 11 dataset ids that can be used for model selection or model evaluation
-qp.datasets.TWITTER_SENTIMENT_DATASETS_TEST
-
-# 9 dataset ids in which "semeval13", "semeval14", and "semeval15" are replaced with "semeval"
-qp.datasets.TWITTER_SENTIMENT_DATASETS_TRAIN  
-
-
-

Some details can be found below:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Dataset

classes

train size

test size

features

train prev

test prev

type

gasp

3

8788

3765

694582

[0.421, 0.496, 0.082]

[0.407, 0.507, 0.086]

sparse

hcr

3

1594

798

222046

[0.546, 0.211, 0.243]

[0.640, 0.167, 0.193]

sparse

omd

3

1839

787

199151

[0.463, 0.271, 0.266]

[0.437, 0.283, 0.280]

sparse

sanders

3

2155

923

229399

[0.161, 0.691, 0.148]

[0.164, 0.688, 0.148]

sparse

semeval13

3

11338

3813

1215742

[0.159, 0.470, 0.372]

[0.158, 0.430, 0.412]

sparse

semeval14

3

11338

1853

1215742

[0.159, 0.470, 0.372]

[0.109, 0.361, 0.530]

sparse

semeval15

3

11338

2390

1215742

[0.159, 0.470, 0.372]

[0.153, 0.413, 0.434]

sparse

semeval16

3

8000

2000

889504

[0.157, 0.351, 0.492]

[0.163, 0.341, 0.497]

sparse

sst

3

2971

1271

376132

[0.261, 0.452, 0.288]

[0.207, 0.481, 0.312]

sparse

wa

3

2184

936

248563

[0.305, 0.414, 0.281]

[0.282, 0.446, 0.272]

sparse

wb

3

4259

1823

404333

[0.270, 0.392, 0.337]

[0.274, 0.392, 0.335]

sparse

-
-
-

UCI Machine Learning

-

A set of 32 datasets from the UCI Machine Learning repository -used in:

-
Pérez-Gállego, P., Quevedo, J. R., & del Coz, J. J. (2017).
-Using ensembles for problems with characterizable changes 
-in data distribution: A case study on quantification.
-Information Fusion, 34, 87-100.
-
-
-

The list does not exactly coincide with that used in Pérez-Gállego et al. 2017 -since we were unable to find the datasets with ids “diabetes” and “phoneme”.

-

These dataset can be loaded by calling, e.g.:

-
import quapy as qp
-data = qp.datasets.fetch_UCIDataset('yeast', verbose=True)
-
-
-

This call will return a Dataset object in which the training and -test splits are randomly drawn, in a stratified manner, from the whole -collection at 70% and 30%, respectively. The verbose=True option indicates -that the dataset description should be printed in standard output. -The original data is not split, -and some papers submit the entire collection to a kFCV validation. -In order to accommodate with these practices, one could first instantiate -the entire collection, and then creating a generator that will return one -training+test dataset at a time, following a kFCV protocol:

-
import quapy as qp
-collection = qp.datasets.fetch_UCILabelledCollection("yeast")
-for data in qp.data.Dataset.kFCV(collection, nfolds=5, nrepeats=2):
-    ...
-
-
-

Above code will allow to conduct a 2x5FCV evaluation on the “yeast” dataset.

-

All datasets come in numerical form (dense matrices); some statistics -are summarized below.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Dataset

classes

instances

features

prev

type

acute.a

2

120

6

[0.508, 0.492]

dense

acute.b

2

120

6

[0.583, 0.417]

dense

balance.1

2

625

4

[0.539, 0.461]

dense

balance.2

2

625

4

[0.922, 0.078]

dense

balance.3

2

625

4

[0.539, 0.461]

dense

breast-cancer

2

683

9

[0.350, 0.650]

dense

cmc.1

2

1473

9

[0.573, 0.427]

dense

cmc.2

2

1473

9

[0.774, 0.226]

dense

cmc.3

2

1473

9

[0.653, 0.347]

dense

ctg.1

2

2126

22

[0.222, 0.778]

dense

ctg.2

2

2126

22

[0.861, 0.139]

dense

ctg.3

2

2126

22

[0.917, 0.083]

dense

german

2

1000

24

[0.300, 0.700]

dense

haberman

2

306

3

[0.735, 0.265]

dense

ionosphere

2

351

34

[0.641, 0.359]

dense

iris.1

2

150

4

[0.667, 0.333]

dense

iris.2

2

150

4

[0.667, 0.333]

dense

iris.3

2

150

4

[0.667, 0.333]

dense

mammographic

2

830

5

[0.514, 0.486]

dense

pageblocks.5

2

5473

10

[0.979, 0.021]

dense

semeion

2

1593

256

[0.901, 0.099]

dense

sonar

2

208

60

[0.534, 0.466]

dense

spambase

2

4601

57

[0.606, 0.394]

dense

spectf

2

267

44

[0.794, 0.206]

dense

tictactoe

2

958

9

[0.653, 0.347]

dense

transfusion

2

748

4

[0.762, 0.238]

dense

wdbc

2

569

30

[0.627, 0.373]

dense

wine.1

2

178

13

[0.669, 0.331]

dense

wine.2

2

178

13

[0.601, 0.399]

dense

wine.3

2

178

13

[0.730, 0.270]

dense

wine-q-red

2

1599

11

[0.465, 0.535]

dense

wine-q-white

2

4898

11

[0.335, 0.665]

dense

yeast

2

1484

8

[0.711, 0.289]

dense

-
-

Issues:

-

All datasets will be downloaded automatically the first time they are requested, and -stored in the quapy_data folder for faster further reuse. -However, some datasets require special actions that at the moment are not fully -automated.

-
    -
  • Datasets with ids “ctg.1”, “ctg.2”, and “ctg.3” (Cardiotocography Data Set) load -an Excel file, which requires the user to install the xlrd Python module in order -to open it.

  • -
  • The dataset with id “pageblocks.5” (Page Blocks Classification (5)) needs to -open a “unix compressed file” (extension .Z), which is not directly doable with -standard Pythons packages like gzip or zip. This file would need to be uncompressed using -OS-dependent software manually. Information on how to do it will be printed the first -time the dataset is invoked.

  • -
-
-
-
-

LeQua Datasets

-

QuaPy also provides the datasets used for the LeQua competition. -In brief, there are 4 tasks (T1A, T1B, T2A, T2B) having to do with text quantification -problems. Tasks T1A and T1B provide documents in vector form, while T2A and T2B provide -raw documents instead. -Tasks T1A and T2A are binary sentiment quantification problems, while T2A and T2B -are multiclass quantification problems consisting of estimating the class prevalence -values of 28 different merchandise products.

-

Every task consists of a training set, a set of validation samples (for model selection) -and a set of test samples (for evaluation). QuaPy returns this data as a LabelledCollection -(training) and two generation protocols (for validation and test samples), as follows:

-
training, val_generator, test_generator = fetch_lequa2022(task=task)
-
-
-

See the lequa2022_experiments.py in the examples folder for further details on how to -carry out experiments using these datasets.

-

The datasets are downloaded only once, and stored for fast reuse.

-

Some statistics are summarized below:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Dataset

classes

train size

validation samples

test samples

docs by sample

type

T1A

2

5000

1000

5000

250

vector

T1B

28

20000

1000

5000

1000

vector

T2A

2

5000

1000

5000

250

text

T2B

28

20000

1000

5000

1000

text

-

For further details on the datasets, we refer to the original -paper:

-
Esuli, A., Moreo, A., Sebastiani, F., & Sperduti, G. (2022).
-A Detailed Overview of LeQua@ CLEF 2022: Learning to Quantify.
-
-
-
-
-

Adding Custom Datasets

-

QuaPy provides data loaders for simple formats dealing with -text, following the format:

-
class-id \t first document's pre-processed text \n
-class-id \t second document's pre-processed text \n
-...
-
-
-

and sparse representations of the form:

-
{-1, 0, or +1} col(int):val(float) col(int):val(float) ... \n
-...
-
-
-

The code in charge in loading a LabelledCollection is:

-
@classmethod
-def load(cls, path:str, loader_func:callable):
-    return LabelledCollection(*loader_func(path))
-
-
-

indicating that any loader_func (e.g., a user-defined one) which -returns valid arguments for initializing a LabelledCollection object will allow -to load any collection. In particular, the LabelledCollection receives as -arguments the instances (as an iterable) and the labels (as an iterable) and, -additionally, the number of classes can be specified (it would otherwise be -inferred from the labels, but that requires at least one positive example for -all classes to be present in the collection).

-

The same loader_func can be passed to a Dataset, along with two -paths, in order to create a training and test pair of LabelledCollection, -e.g.:

-
import quapy as qp
-
-train_path = '../my_data/train.dat'
-test_path = '../my_data/test.dat'
-
-def my_custom_loader(path):
-    with open(path, 'rb') as fin:
-        ...
-    return instances, labels
-
-data = qp.data.Dataset.load(train_path, test_path, my_custom_loader)
-
-
-
-

Data Processing

-

QuaPy implements a number of preprocessing functions in the package qp.data.preprocessing, including:

-
    -
  • text2tfidf: tfidf vectorization

  • -
  • reduce_columns: reducing the number of columns based on term frequency

  • -
  • standardize: transforms the column values into z-scores (i.e., subtract the mean and normalizes by the standard deviation, so -that the column values have zero mean and unit variance).

  • -
  • index: transforms textual tokens into lists of numeric ids)

  • -
-
-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/build/html/Evaluation.html b/docs/build/html/Evaluation.html deleted file mode 100644 index 1b41a03..0000000 --- a/docs/build/html/Evaluation.html +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - - - - - Evaluation — QuaPy 0.1.7 documentation - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Evaluation

-

Quantification is an appealing tool in scenarios of dataset shift, -and particularly in scenarios of prior-probability shift. -That is, the interest in estimating the class prevalences arises -under the belief that those class prevalences might have changed -with respect to the ones observed during training. -In other words, one could simply return the training prevalence -as a predictor of the test prevalence if this change is assumed -to be unlikely (as is the case in general scenarios of -machine learning governed by the iid assumption). -In brief, quantification requires dedicated evaluation protocols, -which are implemented in QuaPy and explained here.

-
-

Error Measures

-

The module quapy.error implements the following error measures for quantification:

-
    -
  • mae: mean absolute error

  • -
  • mrae: mean relative absolute error

  • -
  • mse: mean squared error

  • -
  • mkld: mean Kullback-Leibler Divergence

  • -
  • mnkld: mean normalized Kullback-Leibler Divergence

  • -
-

Functions ae, rae, se, kld, and nkld are also available, -which return the individual errors (i.e., without averaging the whole).

-

Some errors of classification are also available:

-
    -
  • acce: accuracy error (1-accuracy)

  • -
  • f1e: F-1 score error (1-F1 score)

  • -
-

The error functions implement the following interface, e.g.:

-
mae(true_prevs, prevs_hat)
-
-
-

in which the first argument is a ndarray containing the true -prevalences, and the second argument is another ndarray with -the estimations produced by some method.

-

Some error functions, e.g., mrae, mkld, and mnkld, are -smoothed for numerical stability. In those cases, there is a -third argument, e.g.:

-
def mrae(true_prevs, prevs_hat, eps=None): ...
-
-
-

indicating the value for the smoothing parameter epsilon. -Traditionally, this value is set to 1/(2T) in past literature, -with T the sampling size. One could either pass this value -to the function each time, or to set a QuaPy’s environment -variable SAMPLE_SIZE once, and omit this argument -thereafter (recommended); -e.g.:

-
qp.environ['SAMPLE_SIZE'] = 100  # once for all
-true_prev = np.asarray([0.5, 0.3, 0.2])  # let's assume 3 classes
-estim_prev = np.asarray([0.1, 0.3, 0.6])
-error = qp.error.mrae(true_prev, estim_prev)
-print(f'mrae({true_prev}, {estim_prev}) = {error:.3f}')
-
-
-

will print:

-
mrae([0.500, 0.300, 0.200], [0.100, 0.300, 0.600]) = 0.914
-
-
-

Finally, it is possible to instantiate QuaPy’s quantification -error functions from strings using, e.g.:

-
error_function = qp.error.from_name('mse')
-error = error_function(true_prev, estim_prev)
-
-
-
-
-

Evaluation Protocols

-

An evaluation protocol is an evaluation procedure that uses -one specific sample generation procotol to genereate many -samples, typically characterized by widely varying amounts of -shift with respect to the original distribution, that are then -used to evaluate the performance of a (trained) quantifier. -These protocols are explained in more detail in a dedicated entry -in the wiki. For the moment being, let us assume we already have -chosen and instantiated one specific such protocol, that we here -simply call prot. Let also assume our model is called -quantifier and that our evaluatio measure of choice is -mae. The evaluation comes down to:

-
mae = qp.evaluation.evaluate(quantifier, protocol=prot, error_metric='mae')
-print(f'MAE = {mae:.4f}')
-
-
-

It is often desirable to evaluate our system using more than one -single evaluatio measure. In this case, it is convenient to generate -a report. A report in QuaPy is a dataframe accounting for all the -true prevalence values with their corresponding prevalence values -as estimated by the quantifier, along with the error each has given -rise.

-
report = qp.evaluation.evaluation_report(quantifier, protocol=prot, error_metrics=['mae', 'mrae', 'mkld'])
-
-
-

From a pandas’ dataframe, it is straightforward to visualize all the results, -and compute the averaged values, e.g.:

-
pd.set_option('display.expand_frame_repr', False)
-report['estim-prev'] = report['estim-prev'].map(F.strprev)
-print(report)
-
-print('Averaged values:')
-print(report.mean())
-
-
-

This will produce an output like:

-
           true-prev      estim-prev       mae      mrae      mkld
-0     [0.308, 0.692]  [0.314, 0.686]  0.005649  0.013182  0.000074
-1     [0.896, 0.104]  [0.909, 0.091]  0.013145  0.069323  0.000985
-2     [0.848, 0.152]  [0.809, 0.191]  0.039063  0.149806  0.005175
-3     [0.016, 0.984]  [0.033, 0.967]  0.017236  0.487529  0.005298
-4     [0.728, 0.272]  [0.751, 0.249]  0.022769  0.057146  0.001350
-...              ...             ...       ...       ...       ...
-4995    [0.72, 0.28]  [0.698, 0.302]  0.021752  0.053631  0.001133
-4996  [0.868, 0.132]  [0.888, 0.112]  0.020490  0.088230  0.001985
-4997  [0.292, 0.708]  [0.298, 0.702]  0.006149  0.014788  0.000090
-4998    [0.24, 0.76]  [0.220, 0.780]  0.019950  0.054309  0.001127
-4999  [0.948, 0.052]  [0.965, 0.035]  0.016941  0.165776  0.003538
-
-[5000 rows x 5 columns]
-Averaged values:
-mae     0.023588
-mrae    0.108779
-mkld    0.003631
-dtype: float64
-
-Process finished with exit code 0
-
-
-

Alternatively, we can simply generate all the predictions by:

-
true_prevs, estim_prevs = qp.evaluation.prediction(quantifier, protocol=prot)
-
-
-

All the evaluation functions implement specific optimizations for speeding-up -the evaluation of aggregative quantifiers (i.e., of instances of AggregativeQuantifier). -The optimization comes down to generating classification predictions (either crisp or soft) -only once for the entire test set, and then applying the sampling procedure to the -predictions, instead of generating samples of instances and then computing the -classification predictions every time. This is only possible when the protocol -is an instance of OnLabelledCollectionProtocol. The optimization is only -carried out when the number of classification predictions thus generated would be -smaller than the number of predictions required for the entire protocol; e.g., -if the original dataset contains 1M instances, but the protocol is such that it would -at most generate 20 samples of 100 instances, then it would be preferable to postpone the -classification for each sample. This behaviour is indicated by setting -aggr_speedup=”auto”. Conversely, when indicating aggr_speedup=”force” QuaPy will -precompute all the predictions irrespectively of the number of instances and number of samples. -Finally, this can be deactivated by setting aggr_speedup=False. Note that this optimization -is not only applied for the final evaluation, but also for the internal evaluations carried -out during model selection. Since these are typically many, the heuristic can help reduce the -execution time a lot.

-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/build/html/Installation.html b/docs/build/html/Installation.html deleted file mode 100644 index b63e795..0000000 --- a/docs/build/html/Installation.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - Installation — QuaPy 0.1.7 documentation - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Installation

-

QuaPy can be easily installed via pip

-
pip install quapy
-
-
-

See pip page for older versions.

-
-

Requirements

-
    -
  • scikit-learn, numpy, scipy

  • -
  • pytorch (for QuaNet)

  • -
  • svmperf patched for quantification (see below)

  • -
  • joblib

  • -
  • tqdm

  • -
  • pandas, xlrd

  • -
  • matplotlib

  • -
-
-
-

SVM-perf with quantification-oriented losses

-

In order to run experiments involving SVM(Q), SVM(KLD), SVM(NKLD), -SVM(AE), or SVM(RAE), you have to first download the -svmperf -package, apply the patch -svm-perf-quantification-ext.patch, -and compile the sources. -The script -prepare_svmperf.sh, -does all the job. Simply run:

-
./prepare_svmperf.sh
-
-
-

The resulting directory ./svm_perf_quantification contains the -patched version of svmperf with quantification-oriented losses.

-

The -svm-perf-quantification-ext.patch -is an extension of the patch made available by -Esuli et al. 2015 -that allows SVMperf to optimize for -the Q measure as proposed by -Barranquero et al. 2015 -and for the KLD and NKLD as proposed by -Esuli et al. 2015 -for quantification. -This patch extends the former by also allowing SVMperf to optimize for -AE and RAE.

-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/build/html/Methods.html b/docs/build/html/Methods.html deleted file mode 100644 index 8471f3d..0000000 --- a/docs/build/html/Methods.html +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - - - - - Quantification Methods — QuaPy 0.1.7 documentation - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Quantification Methods

-

Quantification methods can be categorized as belonging to -aggregative and non-aggregative groups. -Most methods included in QuaPy at the moment are of type aggregative -(though we plan to add many more methods in the near future), i.e., -are methods characterized by the fact that -quantification is performed as an aggregation function of the individual -products of classification.

-

Any quantifier in QuaPy shoud extend the class BaseQuantifier, -and implement some abstract methods:

-
    @abstractmethod
-    def fit(self, data: LabelledCollection): ...
-
-    @abstractmethod
-    def quantify(self, instances): ...
-
-
-

The meaning of those functions should be familiar to those -used to work with scikit-learn since the class structure of QuaPy -is directly inspired by scikit-learn’s Estimators. Functions -fit and quantify are used to train the model and to provide -class estimations (the reason why -scikit-learn’ structure has not been adopted as is in QuaPy responds to -the fact that scikit-learn’s predict function is expected to return -one output for each input element –e.g., a predicted label for each -instance in a sample– while in quantification the output for a sample -is one single array of class prevalences). -Quantifiers also extend from scikit-learn’s BaseEstimator, in order -to simplify the use of set_params and get_params used in -model selector.

-
-

Aggregative Methods

-

All quantification methods are implemented as part of the -qp.method package. In particular, aggregative methods are defined in -qp.method.aggregative, and extend AggregativeQuantifier(BaseQuantifier). -The methods that any aggregative quantifier must implement are:

-
    @abstractmethod
-    def fit(self, data: LabelledCollection, fit_learner=True): ...
-
-    @abstractmethod
-    def aggregate(self, classif_predictions:np.ndarray): ...
-
-
-

since, as mentioned before, aggregative methods base their prediction on the -individual predictions of a classifier. Indeed, a default implementation -of BaseQuantifier.quantify is already provided, which looks like:

-
    def quantify(self, instances):
-    classif_predictions = self.classify(instances)
-    return self.aggregate(classif_predictions)
-
-
-

Aggregative quantifiers are expected to maintain a classifier (which is -accessed through the @property classifier). This classifier is -given as input to the quantifier, and can be already fit -on external data (in which case, the fit_learner argument should -be set to False), or be fit by the quantifier’s fit (default).

-

Another class of aggregative methods are the probabilistic -aggregative methods, that should inherit from the abstract class -AggregativeProbabilisticQuantifier(AggregativeQuantifier). -The particularity of probabilistic aggregative methods (w.r.t. -non-probabilistic ones), is that the default quantifier is defined -in terms of the posterior probabilities returned by a probabilistic -classifier, and not by the crisp decisions of a hard classifier. -In any case, the interface classify(instances) remains unchanged.

-

One advantage of aggregative methods (either probabilistic or not) -is that the evaluation according to any sampling procedure (e.g., -the artificial sampling protocol) -can be achieved very efficiently, since the entire set can be pre-classified -once, and the quantification estimations for different samples can directly -reuse these predictions, without requiring to classify each element every time. -QuaPy leverages this property to speed-up any procedure having to do with -quantification over samples, as is customarily done in model selection or -in evaluation.

-
-

The Classify & Count variants

-

QuaPy implements the four CC variants, i.e.:

-
    -
  • CC (Classify & Count), the simplest aggregative quantifier; one that -simply relies on the label predictions of a classifier to deliver class estimates.

  • -
  • ACC (Adjusted Classify & Count), the adjusted variant of CC.

  • -
  • PCC (Probabilistic Classify & Count), the probabilistic variant of CC that -relies on the soft estimations (or posterior probabilities) returned by a (probabilistic) classifier.

  • -
  • PACC (Probabilistic Adjusted Classify & Count), the adjusted variant of PCC.

  • -
-

The following code serves as a complete example using CC equipped -with a SVM as the classifier:

-
import quapy as qp
-import quapy.functional as F
-from sklearn.svm import LinearSVC
-
-training, test = qp.datasets.fetch_twitter('hcr', pickle=True).train_test
-
-# instantiate a classifier learner, in this case a SVM
-svm = LinearSVC()
-
-# instantiate a Classify & Count with the SVM
-# (an alias is available in qp.method.aggregative.ClassifyAndCount)
-model = qp.method.aggregative.CC(svm)
-model.fit(training)
-estim_prevalence = model.quantify(test.instances)
-
-
-

The same code could be used to instantiate an ACC, by simply replacing -the instantiation of the model with:

-
model = qp.method.aggregative.ACC(svm)
-
-
-

Note that the adjusted variants (ACC and PACC) need to estimate -some parameters for performing the adjustment (e.g., the -true positive rate and the false positive rate in case of -binary classification) that are estimated on a validation split -of the labelled set. In this case, the init method of -ACC defines an additional parameter, val_split which, by -default, is set to 0.4 and so, the 40% of the labelled data -will be used for estimating the parameters for adjusting the -predictions. This parameters can also be set with an integer, -indicating that the parameters should be estimated by means of -k-fold cross-validation, for which the integer indicates the -number k of folds. Finally, val_split can be set to a -specific held-out validation set (i.e., an instance of LabelledCollection).

-

The specification of val_split can be -postponed to the invokation of the fit method (if val_split was also -set in the constructor, the one specified at fit time would prevail), -e.g.:

-
model = qp.method.aggregative.ACC(svm)
-# perform 5-fold cross validation for estimating ACC's parameters
-# (overrides the default val_split=0.4 in the constructor)
-model.fit(training, val_split=5)
-
-
-

The following code illustrates the case in which PCC is used:

-
model = qp.method.aggregative.PCC(svm)
-model.fit(training)
-estim_prevalence = model.quantify(test.instances)
-print('classifier:', model.classifier)
-
-
-

In this case, QuaPy will print:

-
The learner LinearSVC does not seem to be probabilistic. The learner will be calibrated.
-classifier: CalibratedClassifierCV(base_estimator=LinearSVC(), cv=5)
-
-
-

The first output indicates that the learner (LinearSVC in this case) -is not a probabilistic classifier (i.e., it does not implement the -predict_proba method) and so, the classifier will be converted to -a probabilistic one through calibration. -As a result, the classifier that is printed in the second line points -to a CalibratedClassifier instance. Note that calibration can only -be applied to hard classifiers when fit_learner=True; an exception -will be raised otherwise.

-

Lastly, everything we said aboud ACC and PCC -applies to PACC as well.

-
-
-

Expectation Maximization (EMQ)

-

The Expectation Maximization Quantifier (EMQ), also known as -the SLD, is available at qp.method.aggregative.EMQ or via the -alias qp.method.aggregative.ExpectationMaximizationQuantifier. -The method is described in:

-

Saerens, M., Latinne, P., and Decaestecker, C. (2002). Adjusting the outputs of a classifier -to new a priori probabilities: A simple procedure. Neural Computation, 14(1):21–41.

-

EMQ works with a probabilistic classifier (if the classifier -given as input is a hard one, a calibration will be attempted). -Although this method was originally proposed for improving the -posterior probabilities of a probabilistic classifier, and not -for improving the estimation of prior probabilities, EMQ ranks -almost always among the most effective quantifiers in the -experiments we have carried out.

-

An example of use can be found below:

-
import quapy as qp
-from sklearn.linear_model import LogisticRegression
-
-dataset = qp.datasets.fetch_twitter('hcr', pickle=True)
-
-model = qp.method.aggregative.EMQ(LogisticRegression())
-model.fit(dataset.training)
-estim_prevalence = model.quantify(dataset.test.instances)
-
-
-

New in v0.1.7: EMQ now accepts two new parameters in the construction method, namely -exact_train_prev which allows to use the true training prevalence as the departing -prevalence estimation (default behaviour), or instead an approximation of it as -suggested by Alexandari et al. (2020) -(by setting exact_train_prev=False). -The other parameter is recalib which allows to indicate a calibration method, among those -proposed by Alexandari et al. (2020), -including the Bias-Corrected Temperature Scaling, Vector Scaling, etc. -See the API documentation for further details.

-
-
-

Hellinger Distance y (HDy)

-

Implementation of the method based on the Hellinger Distance y (HDy) proposed by -González-Castro, V., Alaiz-Rodrı́guez, R., and Alegre, E. (2013). Class distribution -estimation based on the Hellinger distance. Information Sciences, 218:146–164.

-

It is implemented in qp.method.aggregative.HDy (also accessible -through the allias qp.method.aggregative.HellingerDistanceY). -This method works with a probabilistic classifier (hard classifiers -can be used as well and will be calibrated) and requires a validation -set to estimate parameter for the mixture model. Just like -ACC and PACC, this quantifier receives a val_split argument -in the constructor (or in the fit method, in which case the previous -value is overridden) that can either be a float indicating the proportion -of training data to be taken as the validation set (in a random -stratified split), or a validation set (i.e., an instance of -LabelledCollection) itself.

-

HDy was proposed as a binary classifier and the implementation -provided in QuaPy accepts only binary datasets.

-

The following code shows an example of use:

-
import quapy as qp
-from sklearn.linear_model import LogisticRegression
-
-# load a binary dataset
-dataset = qp.datasets.fetch_reviews('hp', pickle=True)
-qp.data.preprocessing.text2tfidf(dataset, min_df=5, inplace=True)
-
-model = qp.method.aggregative.HDy(LogisticRegression())
-model.fit(dataset.training)
-estim_prevalence = model.quantify(dataset.test.instances)
-
-
-

New in v0.1.7: QuaPy now provides an implementation of the generalized -“Distribution Matching” approaches for multiclass, inspired by the framework -of Firat (2016). One can instantiate -a variant of HDy for multiclass quantification as follows:

-
mutliclassHDy = qp.method.aggregative.DistributionMatching(classifier=LogisticRegression(), divergence='HD', cdf=False)
-
-
-

New in v0.1.7: QuaPy now provides an implementation of the “DyS” -framework proposed by Maletzke et al (2020) -and the “SMM” method proposed by Hassan et al (2019) -(thanks to Pablo González for the contributions!)

-
-
-

Threshold Optimization methods

-

New in v0.1.7: QuaPy now implements Forman’s threshold optimization methods; -see, e.g., (Forman 2006) -and (Forman 2008). -These include: T50, MAX, X, Median Sweep (MS), and its variant MS2.

-
-
-

Explicit Loss Minimization

-

The Explicit Loss Minimization (ELM) represent a family of methods -based on structured output learning, i.e., quantifiers relying on -classifiers that have been optimized targeting a -quantification-oriented evaluation measure. -The original methods are implemented in QuaPy as classify & count (CC) -quantifiers that use Joachim’s SVMperf -as the underlying classifier, properly set to optimize for the desired loss.

-

In QuaPy, this can be more achieved by calling the functions:

- -

the last two methods (SVM(AE) and SVM(RAE)) have been implemented in -QuaPy in order to make available ELM variants for what nowadays -are considered the most well-behaved evaluation metrics in quantification.

-

In order to make these models work, you would need to run the script -prepare_svmperf.sh (distributed along with QuaPy) that -downloads SVMperf’ source code, applies a patch that -implements the quantification oriented losses, and compiles the -sources.

-

If you want to add any custom loss, you would need to modify -the source code of SVMperf in order to implement it, and -assign a valid loss code to it. Then you must re-compile -the whole thing and instantiate the quantifier in QuaPy -as follows:

-
# you can either set the path to your custom svm_perf_quantification implementation
-# in the environment variable, or as an argument to the constructor of ELM
-qp.environ['SVMPERF_HOME'] = './path/to/svm_perf_quantification'
-
-# assign an alias to your custom loss and the id you have assigned to it
-svmperf = qp.classification.svmperf.SVMperf
-svmperf.valid_losses['mycustomloss'] = 28
-
-# instantiate the ELM method indicating the loss
-model = qp.method.aggregative.ELM(loss='mycustomloss')
-
-
-

All ELM are binary quantifiers since they rely on SVMperf, that -currently supports only binary classification. -ELM variants (any binary quantifier in general) can be extended -to operate in single-label scenarios trivially by adopting a -“one-vs-all” strategy (as, e.g., in -Gao, W. and Sebastiani, F. (2016). From classification to quantification in tweet sentiment -analysis. Social Network Analysis and Mining, 6(19):1–22). -In QuaPy this is possible by using the OneVsAll class.

-

There are two ways for instantiating this class, OneVsAllGeneric that works for -any quantifier, and OneVsAllAggregative that is optimized for aggregative quantifiers. -In general, you can simply use the getOneVsAll function and QuaPy will choose -the more convenient of the two.

-
import quapy as qp
-from quapy.method.aggregative import SVMQ
-
-# load a single-label dataset (this one contains 3 classes)
-dataset = qp.datasets.fetch_twitter('hcr', pickle=True)
-
-# let qp know where svmperf is
-qp.environ['SVMPERF_HOME'] = '../svm_perf_quantification'
-
-model = getOneVsAll(SVMQ(), n_jobs=-1)  # run them on parallel
-model.fit(dataset.training)
-estim_prevalence = model.quantify(dataset.test.instances)
-
-
-

Check the examples explicit_loss_minimization.py -and one_vs_all.py for more details.

-
-
-
-

Meta Models

-

By meta models we mean quantification methods that are defined on top of other -quantification methods, and that thus do not squarely belong to the aggregative nor -the non-aggregative group (indeed, meta models could use quantifiers from any of those -groups). -Meta models are implemented in the qp.method.meta module.

-
-

Ensembles

-

QuaPy implements (some of) the variants proposed in:

- -

The following code shows how to instantiate an Ensemble of 30 Adjusted Classify & Count (ACC) -quantifiers operating with a Logistic Regressor (LR) as the base classifier, and using the -average as the aggregation policy (see the original article for further details). -The last parameter indicates to use all processors for parallelization.

-
import quapy as qp
-from quapy.method.aggregative import ACC
-from quapy.method.meta import Ensemble
-from sklearn.linear_model import LogisticRegression
-
-dataset = qp.datasets.fetch_UCIDataset('haberman')
-
-model = Ensemble(quantifier=ACC(LogisticRegression()), size=30, policy='ave', n_jobs=-1)
-model.fit(dataset.training)
-estim_prevalence = model.quantify(dataset.test.instances)
-
-
-

Other aggregation policies implemented in QuaPy include:

-
    -
  • ‘ptr’ for applying a dynamic selection based on the training prevalence of the ensemble’s members

  • -
  • ‘ds’ for applying a dynamic selection based on the Hellinger Distance

  • -
  • any valid quantification measure (e.g., ‘mse’) for performing a static selection based on -the performance estimated for each member of the ensemble in terms of that evaluation metric.

  • -
-

When using any of the above options, it is important to set the red_size parameter, which -informs of the number of members to retain.

-

Please, check the model selection -wiki if you want to optimize the hyperparameters of ensemble for classification or quantification.

-
-
-

The QuaNet neural network

-

QuaPy offers an implementation of QuaNet, a deep learning model presented in:

-

Esuli, A., Moreo, A., & Sebastiani, F. (2018, October). -A recurrent neural network for sentiment quantification. -In Proceedings of the 27th ACM International Conference on -Information and Knowledge Management (pp. 1775-1778).

-

This model requires torch to be installed. -QuaNet also requires a classifier that can provide embedded representations -of the inputs. -In the original paper, QuaNet was tested using an LSTM as the base classifier. -In the following example, we show an instantiation of QuaNet that instead uses CNN as a probabilistic classifier, taking its last layer representation as the document embedding:

-
import quapy as qp
-from quapy.method.meta import QuaNet
-from quapy.classification.neural import NeuralClassifierTrainer, CNNnet
-
-# use samples of 100 elements
-qp.environ['SAMPLE_SIZE'] = 100
-
-# load the kindle dataset as text, and convert words to numerical indexes
-dataset = qp.datasets.fetch_reviews('kindle', pickle=True)
-qp.data.preprocessing.index(dataset, min_df=5, inplace=True)
-
-# the text classifier is a CNN trained by NeuralClassifierTrainer
-cnn = CNNnet(dataset.vocabulary_size, dataset.n_classes)
-learner = NeuralClassifierTrainer(cnn, device='cuda')
-
-# train QuaNet
-model = QuaNet(learner, device='cuda')
-model.fit(dataset.training)
-estim_prevalence = model.quantify(dataset.test.instances)
-
-
-
-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/build/html/Model-Selection.html b/docs/build/html/Model-Selection.html deleted file mode 100644 index 03a399e..0000000 --- a/docs/build/html/Model-Selection.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - - - - Model Selection — QuaPy 0.1.7 documentation - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Model Selection

-

As a supervised machine learning task, quantification methods -can strongly depend on a good choice of model hyper-parameters. -The process whereby those hyper-parameters are chosen is -typically known as Model Selection, and typically consists of -testing different settings and picking the one that performed -best in a held-out validation set in terms of any given -evaluation measure.

-
-

Targeting a Quantification-oriented loss

-

The task being optimized determines the evaluation protocol, -i.e., the criteria according to which the performance of -any given method for solving is to be assessed. -As a task on its own right, quantification should impose -its own model selection strategies, i.e., strategies -aimed at finding appropriate configurations -specifically designed for the task of quantification.

-

Quantification has long been regarded as an add-on of -classification, and thus the model selection strategies -customarily adopted in classification have simply been -applied to quantification (see the next section). -It has been argued in Moreo, Alejandro, and Fabrizio Sebastiani. -Re-Assessing the “Classify and Count” Quantification Method. -ECIR 2021: Advances in Information Retrieval pp 75–91. -that specific model selection strategies should -be adopted for quantification. That is, model selection -strategies for quantification should target -quantification-oriented losses and be tested in a variety -of scenarios exhibiting different degrees of prior -probability shift.

-

The class qp.model_selection.GridSearchQ implements a grid-search exploration over the space of -hyper-parameter combinations that evaluates -each combination of hyper-parameters by means of a given quantification-oriented -error metric (e.g., any of the error functions implemented -in qp.error) and according to a -sampling generation protocol.

-

The following is an example (also included in the examples folder) of model selection for quantification:

-
import quapy as qp
-from quapy.protocol import APP
-from quapy.method.aggregative import DistributionMatching
-from sklearn.linear_model import LogisticRegression
-import numpy as np
-
-"""
-In this example, we show how to perform model selection on a DistributionMatching quantifier.
-"""
-
-model = DistributionMatching(LogisticRegression())
-
-qp.environ['SAMPLE_SIZE'] = 100
-qp.environ['N_JOBS'] = -1  # explore hyper-parameters in parallel
-
-training, test = qp.datasets.fetch_reviews('imdb', tfidf=True, min_df=5).train_test
-
-# The model will be returned by the fit method of GridSearchQ.
-# Every combination of hyper-parameters will be evaluated by confronting the
-# quantifier thus configured against a series of samples generated by means
-# of a sample generation protocol. For this example, we will use the
-# artificial-prevalence protocol (APP), that generates samples with prevalence
-# values in the entire range of values from a grid (e.g., [0, 0.1, 0.2, ..., 1]).
-# We devote 30% of the dataset for this exploration.
-training, validation = training.split_stratified(train_prop=0.7)
-protocol = APP(validation)
-
-# We will explore a classification-dependent hyper-parameter (e.g., the 'C'
-# hyper-parameter of LogisticRegression) and a quantification-dependent hyper-parameter
-# (e.g., the number of bins in a DistributionMatching quantifier.
-# Classifier-dependent hyper-parameters have to be marked with a prefix "classifier__"
-# in order to let the quantifier know this hyper-parameter belongs to its underlying
-# classifier.
-param_grid = {
-    'classifier__C': np.logspace(-3,3,7),
-    'nbins': [8, 16, 32, 64],
-}
-
-model = qp.model_selection.GridSearchQ(
-    model=model,
-    param_grid=param_grid,
-    protocol=protocol,
-    error='mae',  # the error to optimize is the MAE (a quantification-oriented loss)
-    refit=True,   # retrain on the whole labelled set once done
-    verbose=True  # show information as the process goes on
-).fit(training)
-
-print(f'model selection ended: best hyper-parameters={model.best_params_}')
-model = model.best_model_
-
-# evaluation in terms of MAE
-# we use the same evaluation protocol (APP) on the test set
-mae_score = qp.evaluation.evaluate(model, protocol=APP(test), error_metric='mae')
-
-print(f'MAE={mae_score:.5f}')
-
-
-

In this example, the system outputs:

-
[GridSearchQ]: starting model selection with self.n_jobs =-1
-[GridSearchQ]: hyperparams={'classifier__C': 0.01, 'nbins': 64}	 got mae score 0.04021 [took 1.1356s]
-[GridSearchQ]: hyperparams={'classifier__C': 0.01, 'nbins': 32}	 got mae score 0.04286 [took 1.2139s]
-[GridSearchQ]: hyperparams={'classifier__C': 0.01, 'nbins': 16}	 got mae score 0.04888 [took 1.2491s]
-[GridSearchQ]: hyperparams={'classifier__C': 0.001, 'nbins': 8}	 got mae score 0.05163 [took 1.5372s]
-[...]
-[GridSearchQ]: hyperparams={'classifier__C': 1000.0, 'nbins': 32}	 got mae score 0.02445 [took 2.9056s]
-[GridSearchQ]: optimization finished: best params {'classifier__C': 100.0, 'nbins': 32} (score=0.02234) [took 7.3114s]
-[GridSearchQ]: refitting on the whole development set
-model selection ended: best hyper-parameters={'classifier__C': 100.0, 'nbins': 32}
-MAE=0.03102
-
-
-

The parameter val_split can alternatively be used to indicate -a validation set (i.e., an instance of LabelledCollection) instead -of a proportion. This could be useful if one wants to have control -on the specific data split to be used across different model selection -experiments.

-
-
-

Targeting a Classification-oriented loss

-

Optimizing a model for quantification could rather be -computationally costly. -In aggregative methods, one could alternatively try to optimize -the classifier’s hyper-parameters for classification. -Although this is theoretically suboptimal, many articles in -quantification literature have opted for this strategy.

-

In QuaPy, this is achieved by simply instantiating the -classifier learner as a GridSearchCV from scikit-learn. -The following code illustrates how to do that:

-
learner = GridSearchCV(
-    LogisticRegression(),
-    param_grid={'C': np.logspace(-4, 5, 10), 'class_weight': ['balanced', None]},
-    cv=5)
-model = DistributionMatching(learner).fit(dataset.training)
-
-
-

However, this is conceptually flawed, since the model should be -optimized for the task at hand (quantification), and not for a surrogate task (classification), -i.e., the model should be requested to deliver low quantification errors, rather -than low classification errors.

-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/build/html/Plotting.html b/docs/build/html/Plotting.html deleted file mode 100644 index d41bef6..0000000 --- a/docs/build/html/Plotting.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - - - - - Plotting — QuaPy 0.1.7 documentation - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Plotting

-

The module qp.plot implements some basic plotting functions -that can help analyse the performance of a quantification method.

-

All plotting functions receive as inputs the outcomes of -some experiments and include, for each experiment, -the following three main arguments:

-
    -
  • method_names a list containing the names of the quantification methods

  • -
  • true_prevs a list containing matrices of true prevalences

  • -
  • estim_prevs a list containing matrices of estimated prevalences -(should be of the same shape as the corresponding matrix in true_prevs)

  • -
-

Note that a method (as indicated by a name in method_names) can -appear more than once. This could occur when various datasets are -involved in the experiments. In this case, all experiments for the -method will be merged and the plot will represent the method’s -performance across various datasets.

-

This is a very simple example of a valid input for the plotting functions:

-
method_names = ['classify & count', 'EMQ', 'classify & count']
-true_prevs = [
-    np.array([[0.5, 0.5], [0.25, 0.75]]),
-    np.array([[0.0, 1.0], [0.25, 0.75], [0.0, 0.1]]),
-    np.array([[0.0, 1.0], [0.25, 0.75], [0.0, 0.1]]),
-]
-estim_prevs = [
-    np.array([[0.45, 0.55], [0.6, 0.4]]),
-    np.array([[0.0, 1.0], [0.5, 0.5], [0.2, 0.8]]),
-    np.array([[0.1, 0.9], [0.3, 0.7], [0.0, 0.1]]),
-]
-
-
-

in which the classify & count has been tested in two datasets and -the EMQ method has been tested only in one dataset. For the first -experiment, only two (binary) quantifications have been tested, -while for the second and third experiments three instances have -been tested.

-

In general, we would like to test the performance of the -quantification methods across different scenarios showcasing -the accuracy of the quantifier in predicting class prevalences -for a wide range of prior distributions. This can easily be -achieved by means of the -artificial sampling protocol -that is implemented in QuaPy.

-

The following code shows how to perform one simple experiment -in which the 4 CC-variants, all equipped with a linear SVM, are -applied to one binary dataset of reviews about Kindle devices and -tested across the entire spectrum of class priors (taking 21 splits -of the interval [0,1], i.e., using prevalence steps of 0.05, and -generating 100 random samples at each prevalence).

-
import quapy as qp
-from protocol import APP
-from quapy.method.aggregative import CC, ACC, PCC, PACC
-from sklearn.svm import LinearSVC
-
-qp.environ['SAMPLE_SIZE'] = 500
-
-def gen_data():
-
-    def base_classifier():
-        return LinearSVC(class_weight='balanced')
-
-    def models():
-        yield 'CC', CC(base_classifier())
-        yield 'ACC', ACC(base_classifier())
-        yield 'PCC', PCC(base_classifier())
-        yield 'PACC', PACC(base_classifier())
-
-    train, test = qp.datasets.fetch_reviews('kindle', tfidf=True, min_df=5).train_test
-
-    method_names, true_prevs, estim_prevs, tr_prevs = [], [], [], []
-
-    for method_name, model in models():
-        model.fit(train)
-        true_prev, estim_prev = qp.evaluation.prediction(model, APP(test, repeats=100, random_state=0))
-
-        method_names.append(method_name)
-        true_prevs.append(true_prev)
-        estim_prevs.append(estim_prev)
-        tr_prevs.append(train.prevalence())
-
-    return method_names, true_prevs, estim_prevs, tr_prevs
-
-method_names, true_prevs, estim_prevs, tr_prevs = gen_data()
-
-
-

the plots that can be generated are explained below.

-
-

Diagonal Plot

-

The diagonal plot shows a very insightful view of the -quantifier’s performance. It plots the predicted class -prevalence (in the y-axis) against the true class prevalence -(in the x-axis). Unfortunately, it is limited to binary quantification, -although one can simply generate as many diagonal plots as -classes there are by indicating which class should be considered -the target of the plot.

-

The following call will produce the plot:

-
qp.plot.binary_diagonal(method_names, true_prevs, estim_prevs, train_prev=tr_prevs[0], savepath='./plots/bin_diag.png')
-
-
-

the last argument is optional, and indicates the path where to save -the plot (the file extension will determine the format – typical extensions -are ‘.png’ or ‘.pdf’). If this path is not provided, then the plot -will be shown but not saved. -The resulting plot should look like:

-

diagonal plot on Kindle

-

Note that in this case, we are also indicating the training -prevalence, which is plotted in the diagonal a as cyan dot. -The color bands indicate the standard deviations of the predictions, -and can be hidden by setting the argument show_std=False (see -the complete list of arguments in the documentation).

-

Finally, note how most quantifiers, and specially the “unadjusted” -variants CC and PCC, are strongly biased towards the -prevalence seen during training.

-
-
-

Quantification bias

-

This plot aims at evincing the bias that any quantifier -displays with respect to the training prevalences by -means of box plots. -This plot can be generated by:

-
qp.plot.binary_bias_global(method_names, true_prevs, estim_prevs, savepath='./plots/bin_bias.png')
-
-
-

and should look like:

-

bias plot on Kindle

-

The box plots show some interesting facts:

-
    -
  • all methods are biased towards the training prevalence but specially -so CC and PCC (an unbiased quantifier would have a box centered at 0)

  • -
  • the bias is always positive, indicating that all methods tend to -overestimate the positive class prevalence

  • -
  • CC and PCC have high variability while ACC and specially PACC exhibit -lower variability.

  • -
-

Again, these plots could be generated for experiments ranging across -different datasets, and the plot will merge all data accordingly.

-

Another illustrative example can be shown that consists of -training different CC quantifiers trained at different -(artificially sampled) training prevalences. -For this example, we generate training samples of 5000 -documents containing 10%, 20%, …, 90% of positives from the -IMDb dataset, and generate the bias plot again. -This example can be run by rewritting the gen_data() function -like this:

-
def gen_data():
-
-    train, test = qp.datasets.fetch_reviews('imdb', tfidf=True, min_df=5).train_test
-    model = CC(LinearSVC())
-
-    method_data = []
-    for training_prevalence in np.linspace(0.1, 0.9, 9):
-        training_size = 5000
-        # since the problem is binary, it suffices to specify the negative prevalence, since the positive is constrained
-        train_sample = train.sampling(training_size, 1-training_prevalence)
-        model.fit(train_sample)
-        true_prev, estim_prev = qp.evaluation.prediction(model, APP(test, repeats=100, random_state=0))
-        method_name = 'CC$_{'+f'{int(100*training_prevalence)}' + '\%}$'
-        method_data.append((method_name, true_prev, estim_prev, train_sample.prevalence()))
-
-    return zip(*method_data)
-
-
-

and the plot should now look like:

-

bias plot on IMDb

-

which clearly shows a negative bias for CC variants trained on -data containing more negatives (i.e., < 50%) and positive biases -in cases containing more positives (i.e., >50%). The CC trained -at 50% behaves as an unbiased estimator of the positive class -prevalence.

-

The function qp.plot.binary_bias_bins allows the user to -generate box plots broken down by bins of true test prevalence. -To this aim, an argument nbins is passed which indicates -how many isometric subintervals to take. For example -the following plot is produced for nbins=3:

-

bias plot on IMDb

-

Interestingly enough, the seemingly unbiased estimator (CC at 50%) happens to display -a positive bias (or a tendency to overestimate) in cases of low prevalence -(i.e., when the true prevalence of the positive class is below 33%), -and a negative bias (or a tendency to underestimate) in cases of high prevalence -(i.e., when the true prevalence is beyond 67%).

-

Out of curiosity, the diagonal plot for this experiment looks like:

-

diag plot on IMDb

-

showing pretty clearly the dependency of CC on the prior probabilities -of the labeled set it was trained on.

-
-
-

Error by Drift

-

Above discussed plots are useful for analyzing and comparing -the performance of different quantification methods, but are -limited to the binary case. The “error by drift” is a plot -that shows the error in predictions as a function of the -(prior probability) drift between each test sample and the -training set. Interestingly, the error and drift can both be measured -in terms of any evaluation measure for quantification (like the -ones available in qp.error) and can thus be computed -irrespectively of the number of classes.

-

The following shows how to generate the plot for the 4 CC variants, -using 10 bins for the drift -and absolute error as the measure of the error (the -drift in the x-axis is always computed in terms of absolute error since -other errors are harder to interpret):

-
qp.plot.error_by_drift(method_names, true_prevs, estim_prevs, tr_prevs, 
-    error_name='ae', n_bins=10, savepath='./plots/err_drift.png')
-
-
-

diag plot on IMDb

-

Note that all methods work reasonably well in cases of low prevalence -drift (i.e., any CC-variant is a good quantifier whenever the IID -assumption is approximately preserved). The higher the drift, the worse -those quantifiers tend to perform, although it is clear that PACC -yields the lowest error for the most difficult cases.

-

Remember that any plot can be generated across many datasets, and -that this would probably result in a more solid comparison. -In those cases, however, it is likely that the variances of each -method get higher, to the detriment of the visualization. -We recommend to set show_std=False in those cases -in order to hide the color bands.

-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/build/html/_images/bin_bias.png b/docs/build/html/_images/bin_bias.png deleted file mode 100644 index 572dae451e1562ba22198ff30771408671e67e27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63858 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 LdLQz7Z|na6j^@jB diff --git a/docs/build/html/_images/bin_bias_bin_cc.png b/docs/build/html/_images/bin_bias_bin_cc.png deleted file mode 100644 index db34c766fac953fa0928543bb8c84922d0886fe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110404 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%0A4y@+AJRP)*j!55@%=U0!99ybXKs2ub$+(z& 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 YG^lUstF;y9=$*;!JtUj7``Eev2l_h$B>(^b diff --git a/docs/build/html/_images/bin_bias_cc.png b/docs/build/html/_images/bin_bias_cc.png deleted file mode 100644 index db91dd4aff341580997719f85917bf6a9a6abed0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72541 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 diff --git a/docs/build/html/_images/bin_diag.png b/docs/build/html/_images/bin_diag.png deleted file mode 100644 index 7ded71a2f5638e9caf04b39b684d56c9021991fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189871 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
jNB#!|sE*?TGBg|jsaP=c@Lc)N!(##m!) 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μ%*e}%>N>Qevbh46F-bLx$rPiqL<94sO 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
rYKW{GXAtGVq2LqpHGHK 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≺kZH1D?@`%UPbHJdCH+qH=v>O} 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 R&!f-q*Y}|+*;p-SzjBVI|XBm;< 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%0ASgCzcRcff&G9QYb}R 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 for older versions. - -Requirements -************ - -* scikit-learn, numpy, scipy -* pytorch (for QuaNet) -* svmperf patched for quantification (see below) -* joblib -* tqdm -* pandas, xlrd -* matplotlib - - -SVM-perf with quantification-oriented losses -******************************************** - -In order to run experiments involving SVM(Q), SVM(KLD), SVM(NKLD), -SVM(AE), or SVM(RAE), you have to first download the -`svmperf `_ -package, apply the patch -`svm-perf-quantification-ext.patch `_, -and compile the sources. -The script -`prepare_svmperf.sh `_, -does all the job. Simply run: - -:: - - ./prepare_svmperf.sh - - -The resulting directory `./svm_perf_quantification` contains the -patched version of `svmperf` with quantification-oriented losses. - -The -`svm-perf-quantification-ext.patch `_ -is an extension of the patch made available by -`Esuli et al. 2015 `_ -that allows SVMperf to optimize for -the `Q` measure as proposed by -`Barranquero et al. 2015 `_ -and for the `KLD` and `NKLD` as proposed by -`Esuli et al. 2015 `_ -for quantification. -This patch extends the former by also allowing SVMperf to optimize for -`AE` and `RAE`. \ No newline at end of file diff --git a/docs/build/html/_sources/Methods.md.txt b/docs/build/html/_sources/Methods.md.txt deleted file mode 100644 index 7060a0a..0000000 --- a/docs/build/html/_sources/Methods.md.txt +++ /dev/null @@ -1,438 +0,0 @@ -# Quantification Methods - -Quantification methods can be categorized as belonging to -_aggregative_ and _non-aggregative_ groups. -Most methods included in QuaPy at the moment are of type _aggregative_ -(though we plan to add many more methods in the near future), i.e., -are methods characterized by the fact that -quantification is performed as an aggregation function of the individual -products of classification. - -Any quantifier in QuaPy shoud extend the class _BaseQuantifier_, -and implement some abstract methods: -```python - @abstractmethod - def fit(self, data: LabelledCollection): ... - - @abstractmethod - def quantify(self, instances): ... -``` -The meaning of those functions should be familiar to those -used to work with scikit-learn since the class structure of QuaPy -is directly inspired by scikit-learn's _Estimators_. Functions -_fit_ and _quantify_ are used to train the model and to provide -class estimations (the reason why -scikit-learn' structure has not been adopted _as is_ in QuaPy responds to -the fact that scikit-learn's _predict_ function is expected to return -one output for each input element --e.g., a predicted label for each -instance in a sample-- while in quantification the output for a sample -is one single array of class prevalences). -Quantifiers also extend from scikit-learn's `BaseEstimator`, in order -to simplify the use of _set_params_ and _get_params_ used in -[model selector](https://github.com/HLT-ISTI/QuaPy/wiki/Model-Selection). - -## Aggregative Methods - -All quantification methods are implemented as part of the -_qp.method_ package. In particular, _aggregative_ methods are defined in -_qp.method.aggregative_, and extend _AggregativeQuantifier(BaseQuantifier)_. -The methods that any _aggregative_ quantifier must implement are: - -```python - @abstractmethod - def fit(self, data: LabelledCollection, fit_learner=True): ... - - @abstractmethod - def aggregate(self, classif_predictions:np.ndarray): ... -``` - -since, as mentioned before, aggregative methods base their prediction on the -individual predictions of a classifier. Indeed, a default implementation -of _BaseQuantifier.quantify_ is already provided, which looks like: - -```python - def quantify(self, instances): - classif_predictions = self.classify(instances) - return self.aggregate(classif_predictions) -``` -Aggregative quantifiers are expected to maintain a classifier (which is -accessed through the _@property_ _classifier_). This classifier is -given as input to the quantifier, and can be already fit -on external data (in which case, the _fit_learner_ argument should -be set to False), or be fit by the quantifier's fit (default). - -Another class of _aggregative_ methods are the _probabilistic_ -aggregative methods, that should inherit from the abstract class -_AggregativeProbabilisticQuantifier(AggregativeQuantifier)_. -The particularity of _probabilistic_ aggregative methods (w.r.t. -non-probabilistic ones), is that the default quantifier is defined -in terms of the posterior probabilities returned by a probabilistic -classifier, and not by the crisp decisions of a hard classifier. -In any case, the interface _classify(instances)_ remains unchanged. - -One advantage of _aggregative_ methods (either probabilistic or not) -is that the evaluation according to any sampling procedure (e.g., -the [artificial sampling protocol](https://github.com/HLT-ISTI/QuaPy/wiki/Evaluation)) -can be achieved very efficiently, since the entire set can be pre-classified -once, and the quantification estimations for different samples can directly -reuse these predictions, without requiring to classify each element every time. -QuaPy leverages this property to speed-up any procedure having to do with -quantification over samples, as is customarily done in model selection or -in evaluation. - -### The Classify & Count variants - -QuaPy implements the four CC variants, i.e.: - -* _CC_ (Classify & Count), the simplest aggregative quantifier; one that - simply relies on the label predictions of a classifier to deliver class estimates. -* _ACC_ (Adjusted Classify & Count), the adjusted variant of CC. -* _PCC_ (Probabilistic Classify & Count), the probabilistic variant of CC that -relies on the soft estimations (or posterior probabilities) returned by a (probabilistic) classifier. -* _PACC_ (Probabilistic Adjusted Classify & Count), the adjusted variant of PCC. - -The following code serves as a complete example using CC equipped -with a SVM as the classifier: - -```python -import quapy as qp -import quapy.functional as F -from sklearn.svm import LinearSVC - -training, test = qp.datasets.fetch_twitter('hcr', pickle=True).train_test - -# instantiate a classifier learner, in this case a SVM -svm = LinearSVC() - -# instantiate a Classify & Count with the SVM -# (an alias is available in qp.method.aggregative.ClassifyAndCount) -model = qp.method.aggregative.CC(svm) -model.fit(training) -estim_prevalence = model.quantify(test.instances) -``` - -The same code could be used to instantiate an ACC, by simply replacing -the instantiation of the model with: -```python -model = qp.method.aggregative.ACC(svm) -``` -Note that the adjusted variants (ACC and PACC) need to estimate -some parameters for performing the adjustment (e.g., the -_true positive rate_ and the _false positive rate_ in case of -binary classification) that are estimated on a validation split -of the labelled set. In this case, the __init__ method of -ACC defines an additional parameter, _val_split_ which, by -default, is set to 0.4 and so, the 40% of the labelled data -will be used for estimating the parameters for adjusting the -predictions. This parameters can also be set with an integer, -indicating that the parameters should be estimated by means of -_k_-fold cross-validation, for which the integer indicates the -number _k_ of folds. Finally, _val_split_ can be set to a -specific held-out validation set (i.e., an instance of _LabelledCollection_). - -The specification of _val_split_ can be -postponed to the invokation of the fit method (if _val_split_ was also -set in the constructor, the one specified at fit time would prevail), -e.g.: - -```python -model = qp.method.aggregative.ACC(svm) -# perform 5-fold cross validation for estimating ACC's parameters -# (overrides the default val_split=0.4 in the constructor) -model.fit(training, val_split=5) -``` - -The following code illustrates the case in which PCC is used: - -```python -model = qp.method.aggregative.PCC(svm) -model.fit(training) -estim_prevalence = model.quantify(test.instances) -print('classifier:', model.classifier) -``` -In this case, QuaPy will print: -``` -The learner LinearSVC does not seem to be probabilistic. The learner will be calibrated. -classifier: CalibratedClassifierCV(base_estimator=LinearSVC(), cv=5) -``` -The first output indicates that the learner (_LinearSVC_ in this case) -is not a probabilistic classifier (i.e., it does not implement the -_predict_proba_ method) and so, the classifier will be converted to -a probabilistic one through [calibration](https://scikit-learn.org/stable/modules/calibration.html). -As a result, the classifier that is printed in the second line points -to a _CalibratedClassifier_ instance. Note that calibration can only -be applied to hard classifiers when _fit_learner=True_; an exception -will be raised otherwise. - -Lastly, everything we said aboud ACC and PCC -applies to PACC as well. - - -### Expectation Maximization (EMQ) - -The Expectation Maximization Quantifier (EMQ), also known as -the SLD, is available at _qp.method.aggregative.EMQ_ or via the -alias _qp.method.aggregative.ExpectationMaximizationQuantifier_. -The method is described in: - -_Saerens, M., Latinne, P., and Decaestecker, C. (2002). Adjusting the outputs of a classifier -to new a priori probabilities: A simple procedure. Neural Computation, 14(1):21–41._ - -EMQ works with a probabilistic classifier (if the classifier -given as input is a hard one, a calibration will be attempted). -Although this method was originally proposed for improving the -posterior probabilities of a probabilistic classifier, and not -for improving the estimation of prior probabilities, EMQ ranks -almost always among the most effective quantifiers in the -experiments we have carried out. - -An example of use can be found below: - -```python -import quapy as qp -from sklearn.linear_model import LogisticRegression - -dataset = qp.datasets.fetch_twitter('hcr', pickle=True) - -model = qp.method.aggregative.EMQ(LogisticRegression()) -model.fit(dataset.training) -estim_prevalence = model.quantify(dataset.test.instances) -``` - -_New in v0.1.7_: EMQ now accepts two new parameters in the construction method, namely -_exact_train_prev_ which allows to use the true training prevalence as the departing -prevalence estimation (default behaviour), or instead an approximation of it as -suggested by [Alexandari et al. (2020)](http://proceedings.mlr.press/v119/alexandari20a.html) -(by setting _exact_train_prev=False_). -The other parameter is _recalib_ which allows to indicate a calibration method, among those -proposed by [Alexandari et al. (2020)](http://proceedings.mlr.press/v119/alexandari20a.html), -including the Bias-Corrected Temperature Scaling, Vector Scaling, etc. -See the API documentation for further details. - - -### Hellinger Distance y (HDy) - -Implementation of the method based on the Hellinger Distance y (HDy) proposed by -[González-Castro, V., Alaiz-Rodrı́guez, R., and Alegre, E. (2013). Class distribution -estimation based on the Hellinger distance. Information Sciences, 218:146–164.](https://www.sciencedirect.com/science/article/pii/S0020025512004069) - -It is implemented in _qp.method.aggregative.HDy_ (also accessible -through the allias _qp.method.aggregative.HellingerDistanceY_). -This method works with a probabilistic classifier (hard classifiers -can be used as well and will be calibrated) and requires a validation -set to estimate parameter for the mixture model. Just like -ACC and PACC, this quantifier receives a _val_split_ argument -in the constructor (or in the fit method, in which case the previous -value is overridden) that can either be a float indicating the proportion -of training data to be taken as the validation set (in a random -stratified split), or a validation set (i.e., an instance of -_LabelledCollection_) itself. - -HDy was proposed as a binary classifier and the implementation -provided in QuaPy accepts only binary datasets. - -The following code shows an example of use: -```python -import quapy as qp -from sklearn.linear_model import LogisticRegression - -# load a binary dataset -dataset = qp.datasets.fetch_reviews('hp', pickle=True) -qp.data.preprocessing.text2tfidf(dataset, min_df=5, inplace=True) - -model = qp.method.aggregative.HDy(LogisticRegression()) -model.fit(dataset.training) -estim_prevalence = model.quantify(dataset.test.instances) -``` - -_New in v0.1.7:_ QuaPy now provides an implementation of the generalized -"Distribution Matching" approaches for multiclass, inspired by the framework -of [Firat (2016)](https://arxiv.org/abs/1606.00868). One can instantiate -a variant of HDy for multiclass quantification as follows: - -```python -mutliclassHDy = qp.method.aggregative.DistributionMatching(classifier=LogisticRegression(), divergence='HD', cdf=False) -``` - -_New in v0.1.7:_ QuaPy now provides an implementation of the "DyS" -framework proposed by [Maletzke et al (2020)](https://ojs.aaai.org/index.php/AAAI/article/view/4376) -and the "SMM" method proposed by [Hassan et al (2019)](https://ieeexplore.ieee.org/document/9260028) -(thanks to _Pablo González_ for the contributions!) - -### Threshold Optimization methods - -_New in v0.1.7:_ QuaPy now implements Forman's threshold optimization methods; -see, e.g., [(Forman 2006)](https://dl.acm.org/doi/abs/10.1145/1150402.1150423) -and [(Forman 2008)](https://link.springer.com/article/10.1007/s10618-008-0097-y). -These include: T50, MAX, X, Median Sweep (MS), and its variant MS2. - -### Explicit Loss Minimization - -The Explicit Loss Minimization (ELM) represent a family of methods -based on structured output learning, i.e., quantifiers relying on -classifiers that have been optimized targeting a -quantification-oriented evaluation measure. -The original methods are implemented in QuaPy as classify & count (CC) -quantifiers that use Joachim's [SVMperf](https://www.cs.cornell.edu/people/tj/svm_light/svm_perf.html) -as the underlying classifier, properly set to optimize for the desired loss. - -In QuaPy, this can be more achieved by calling the functions: - -* _newSVMQ_: returns the quantification method called SVM(Q) that optimizes for the metric _Q_ defined -in [_Barranquero, J., Díez, J., and del Coz, J. J. (2015). Quantification-oriented learning based -on reliable classifiers. Pattern Recognition, 48(2):591–604._](https://www.sciencedirect.com/science/article/pii/S003132031400291X) -* _newSVMKLD_ and _newSVMNKLD_: returns the quantification method called SVM(KLD) and SVM(nKLD), standing for - Kullback-Leibler Divergence and Normalized Kullback-Leibler Divergence, as proposed in [_Esuli, A. and Sebastiani, F. (2015). - Optimizing text quantifiers for multivariate loss functions. - ACM Transactions on Knowledge Discovery and Data, 9(4):Article 27._](https://dl.acm.org/doi/abs/10.1145/2700406) -* _newSVMAE_ and _newSVMRAE_: returns a quantification method called SVM(AE) and SVM(RAE) that optimizes for the (Mean) Absolute Error and for the - (Mean) Relative Absolute Error, as first used by - [_Moreo, A. and Sebastiani, F. (2021). Tweet sentiment quantification: An experimental re-evaluation. PLOS ONE 17 (9), 1-23._](https://arxiv.org/abs/2011.02552) - -the last two methods (SVM(AE) and SVM(RAE)) have been implemented in -QuaPy in order to make available ELM variants for what nowadays -are considered the most well-behaved evaluation metrics in quantification. - -In order to make these models work, you would need to run the script -_prepare_svmperf.sh_ (distributed along with QuaPy) that -downloads _SVMperf_' source code, applies a patch that -implements the quantification oriented losses, and compiles the -sources. - -If you want to add any custom loss, you would need to modify -the source code of _SVMperf_ in order to implement it, and -assign a valid loss code to it. Then you must re-compile -the whole thing and instantiate the quantifier in QuaPy -as follows: - -```python -# you can either set the path to your custom svm_perf_quantification implementation -# in the environment variable, or as an argument to the constructor of ELM -qp.environ['SVMPERF_HOME'] = './path/to/svm_perf_quantification' - -# assign an alias to your custom loss and the id you have assigned to it -svmperf = qp.classification.svmperf.SVMperf -svmperf.valid_losses['mycustomloss'] = 28 - -# instantiate the ELM method indicating the loss -model = qp.method.aggregative.ELM(loss='mycustomloss') -``` - -All ELM are binary quantifiers since they rely on _SVMperf_, that -currently supports only binary classification. -ELM variants (any binary quantifier in general) can be extended -to operate in single-label scenarios trivially by adopting a -"one-vs-all" strategy (as, e.g., in -[_Gao, W. and Sebastiani, F. (2016). From classification to quantification in tweet sentiment -analysis. Social Network Analysis and Mining, 6(19):1–22_](https://link.springer.com/article/10.1007/s13278-016-0327-z)). -In QuaPy this is possible by using the _OneVsAll_ class. - -There are two ways for instantiating this class, _OneVsAllGeneric_ that works for -any quantifier, and _OneVsAllAggregative_ that is optimized for aggregative quantifiers. -In general, you can simply use the _getOneVsAll_ function and QuaPy will choose -the more convenient of the two. - -```python -import quapy as qp -from quapy.method.aggregative import SVMQ - -# load a single-label dataset (this one contains 3 classes) -dataset = qp.datasets.fetch_twitter('hcr', pickle=True) - -# let qp know where svmperf is -qp.environ['SVMPERF_HOME'] = '../svm_perf_quantification' - -model = getOneVsAll(SVMQ(), n_jobs=-1) # run them on parallel -model.fit(dataset.training) -estim_prevalence = model.quantify(dataset.test.instances) -``` - -Check the examples _[explicit_loss_minimization.py](..%2Fexamples%2Fexplicit_loss_minimization.py)_ -and [one_vs_all.py](..%2Fexamples%2Fone_vs_all.py) for more details. - -## Meta Models - -By _meta_ models we mean quantification methods that are defined on top of other -quantification methods, and that thus do not squarely belong to the aggregative nor -the non-aggregative group (indeed, _meta_ models could use quantifiers from any of those -groups). -_Meta_ models are implemented in the _qp.method.meta_ module. - -### Ensembles - -QuaPy implements (some of) the variants proposed in: - -* [_Pérez-Gállego, P., Quevedo, J. R., & del Coz, J. J. (2017). -Using ensembles for problems with characterizable changes in data distribution: A case study on quantification. -Information Fusion, 34, 87-100._](https://www.sciencedirect.com/science/article/pii/S1566253516300628) -* [_Pérez-Gállego, P., Castano, A., Quevedo, J. R., & del Coz, J. J. (2019). - Dynamic ensemble selection for quantification tasks. - Information Fusion, 45, 1-15._](https://www.sciencedirect.com/science/article/pii/S1566253517303652) - -The following code shows how to instantiate an Ensemble of 30 _Adjusted Classify & Count_ (ACC) -quantifiers operating with a _Logistic Regressor_ (LR) as the base classifier, and using the -_average_ as the aggregation policy (see the original article for further details). -The last parameter indicates to use all processors for parallelization. - -```python -import quapy as qp -from quapy.method.aggregative import ACC -from quapy.method.meta import Ensemble -from sklearn.linear_model import LogisticRegression - -dataset = qp.datasets.fetch_UCIDataset('haberman') - -model = Ensemble(quantifier=ACC(LogisticRegression()), size=30, policy='ave', n_jobs=-1) -model.fit(dataset.training) -estim_prevalence = model.quantify(dataset.test.instances) -``` - -Other aggregation policies implemented in QuaPy include: -* 'ptr' for applying a dynamic selection based on the training prevalence of the ensemble's members -* 'ds' for applying a dynamic selection based on the Hellinger Distance -* _any valid quantification measure_ (e.g., 'mse') for performing a static selection based on -the performance estimated for each member of the ensemble in terms of that evaluation metric. - -When using any of the above options, it is important to set the _red_size_ parameter, which -informs of the number of members to retain. - -Please, check the [model selection](https://github.com/HLT-ISTI/QuaPy/wiki/Model-Selection) -wiki if you want to optimize the hyperparameters of ensemble for classification or quantification. - -### The QuaNet neural network - -QuaPy offers an implementation of QuaNet, a deep learning model presented in: - -[_Esuli, A., Moreo, A., & Sebastiani, F. (2018, October). -A recurrent neural network for sentiment quantification. -In Proceedings of the 27th ACM International Conference on -Information and Knowledge Management (pp. 1775-1778)._](https://dl.acm.org/doi/abs/10.1145/3269206.3269287) - -This model requires _torch_ to be installed. -QuaNet also requires a classifier that can provide embedded representations -of the inputs. -In the original paper, QuaNet was tested using an LSTM as the base classifier. -In the following example, we show an instantiation of QuaNet that instead uses CNN as a probabilistic classifier, taking its last layer representation as the document embedding: - -```python -import quapy as qp -from quapy.method.meta import QuaNet -from quapy.classification.neural import NeuralClassifierTrainer, CNNnet - -# use samples of 100 elements -qp.environ['SAMPLE_SIZE'] = 100 - -# load the kindle dataset as text, and convert words to numerical indexes -dataset = qp.datasets.fetch_reviews('kindle', pickle=True) -qp.data.preprocessing.index(dataset, min_df=5, inplace=True) - -# the text classifier is a CNN trained by NeuralClassifierTrainer -cnn = CNNnet(dataset.vocabulary_size, dataset.n_classes) -learner = NeuralClassifierTrainer(cnn, device='cuda') - -# train QuaNet -model = QuaNet(learner, device='cuda') -model.fit(dataset.training) -estim_prevalence = model.quantify(dataset.test.instances) -``` - diff --git a/docs/build/html/_sources/Model-Selection.md.txt b/docs/build/html/_sources/Model-Selection.md.txt deleted file mode 100644 index 1df9107..0000000 --- a/docs/build/html/_sources/Model-Selection.md.txt +++ /dev/null @@ -1,150 +0,0 @@ -# Model Selection - -As a supervised machine learning task, quantification methods -can strongly depend on a good choice of model hyper-parameters. -The process whereby those hyper-parameters are chosen is -typically known as _Model Selection_, and typically consists of -testing different settings and picking the one that performed -best in a held-out validation set in terms of any given -evaluation measure. - -## Targeting a Quantification-oriented loss - -The task being optimized determines the evaluation protocol, -i.e., the criteria according to which the performance of -any given method for solving is to be assessed. -As a task on its own right, quantification should impose -its own model selection strategies, i.e., strategies -aimed at finding appropriate configurations -specifically designed for the task of quantification. - -Quantification has long been regarded as an add-on of -classification, and thus the model selection strategies -customarily adopted in classification have simply been -applied to quantification (see the next section). -It has been argued in [Moreo, Alejandro, and Fabrizio Sebastiani. -Re-Assessing the "Classify and Count" Quantification Method. -ECIR 2021: Advances in Information Retrieval pp 75–91.](https://link.springer.com/chapter/10.1007/978-3-030-72240-1_6) -that specific model selection strategies should -be adopted for quantification. That is, model selection -strategies for quantification should target -quantification-oriented losses and be tested in a variety -of scenarios exhibiting different degrees of prior -probability shift. - -The class _qp.model_selection.GridSearchQ_ implements a grid-search exploration over the space of -hyper-parameter combinations that [evaluates](https://github.com/HLT-ISTI/QuaPy/wiki/Evaluation) -each combination of hyper-parameters by means of a given quantification-oriented -error metric (e.g., any of the error functions implemented -in _qp.error_) and according to a -[sampling generation protocol](https://github.com/HLT-ISTI/QuaPy/wiki/Protocols). - -The following is an example (also included in the examples folder) of model selection for quantification: - -```python -import quapy as qp -from quapy.protocol import APP -from quapy.method.aggregative import DistributionMatching -from sklearn.linear_model import LogisticRegression -import numpy as np - -""" -In this example, we show how to perform model selection on a DistributionMatching quantifier. -""" - -model = DistributionMatching(LogisticRegression()) - -qp.environ['SAMPLE_SIZE'] = 100 -qp.environ['N_JOBS'] = -1 # explore hyper-parameters in parallel - -training, test = qp.datasets.fetch_reviews('imdb', tfidf=True, min_df=5).train_test - -# The model will be returned by the fit method of GridSearchQ. -# Every combination of hyper-parameters will be evaluated by confronting the -# quantifier thus configured against a series of samples generated by means -# of a sample generation protocol. For this example, we will use the -# artificial-prevalence protocol (APP), that generates samples with prevalence -# values in the entire range of values from a grid (e.g., [0, 0.1, 0.2, ..., 1]). -# We devote 30% of the dataset for this exploration. -training, validation = training.split_stratified(train_prop=0.7) -protocol = APP(validation) - -# We will explore a classification-dependent hyper-parameter (e.g., the 'C' -# hyper-parameter of LogisticRegression) and a quantification-dependent hyper-parameter -# (e.g., the number of bins in a DistributionMatching quantifier. -# Classifier-dependent hyper-parameters have to be marked with a prefix "classifier__" -# in order to let the quantifier know this hyper-parameter belongs to its underlying -# classifier. -param_grid = { - 'classifier__C': np.logspace(-3,3,7), - 'nbins': [8, 16, 32, 64], -} - -model = qp.model_selection.GridSearchQ( - model=model, - param_grid=param_grid, - protocol=protocol, - error='mae', # the error to optimize is the MAE (a quantification-oriented loss) - refit=True, # retrain on the whole labelled set once done - verbose=True # show information as the process goes on -).fit(training) - -print(f'model selection ended: best hyper-parameters={model.best_params_}') -model = model.best_model_ - -# evaluation in terms of MAE -# we use the same evaluation protocol (APP) on the test set -mae_score = qp.evaluation.evaluate(model, protocol=APP(test), error_metric='mae') - -print(f'MAE={mae_score:.5f}') -``` - -In this example, the system outputs: -``` -[GridSearchQ]: starting model selection with self.n_jobs =-1 -[GridSearchQ]: hyperparams={'classifier__C': 0.01, 'nbins': 64} got mae score 0.04021 [took 1.1356s] -[GridSearchQ]: hyperparams={'classifier__C': 0.01, 'nbins': 32} got mae score 0.04286 [took 1.2139s] -[GridSearchQ]: hyperparams={'classifier__C': 0.01, 'nbins': 16} got mae score 0.04888 [took 1.2491s] -[GridSearchQ]: hyperparams={'classifier__C': 0.001, 'nbins': 8} got mae score 0.05163 [took 1.5372s] -[...] -[GridSearchQ]: hyperparams={'classifier__C': 1000.0, 'nbins': 32} got mae score 0.02445 [took 2.9056s] -[GridSearchQ]: optimization finished: best params {'classifier__C': 100.0, 'nbins': 32} (score=0.02234) [took 7.3114s] -[GridSearchQ]: refitting on the whole development set -model selection ended: best hyper-parameters={'classifier__C': 100.0, 'nbins': 32} -MAE=0.03102 -``` - -The parameter _val_split_ can alternatively be used to indicate -a validation set (i.e., an instance of _LabelledCollection_) instead -of a proportion. This could be useful if one wants to have control -on the specific data split to be used across different model selection -experiments. - -## Targeting a Classification-oriented loss - -Optimizing a model for quantification could rather be -computationally costly. -In aggregative methods, one could alternatively try to optimize -the classifier's hyper-parameters for classification. -Although this is theoretically suboptimal, many articles in -quantification literature have opted for this strategy. - -In QuaPy, this is achieved by simply instantiating the -classifier learner as a GridSearchCV from scikit-learn. -The following code illustrates how to do that: - -```python -learner = GridSearchCV( - LogisticRegression(), - param_grid={'C': np.logspace(-4, 5, 10), 'class_weight': ['balanced', None]}, - cv=5) -model = DistributionMatching(learner).fit(dataset.training) -``` - -However, this is conceptually flawed, since the model should be -optimized for the task at hand (quantification), and not for a surrogate task (classification), -i.e., the model should be requested to deliver low quantification errors, rather -than low classification errors. - - - diff --git a/docs/build/html/_sources/Plotting.md.txt b/docs/build/html/_sources/Plotting.md.txt deleted file mode 100644 index 99f3f7e..0000000 --- a/docs/build/html/_sources/Plotting.md.txt +++ /dev/null @@ -1,250 +0,0 @@ -# Plotting - -The module _qp.plot_ implements some basic plotting functions -that can help analyse the performance of a quantification method. - -All plotting functions receive as inputs the outcomes of -some experiments and include, for each experiment, -the following three main arguments: - -* _method_names_ a list containing the names of the quantification methods -* _true_prevs_ a list containing matrices of true prevalences -* _estim_prevs_ a list containing matrices of estimated prevalences -(should be of the same shape as the corresponding matrix in _true_prevs_) - -Note that a method (as indicated by a name in _method_names_) can -appear more than once. This could occur when various datasets are -involved in the experiments. In this case, all experiments for the -method will be merged and the plot will represent the method's -performance across various datasets. - -This is a very simple example of a valid input for the plotting functions: -```python -method_names = ['classify & count', 'EMQ', 'classify & count'] -true_prevs = [ - np.array([[0.5, 0.5], [0.25, 0.75]]), - np.array([[0.0, 1.0], [0.25, 0.75], [0.0, 0.1]]), - np.array([[0.0, 1.0], [0.25, 0.75], [0.0, 0.1]]), -] -estim_prevs = [ - np.array([[0.45, 0.55], [0.6, 0.4]]), - np.array([[0.0, 1.0], [0.5, 0.5], [0.2, 0.8]]), - np.array([[0.1, 0.9], [0.3, 0.7], [0.0, 0.1]]), -] -``` -in which the _classify & count_ has been tested in two datasets and -the _EMQ_ method has been tested only in one dataset. For the first -experiment, only two (binary) quantifications have been tested, -while for the second and third experiments three instances have -been tested. - -In general, we would like to test the performance of the -quantification methods across different scenarios showcasing -the accuracy of the quantifier in predicting class prevalences -for a wide range of prior distributions. This can easily be -achieved by means of the -[artificial sampling protocol](https://github.com/HLT-ISTI/QuaPy/wiki/Protocols) -that is implemented in QuaPy. - -The following code shows how to perform one simple experiment -in which the 4 _CC-variants_, all equipped with a linear SVM, are -applied to one binary dataset of reviews about _Kindle_ devices and -tested across the entire spectrum of class priors (taking 21 splits -of the interval [0,1], i.e., using prevalence steps of 0.05, and -generating 100 random samples at each prevalence). - -```python -import quapy as qp -from protocol import APP -from quapy.method.aggregative import CC, ACC, PCC, PACC -from sklearn.svm import LinearSVC - -qp.environ['SAMPLE_SIZE'] = 500 - -def gen_data(): - - def base_classifier(): - return LinearSVC(class_weight='balanced') - - def models(): - yield 'CC', CC(base_classifier()) - yield 'ACC', ACC(base_classifier()) - yield 'PCC', PCC(base_classifier()) - yield 'PACC', PACC(base_classifier()) - - train, test = qp.datasets.fetch_reviews('kindle', tfidf=True, min_df=5).train_test - - method_names, true_prevs, estim_prevs, tr_prevs = [], [], [], [] - - for method_name, model in models(): - model.fit(train) - true_prev, estim_prev = qp.evaluation.prediction(model, APP(test, repeats=100, random_state=0)) - - method_names.append(method_name) - true_prevs.append(true_prev) - estim_prevs.append(estim_prev) - tr_prevs.append(train.prevalence()) - - return method_names, true_prevs, estim_prevs, tr_prevs - -method_names, true_prevs, estim_prevs, tr_prevs = gen_data() -```` -the plots that can be generated are explained below. - -## Diagonal Plot - -The _diagonal_ plot shows a very insightful view of the -quantifier's performance. It plots the predicted class -prevalence (in the y-axis) against the true class prevalence -(in the x-axis). Unfortunately, it is limited to binary quantification, -although one can simply generate as many _diagonal_ plots as -classes there are by indicating which class should be considered -the target of the plot. - -The following call will produce the plot: - -```python -qp.plot.binary_diagonal(method_names, true_prevs, estim_prevs, train_prev=tr_prevs[0], savepath='./plots/bin_diag.png') -``` - -the last argument is optional, and indicates the path where to save -the plot (the file extension will determine the format -- typical extensions -are '.png' or '.pdf'). If this path is not provided, then the plot -will be shown but not saved. -The resulting plot should look like: - -![diagonal plot on Kindle](./wiki_examples/selected_plots/bin_diag.png) - -Note that in this case, we are also indicating the training -prevalence, which is plotted in the diagonal a as cyan dot. -The color bands indicate the standard deviations of the predictions, -and can be hidden by setting the argument _show_std=False_ (see -the complete list of arguments in the documentation). - -Finally, note how most quantifiers, and specially the "unadjusted" -variants CC and PCC, are strongly biased towards the -prevalence seen during training. - -## Quantification bias - -This plot aims at evincing the bias that any quantifier -displays with respect to the training prevalences by -means of [box plots](https://en.wikipedia.org/wiki/Box_plot). -This plot can be generated by: - -```python -qp.plot.binary_bias_global(method_names, true_prevs, estim_prevs, savepath='./plots/bin_bias.png') -``` - -and should look like: - -![bias plot on Kindle](./wiki_examples/selected_plots/bin_bias.png) - -The box plots show some interesting facts: -* all methods are biased towards the training prevalence but specially -so CC and PCC (an unbiased quantifier would have a box centered at 0) -* the bias is always positive, indicating that all methods tend to -overestimate the positive class prevalence -* CC and PCC have high variability while ACC and specially PACC exhibit -lower variability. - -Again, these plots could be generated for experiments ranging across -different datasets, and the plot will merge all data accordingly. - -Another illustrative example can be shown that consists of -training different CC quantifiers trained at different -(artificially sampled) training prevalences. -For this example, we generate training samples of 5000 -documents containing 10%, 20%, ..., 90% of positives from the -IMDb dataset, and generate the bias plot again. -This example can be run by rewritting the _gen_data()_ function -like this: - -```python -def gen_data(): - - train, test = qp.datasets.fetch_reviews('imdb', tfidf=True, min_df=5).train_test - model = CC(LinearSVC()) - - method_data = [] - for training_prevalence in np.linspace(0.1, 0.9, 9): - training_size = 5000 - # since the problem is binary, it suffices to specify the negative prevalence, since the positive is constrained - train_sample = train.sampling(training_size, 1-training_prevalence) - model.fit(train_sample) - true_prev, estim_prev = qp.evaluation.prediction(model, APP(test, repeats=100, random_state=0)) - method_name = 'CC$_{'+f'{int(100*training_prevalence)}' + '\%}$' - method_data.append((method_name, true_prev, estim_prev, train_sample.prevalence())) - - return zip(*method_data) -``` - -and the plot should now look like: - -![bias plot on IMDb](./wiki_examples/selected_plots/bin_bias_cc.png) - -which clearly shows a negative bias for CC variants trained on -data containing more negatives (i.e., < 50%) and positive biases -in cases containing more positives (i.e., >50%). The CC trained -at 50% behaves as an unbiased estimator of the positive class -prevalence. - -The function _qp.plot.binary_bias_bins_ allows the user to -generate box plots broken down by bins of true test prevalence. -To this aim, an argument _nbins_ is passed which indicates -how many isometric subintervals to take. For example -the following plot is produced for _nbins=3_: - -![bias plot on IMDb](./wiki_examples/selected_plots/bin_bias_bin_cc.png) - -Interestingly enough, the seemingly unbiased estimator (CC at 50%) happens to display -a positive bias (or a tendency to overestimate) in cases of low prevalence -(i.e., when the true prevalence of the positive class is below 33%), -and a negative bias (or a tendency to underestimate) in cases of high prevalence -(i.e., when the true prevalence is beyond 67%). - -Out of curiosity, the diagonal plot for this experiment looks like: - -![diag plot on IMDb](./wiki_examples/selected_plots/bin_diag_cc.png) - -showing pretty clearly the dependency of CC on the prior probabilities -of the labeled set it was trained on. - - -## Error by Drift - -Above discussed plots are useful for analyzing and comparing -the performance of different quantification methods, but are -limited to the binary case. The "error by drift" is a plot -that shows the error in predictions as a function of the -(prior probability) drift between each test sample and the -training set. Interestingly, the error and drift can both be measured -in terms of any evaluation measure for quantification (like the -ones available in _qp.error_) and can thus be computed -irrespectively of the number of classes. - -The following shows how to generate the plot for the 4 CC variants, -using 10 bins for the drift -and _absolute error_ as the measure of the error (the -drift in the x-axis is always computed in terms of _absolute error_ since -other errors are harder to interpret): - -```python -qp.plot.error_by_drift(method_names, true_prevs, estim_prevs, tr_prevs, - error_name='ae', n_bins=10, savepath='./plots/err_drift.png') -``` - -![diag plot on IMDb](./wiki_examples/selected_plots/err_drift.png) - -Note that all methods work reasonably well in cases of low prevalence -drift (i.e., any CC-variant is a good quantifier whenever the IID -assumption is approximately preserved). The higher the drift, the worse -those quantifiers tend to perform, although it is clear that PACC -yields the lowest error for the most difficult cases. - -Remember that any plot can be generated _across many datasets_, and -that this would probably result in a more solid comparison. -In those cases, however, it is likely that the variances of each -method get higher, to the detriment of the visualization. -We recommend to set _show_std=False_ in those cases -in order to hide the color bands. diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt index bf17bc7..cc5b4dc 100644 --- a/docs/build/html/_sources/index.rst.txt +++ b/docs/build/html/_sources/index.rst.txt @@ -1,87 +1,36 @@ -.. QuaPy documentation master file, created by - sphinx-quickstart on Tue Nov 9 11:31:32 2021. +.. QuaPy: A Python-based open-source framework for quantification documentation master file, created by + sphinx-quickstart on Wed Feb 7 16:26:46 2024. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to QuaPy's documentation! -================================= +========================================================================================== -QuaPy is an open source framework for Quantification (a.k.a. Supervised Prevalence Estimation) -written in Python. +QuaPy is a Python-based open-source framework for quantification. -Introduction +This document contains the API of the modules included in QuaPy. + +Installation ------------ -QuaPy roots on the concept of data sample, and provides implementations of most important concepts -in quantification literature, such as the most important quantification baselines, many advanced -quantification methods, quantification-oriented model selection, many evaluation measures and protocols -used for evaluating quantification methods. -QuaPy also integrates commonly used datasets and offers visualization tools for facilitating the analysis and -interpretation of results. +`pip install quapy` -A quick example: -**************** +GitHub +------------ -The following script fetchs a Twitter dataset, trains and evaluates an -`Adjusted Classify & Count` model in terms of the `Mean Absolute Error` (MAE) -between the class prevalences estimated for the test set and the true prevalences -of the test set. +QuaPy is hosted in GitHub at `https://github.com/HLT-ISTI/QuaPy `_ -:: - - import quapy as qp - from sklearn.linear_model import LogisticRegression - - dataset = qp.datasets.fetch_twitter('semeval16') - - # create an "Adjusted Classify & Count" quantifier - model = qp.method.aggregative.ACC(LogisticRegression()) - model.fit(dataset.training) - - estim_prevalences = model.quantify(dataset.test.instances) - true_prevalences = dataset.test.prevalence() - - error = qp.error.mae(true_prevalences, estim_prevalences) - - print(f'Mean Absolute Error (MAE)={error:.3f}') - - -Quantification is useful in scenarios of prior probability shift. In other -words, we would not be interested in estimating the class prevalences of the test set if -we could assume the IID assumption to hold, as this prevalence would simply coincide with the -class prevalence of the training set. For this reason, any Quantification model -should be tested across samples characterized by different class prevalences. -QuaPy implements sampling procedures and evaluation protocols that automates this endeavour. -See the :doc:`Evaluation` for detailed examples. - -Features -******** - -* Implementation of most popular quantification methods (Classify-&-Count variants, Expectation-Maximization, SVM-based variants for quantification, HDy, QuaNet, and Ensembles). -* Versatile functionality for performing evaluation based on artificial sampling protocols. -* Implementation of most commonly used evaluation metrics (e.g., MAE, MRAE, MSE, NKLD, etc.). -* Popular datasets for Quantification (textual and numeric) available, including: - * 32 UCI Machine Learning datasets. - * 11 Twitter Sentiment datasets. - * 3 Reviews Sentiment datasets. - * 4 tasks from LeQua competition (_new in v0.1.7!_) -* Native supports for binary and single-label scenarios of quantification. -* Model selection functionality targeting quantification-oriented losses. -* Visualization tools for analysing results. .. toctree:: :maxdepth: 2 :caption: Contents: - Installation - Datasets - Evaluation - Protocols - Methods - Model-Selection - Plotting - API Developers documentation +Contents +-------- +.. toctree:: + + modules Indices and tables diff --git a/docs/build/html/_sources/quapy.classification.rst.txt b/docs/build/html/_sources/quapy.classification.rst.txt index 3d14431..cfc7d9b 100644 --- a/docs/build/html/_sources/quapy.classification.rst.txt +++ b/docs/build/html/_sources/quapy.classification.rst.txt @@ -1,38 +1,35 @@ -:tocdepth: 2 - quapy.classification package ============================ Submodules ---------- -quapy.classification.calibration --------------------------------- +quapy.classification.calibration module +--------------------------------------- -.. versionadded:: 0.1.7 .. automodule:: quapy.classification.calibration :members: :undoc-members: :show-inheritance: -quapy.classification.methods ----------------------------- +quapy.classification.methods module +----------------------------------- .. automodule:: quapy.classification.methods :members: :undoc-members: :show-inheritance: -quapy.classification.neural ---------------------------- +quapy.classification.neural module +---------------------------------- .. automodule:: quapy.classification.neural :members: :undoc-members: :show-inheritance: -quapy.classification.svmperf ----------------------------- +quapy.classification.svmperf module +----------------------------------- .. automodule:: quapy.classification.svmperf :members: diff --git a/docs/build/html/_sources/quapy.data.rst.txt b/docs/build/html/_sources/quapy.data.rst.txt index fda5ff0..cadace6 100644 --- a/docs/build/html/_sources/quapy.data.rst.txt +++ b/docs/build/html/_sources/quapy.data.rst.txt @@ -1,37 +1,36 @@ -:tocdepth: 2 - quapy.data package ================== Submodules ---------- -quapy.data.base ---------------- +quapy.data.base module +---------------------- .. automodule:: quapy.data.base :members: :undoc-members: :show-inheritance: -quapy.data.datasets -------------------- +quapy.data.datasets module +-------------------------- .. automodule:: quapy.data.datasets :members: :undoc-members: :show-inheritance: -quapy.data.preprocessing ------------------------- + +quapy.data.preprocessing module +------------------------------- .. automodule:: quapy.data.preprocessing :members: :undoc-members: :show-inheritance: -quapy.data.reader ------------------ +quapy.data.reader module +------------------------ .. automodule:: quapy.data.reader :members: diff --git a/docs/build/html/_sources/quapy.method.rst.txt b/docs/build/html/_sources/quapy.method.rst.txt index cfda57f..8026e0a 100644 --- a/docs/build/html/_sources/quapy.method.rst.txt +++ b/docs/build/html/_sources/quapy.method.rst.txt @@ -1,45 +1,51 @@ -:tocdepth: 2 - quapy.method package ==================== Submodules ---------- -quapy.method.aggregative ------------------------- +quapy.method.aggregative module +------------------------------- .. automodule:: quapy.method.aggregative :members: :undoc-members: :show-inheritance: -quapy.method.base ------------------ +.. automodule:: quapy.method._kdey + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: quapy.method._neural + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: quapy.method._threshold_optim + :members: + :undoc-members: + :show-inheritance: + + +quapy.method.base module +------------------------ .. automodule:: quapy.method.base :members: :undoc-members: :show-inheritance: -quapy.method.meta ------------------ +quapy.method.meta module +------------------------ .. automodule:: quapy.method.meta :members: :undoc-members: :show-inheritance: -quapy.method.neural -------------------- - -.. automodule:: quapy.method.neural - :members: - :undoc-members: - :show-inheritance: - -quapy.method.non\_aggregative ------------------------------ +quapy.method.non\_aggregative module +------------------------------------ .. automodule:: quapy.method.non_aggregative :members: diff --git a/docs/build/html/_sources/quapy.rst.txt b/docs/build/html/_sources/quapy.rst.txt index e3e1697..af2708b 100644 --- a/docs/build/html/_sources/quapy.rst.txt +++ b/docs/build/html/_sources/quapy.rst.txt @@ -1,79 +1,76 @@ -:tocdepth: 2 - quapy package ============= +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + quapy.classification + quapy.data + quapy.method + + Submodules ---------- -quapy.error ------------ +quapy.error module +------------------ .. automodule:: quapy.error :members: :undoc-members: :show-inheritance: -quapy.evaluation ----------------- +quapy.evaluation module +----------------------- .. automodule:: quapy.evaluation :members: :undoc-members: :show-inheritance: -quapy.protocol --------------- - -.. versionadded:: 0.1.7 -.. automodule:: quapy.protocol - :members: - :undoc-members: - :show-inheritance: - -quapy.functional ----------------- +quapy.functional module +----------------------- .. automodule:: quapy.functional :members: :undoc-members: :show-inheritance: -quapy.model\_selection ----------------------- +quapy.model\_selection module +----------------------------- .. automodule:: quapy.model_selection :members: :undoc-members: :show-inheritance: -quapy.plot ----------- +quapy.plot module +----------------- .. automodule:: quapy.plot :members: :undoc-members: :show-inheritance: -quapy.util ----------- +quapy.protocol module +--------------------- + +.. automodule:: quapy.protocol + :members: + :undoc-members: + :show-inheritance: + +quapy.util module +----------------- .. automodule:: quapy.util :members: :undoc-members: :show-inheritance: -Subpackages ------------ - -.. toctree:: - :maxdepth: 3 - - quapy.classification - quapy.data - quapy.method - - Module contents --------------- @@ -81,4 +78,3 @@ Module contents :members: :undoc-members: :show-inheritance: - diff --git a/docs/build/html/_static/background_b01.png b/docs/build/html/_static/background_b01.png deleted file mode 100644 index 353f26dde0803aa172c23e21ef6ac068e1253bc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)6QBN1gkP61+AN9}d56}GnU-I97 adu9eB2afnIr`wM~3O!x@T-G@yGywpsd=;et diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css index 096e3f6..f316efc 100644 --- a/docs/build/html/_static/basic.css +++ b/docs/build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -55,7 +55,7 @@ div.sphinxsidebarwrapper { div.sphinxsidebar { float: left; - width: 210px; + width: 230px; margin-left: -100%; font-size: 90%; word-wrap: break-word; @@ -237,6 +237,10 @@ a.headerlink { visibility: hidden; } +a:visited { + color: #551A8B; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -324,6 +328,7 @@ aside.sidebar { p.sidebar-title { font-weight: bold; } + nav.contents, aside.topic, div.admonition, div.topic, blockquote { @@ -331,6 +336,7 @@ div.admonition, div.topic, blockquote { } /* -- topics ---------------------------------------------------------------- */ + nav.contents, aside.topic, div.topic { @@ -606,6 +612,7 @@ ol.simple p, ul.simple p { margin-bottom: 0; } + aside.footnote > span, div.citation > span { float: left; @@ -667,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -735,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { diff --git a/docs/build/html/_static/bizstyle.css b/docs/build/html/_static/bizstyle.css deleted file mode 100644 index ec32aa0..0000000 --- a/docs/build/html/_static/bizstyle.css +++ /dev/null @@ -1,508 +0,0 @@ -/* - * bizstyle.css_t - * ~~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- business style theme. - * - * :copyright: Copyright 2011-2014 by Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', - 'Verdana', sans-serif; - font-size: 14px; - letter-spacing: -0.01em; - line-height: 150%; - text-align: center; - background-color: white; - background-image: url(background_b01.png); - color: black; - padding: 0; - border-right: 1px solid #336699; - border-left: 1px solid #336699; - - margin: 0px 40px 0px 40px; -} - -div.document { - background-color: white; - text-align: left; - background-repeat: repeat-x; - - -moz-box-shadow: 2px 2px 5px #000; - -webkit-box-shadow: 2px 2px 5px #000; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 240px; - border-left: 1px solid #ccc; -} - -div.body { - margin: 0; - padding: 0.5em 20px 20px 20px; -} -div.bodywrapper { - margin: 0 0 0 calc(210px + 30px); -} - -div.related { - font-size: 1em; - - -moz-box-shadow: 2px 2px 5px #000; - -webkit-box-shadow: 2px 2px 5px #000; -} - -div.related ul { - background-color: #336699; - height: 100%; - overflow: hidden; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; -} - -div.related ul li { - color: white; - margin: 0; - padding: 0; - height: 2em; - float: left; -} - -div.related ul li.right { - float: right; - margin-right: 5px; -} - -div.related ul li a { - margin: 0; - padding: 0 5px 0 5px; - line-height: 1.75em; - color: #fff; -} - -div.related ul li a:hover { - color: #fff; - text-decoration: underline; -} - -div.sphinxsidebarwrapper { - padding: 0; -} - -div.sphinxsidebar { - padding: 0.5em 12px 12px 12px; - width: 210px; - font-size: 1em; - text-align: left; -} - -div.sphinxsidebar h3, div.sphinxsidebar h4 { - margin: 1em 0 0.5em 0; - font-size: 1em; - padding: 0.1em 0 0.1em 0.5em; - color: white; - border: 1px solid #336699; - background-color: #336699; -} - -div.sphinxsidebar h3 a { - color: white; -} - -div.sphinxsidebar ul { - padding-left: 1.5em; - margin-top: 7px; - padding: 0; - line-height: 130%; -} - -div.sphinxsidebar ul ul { - margin-left: 20px; -} - -div.sphinxsidebar input { - border: 1px solid #336699; -} - -div.footer { - background-color: white; - color: #336699; - padding: 3px 8px 3px 0; - clear: both; - font-size: 0.8em; - text-align: right; - border-bottom: 1px solid #336699; - - -moz-box-shadow: 2px 2px 5px #000; - -webkit-box-shadow: 2px 2px 5px #000; -} - -div.footer a { - color: #336699; - text-decoration: underline; -} - -/* -- body styles ----------------------------------------------------------- */ - -p { - margin: 0.8em 0 0.5em 0; -} - -a { - color: #336699; - text-decoration: none; -} - -a:hover { - color: #336699; - text-decoration: underline; -} - -div.body a { - text-decoration: underline; -} - -h1, h2, h3 { - color: #336699; -} - -h1 { - margin: 0; - padding: 0.7em 0 0.3em 0; - font-size: 1.5em; -} - -h2 { - margin: 1.3em 0 0.2em 0; - font-size: 1.35em; - padding-bottom: .5em; - border-bottom: 1px solid #336699; -} - -h3 { - margin: 1em 0 -0.3em 0; - font-size: 1.2em; - padding-bottom: .3em; - border-bottom: 1px solid #CCCCCC; -} - -div.body h1 a, div.body h2 a, div.body h3 a, -div.body h4 a, div.body h5 a, div.body h6 a { - color: black!important; -} - -h1 a.anchor, h2 a.anchor, h3 a.anchor, -h4 a.anchor, h5 a.anchor, h6 a.anchor { - display: none; - margin: 0 0 0 0.3em; - padding: 0 0.2em 0 0.2em; - color: #aaa!important; -} - -h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, -h5:hover a.anchor, h6:hover a.anchor { - display: inline; -} - -h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, -h5 a.anchor:hover, h6 a.anchor:hover { - color: #777; - background-color: #eee; -} - -a.headerlink { - color: #c60f0f!important; - font-size: 1em; - margin-left: 6px; - padding: 0 4px 0 4px; - text-decoration: none!important; -} - -a.headerlink:hover { - background-color: #ccc; - color: white!important; -} - -cite, code, tt { - font-family: 'Consolas', 'Deja Vu Sans Mono', - 'Bitstream Vera Sans Mono', monospace; - font-size: 0.95em; - letter-spacing: 0.01em; -} - -code { - background-color: #F2F2F2; - border-bottom: 1px solid #ddd; - color: #333; -} - -code.descname, code.descclassname, code.xref { - border: 0; -} - -hr { - border: 1px solid #abc; - margin: 2em; -} - -a code { - border: 0; - color: #CA7900; -} - -a code:hover { - color: #2491CF; -} - -pre { - background-color: transparent !important; - font-family: 'Consolas', 'Deja Vu Sans Mono', - 'Bitstream Vera Sans Mono', monospace; - font-size: 0.95em; - letter-spacing: 0.015em; - line-height: 120%; - padding: 0.5em; - border-right: 5px solid #ccc; - border-left: 5px solid #ccc; -} - -pre a { - color: inherit; - text-decoration: underline; -} - -td.linenos pre { - padding: 0.5em 0; -} - -div.quotebar { - background-color: #f8f8f8; - max-width: 250px; - float: right; - padding: 2px 7px; - border: 1px solid #ccc; -} -nav.contents, -aside.topic, - -div.topic { - background-color: #f8f8f8; -} - -table { - border-collapse: collapse; - margin: 0 -0.5em 0 -0.5em; -} - -table td, table th { - padding: 0.2em 0.5em 0.2em 0.5em; -} - -div.admonition { - font-size: 0.9em; - margin: 1em 0 1em 0; - border: 3px solid #cccccc; - background-color: #f7f7f7; - padding: 0; -} - -div.admonition p { - margin: 0.5em 1em 0.5em 1em; - padding: 0; -} - -div.admonition li p { - margin-left: 0; -} - -div.admonition pre, div.warning pre { - margin: 0; -} - -div.highlight { - margin: 0.4em 1em; -} - -div.admonition p.admonition-title { - margin: 0; - padding: 0.1em 0 0.1em 0.5em; - color: white; - border-bottom: 3px solid #cccccc; - font-weight: bold; - background-color: #165e83; -} - -div.danger { border: 3px solid #f0908d; background-color: #f0cfa0; } -div.error { border: 3px solid #f0908d; background-color: #ede4cd; } -div.warning { border: 3px solid #f8b862; background-color: #f0cfa0; } -div.caution { border: 3px solid #f8b862; background-color: #ede4cd; } -div.attention { border: 3px solid #f8b862; background-color: #f3f3f3; } -div.important { border: 3px solid #f0cfa0; background-color: #ede4cd; } -div.note { border: 3px solid #f0cfa0; background-color: #f3f3f3; } -div.hint { border: 3px solid #bed2c3; background-color: #f3f3f3; } -div.tip { border: 3px solid #bed2c3; background-color: #f3f3f3; } - -div.danger p.admonition-title, div.error p.admonition-title { - background-color: #b7282e; - border-bottom: 3px solid #f0908d; -} - -div.caution p.admonition-title, -div.warning p.admonition-title, -div.attention p.admonition-title { - background-color: #f19072; - border-bottom: 3px solid #f8b862; -} - -div.note p.admonition-title, div.important p.admonition-title { - background-color: #f8b862; - border-bottom: 3px solid #f0cfa0; -} - -div.hint p.admonition-title, div.tip p.admonition-title { - background-color: #7ebea5; - border-bottom: 3px solid #bed2c3; -} - -div.admonition ul, div.admonition ol, -div.warning ul, div.warning ol { - margin: 0.1em 0.5em 0.5em 3em; - padding: 0; -} - -div.versioninfo { - margin: 1em 0 0 0; - border: 1px solid #ccc; - background-color: #DDEAF0; - padding: 8px; - line-height: 1.3em; - font-size: 0.9em; -} - -.viewcode-back { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', - 'Verdana', sans-serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} - -p.versionchanged span.versionmodified { - font-size: 0.9em; - margin-right: 0.2em; - padding: 0.1em; - background-color: #DCE6A0; -} - -dl.field-list > dt { - color: white; - background-color: #82A0BE; -} - -dl.field-list > dd { - background-color: #f7f7f7; -} - -/* -- table styles ---------------------------------------------------------- */ - -table.docutils { - margin: 1em 0; - padding: 0; - border: 1px solid white; - background-color: #f7f7f7; -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 1px solid white; - border-bottom: 1px solid white; -} - -table.docutils td p { - margin-top: 0; - margin-bottom: 0.3em; -} - -table.field-list td, table.field-list th { - border: 0 !important; - word-break: break-word; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - color: white; - text-align: left; - padding-right: 5px; - background-color: #82A0BE; -} - -div.literal-block-wrapper div.code-block-caption { - background-color: #EEE; - border-style: solid; - border-color: #CCC; - border-width: 1px 5px; -} - -/* WIDE DESKTOP STYLE */ -@media only screen and (min-width: 1176px) { -body { - margin: 0 40px 0 40px; -} -} - -/* TABLET STYLE */ -@media only screen and (min-width: 768px) and (max-width: 991px) { -body { - margin: 0 40px 0 40px; -} -} - -/* MOBILE LAYOUT (PORTRAIT/320px) */ -@media only screen and (max-width: 767px) { -body { - margin: 0; -} -div.bodywrapper { - margin: 0; - width: 100%; - border: none; -} -div.sphinxsidebar { - display: none; -} -} - -/* MOBILE LAYOUT (LANDSCAPE/480px) */ -@media only screen and (min-width: 480px) and (max-width: 767px) { -body { - margin: 0 20px 0 20px; -} -} - -/* RETINA OVERRIDES */ -@media -only screen and (-webkit-min-device-pixel-ratio: 2), -only screen and (min-device-pixel-ratio: 2) { -} - -/* -- end ------------------------------------------------------------------- */ \ No newline at end of file diff --git a/docs/build/html/_static/bizstyle.js b/docs/build/html/_static/bizstyle.js deleted file mode 100644 index 4d5d01d..0000000 --- a/docs/build/html/_static/bizstyle.js +++ /dev/null @@ -1,30 +0,0 @@ -// -// bizstyle.js -// ~~~~~~~~~~~ -// -// Sphinx javascript -- for bizstyle theme. -// -// This theme was created by referring to 'sphinxdoc' -// -// :copyright: Copyright 2012-2014 by Sphinx team, see AUTHORS. -// :license: BSD, see LICENSE for details. -// -const initialiseBizStyle = () => { - if (navigator.userAgent.indexOf("iPhone") > 0 || navigator.userAgent.indexOf("Android") > 0) { - document.querySelector("li.nav-item-0 a").innerText = "Top" - } - const truncator = item => {if (item.textContent.length > 20) { - item.title = item.innerText - item.innerText = item.innerText.substr(0, 17) + "..." - } - } - document.querySelectorAll("div.related:first ul li:not(.right) a").slice(1).forEach(truncator); - document.querySelectorAll("div.related:last ul li:not(.right) a").slice(1).forEach(truncator); -} - -window.addEventListener("resize", - () => (document.querySelector("li.nav-item-0 a").innerText = (window.innerWidth <= 776) ? "Top" : "QuaPy 0.1.7 documentation") -) - -if (document.readyState !== "loading") initialiseBizStyle() -else document.addEventListener("DOMContentLoaded", initialiseBizStyle) \ No newline at end of file diff --git a/docs/build/html/_static/css3-mediaqueries.js b/docs/build/html/_static/css3-mediaqueries.js deleted file mode 100644 index 59735f5..0000000 --- a/docs/build/html/_static/css3-mediaqueries.js +++ /dev/null @@ -1 +0,0 @@ -if(typeof Object.create!=="function"){Object.create=function(e){function t(){}t.prototype=e;return new t}}var ua={toString:function(){return navigator.userAgent},test:function(e){return this.toString().toLowerCase().indexOf(e.toLowerCase())>-1}};ua.version=(ua.toString().toLowerCase().match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1];ua.webkit=ua.test("webkit");ua.gecko=ua.test("gecko")&&!ua.webkit;ua.opera=ua.test("opera");ua.ie=ua.test("msie")&&!ua.opera;ua.ie6=ua.ie&&document.compatMode&&typeof document.documentElement.style.maxHeight==="undefined";ua.ie7=ua.ie&&document.documentElement&&typeof document.documentElement.style.maxHeight!=="undefined"&&typeof XDomainRequest==="undefined";ua.ie8=ua.ie&&typeof XDomainRequest!=="undefined";var domReady=function(){var e=[];var t=function(){if(!arguments.callee.done){arguments.callee.done=true;for(var t=0;t=200&&r.status<300||r.status===304||navigator.userAgent.indexOf("Safari")>-1&&typeof r.status==="undefined"){t(r.responseText)}else{n()}document.documentElement.style.cursor="";r=null}};r.send("")};var l=function(t){t=t.replace(e.REDUNDANT_COMPONENTS,"");t=t.replace(e.REDUNDANT_WHITESPACE,"$1");t=t.replace(e.WHITESPACE_IN_PARENTHESES,"($1)");t=t.replace(e.MORE_WHITESPACE," ");t=t.replace(e.FINAL_SEMICOLONS,"}");return t};var c={stylesheet:function(t){var n={};var r=[],i=[],s=[],o=[];var u=t.cssHelperText;var a=t.getAttribute("media");if(a){var f=a.toLowerCase().split(",")}else{var f=["all"]}for(var l=0;l-1&&a.href&&a.href.length!==0&&!a.disabled){r[r.length]=a}}if(r.length>0){var c=0;var d=function(){c++;if(c===r.length){i()}};var v=function(t){var n=t.href;f(n,function(r){r=l(r).replace(e.RELATIVE_URLS,"url("+n.substring(0,n.lastIndexOf("/"))+"/$1)");t.cssHelperText=r;d()},d)};for(u=0;u0){r.setAttribute("media",t.join(","))}document.getElementsByTagName("head")[0].appendChild(r);if(r.styleSheet){r.styleSheet.cssText=e}else{r.appendChild(document.createTextNode(e))}r.addedWithCssHelper=true;if(typeof n==="undefined"||n===true){cssHelper.parsed(function(t){var n=p(r,e);for(var i in n){if(n.hasOwnProperty(i)){g(i,n[i])}}a("newStyleParsed",r)})}else{r.parsingDisallowed=true}return r},removeStyle:function(e){return e.parentNode.removeChild(e)},parsed:function(e){if(n){s(e)}else{if(typeof t!=="undefined"){if(typeof e==="function"){e(t)}}else{s(e);d()}}},stylesheets:function(e){cssHelper.parsed(function(t){e(m.stylesheets||y("stylesheets"))})},mediaQueryLists:function(e){cssHelper.parsed(function(t){e(m.mediaQueryLists||y("mediaQueryLists"))})},rules:function(e){cssHelper.parsed(function(t){e(m.rules||y("rules"))})},selectors:function(e){cssHelper.parsed(function(t){e(m.selectors||y("selectors"))})},declarations:function(e){cssHelper.parsed(function(t){e(m.declarations||y("declarations"))})},properties:function(e){cssHelper.parsed(function(t){e(m.properties||y("properties"))})},broadcast:a,addListener:function(e,t){if(typeof t==="function"){if(!u[e]){u[e]={listeners:[]}}u[e].listeners[u[e].listeners.length]=t}},removeListener:function(e,t){if(typeof t==="function"&&u[e]){var n=u[e].listeners;for(var r=0;r=a||s&&l0}}else if("device-height"===e.substring(r-13,r)){c=screen.height;if(t!==null){if(u==="length"){return i&&c>=a||s&&c0}}else if("width"===e.substring(r-5,r)){l=document.documentElement.clientWidth||document.body.clientWidth;if(t!==null){if(u==="length"){return i&&l>=a||s&&l0}}else if("height"===e.substring(r-6,r)){c=document.documentElement.clientHeight||document.body.clientHeight;if(t!==null){if(u==="length"){return i&&c>=a||s&&c0}}else if("device-aspect-ratio"===e.substring(r-19,r)){return u==="aspect-ratio"&&screen.width*a[1]===screen.height*a[0]}else if("color-index"===e.substring(r-11,r)){var h=Math.pow(2,screen.colorDepth);if(t!==null){if(u==="absolute"){return i&&h>=a||s&&h0}}else if("color"===e.substring(r-5,r)){var p=screen.colorDepth;if(t!==null){if(u==="absolute"){return i&&p>=a||s&&p0}}else if("resolution"===e.substring(r-10,r)){var d;if(f==="dpcm"){d=o("1cm")}else{d=o("1in")}if(t!==null){if(u==="resolution"){return i&&d>=a||s&&d0}}else{return false}};var a=function(e){var t=e.getValid();var n=e.getExpressions();var r=n.length;if(r>0){for(var i=0;i0){u=false;for(var f=0;f0){l[c++]=","}l[c++]=h}}if(l.length>0){r[r.length]=cssHelper.addStyle("@media "+l.join("")+"{"+e.getCssText()+"}",t,false)}};var l=function(e,t){for(var n=0;n0}}var o=[],u=[];for(var f in i){if(i.hasOwnProperty(f)){o[o.length]=f;if(i[f]){u[u.length]=f}if(f==="all"){n=true}}}if(u.length>0){r[r.length]=cssHelper.addStyle(e.getCssText(),u,false)}var c=e.getMediaQueryLists();if(n){l(c)}else{l(c,o)}};var h=function(e){for(var t=0;td||Math.abs(s-t)>d){e=n;t=s;clearTimeout(r);r=setTimeout(function(){if(!i()){p()}else{cssHelper.broadcast("cssMediaQueriesTested")}},500)}};window.onresize=function(){var e=window.onresize||function(){};return function(){e();s()}}()};var m=document.documentElement;m.style.marginLeft="-32767px";setTimeout(function(){m.style.marginLeft=""},5e3);return function(){if(!i()){cssHelper.addListener("newStyleParsed",function(e){c(e.cssHelperParsed.stylesheet)});cssHelper.addListener("cssMediaQueriesTested",function(){if(ua.ie){m.style.width="1px"}setTimeout(function(){m.style.width="";m.style.marginLeft=""},0);cssHelper.removeListener("cssMediaQueriesTested",arguments.callee)});s();p()}else{m.style.marginLeft=""}v()}}());try{document.execCommand("BackgroundImageCache",false,true)}catch(e){} diff --git a/docs/build/html/_static/css3-mediaqueries_src.js b/docs/build/html/_static/css3-mediaqueries_src.js deleted file mode 100644 index 7878620..0000000 --- a/docs/build/html/_static/css3-mediaqueries_src.js +++ /dev/null @@ -1,1104 +0,0 @@ -/* -css3-mediaqueries.js - CSS Helper and CSS3 Media Queries Enabler - -author: Wouter van der Graaf -version: 1.0 (20110330) -license: MIT -website: http://code.google.com/p/css3-mediaqueries-js/ - -W3C spec: http://www.w3.org/TR/css3-mediaqueries/ - -Note: use of embedded ",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/build/html/_static/js/html5shiv.min.js b/docs/build/html/_static/js/html5shiv.min.js new file mode 100644 index 0000000..cd1c674 --- /dev/null +++ b/docs/build/html/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/build/html/_static/js/theme.js b/docs/build/html/_static/js/theme.js new file mode 100644 index 0000000..1fddb6e --- /dev/null +++ b/docs/build/html/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("

"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0g7{2zat zIm@i@&@2&y-PR1xY$qjFM{J&XU;25XW1{_&{(Ldr+IaofPcAOcp2zd*+4*{gj8%&M U)(>{V3jhEB literal 0 HcmV?d00001 diff --git a/docs/build/html/_static/sphinx_highlight.js b/docs/build/html/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/docs/build/html/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '
-[docs] -class RecalibratedProbabilisticClassifier: +
[docs]class RecalibratedProbabilisticClassifier: """ Abstract class for (re)calibration method from `abstention.calibration`, as defined in `Alexandari, A., Kundaje, A., & Shrikumar, A. (2020, November). Maximum likelihood with bias-corrected calibration @@ -95,10 +94,7 @@ pass
- -
-[docs] -class RecalibratedProbabilisticClassifierBase(BaseEstimator, RecalibratedProbabilisticClassifier): +
[docs]class RecalibratedProbabilisticClassifierBase(BaseEstimator, RecalibratedProbabilisticClassifier): """ Applies a (re)calibration method from `abstention.calibration`, as defined in `Alexandari et al. paper <http://proceedings.mlr.press/v119/alexandari20a.html>`_. @@ -121,9 +117,7 @@ self.n_jobs = n_jobs self.verbose = verbose -
-[docs] - def fit(self, X, y): +
[docs] def fit(self, X, y): """ Fits the calibration for the probabilistic classifier. @@ -141,10 +135,7 @@ raise ValueError('wrong value for val_split: the proportion of validation documents must be in (0,1)') return self.fit_tr_val(X, y)
- -
-[docs] - def fit_cv(self, X, y): +
[docs] def fit_cv(self, X, y): """ Fits the calibration in a cross-validation manner, i.e., it generates posterior probabilities for all training instances via cross-validation, and then retrains the classifier on all training instances. @@ -162,10 +153,7 @@ self.calibration_function = self.calibrator(posteriors, np.eye(nclasses)[y], posterior_supplied=True) return self
- -
-[docs] - def fit_tr_val(self, X, y): +
[docs] def fit_tr_val(self, X, y): """ Fits the calibration in a train/val-split manner, i.e.t, it partitions the training instances into a training and a validation set, and then uses the training samples to learn classifier which is then used @@ -183,10 +171,7 @@ self.calibration_function = self.calibrator(posteriors, np.eye(nclasses)[yva], posterior_supplied=True) return self
- -
-[docs] - def predict(self, X): +
[docs] def predict(self, X): """ Predicts class labels for the data instances in `X` @@ -195,10 +180,7 @@ """ return self.classifier.predict(X)
- -
-[docs] - def predict_proba(self, X): +
[docs] def predict_proba(self, X): """ Generates posterior probabilities for the data instances in `X` @@ -208,7 +190,6 @@ posteriors = self.classifier.predict_proba(X) return self.calibration_function(posteriors)
- @property def classes_(self): """ @@ -219,10 +200,7 @@ return self.classifier.classes_
- -
-[docs] -class NBVSCalibration(RecalibratedProbabilisticClassifierBase): +
[docs]class NBVSCalibration(RecalibratedProbabilisticClassifierBase): """ Applies the No-Bias Vector Scaling (NBVS) calibration method from `abstention.calibration`, as defined in `Alexandari et al. paper <http://proceedings.mlr.press/v119/alexandari20a.html>`_: @@ -244,10 +222,7 @@ self.verbose = verbose
- -
-[docs] -class BCTSCalibration(RecalibratedProbabilisticClassifierBase): +
[docs]class BCTSCalibration(RecalibratedProbabilisticClassifierBase): """ Applies the Bias-Corrected Temperature Scaling (BCTS) calibration method from `abstention.calibration`, as defined in `Alexandari et al. paper <http://proceedings.mlr.press/v119/alexandari20a.html>`_: @@ -269,10 +244,7 @@ self.verbose = verbose
- -
-[docs] -class TSCalibration(RecalibratedProbabilisticClassifierBase): +
[docs]class TSCalibration(RecalibratedProbabilisticClassifierBase): """ Applies the Temperature Scaling (TS) calibration method from `abstention.calibration`, as defined in `Alexandari et al. paper <http://proceedings.mlr.press/v119/alexandari20a.html>`_: @@ -294,10 +266,7 @@ self.verbose = verbose
- -
-[docs] -class VSCalibration(RecalibratedProbabilisticClassifierBase): +
[docs]class VSCalibration(RecalibratedProbabilisticClassifierBase): """ Applies the Vector Scaling (VS) calibration method from `abstention.calibration`, as defined in `Alexandari et al. paper <http://proceedings.mlr.press/v119/alexandari20a.html>`_: @@ -318,7 +287,6 @@ self.n_jobs = n_jobs self.verbose = verbose
-
diff --git a/docs/build/html/_modules/quapy/data/datasets.html b/docs/build/html/_modules/quapy/data/datasets.html index 02c1ac7..b910036 100644 --- a/docs/build/html/_modules/quapy/data/datasets.html +++ b/docs/build/html/_modules/quapy/data/datasets.html @@ -1,22 +1,23 @@ - + quapy.data.datasets — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -70,11 +71,8 @@

Source code for quapy.data.datasets

-
-[docs] -def warn(*args, **kwargs): +
[docs]def warn(*args, **kwargs): pass
- import warnings warnings.warn = warn import os @@ -142,9 +140,7 @@ } -
-[docs] -def fetch_reviews(dataset_name, tfidf=False, min_df=None, data_home=None, pickle=False) -> Dataset: +
[docs]def fetch_reviews(dataset_name, tfidf=False, min_df=None, data_home=None, pickle=False) -> Dataset: """ Loads a Reviews dataset as a Dataset instance, as used in `Esuli, A., Moreo, A., and Sebastiani, F. "A recurrent neural network for sentiment quantification." @@ -190,10 +186,7 @@ return data
- -
-[docs] -def fetch_twitter(dataset_name, for_model_selection=False, min_df=None, data_home=None, pickle=False) -> Dataset: +
[docs]def fetch_twitter(dataset_name, for_model_selection=False, min_df=None, data_home=None, pickle=False) -> Dataset: """ Loads a Twitter dataset as a :class:`quapy.data.base.Dataset` instance, as used in: `Gao, W., Sebastiani, F.: From classification to quantification in tweet sentiment analysis. @@ -267,10 +260,7 @@ return data
- -
-[docs] -def fetch_UCIBinaryDataset(dataset_name, data_home=None, test_split=0.3, verbose=False) -> Dataset: +
[docs]def fetch_UCIBinaryDataset(dataset_name, data_home=None, test_split=0.3, verbose=False) -> Dataset: """ Loads a UCI dataset as an instance of :class:`quapy.data.base.Dataset`, as used in `Pérez-Gállego, P., Quevedo, J. R., & del Coz, J. J. (2017). @@ -295,10 +285,7 @@ return Dataset(*data.split_stratified(1 - test_split, random_state=0))
- -
-[docs] -def fetch_UCIBinaryLabelledCollection(dataset_name, data_home=None, verbose=False) -> LabelledCollection: +
[docs]def fetch_UCIBinaryLabelledCollection(dataset_name, data_home=None, verbose=False) -> LabelledCollection: """ Loads a UCI collection as an instance of :class:`quapy.data.base.LabelledCollection`, as used in `Pérez-Gállego, P., Quevedo, J. R., & del Coz, J. J. (2017). @@ -642,10 +629,7 @@ return data
- -
-[docs] -def fetch_UCIMulticlassDataset(dataset_name, data_home=None, test_split=0.3, verbose=False) -> Dataset: +
[docs]def fetch_UCIMulticlassDataset(dataset_name, data_home=None, test_split=0.3, verbose=False) -> Dataset: """ Loads a UCI multiclass dataset as an instance of :class:`quapy.data.base.Dataset`. @@ -675,10 +659,7 @@ return Dataset(*data.split_stratified(1 - test_split, random_state=0))
- -
-[docs] -def fetch_UCIMulticlassLabelledCollection(dataset_name, data_home=None, verbose=False) -> LabelledCollection: +
[docs]def fetch_UCIMulticlassLabelledCollection(dataset_name, data_home=None, verbose=False) -> LabelledCollection: """ Loads a UCI multiclass collection as an instance of :class:`quapy.data.base.LabelledCollection`. @@ -751,14 +732,11 @@ return data
- def _df_replace(df, col, repl={'yes': 1, 'no':0}, astype=float): df[col] = df[col].apply(lambda x:repl[x]).astype(astype, copy=False) -
-[docs] -def fetch_lequa2022(task, data_home=None): +
[docs]def fetch_lequa2022(task, data_home=None): """ Loads the official datasets provided for the `LeQua <https://lequa2022.github.io/index>`_ competition. In brief, there are 4 tasks (T1A, T1B, T2A, T2B) having to do with text quantification @@ -830,10 +808,7 @@ return train, val_gen, test_gen
- -
-[docs] -def fetch_IFCB(single_sample_train=True, for_model_selection=False, data_home=None): +
[docs]def fetch_IFCB(single_sample_train=True, for_model_selection=False, data_home=None): """ Loads the IFCB dataset for quantification from `Zenodo <https://zenodo.org/records/10036244>`_ (for more information on this dataset, please follow the zenodo link). @@ -912,7 +887,6 @@ return train, test_gen else: return train_gen, test_gen
-
diff --git a/docs/build/html/_modules/quapy/error.html b/docs/build/html/_modules/quapy/error.html index 5c1ce33..1613468 100644 --- a/docs/build/html/_modules/quapy/error.html +++ b/docs/build/html/_modules/quapy/error.html @@ -1,22 +1,23 @@ - + quapy.error — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -77,9 +78,7 @@ import quapy as qp -
-[docs] -def from_name(err_name): +
[docs]def from_name(err_name): """Gets an error function from its name. E.g., `from_name("mae")` will return function :meth:`quapy.error.mae` @@ -91,10 +90,7 @@ return callable_error
- -
-[docs] -def f1e(y_true, y_pred): +
[docs]def f1e(y_true, y_pred): """F1 error: simply computes the error in terms of macro :math:`F_1`, i.e., :math:`1-F_1^M`, where :math:`F_1` is the harmonic mean of precision and recall, defined as :math:`\\frac{2tp}{2tp+fp+fn}`, with `tp`, `fp`, and `fn` standing @@ -109,10 +105,7 @@ return 1. - f1_score(y_true, y_pred, average='macro')
- -
-[docs] -def acce(y_true, y_pred): +
[docs]def acce(y_true, y_pred): """Computes the error in terms of 1-accuracy. The accuracy is computed as :math:`\\frac{tp+tn}{tp+fp+fn+tn}`, with `tp`, `fp`, `fn`, and `tn` standing for true positives, false positives, false negatives, and true negatives, @@ -125,10 +118,7 @@ return 1. - (y_true == y_pred).mean()
- -
-[docs] -def mae(prevs, prevs_hat): +
[docs]def mae(prevs, prevs_hat): """Computes the mean absolute error (see :meth:`quapy.error.ae`) across the sample pairs. :param prevs: array-like of shape `(n_samples, n_classes,)` with the true prevalence values @@ -139,10 +129,7 @@ return ae(prevs, prevs_hat).mean()
- -
-[docs] -def ae(prevs, prevs_hat): +
[docs]def ae(prevs, prevs_hat): """Computes the absolute error between the two prevalence vectors. Absolute error between two prevalence vectors :math:`p` and :math:`\\hat{p}` is computed as :math:`AE(p,\\hat{p})=\\frac{1}{|\\mathcal{Y}|}\\sum_{y\\in \\mathcal{Y}}|\\hat{p}(y)-p(y)|`, @@ -156,10 +143,7 @@ return abs(prevs_hat - prevs).mean(axis=-1)
- -
-[docs] -def nae(prevs, prevs_hat): +
[docs]def nae(prevs, prevs_hat): """Computes the normalized absolute error between the two prevalence vectors. Normalized absolute error between two prevalence vectors :math:`p` and :math:`\\hat{p}` is computed as :math:`NAE(p,\\hat{p})=\\frac{AE(p,\\hat{p})}{z_{AE}}`, @@ -174,10 +158,7 @@ return abs(prevs_hat - prevs).sum(axis=-1)/(2*(1-prevs.min(axis=-1)))
- -
-[docs] -def mnae(prevs, prevs_hat): +
[docs]def mnae(prevs, prevs_hat): """Computes the mean normalized absolute error (see :meth:`quapy.error.nae`) across the sample pairs. :param prevs: array-like of shape `(n_samples, n_classes,)` with the true prevalence values @@ -188,10 +169,7 @@ return nae(prevs, prevs_hat).mean()
- -
-[docs] -def mse(prevs, prevs_hat): +
[docs]def mse(prevs, prevs_hat): """Computes the mean squared error (see :meth:`quapy.error.se`) across the sample pairs. :param prevs: array-like of shape `(n_samples, n_classes,)` with the @@ -203,10 +181,7 @@ return se(prevs, prevs_hat).mean()
- -
-[docs] -def se(prevs, prevs_hat): +
[docs]def se(prevs, prevs_hat): """Computes the squared error between the two prevalence vectors. Squared error between two prevalence vectors :math:`p` and :math:`\\hat{p}` is computed as :math:`SE(p,\\hat{p})=\\frac{1}{|\\mathcal{Y}|}\\sum_{y\\in \\mathcal{Y}}(\\hat{p}(y)-p(y))^2`, @@ -220,10 +195,7 @@ return ((prevs_hat - prevs) ** 2).mean(axis=-1)
- -
-[docs] -def mkld(prevs, prevs_hat, eps=None): +
[docs]def mkld(prevs, prevs_hat, eps=None): """Computes the mean Kullback-Leibler divergence (see :meth:`quapy.error.kld`) across the sample pairs. The distributions are smoothed using the `eps` factor (see :meth:`quapy.error.smooth`). @@ -241,10 +213,7 @@ return kld(prevs, prevs_hat, eps).mean()
- -
-[docs] -def kld(prevs, prevs_hat, eps=None): +
[docs]def kld(prevs, prevs_hat, eps=None): """Computes the Kullback-Leibler divergence between the two prevalence distributions. Kullback-Leibler divergence between two prevalence distributions :math:`p` and :math:`\\hat{p}` is computed as @@ -267,10 +236,7 @@ return (smooth_prevs*np.log(smooth_prevs/smooth_prevs_hat)).sum(axis=-1)
- -
-[docs] -def mnkld(prevs, prevs_hat, eps=None): +
[docs]def mnkld(prevs, prevs_hat, eps=None): """Computes the mean Normalized Kullback-Leibler divergence (see :meth:`quapy.error.nkld`) across the sample pairs. The distributions are smoothed using the `eps` factor (see :meth:`quapy.error.smooth`). @@ -287,10 +253,7 @@ return nkld(prevs, prevs_hat, eps).mean()
- -
-[docs] -def nkld(prevs, prevs_hat, eps=None): +
[docs]def nkld(prevs, prevs_hat, eps=None): """Computes the Normalized Kullback-Leibler divergence between the two prevalence distributions. Normalized Kullback-Leibler divergence between two prevalence distributions :math:`p` and :math:`\\hat{p}` is computed as @@ -311,10 +274,7 @@ return 2. * ekld / (1 + ekld) - 1.
- -
-[docs] -def mrae(prevs, prevs_hat, eps=None): +
[docs]def mrae(prevs, prevs_hat, eps=None): """Computes the mean relative absolute error (see :meth:`quapy.error.rae`) across the sample pairs. The distributions are smoothed using the `eps` factor (see :meth:`quapy.error.smooth`). @@ -332,10 +292,7 @@ return rae(prevs, prevs_hat, eps).mean()
- -
-[docs] -def rae(prevs, prevs_hat, eps=None): +
[docs]def rae(prevs, prevs_hat, eps=None): """Computes the absolute relative error between the two prevalence vectors. Relative absolute error between two prevalence vectors :math:`p` and :math:`\\hat{p}` is computed as @@ -358,10 +315,7 @@ return (abs(prevs - prevs_hat) / prevs).mean(axis=-1)
- -
-[docs] -def nrae(prevs, prevs_hat, eps=None): +
[docs]def nrae(prevs, prevs_hat, eps=None): """Computes the normalized absolute relative error between the two prevalence vectors. Relative absolute error between two prevalence vectors :math:`p` and :math:`\\hat{p}` is computed as @@ -386,10 +340,7 @@ return (abs(prevs - prevs_hat) / prevs).sum(axis=-1)/(prevs.shape[-1]-1+(1-min_p)/min_p)
- -
-[docs] -def mnrae(prevs, prevs_hat, eps=None): +
[docs]def mnrae(prevs, prevs_hat, eps=None): """Computes the mean normalized relative absolute error (see :meth:`quapy.error.nrae`) across the sample pairs. The distributions are smoothed using the `eps` factor (see :meth:`quapy.error.smooth`). @@ -407,10 +358,7 @@ return nrae(prevs, prevs_hat, eps).mean()
- -
-[docs] -def smooth(prevs, eps): +
[docs]def smooth(prevs, eps): """ Smooths a prevalence distribution with :math:`\\epsilon` (`eps`) as: :math:`\\underline{p}(y)=\\frac{\\epsilon+p(y)}{\\epsilon|\\mathcal{Y}|+ \\displaystyle\\sum_{y\\in \\mathcal{Y}}p(y)}` @@ -423,7 +371,6 @@ return (prevs + eps) / (eps * n_classes + 1)
- def __check_eps(eps=None): if eps is None: sample_size = qp.environ['SAMPLE_SIZE'] diff --git a/docs/build/html/_modules/quapy/evaluation.html b/docs/build/html/_modules/quapy/evaluation.html index 2208550..56d34a5 100644 --- a/docs/build/html/_modules/quapy/evaluation.html +++ b/docs/build/html/_modules/quapy/evaluation.html @@ -1,22 +1,23 @@ - + quapy.evaluation — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -79,9 +80,7 @@ import pandas as pd -
-[docs] -def prediction( +
[docs]def prediction( model: BaseQuantifier, protocol: AbstractProtocol, aggr_speedup: Union[str, bool] = 'auto', @@ -140,7 +139,6 @@ return __prediction_helper(model.quantify, protocol, verbose)
- def __prediction_helper(quantification_fn, protocol: AbstractProtocol, verbose=False): true_prevs, estim_prevs = [], [] for sample_instances, sample_prev in tqdm(protocol(), total=protocol.total(), desc='predicting') if verbose else protocol(): @@ -153,9 +151,7 @@ return true_prevs, estim_prevs -
-[docs] -def evaluation_report(model: BaseQuantifier, +
[docs]def evaluation_report(model: BaseQuantifier, protocol: AbstractProtocol, error_metrics: Iterable[Union[str,Callable]] = 'mae', aggr_speedup: Union[str, bool] = 'auto', @@ -186,7 +182,6 @@ return _prevalence_report(true_prevs, estim_prevs, error_metrics)
- def _prevalence_report(true_prevs, estim_prevs, error_metrics: Iterable[Union[str, Callable]] = 'mae'): if isinstance(error_metrics, str): @@ -208,9 +203,7 @@ return df -
-[docs] -def evaluate( +
[docs]def evaluate( model: BaseQuantifier, protocol: AbstractProtocol, error_metric: Union[str, Callable], @@ -242,10 +235,7 @@ return error_metric(true_prevs, estim_prevs)
- -
-[docs] -def evaluate_on_samples( +
[docs]def evaluate_on_samples( model: BaseQuantifier, samples: Iterable[qp.data.LabelledCollection], error_metric: Union[str, Callable], @@ -269,7 +259,6 @@ -
diff --git a/docs/build/html/_modules/quapy/functional.html b/docs/build/html/_modules/quapy/functional.html index 1d41ac8..1b02248 100644 --- a/docs/build/html/_modules/quapy/functional.html +++ b/docs/build/html/_modules/quapy/functional.html @@ -1,22 +1,23 @@ - + quapy.functional — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -78,9 +79,7 @@ import numpy as np -
-[docs] -def prevalence_linspace(n_prevalences=21, repeats=1, smooth_limits_epsilon=0.01): +
[docs]def prevalence_linspace(n_prevalences=21, repeats=1, smooth_limits_epsilon=0.01): """ Produces an array of uniformly separated values of prevalence. By default, produces an array of 21 prevalence values, with @@ -102,10 +101,7 @@ return p
- -
-[docs] -def prevalence_from_labels(labels, classes): +
[docs]def prevalence_from_labels(labels, classes): """ Computed the prevalence values from a vector of labels. @@ -123,10 +119,7 @@ return prevalences
- -
-[docs] -def prevalence_from_probabilities(posteriors, binarize: bool = False): +
[docs]def prevalence_from_probabilities(posteriors, binarize: bool = False): """ Returns a vector of prevalence values from a matrix of posterior probabilities. @@ -146,10 +139,7 @@ return prevalences
- -
-[docs] -def as_binary_prevalence(positive_prevalence: Union[float, np.ndarray], clip_if_necessary=False): +
[docs]def as_binary_prevalence(positive_prevalence: Union[float, np.ndarray], clip_if_necessary=False): """ Helper that, given a float representing the prevalence for the positive class, returns a np.ndarray of two values representing a binary distribution. @@ -167,10 +157,7 @@ - -
-[docs] -def HellingerDistance(P, Q) -> float: +
[docs]def HellingerDistance(P, Q) -> float: """ Computes the Hellingher Distance (HD) between (discretized) distributions `P` and `Q`. The HD for two discrete distributions of `k` bins is defined as: @@ -185,10 +172,7 @@ return np.sqrt(np.sum((np.sqrt(P) - np.sqrt(Q))**2))
- -
-[docs] -def TopsoeDistance(P, Q, epsilon=1e-20): +
[docs]def TopsoeDistance(P, Q, epsilon=1e-20): """ Topsoe distance between two (discretized) distributions `P` and `Q`. The Topsoe distance for two discrete distributions of `k` bins is defined as: @@ -202,12 +186,9 @@ :return: float """ return np.sum(P*np.log((2*P+epsilon)/(P+Q+epsilon)) + Q*np.log((2*Q+epsilon)/(P+Q+epsilon)))
- -
-[docs] -def uniform_prevalence_sampling(n_classes, size=1): +
[docs]def uniform_prevalence_sampling(n_classes, size=1): """ Implements the `Kraemer algorithm <http://www.cs.cmu.edu/~nasmith/papers/smith+tromble.tr04.pdf>`_ for sampling uniformly at random from the unit simplex. This implementation is adapted from this @@ -233,13 +214,10 @@ return u
- uniform_simplex_sampling = uniform_prevalence_sampling -
-[docs] -def strprev(prevalences, prec=3): +
[docs]def strprev(prevalences, prec=3): """ Returns a string representation for a prevalence vector. E.g., @@ -253,10 +231,7 @@ return '['+ ', '.join([f'{p:.{prec}f}' for p in prevalences]) + ']'
- -
-[docs] -def adjusted_quantification(prevalence_estim, tpr, fpr, clip=True): +
[docs]def adjusted_quantification(prevalence_estim, tpr, fpr, clip=True): """ Implements the adjustment of ACC and PACC for the binary case. The adjustment for a prevalence estimate of the positive class `p` comes down to computing: @@ -280,10 +255,7 @@ return adjusted
- -
-[docs] -def normalize_prevalence(prevalences): +
[docs]def normalize_prevalence(prevalences): """ Normalize a vector or matrix of prevalence values. The normalization consists of applying a L1 normalization in cases in which the prevalence values are not all-zeros, and to convert the prevalence values into `1/n_classes` in @@ -305,7 +277,6 @@ return prevalences
- def __num_prevalence_combinations_depr(n_prevpoints:int, n_classes:int, n_repeats:int=1): """ Computes the number of prevalence combinations in the n_classes-dimensional simplex if `nprevpoints` equally distant @@ -330,9 +301,7 @@ return __f(n_classes, n_prevpoints) * n_repeats -
-[docs] -def num_prevalence_combinations(n_prevpoints:int, n_classes:int, n_repeats:int=1): +
[docs]def num_prevalence_combinations(n_prevpoints:int, n_classes:int, n_repeats:int=1): """ Computes the number of valid prevalence combinations in the n_classes-dimensional simplex if `n_prevpoints` equally distant prevalence values are generated and `n_repeats` repetitions are requested. @@ -357,10 +326,7 @@ return int(scipy.special.binom(N + C - 1, C - 1) * r)
- -
-[docs] -def get_nprevpoints_approximation(combinations_budget:int, n_classes:int, n_repeats:int=1): +
[docs]def get_nprevpoints_approximation(combinations_budget:int, n_classes:int, n_repeats:int=1): """ Searches for the largest number of (equidistant) prevalence points to define for each of the `n_classes` classes so that the number of valid prevalence values generated as combinations of prevalence points (points in a @@ -381,10 +347,7 @@ n_prevpoints += 1
- -
-[docs] -def check_prevalence_vector(p, raise_exception=False, toleranze=1e-08): +
[docs]def check_prevalence_vector(p, raise_exception=False, toleranze=1e-08): """ Checks that p is a valid prevalence vector, i.e., that it contains values in [0,1] and that the values sum up to 1. @@ -407,10 +370,7 @@ return True
- -
-[docs] -def get_divergence(divergence: Union[str, Callable]): +
[docs]def get_divergence(divergence: Union[str, Callable]): if isinstance(divergence, str): if divergence=='HD': return HellingerDistance @@ -424,10 +384,7 @@ raise ValueError(f'argument "divergence" not understood; use a str or a callable function')
- -
-[docs] -def argmin_prevalence(loss, n_classes, method='optim_minimize'): +
[docs]def argmin_prevalence(loss, n_classes, method='optim_minimize'): if method == 'optim_minimize': return optim_minimize(loss, n_classes) elif method == 'linear_search': @@ -438,10 +395,7 @@ raise NotImplementedError()
- -
-[docs] -def optim_minimize(loss, n_classes): +
[docs]def optim_minimize(loss, n_classes): """ Searches for the optimal prevalence values, i.e., an `n_classes`-dimensional vector of the (`n_classes`-1)-simplex that yields the smallest lost. This optimization is carried out by means of a constrained search using scipy's @@ -463,10 +417,7 @@ return r.x
- -
diff --git a/docs/build/html/_modules/quapy/method/_kdey.html b/docs/build/html/_modules/quapy/method/_kdey.html index 198113f..4e96e56 100644 --- a/docs/build/html/_modules/quapy/method/_kdey.html +++ b/docs/build/html/_modules/quapy/method/_kdey.html @@ -1,22 +1,23 @@ - + quapy.method._kdey — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -83,9 +84,7 @@ from sklearn.metrics.pairwise import rbf_kernel -
-[docs] -class KDEBase: +
[docs]class KDEBase: """ Common ancestor for KDE-based methods. Implements some common routines. """ @@ -105,9 +104,7 @@ if isinstance(bandwidth, float): assert 0 < bandwidth < 1, "the bandwith for KDEy should be in (0,1), since this method models the unit simplex" -
-[docs] - def get_kde_function(self, X, bandwidth): +
[docs] def get_kde_function(self, X, bandwidth): """ Wraps the KDE function from scikit-learn. @@ -117,10 +114,7 @@ """ return KernelDensity(bandwidth=bandwidth).fit(X)
- -
-[docs] - def pdf(self, kde, X): +
[docs] def pdf(self, kde, X): """ Wraps the density evalution of scikit-learn's KDE. Scikit-learn returns log-scores (s), so this function returns :math:`e^{s}` @@ -131,10 +125,7 @@ """ return np.exp(kde.score_samples(X))
- -
-[docs] - def get_mixture_components(self, X, y, n_classes, bandwidth): +
[docs] def get_mixture_components(self, X, y, n_classes, bandwidth): """ Returns an array containing the mixture components, i.e., the KDE functions for each class. @@ -144,15 +135,11 @@ :param bandwidth: float, the bandwidth of the kernel :return: a list of KernelDensity objects, each fitted with the corresponding class-specific covariates """ - return [self.get_kde_function(X[y == cat], bandwidth) for cat in range(n_classes)]
-
+ return [self.get_kde_function(X[y == cat], bandwidth) for cat in range(n_classes)]
- -
-[docs] -class KDEyML(AggregativeSoftQuantifier, KDEBase): +
[docs]class KDEyML(AggregativeSoftQuantifier, KDEBase): """ Kernel Density Estimation model for quantification (KDEy) relying on the Kullback-Leibler divergence (KLD) as the divergence measure to be minimized. This method was first proposed in the paper @@ -199,16 +186,11 @@ self.n_jobs = n_jobs self.random_state=random_state -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): self.mix_densities = self.get_mixture_components(*classif_predictions.Xy, data.n_classes, self.bandwidth) return self
- -
-[docs] - def aggregate(self, posteriors: np.ndarray): +
[docs] def aggregate(self, posteriors: np.ndarray): """ Searches for the mixture model parameter (the sought prevalence values) that maximizes the likelihood of the data (i.e., that minimizes the negative log-likelihood) @@ -226,14 +208,10 @@ test_loglikelihood = np.log(test_mixture_likelihood + epsilon) return -np.sum(test_loglikelihood) - return F.optim_minimize(neg_loglikelihood, n_classes)
-
+ return F.optim_minimize(neg_loglikelihood, n_classes)
- -
-[docs] -class KDEyHD(AggregativeSoftQuantifier, KDEBase): +
[docs]class KDEyHD(AggregativeSoftQuantifier, KDEBase): """ Kernel Density Estimation model for quantification (KDEy) relying on the squared Hellinger Disntace (HD) as the divergence measure to be minimized. This method was first proposed in the paper @@ -290,9 +268,7 @@ self.random_state=random_state self.montecarlo_trials = montecarlo_trials -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): self.mix_densities = self.get_mixture_components(*classif_predictions.Xy, data.n_classes, self.bandwidth) N = self.montecarlo_trials @@ -304,10 +280,7 @@ return self
- -
-[docs] - def aggregate(self, posteriors: np.ndarray): +
[docs] def aggregate(self, posteriors: np.ndarray): # we retain all n*N examples (sampled from a mixture with uniform parameter), and then # apply importance sampling (IS). In this version we compute D(p_alpha||q) with IS n_classes = len(self.mix_densities) @@ -336,14 +309,10 @@ ps_div_qs = prev @ fracs return np.mean( f(ps_div_qs) * iw ) - return F.optim_minimize(divergence, n_classes)
-
+ return F.optim_minimize(divergence, n_classes)
- -
-[docs] -class KDEyCS(AggregativeSoftQuantifier): +
[docs]class KDEyCS(AggregativeSoftQuantifier): """ Kernel Density Estimation model for quantification (KDEy) relying on the Cauchy-Schwarz divergence (CS) as the divergence measure to be minimized. This method was first proposed in the paper @@ -387,9 +356,7 @@ self.bandwidth = bandwidth self.n_jobs = n_jobs -
-[docs] - def gram_matrix_mix_sum(self, X, Y=None): +
[docs] def gram_matrix_mix_sum(self, X, Y=None): # this adapts the output of the rbf_kernel function (pairwise evaluations of Gaussian kernels k(x,y)) # to contain pairwise evaluations of N(x|mu,Sigma1+Sigma2) with mu=y and Sigma1 and Sigma2 are # two "scalar matrices" (h^2)*I each, so Sigma1+Sigma2 has scalar 2(h^2) (h is the bandwidth) @@ -401,10 +368,7 @@ gram = norm_factor * rbf_kernel(X, Y, gamma=gamma) return gram.sum()
- -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): P, y = classif_predictions.Xy n = data.n_classes @@ -435,10 +399,7 @@ return self
- -
-[docs] - def aggregate(self, posteriors: np.ndarray): +
[docs] def aggregate(self, posteriors: np.ndarray): Ptr = self.Ptr Pte = posteriors y = self.ytr @@ -467,9 +428,7 @@ partB = 0.5 * np.log(alpha_ratio @ tr_tr_sums @ alpha_ratio) return partA + partB #+ partC - return F.optim_minimize(divergence, n)
-
- + return F.optim_minimize(divergence, n)
diff --git a/docs/build/html/_modules/quapy/method/_neural.html b/docs/build/html/_modules/quapy/method/_neural.html index a4f6a27..706a7cc 100644 --- a/docs/build/html/_modules/quapy/method/_neural.html +++ b/docs/build/html/_modules/quapy/method/_neural.html @@ -1,22 +1,23 @@ - + quapy.method._neural — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -84,9 +85,7 @@ from tqdm import tqdm -
-[docs] -class QuaNetTrainer(BaseQuantifier): +
[docs]class QuaNetTrainer(BaseQuantifier): """ Implementation of `QuaNet <https://dl.acm.org/doi/abs/10.1145/3269206.3269287>`_, a neural network for quantification. This implementation uses `PyTorch <https://pytorch.org/>`_ and can take advantage of GPU @@ -185,9 +184,7 @@ self.__check_params_colision(self.quanet_params, self.classifier.get_params()) self._classes_ = None -
-[docs] - def fit(self, data: LabelledCollection, fit_classifier=True): +
[docs] def fit(self, data: LabelledCollection, fit_classifier=True): """ Trains QuaNet. @@ -266,7 +263,6 @@ return self
- def _get_aggregative_estims(self, posteriors): label_predictions = np.argmax(posteriors, axis=-1) prevs_estim = [] @@ -278,9 +274,7 @@ return prevs_estim -
-[docs] - def quantify(self, instances): +
[docs] def quantify(self, instances): posteriors = self.classifier.predict_proba(instances) embeddings = self.classifier.transform(instances) quant_estims = self._get_aggregative_estims(posteriors) @@ -292,7 +286,6 @@ prevalence = prevalence.numpy().flatten() return prevalence
- def _epoch(self, data: LabelledCollection, posteriors, iterations, epoch, early_stop, train): mse_loss = MSELoss() @@ -343,17 +336,12 @@ f'val-mseloss={self.status["va-loss"]:.5f} val-maeloss={self.status["va-mae"]:.5f} ' f'patience={early_stop.patience}/{early_stop.PATIENCE_LIMIT}') -
-[docs] - def get_params(self, deep=True): +
[docs] def get_params(self, deep=True): classifier_params = self.classifier.get_params() classifier_params = {'classifier__'+k:v for k,v in classifier_params.items()} return {**classifier_params, **self.quanet_params}
- -
-[docs] - def set_params(self, **parameters): +
[docs] def set_params(self, **parameters): learner_params = {} for key, val in parameters.items(): if key in self.quanet_params: @@ -364,7 +352,6 @@ raise ValueError('unknown parameter ', key) self.classifier.set_params(**learner_params)
- def __check_params_colision(self, quanet_params, learner_params): quanet_keys = set(quanet_params.keys()) learner_keys = set(learner_params.keys()) @@ -373,34 +360,25 @@ raise ValueError(f'the use of parameters {intersection} is ambiguous sine those can refer to ' f'the parameters of QuaNet or the learner {self.classifier.__class__.__name__}') -
-[docs] - def clean_checkpoint(self): +
[docs] def clean_checkpoint(self): """ Removes the checkpoint """ os.remove(self.checkpoint)
- -
-[docs] - def clean_checkpoint_dir(self): +
[docs] def clean_checkpoint_dir(self): """ Removes anything contained in the checkpoint directory """ import shutil shutil.rmtree(self.checkpointdir, ignore_errors=True)
- @property def classes_(self): return self._classes_
- -
-[docs] -def mae_loss(output, target): +
[docs]def mae_loss(output, target): """ Torch-like wrapper for the Mean Absolute Error @@ -411,10 +389,7 @@ return torch.mean(torch.abs(output - target))
- -
-[docs] -class QuaNetModule(torch.nn.Module): +
[docs]class QuaNetModule(torch.nn.Module): """ Implements the `QuaNet <https://dl.acm.org/doi/abs/10.1145/3269206.3269287>`_ forward pass. See :class:`QuaNetTrainer` for training QuaNet. @@ -477,9 +452,7 @@ var_hidden, var_cell = var_hidden.cuda(), var_cell.cuda() return var_hidden, var_cell -
-[docs] - def forward(self, doc_embeddings, doc_posteriors, statistics): +
[docs] def forward(self, doc_embeddings, doc_posteriors, statistics): device = self.device doc_embeddings = torch.as_tensor(doc_embeddings, dtype=torch.float, device=device) doc_posteriors = torch.as_tensor(doc_posteriors, dtype=torch.float, device=device) @@ -509,9 +482,7 @@ logits = self.output(abstracted).view(1, -1) prevalence = torch.softmax(logits, -1) - return prevalence
-
- + return prevalence
diff --git a/docs/build/html/_modules/quapy/method/_threshold_optim.html b/docs/build/html/_modules/quapy/method/_threshold_optim.html index 0aa215b..486aa61 100644 --- a/docs/build/html/_modules/quapy/method/_threshold_optim.html +++ b/docs/build/html/_modules/quapy/method/_threshold_optim.html @@ -1,22 +1,23 @@ - + quapy.method._threshold_optim — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -80,9 +81,7 @@ from quapy.method.aggregative import BinaryAggregativeQuantifier -
-[docs] -class ThresholdOptimization(BinaryAggregativeQuantifier): +
[docs]class ThresholdOptimization(BinaryAggregativeQuantifier): """ Abstract class of Threshold Optimization variants for :class:`ACC` as proposed by `Forman 2006 <https://dl.acm.org/doi/abs/10.1145/1150402.1150423>`_ and @@ -106,9 +105,7 @@ self.val_split = val_split self.n_jobs = qp._get_njobs(n_jobs) -
-[docs] - @abstractmethod +
[docs] @abstractmethod def condition(self, tpr, fpr) -> float: """ Implements the criterion according to which the threshold should be selected. @@ -120,10 +117,7 @@ """ ...
- -
-[docs] - def discard(self, tpr, fpr) -> bool: +
[docs] def discard(self, tpr, fpr) -> bool: """ Indicates whether a combination of tpr and fpr should be discarded @@ -134,7 +128,6 @@ return (tpr - fpr) == 0
- def _eval_candidate_thresholds(self, decision_scores, y): """ Seeks for the best `tpr` and `fpr` according to the score obtained at different @@ -170,9 +163,7 @@ return candidates -
-[docs] - def aggregate_with_threshold(self, classif_predictions, tprs, fprs, thresholds): +
[docs] def aggregate_with_threshold(self, classif_predictions, tprs, fprs, thresholds): # This function performs the adjusted count for given tpr, fpr, and threshold. # Note that, due to broadcasting, tprs, fprs, and thresholds could be arrays of length > 1 prevs_estims = np.mean(classif_predictions[:, None] >= thresholds, axis=0) @@ -180,7 +171,6 @@ prevs_estims = F.as_binary_prevalence(prevs_estims, clip_if_necessary=True) return prevs_estims.squeeze()
- def _compute_table(self, y, y_): TP = np.logical_and(y == y_, y == self.pos_label).sum() FP = np.logical_and(y != y_, y == self.neg_label).sum() @@ -198,27 +188,18 @@ return 0 return FP / (FP + TN) -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): decision_scores, y = classif_predictions.Xy # the standard behavior is to keep the best threshold only self.tpr, self.fpr, self.threshold = self._eval_candidate_thresholds(decision_scores, y)[0] return self
- -
-[docs] - def aggregate(self, classif_predictions: np.ndarray): +
[docs] def aggregate(self, classif_predictions: np.ndarray): # the standard behavior is to compute the adjusted count using the best threshold found - return self.aggregate_with_threshold(classif_predictions, self.tpr, self.fpr, self.threshold)
-
+ return self.aggregate_with_threshold(classif_predictions, self.tpr, self.fpr, self.threshold)
- -
-[docs] -class T50(ThresholdOptimization): +
[docs]class T50(ThresholdOptimization): """ Threshold Optimization variant for :class:`ACC` as proposed by `Forman 2006 <https://dl.acm.org/doi/abs/10.1145/1150402.1150423>`_ and @@ -238,17 +219,11 @@ def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) -
-[docs] - def condition(self, tpr, fpr) -> float: - return abs(tpr - 0.5)
-
+
[docs] def condition(self, tpr, fpr) -> float: + return abs(tpr - 0.5)
- -
-[docs] -class MAX(ThresholdOptimization): +
[docs]class MAX(ThresholdOptimization): """ Threshold Optimization variant for :class:`ACC` as proposed by `Forman 2006 <https://dl.acm.org/doi/abs/10.1145/1150402.1150423>`_ and @@ -268,18 +243,12 @@ def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) -
-[docs] - def condition(self, tpr, fpr) -> float: +
[docs] def condition(self, tpr, fpr) -> float: # MAX strives to maximize (tpr - fpr), which is equivalent to minimize (fpr - tpr) - return (fpr - tpr)
-
+ return (fpr - tpr)
- -
-[docs] -class X(ThresholdOptimization): +
[docs]class X(ThresholdOptimization): """ Threshold Optimization variant for :class:`ACC` as proposed by `Forman 2006 <https://dl.acm.org/doi/abs/10.1145/1150402.1150423>`_ and @@ -299,17 +268,11 @@ def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) -
-[docs] - def condition(self, tpr, fpr) -> float: - return abs(1 - (tpr + fpr))
-
+
[docs] def condition(self, tpr, fpr) -> float: + return abs(1 - (tpr + fpr))
- -
-[docs] -class MS(ThresholdOptimization): +
[docs]class MS(ThresholdOptimization): """ Median Sweep. Threshold Optimization variant for :class:`ACC` as proposed by `Forman 2006 <https://dl.acm.org/doi/abs/10.1145/1150402.1150423>`_ and @@ -328,15 +291,10 @@ def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) -
-[docs] - def condition(self, tpr, fpr) -> float: +
[docs] def condition(self, tpr, fpr) -> float: return 1
- -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): decision_scores, y = classif_predictions.Xy # keeps all candidates tprs_fprs_thresholds = self._eval_candidate_thresholds(decision_scores, y) @@ -345,21 +303,14 @@ self.thresholds = tprs_fprs_thresholds[:, 2] return self
- -
-[docs] - def aggregate(self, classif_predictions: np.ndarray): +
[docs] def aggregate(self, classif_predictions: np.ndarray): prevalences = self.aggregate_with_threshold(classif_predictions, self.tprs, self.fprs, self.thresholds) if prevalences.ndim==2: prevalences = np.median(prevalences, axis=0) - return prevalences
-
+ return prevalences
- -
-[docs] -class MS2(MS): +
[docs]class MS2(MS): """ Median Sweep 2. Threshold Optimization variant for :class:`ACC` as proposed by `Forman 2006 <https://dl.acm.org/doi/abs/10.1145/1150402.1150423>`_ and @@ -379,12 +330,8 @@ def __init__(self, classifier: BaseEstimator, val_split=5): super().__init__(classifier, val_split) -
-[docs] - def discard(self, tpr, fpr) -> bool: - return (tpr-fpr) <= 0.25
-
- +
[docs] def discard(self, tpr, fpr) -> bool: + return (tpr-fpr) <= 0.25
diff --git a/docs/build/html/_modules/quapy/method/aggregative.html b/docs/build/html/_modules/quapy/method/aggregative.html index f34498e..8311baa 100644 --- a/docs/build/html/_modules/quapy/method/aggregative.html +++ b/docs/build/html/_modules/quapy/method/aggregative.html @@ -1,22 +1,23 @@ - + quapy.method.aggregative — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -93,9 +94,7 @@ # Abstract classes # ------------------------------------ -
-[docs] -class AggregativeQuantifier(BaseQuantifier, ABC): +
[docs]class AggregativeQuantifier(BaseQuantifier, ABC): """ Abstract class for quantification methods that base their estimations on the aggregation of classification results. Aggregative quantifiers implement a pipeline that consists of generating classification predictions @@ -147,9 +146,7 @@ empty_class_names = data.classes_[empty_classes] raise ValueError(f'classes {empty_class_names} have no training examples') -
-[docs] - def fit(self, data: LabelledCollection, fit_classifier=True, val_split=None): +
[docs] def fit(self, data: LabelledCollection, fit_classifier=True, val_split=None): """ Trains the aggregative quantifier. This comes down to training a classifier and an aggregation function. @@ -163,10 +160,7 @@ self.aggregation_fit(classif_predictions, data) return self
- -
-[docs] - def classifier_fit_predict(self, data: LabelledCollection, fit_classifier=True, predict_on=None): +
[docs] def classifier_fit_predict(self, data: LabelledCollection, fit_classifier=True, predict_on=None): """ Trains the classifier if requested (`fit_classifier=True`) and generate the necessary predictions to train the aggregation function. @@ -236,10 +230,7 @@ return predictions
- -
-[docs] - @abstractmethod +
[docs] @abstractmethod def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Trains the aggregation function. @@ -250,7 +241,6 @@ """ ...
- @property def classifier(self): """ @@ -269,9 +259,7 @@ """ self.classifier_ = classifier -
-[docs] - def classify(self, instances): +
[docs] def classify(self, instances): """ Provides the label predictions for the given instances. The predictions should respect the format expected by :meth:`aggregate`, e.g., posterior probabilities for probabilistic quantifiers, or crisp predictions for @@ -282,7 +270,6 @@ """ return getattr(self.classifier, self._classifier_method())(instances)
- def _classifier_method(self): """ Name of the method that must be used for issuing label predictions. The default one is "decision_function". @@ -301,9 +288,7 @@ assert hasattr(self.classifier, self._classifier_method()), \ f"the method does not implement the required {self._classifier_method()} method" -
-[docs] - def quantify(self, instances): +
[docs] def quantify(self, instances): """ Generate class prevalence estimates for the sample's instances by aggregating the label predictions generated by the classifier. @@ -314,10 +299,7 @@ classif_predictions = self.classify(instances) return self.aggregate(classif_predictions)
- -
-[docs] - @abstractmethod +
[docs] @abstractmethod def aggregate(self, classif_predictions: np.ndarray): """ Implements the aggregation of label predictions. @@ -327,7 +309,6 @@ """ ...
- @property def classes_(self): """ @@ -339,10 +320,7 @@ return self.classifier.classes_
- -
-[docs] -class AggregativeCrispQuantifier(AggregativeQuantifier, ABC): +
[docs]class AggregativeCrispQuantifier(AggregativeQuantifier, ABC): """ Abstract class for quantification methods that base their estimations on the aggregation of crips decisions as returned by a hard classifier. Aggregative crisp quantifiers thus extend Aggregative @@ -359,10 +337,7 @@ return 'predict'
- -
-[docs] -class AggregativeSoftQuantifier(AggregativeQuantifier, ABC): +
[docs]class AggregativeSoftQuantifier(AggregativeQuantifier, ABC): """ Abstract class for quantification methods that base their estimations on the aggregation of posterior probabilities as returned by a probabilistic classifier. @@ -401,10 +376,7 @@ f'fit_classifier is set to False')
- -
-[docs] -class BinaryAggregativeQuantifier(AggregativeQuantifier, BinaryQuantifier): +
[docs]class BinaryAggregativeQuantifier(AggregativeQuantifier, BinaryQuantifier): @property def pos_label(self): @@ -414,20 +386,14 @@ def neg_label(self): return self.classifier.classes_[0] -
-[docs] - def fit(self, data: LabelledCollection, fit_classifier=True, val_split=None): +
[docs] def fit(self, data: LabelledCollection, fit_classifier=True, val_split=None): self._check_binary(data, self.__class__.__name__) - return super().fit(data, fit_classifier, val_split)
-
- + return super().fit(data, fit_classifier, val_split)
# Methods # ------------------------------------ -
-[docs] -class CC(AggregativeCrispQuantifier): +
[docs]class CC(AggregativeCrispQuantifier): """ The most basic Quantification method. One that simply classifies all instances and counts how many have been attributed to each of the classes in order to compute class prevalence estimates. @@ -438,9 +404,7 @@ def __init__(self, classifier: BaseEstimator): self.classifier = classifier -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Nothing to do here! @@ -448,24 +412,17 @@ """ pass
- -
-[docs] - def aggregate(self, classif_predictions: np.ndarray): +
[docs] def aggregate(self, classif_predictions: np.ndarray): """ Computes class prevalence estimates by counting the prevalence of each of the predicted labels. :param classif_predictions: array-like with label predictions :return: `np.ndarray` of shape `(n_classes,)` with class prevalence estimates. """ - return F.prevalence_from_labels(classif_predictions, self.classes_)
-
+ return F.prevalence_from_labels(classif_predictions, self.classes_)
- -
-[docs] -class ACC(AggregativeCrispQuantifier): +
[docs]class ACC(AggregativeCrispQuantifier): """ `Adjusted Classify & Count <https://link.springer.com/article/10.1007/s10618-008-0097-y>`_, the "adjusted" variant of :class:`CC`, that corrects the predictions of CC @@ -502,9 +459,7 @@ def _check_init_parameters(self): assert self.solver in ['exact', 'minimize'], "unknown solver; valid ones are 'exact', 'minimize'" -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Estimates the misclassification rates. @@ -514,10 +469,7 @@ self.cc = CC(self.classifier) self.Pte_cond_estim_ = self.getPteCondEstim(self.classifier.classes_, true_labels, pred_labels)
- -
-[docs] - @classmethod +
[docs] @classmethod def getPteCondEstim(cls, classes, y, y_): # estimate the matrix with entry (i,j) being the estimate of P(hat_yi|yj), that is, the probability that a # document that belongs to yj ends up being classified as belonging to yi @@ -531,17 +483,11 @@ conf[:, i] /= class_counts[i] return conf
- -
-[docs] - def aggregate(self, classif_predictions): +
[docs] def aggregate(self, classif_predictions): prevs_estim = self.cc.aggregate(classif_predictions) return ACC.solve_adjustment(self.Pte_cond_estim_, prevs_estim, solver=self.solver)
- -
-[docs] - @classmethod +
[docs] @classmethod def solve_adjustment(cls, PteCondEstim, prevs_estim, solver='exact'): """ Solves the system linear system :math:`Ax = B` with :math:`A` = `PteCondEstim` and :math:`B` = `prevs_estim` @@ -577,14 +523,10 @@ def loss(prev): return np.linalg.norm(A @ prev - B) - return F.optim_minimize(loss, n_classes=A.shape[0])
-
+ return F.optim_minimize(loss, n_classes=A.shape[0])
- -
-[docs] -class PCC(AggregativeSoftQuantifier): +
[docs]class PCC(AggregativeSoftQuantifier): """ `Probabilistic Classify & Count <https://ieeexplore.ieee.org/abstract/document/5694031>`_, the probabilistic variant of CC that relies on the posterior probabilities returned by a probabilistic classifier. @@ -595,9 +537,7 @@ def __init__(self, classifier: BaseEstimator): self.classifier = classifier -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Nothing to do here! @@ -605,18 +545,11 @@ """ pass
- -
-[docs] - def aggregate(self, classif_posteriors): - return F.prevalence_from_probabilities(classif_posteriors, binarize=False)
-
+
[docs] def aggregate(self, classif_posteriors): + return F.prevalence_from_probabilities(classif_posteriors, binarize=False)
- -
-[docs] -class PACC(AggregativeSoftQuantifier): +
[docs]class PACC(AggregativeSoftQuantifier): """ `Probabilistic Adjusted Classify & Count <https://ieeexplore.ieee.org/abstract/document/5694031>`_, the probabilistic variant of ACC that relies on the posterior probabilities returned by a probabilistic classifier. @@ -652,9 +585,7 @@ def _check_init_parameters(self): assert self.solver in ['exact', 'minimize'], "unknown solver; valid ones are 'exact', 'minimize'" -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Estimates the misclassification rates @@ -664,17 +595,11 @@ self.pcc = PCC(self.classifier) self.Pte_cond_estim_ = self.getPteCondEstim(self.classifier.classes_, true_labels, posteriors)
- -
-[docs] - def aggregate(self, classif_posteriors): +
[docs] def aggregate(self, classif_posteriors): prevs_estim = self.pcc.aggregate(classif_posteriors) return ACC.solve_adjustment(self.Pte_cond_estim_, prevs_estim, solver=self.solver)
- -
-[docs] - @classmethod +
[docs] @classmethod def getPteCondEstim(cls, classes, y, y_): # estimate the matrix with entry (i,j) being the estimate of P(hat_yi|yj), that is, the probability that a # document that belongs to yj ends up being classified as belonging to yi @@ -685,14 +610,10 @@ if idx.any(): confusion[i] = y_[idx].mean(axis=0) - return confusion.T
-
+ return confusion.T
- -
-[docs] -class EMQ(AggregativeSoftQuantifier): +
[docs]class EMQ(AggregativeSoftQuantifier): """ `Expectation Maximization for Quantification <https://ieeexplore.ieee.org/abstract/document/6789744>`_ (EMQ), aka `Saerens-Latinne-Decaestecker` (SLD) algorithm. @@ -736,9 +657,7 @@ self.recalib = recalib self.n_jobs = n_jobs -
-[docs] - @classmethod +
[docs] @classmethod def EMQ_BCTS(cls, classifier: BaseEstimator, n_jobs=None): """ Constructs an instance of EMQ using the best configuration found in the `Alexandari et al. paper @@ -752,7 +671,6 @@ """ return EMQ(classifier, val_split=5, exact_train_prev=False, recalib='bcts', n_jobs=n_jobs)
- def _check_init_parameters(self): if self.val_split is not None: if self.exact_train_prev and self.recalib is None: @@ -767,9 +685,7 @@ f'indicating the number of folds for kFCV.') self.val_split=5 -
-[docs] - def classify(self, instances): +
[docs] def classify(self, instances): """ Provides the posterior probabilities for the given instances. If the classifier was required to be recalibrated, then these posteriors are recalibrated accordingly. @@ -782,10 +698,7 @@ posteriors = self.calibration_function(posteriors) return posteriors
- -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): if self.recalib is not None: P, y = classif_predictions.Xy if self.recalib == 'nbvs': @@ -810,17 +723,11 @@ train_posteriors = self.calibration_function(train_posteriors) self.train_prevalence = F.prevalence_from_probabilities(train_posteriors)
- -
-[docs] - def aggregate(self, classif_posteriors, epsilon=EPSILON): +
[docs] def aggregate(self, classif_posteriors, epsilon=EPSILON): priors, posteriors = self.EM(self.train_prevalence, classif_posteriors, epsilon) return priors
- -
-[docs] - def predict_proba(self, instances, epsilon=EPSILON): +
[docs] def predict_proba(self, instances, epsilon=EPSILON): """ Returns the posterior probabilities updated by the EM algorithm. @@ -832,10 +739,7 @@ priors, posteriors = self.EM(self.train_prevalence, classif_posteriors, epsilon) return posteriors
- -
-[docs] - @classmethod +
[docs] @classmethod def EM(cls, tr_prev, posterior_probabilities, epsilon=EPSILON): """ Computes the `Expectation Maximization` routine. @@ -871,14 +775,10 @@ if not converged: print('[warning] the method has reached the maximum number of iterations; it might have not converged') - return qs, ps
-
+ return qs, ps
- -
-[docs] -class HDy(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): +
[docs]class HDy(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): """ `Hellinger Distance y <https://www.sciencedirect.com/science/article/pii/S0020025512004069>`_ (HDy). HDy is a probabilistic method for training binary quantifiers, that models quantification as the problem of @@ -897,9 +797,7 @@ self.classifier = classifier self.val_split = val_split -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Trains a HDy quantifier. @@ -927,10 +825,7 @@ return self
- -
-[docs] - def aggregate(self, classif_posteriors): +
[docs] def aggregate(self, classif_posteriors): # "In this work, the number of bins b used in HDx and HDy was chosen from 10 to 110 in steps of 10, # and the final estimated a priori probability was taken as the median of these 11 estimates." # (González-Castro, et al., 2013). @@ -959,14 +854,10 @@ prev_estimations.append(prev_selected) class1_prev = np.median(prev_estimations) - return F.as_binary_prevalence(class1_prev)
-
+ return F.as_binary_prevalence(class1_prev)
- -
-[docs] -class DyS(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): +
[docs]class DyS(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): """ `DyS framework <https://ojs.aaai.org/index.php/AAAI/article/view/4376>`_ (DyS). DyS is a generalization of HDy method, using a Ternary Search in order to find the prevalence that @@ -1007,9 +898,7 @@ # Left and right are the current bounds; the maximum is between them return (left + right) / 2 -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): Px, y = classif_predictions.Xy Px = Px[:, self.pos_label] # takes only the P(y=+1|x) self.Pxy1 = Px[y == self.pos_label] @@ -1018,10 +907,7 @@ self.Pxy0_density = np.histogram(self.Pxy0, bins=self.n_bins, range=(0, 1), density=True)[0] return self
- -
-[docs] - def aggregate(self, classif_posteriors): +
[docs] def aggregate(self, classif_posteriors): Px = classif_posteriors[:, self.pos_label] # takes only the P(y=+1|x) Px_test = np.histogram(Px, bins=self.n_bins, range=(0, 1), density=True)[0] @@ -1032,14 +918,10 @@ return divergence(Px_train, Px_test) class1_prev = self._ternary_search(f=distribution_distance, left=0, right=1, tol=self.tol) - return F.as_binary_prevalence(class1_prev)
-
+ return F.as_binary_prevalence(class1_prev)
- -
-[docs] -class SMM(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): +
[docs]class SMM(AggregativeSoftQuantifier, BinaryAggregativeQuantifier): """ `SMM method <https://ieeexplore.ieee.org/document/9260028>`_ (SMM). SMM is a simplification of matching distribution methods where the representation of the examples @@ -1054,9 +936,7 @@ self.classifier = classifier self.val_split = val_split -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): Px, y = classif_predictions.Xy Px = Px[:, self.pos_label] # takes only the P(y=+1|x) self.Pxy1 = Px[y == self.pos_label] @@ -1065,22 +945,15 @@ self.Pxy0_mean = np.mean(self.Pxy0) # equiv. FPR return self
- -
-[docs] - def aggregate(self, classif_posteriors): +
[docs] def aggregate(self, classif_posteriors): Px = classif_posteriors[:, self.pos_label] # takes only the P(y=+1|x) Px_mean = np.mean(Px) class1_prev = (Px_mean - self.Pxy0_mean)/(self.Pxy1_mean - self.Pxy0_mean) - return F.as_binary_prevalence(class1_prev, clip_if_necessary=True)
-
+ return F.as_binary_prevalence(class1_prev, clip_if_necessary=True)
- -
-[docs] -class DMy(AggregativeSoftQuantifier): +
[docs]class DMy(AggregativeSoftQuantifier): """ Generic Distribution Matching quantifier for binary or multiclass quantification based on the space of posterior probabilities. This implementation takes the number of bins, the divergence, and the possibility to work on CDF @@ -1135,9 +1008,7 @@ distributions = np.cumsum(distributions, axis=1) return distributions -
-[docs] - def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): +
[docs] def aggregation_fit(self, classif_predictions: LabelledCollection, data: LabelledCollection): """ Trains the classifier (if requested) and generates the validation distributions out of the training data. The validation distributions have shape `(n, ch, nbins)`, with `n` the number of classes, `ch` the number of @@ -1163,10 +1034,7 @@ backend='threading' )
- -
-[docs] - def aggregate(self, posteriors: np.ndarray): +
[docs] def aggregate(self, posteriors: np.ndarray): """ Searches for the mixture model parameter (the sought prevalence values) that yields a validation distribution (the mixture) that best matches the test distribution, in terms of the divergence measure of choice. @@ -1186,15 +1054,11 @@ divs = [divergence(test_distribution[ch], mixture_distribution[ch]) for ch in range(n_channels)] return np.mean(divs) - return F.argmin_prevalence(loss, n_classes, method=self.search)
-
+ return F.argmin_prevalence(loss, n_classes, method=self.search)
- -
-[docs] -def newELM(svmperf_base=None, loss='01', C=1): +
[docs]def newELM(svmperf_base=None, loss='01', C=1): """ Explicit Loss Minimization (ELM) quantifiers. Quantifiers based on ELM represent a family of methods based on structured output learning; @@ -1221,10 +1085,7 @@ return CC(SVMperf(svmperf_base, loss=loss, C=C))
- -
-[docs] -def newSVMQ(svmperf_base=None, C=1): +
[docs]def newSVMQ(svmperf_base=None, C=1): """ SVM(Q) is an Explicit Loss Minimization (ELM) quantifier set to optimize for the `Q` loss combining a classification-oriented loss and a quantification-oriented loss, as proposed by @@ -1249,7 +1110,6 @@ """ return newELM(svmperf_base, loss='q', C=C)
- def newSVMKLD(svmperf_base=None, C=1): """ SVM(KLD) is an Explicit Loss Minimization (ELM) quantifier set to optimize for the Kullback-Leibler Divergence @@ -1275,9 +1135,7 @@ return newELM(svmperf_base, loss='kld', C=C) -
-[docs] -def newSVMKLD(svmperf_base=None, C=1): +
[docs]def newSVMKLD(svmperf_base=None, C=1): """ SVM(KLD) is an Explicit Loss Minimization (ELM) quantifier set to optimize for the Kullback-Leibler Divergence normalized via the logistic function, as proposed by @@ -1302,10 +1160,7 @@ """ return newELM(svmperf_base, loss='nkld', C=C)
- -
-[docs] -def newSVMAE(svmperf_base=None, C=1): +
[docs]def newSVMAE(svmperf_base=None, C=1): """ SVM(KLD) is an Explicit Loss Minimization (ELM) quantifier set to optimize for the Absolute Error as first used by `Moreo and Sebastiani, 2021 <https://arxiv.org/abs/2011.02552>`_. @@ -1329,10 +1184,7 @@ """ return newELM(svmperf_base, loss='mae', C=C)
- -
-[docs] -def newSVMRAE(svmperf_base=None, C=1): +
[docs]def newSVMRAE(svmperf_base=None, C=1): """ SVM(KLD) is an Explicit Loss Minimization (ELM) quantifier set to optimize for the Relative Absolute Error as first used by `Moreo and Sebastiani, 2021 <https://arxiv.org/abs/2011.02552>`_. @@ -1357,10 +1209,7 @@ return newELM(svmperf_base, loss='mrae', C=C)
- -
-[docs] -class OneVsAllAggregative(OneVsAllGeneric, AggregativeQuantifier): +
[docs]class OneVsAllAggregative(OneVsAllGeneric, AggregativeQuantifier): """ Allows any binary quantifier to perform quantification on single-label datasets. The method maintains one binary quantifier for each class, and then l1-normalizes the outputs so that the @@ -1385,9 +1234,7 @@ self.n_jobs = qp._get_njobs(n_jobs) self.parallel_backend = parallel_backend -
-[docs] - def classify(self, instances): +
[docs] def classify(self, instances): """ If the base quantifier is not probabilistic, returns a matrix of shape `(n,m,)` with `n` the number of instances and `m` the number of classes. The entry `(i,j)` is a binary value indicating whether instance @@ -1408,14 +1255,10 @@ else: return classif_predictions.T
- -
-[docs] - def aggregate(self, classif_predictions): +
[docs] def aggregate(self, classif_predictions): prevalences = self._parallel(self._delayed_binary_aggregate, classif_predictions) return F.normalize_prevalence(prevalences)
- def _delayed_binary_classification(self, c, X): return self.dict_binary_quantifiers[c].classify(X) @@ -1424,10 +1267,7 @@ return self.dict_binary_quantifiers[c].aggregate(classif_predictions[:, c])[1]
- -
-[docs] -class AggregativeMedianEstimator(BinaryQuantifier): +
[docs]class AggregativeMedianEstimator(BinaryQuantifier): """ This method is a meta-quantifier that returns, as the estimated class prevalence values, the median of the estimation returned by differently (hyper)parameterized base quantifiers. @@ -1445,18 +1285,12 @@ self.random_state = random_state self.n_jobs = qp._get_njobs(n_jobs) -
-[docs] - def get_params(self, deep=True): +
[docs] def get_params(self, deep=True): return self.base_quantifier.get_params(deep)
- -
-[docs] - def set_params(self, **params): +
[docs] def set_params(self, **params): self.base_quantifier.set_params(**params)
- def _delayed_fit(self, args): with qp.util.temp_seed(self.random_state): params, training = args @@ -1484,9 +1318,7 @@ return model -
-[docs] - def fit(self, training: LabelledCollection, **kwargs): +
[docs] def fit(self, training: LabelledCollection, **kwargs): import itertools self._check_binary(training, self.__class__.__name__) @@ -1528,14 +1360,11 @@ ) return self
- def _delayed_predict(self, args): model, instances = args return model.quantify(instances) -
-[docs] - def quantify(self, instances): +
[docs] def quantify(self, instances): prev_preds = qp.util.parallel( self._delayed_predict, ((model, instances) for model in self.models), @@ -1543,9 +1372,7 @@ n_jobs=self.n_jobs, backend='threading' ) - return np.median(prev_preds, axis=0)
-
- + return np.median(prev_preds, axis=0)
#--------------------------------------------------------------- diff --git a/docs/build/html/_modules/quapy/method/base.html b/docs/build/html/_modules/quapy/method/base.html index cdc483c..6288bd1 100644 --- a/docs/build/html/_modules/quapy/method/base.html +++ b/docs/build/html/_modules/quapy/method/base.html @@ -1,22 +1,23 @@ - + quapy.method.base — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -83,18 +84,14 @@ # Base Quantifier abstract class # ------------------------------------ -
-[docs] -class BaseQuantifier(BaseEstimator): +
[docs]class BaseQuantifier(BaseEstimator): """ Abstract Quantifier. A quantifier is defined as an object of a class that implements the method :meth:`fit` on :class:`quapy.data.base.LabelledCollection`, the method :meth:`quantify`, and the :meth:`set_params` and :meth:`get_params` for model selection (see :meth:`quapy.model_selection.GridSearchQ`) """ -
-[docs] - @abstractmethod +
[docs] @abstractmethod def fit(self, data: LabelledCollection): """ Trains a quantifier. @@ -104,10 +101,7 @@ """ ...
- -
-[docs] - @abstractmethod +
[docs] @abstractmethod def quantify(self, instances): """ Generate class prevalence estimates for the sample's instances @@ -115,14 +109,10 @@ :param instances: array-like :return: `np.ndarray` of shape `(n_classes,)` with class prevalence estimates. """ - ...
-
+ ...
- -
-[docs] -class BinaryQuantifier(BaseQuantifier): +
[docs]class BinaryQuantifier(BaseQuantifier): """ Abstract class of binary quantifiers, i.e., quantifiers estimating class prevalence values for only two classes (typically, to be interpreted as one class and its complement). @@ -133,17 +123,11 @@ f'Use the class OneVsAll to enable {quantifier_name} work on single-label data.'
- -
-[docs] -class OneVsAll: +
[docs]class OneVsAll: pass
- -
-[docs] -def newOneVsAll(binary_quantifier, n_jobs=None): +
[docs]def newOneVsAll(binary_quantifier, n_jobs=None): assert isinstance(binary_quantifier, BaseQuantifier), \ f'{binary_quantifier} does not seem to be a Quantifier' if isinstance(binary_quantifier, qp.method.aggregative.AggregativeQuantifier): @@ -152,10 +136,7 @@ return OneVsAllGeneric(binary_quantifier, n_jobs)
- -
-[docs] -class OneVsAllGeneric(OneVsAll, BaseQuantifier): +
[docs]class OneVsAllGeneric(OneVsAll, BaseQuantifier): """ Allows any binary quantifier to perform quantification on single-label datasets. The method maintains one binary quantifier for each class, and then l1-normalizes the outputs so that the class prevelence values sum up to 1. @@ -170,9 +151,7 @@ self.binary_quantifier = binary_quantifier self.n_jobs = qp._get_njobs(n_jobs) -
-[docs] - def fit(self, data: LabelledCollection, fit_classifier=True): +
[docs] def fit(self, data: LabelledCollection, fit_classifier=True): assert not data.binary, f'{self.__class__.__name__} expect non-binary data' assert fit_classifier == True, 'fit_classifier must be True' @@ -180,7 +159,6 @@ self._parallel(self._delayed_binary_fit, data) return self
- def _parallel(self, func, *args, **kwargs): return np.asarray( Parallel(n_jobs=self.n_jobs, backend='threading')( @@ -188,13 +166,10 @@ ) ) -
-[docs] - def quantify(self, instances): +
[docs] def quantify(self, instances): prevalences = self._parallel(self._delayed_binary_predict, instances) return qp.functional.normalize_prevalence(prevalences)
- @property def classes_(self): return sorted(self.dict_binary_quantifiers.keys()) @@ -205,7 +180,6 @@ def _delayed_binary_fit(self, c, data): bindata = LabelledCollection(data.instances, data.labels == c, classes=[False, True]) self.dict_binary_quantifiers[c].fit(bindata)
-
diff --git a/docs/build/html/_modules/quapy/method/meta.html b/docs/build/html/_modules/quapy/method/meta.html index b24dcc3..ca38440 100644 --- a/docs/build/html/_modules/quapy/method/meta.html +++ b/docs/build/html/_modules/quapy/method/meta.html @@ -1,22 +1,23 @@ - + quapy.method.meta — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -98,9 +99,7 @@ QuaNet = "QuaNet is not available due to missing torch package" -
-[docs] -class MedianEstimator2(BinaryQuantifier): +
[docs]class MedianEstimator2(BinaryQuantifier): """ This method is a meta-quantifier that returns, as the estimated class prevalence values, the median of the estimation returned by differently (hyper)parameterized base quantifiers. @@ -118,18 +117,12 @@ self.random_state = random_state self.n_jobs = qp._get_njobs(n_jobs) -
-[docs] - def get_params(self, deep=True): +
[docs] def get_params(self, deep=True): return self.base_quantifier.get_params(deep)
- -
-[docs] - def set_params(self, **params): +
[docs] def set_params(self, **params): self.base_quantifier.set_params(**params)
- def _delayed_fit(self, args): with qp.util.temp_seed(self.random_state): params, training = args @@ -138,9 +131,7 @@ model.fit(training) return model -
-[docs] - def fit(self, training: LabelledCollection): +
[docs] def fit(self, training: LabelledCollection): self._check_binary(training, self.__class__.__name__) configs = qp.model_selection.expand_grid(self.param_grid) @@ -152,14 +143,11 @@ ) return self
- def _delayed_predict(self, args): model, instances = args return model.quantify(instances) -
-[docs] - def quantify(self, instances): +
[docs] def quantify(self, instances): prev_preds = qp.util.parallel( self._delayed_predict, ((model, instances) for model in self.models), @@ -167,14 +155,10 @@ n_jobs=self.n_jobs ) prev_preds = np.asarray(prev_preds) - return np.median(prev_preds, axis=0)
-
+ return np.median(prev_preds, axis=0)
- -
-[docs] -class MedianEstimator(BinaryQuantifier): +
[docs]class MedianEstimator(BinaryQuantifier): """ This method is a meta-quantifier that returns, as the estimated class prevalence values, the median of the estimation returned by differently (hyper)parameterized base quantifiers. @@ -192,18 +176,12 @@ self.random_state = random_state self.n_jobs = qp._get_njobs(n_jobs) -
-[docs] - def get_params(self, deep=True): +
[docs] def get_params(self, deep=True): return self.base_quantifier.get_params(deep)
- -
-[docs] - def set_params(self, **params): +
[docs] def set_params(self, **params): self.base_quantifier.set_params(**params)
- def _delayed_fit(self, args): with qp.util.temp_seed(self.random_state): params, training = args @@ -229,9 +207,7 @@ return model -
-[docs] - def fit(self, training: LabelledCollection): +
[docs] def fit(self, training: LabelledCollection): self._check_binary(training, self.__class__.__name__) if isinstance(self.base_quantifier, AggregativeQuantifier): @@ -269,14 +245,11 @@ ) return self
- def _delayed_predict(self, args): model, instances = args return model.quantify(instances) -
-[docs] - def quantify(self, instances): +
[docs] def quantify(self, instances): prev_preds = qp.util.parallel( self._delayed_predict, ((model, instances) for model in self.models), @@ -285,14 +258,10 @@ asarray=False ) prev_preds = np.asarray(prev_preds) - return np.median(prev_preds, axis=0)
-
+ return np.median(prev_preds, axis=0)
- -
-[docs] -class Ensemble(BaseQuantifier): +
[docs]class Ensemble(BaseQuantifier): VALID_POLICIES = {'ave', 'ptr', 'ds'} | qp.error.QUANTIFICATION_ERROR_NAMES """ @@ -361,9 +330,7 @@ if self.verbose: print('[Ensemble]' + msg) -
-[docs] - def fit(self, data: qp.data.LabelledCollection, val_split: Union[qp.data.LabelledCollection, float] = None): +
[docs] def fit(self, data: qp.data.LabelledCollection, val_split: Union[qp.data.LabelledCollection, float] = None): if self.policy == 'ds' and not data.binary: raise ValueError(f'ds policy is only defined for binary quantification, but this dataset is not binary') @@ -400,10 +367,7 @@ self._sout('Fit [Done]') return self
- -
-[docs] - def quantify(self, instances): +
[docs] def quantify(self, instances): predictions = np.asarray( qp.util.parallel(_delayed_quantify, ((Qi, instances) for Qi in self.ensemble), n_jobs=self.n_jobs) ) @@ -416,10 +380,7 @@ predictions = np.mean(predictions, axis=0) return F.normalize_prevalence(predictions)
- -
-[docs] - def set_params(self, **parameters): +
[docs] def set_params(self, **parameters): """ This function should not be used within :class:`quapy.model_selection.GridSearchQ` (is here for compatibility with the abstract class). @@ -435,10 +396,7 @@ f'or Ensemble(Q(GridSearchCV(l))) with Q a quantifier class that has a classifier ' f'l optimized for classification (not recommended).')
- -
-[docs] - def get_params(self, deep=True): +
[docs] def get_params(self, deep=True): """ This function should not be used within :class:`quapy.model_selection.GridSearchQ` (is here for compatibility with the abstract class). @@ -452,7 +410,6 @@ raise NotImplementedError()
- def _accuracy_policy(self, error_name): """ Selects the red_size best performant quantifiers in a static way (i.e., dropping all non-selected instances). @@ -538,10 +495,7 @@ return False
- -
-[docs] -def get_probability_distribution(posterior_probabilities, bins=8): +
[docs]def get_probability_distribution(posterior_probabilities, bins=8): """ Gets a histogram out of the posterior probabilities (only for the binary case). @@ -555,7 +509,6 @@ return distribution
- def _select_k(elements, order, k): return [elements[idx] for idx in order[:k]] @@ -649,9 +602,7 @@ f'the name of an error function in {qp.error.ERROR_NAMES}') -
-[docs] -def ensembleFactory(classifier, base_quantifier_class, param_grid=None, optim=None, param_model_sel: dict = None, +
[docs]def ensembleFactory(classifier, base_quantifier_class, param_grid=None, optim=None, param_model_sel: dict = None, **kwargs): """ Ensemble factory. Provides a unified interface for instantiating ensembles that can be optimized (via model @@ -702,10 +653,7 @@ return _instantiate_ensemble(classifier, base_quantifier_class, param_grid, error, param_model_sel, **kwargs)
- -
-[docs] -def ECC(classifier, param_grid=None, optim=None, param_mod_sel=None, **kwargs): +
[docs]def ECC(classifier, param_grid=None, optim=None, param_mod_sel=None, **kwargs): """ Implements an ensemble of :class:`quapy.method.aggregative.CC` quantifiers, as used by `Pérez-Gállego et al., 2019 <https://www.sciencedirect.com/science/article/pii/S1566253517303652>`_. @@ -728,10 +676,7 @@ return ensembleFactory(classifier, CC, param_grid, optim, param_mod_sel, **kwargs)
- -
-[docs] -def EACC(classifier, param_grid=None, optim=None, param_mod_sel=None, **kwargs): +
[docs]def EACC(classifier, param_grid=None, optim=None, param_mod_sel=None, **kwargs): """ Implements an ensemble of :class:`quapy.method.aggregative.ACC` quantifiers, as used by `Pérez-Gállego et al., 2019 <https://www.sciencedirect.com/science/article/pii/S1566253517303652>`_. @@ -754,10 +699,7 @@ return ensembleFactory(classifier, ACC, param_grid, optim, param_mod_sel, **kwargs)
- -
-[docs] -def EPACC(classifier, param_grid=None, optim=None, param_mod_sel=None, **kwargs): +
[docs]def EPACC(classifier, param_grid=None, optim=None, param_mod_sel=None, **kwargs): """ Implements an ensemble of :class:`quapy.method.aggregative.PACC` quantifiers. @@ -779,10 +721,7 @@ return ensembleFactory(classifier, PACC, param_grid, optim, param_mod_sel, **kwargs)
- -
-[docs] -def EHDy(classifier, param_grid=None, optim=None, param_mod_sel=None, **kwargs): +
[docs]def EHDy(classifier, param_grid=None, optim=None, param_mod_sel=None, **kwargs): """ Implements an ensemble of :class:`quapy.method.aggregative.HDy` quantifiers, as used by `Pérez-Gállego et al., 2019 <https://www.sciencedirect.com/science/article/pii/S1566253517303652>`_. @@ -805,10 +744,7 @@ return ensembleFactory(classifier, HDy, param_grid, optim, param_mod_sel, **kwargs)
- -
-[docs] -def EEMQ(classifier, param_grid=None, optim=None, param_mod_sel=None, **kwargs): +
[docs]def EEMQ(classifier, param_grid=None, optim=None, param_mod_sel=None, **kwargs): """ Implements an ensemble of :class:`quapy.method.aggregative.EMQ` quantifiers. @@ -828,7 +764,6 @@ """ return ensembleFactory(classifier, EMQ, param_grid, optim, param_mod_sel, **kwargs)
-
diff --git a/docs/build/html/_modules/quapy/method/non_aggregative.html b/docs/build/html/_modules/quapy/method/non_aggregative.html index 3363c35..aeb5b96 100644 --- a/docs/build/html/_modules/quapy/method/non_aggregative.html +++ b/docs/build/html/_modules/quapy/method/non_aggregative.html @@ -1,22 +1,23 @@ - + quapy.method.non_aggregative — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -79,9 +80,7 @@ import quapy.functional as F -
-[docs] -class MaximumLikelihoodPrevalenceEstimation(BaseQuantifier): +
[docs]class MaximumLikelihoodPrevalenceEstimation(BaseQuantifier): """ The `Maximum Likelihood Prevalence Estimation` (MLPE) method is a lazy method that assumes there is no prior probability shift between training and test instances (put it other way, that the i.i.d. assumpion holds). @@ -93,9 +92,7 @@ def __init__(self): self._classes_ = None -
-[docs] - def fit(self, data: LabelledCollection): +
[docs] def fit(self, data: LabelledCollection): """ Computes the training prevalence and stores it. @@ -105,24 +102,17 @@ self.estimated_prevalence = data.prevalence() return self
- -
-[docs] - def quantify(self, instances): +
[docs] def quantify(self, instances): """ Ignores the input instances and returns, as the class prevalence estimantes, the training prevalence. :param instances: array-like (ignored) :return: the class prevalence seen during training """ - return self.estimated_prevalence
-
+ return self.estimated_prevalence
- -
-[docs] -class DMx(BaseQuantifier): +
[docs]class DMx(BaseQuantifier): """ Generic Distribution Matching quantifier for binary or multiclass quantification based on the space of covariates. This implementation takes the number of bins, the divergence, and the possibility to work on CDF as hyperparameters. @@ -142,9 +132,7 @@ self.search = search self.n_jobs = n_jobs -
-[docs] - @classmethod +
[docs] @classmethod def HDx(cls, n_jobs=None): """ `Hellinger Distance x <https://www.sciencedirect.com/science/article/pii/S0020025512004069>`_ (HDx). @@ -168,7 +156,6 @@ hdx = MedianEstimator(base_quantifier=dmx, param_grid=nbins, n_jobs=n_jobs) return hdx
- def __get_distributions(self, X): histograms = [] @@ -185,9 +172,7 @@ return distributions -
-[docs] - def fit(self, data: LabelledCollection): +
[docs] def fit(self, data: LabelledCollection): """ Generates the validation distributions out of the training data (covariates). The validation distributions have shape `(n, nfeats, nbins)`, with `n` the number of classes, `nfeats` @@ -209,10 +194,7 @@ return self
- -
-[docs] - def quantify(self, instances): +
[docs] def quantify(self, instances): """ Searches for the mixture model parameter (the sought prevalence values) that yields a validation distribution (the mixture) that best matches the test distribution, in terms of the divergence measure of choice. @@ -234,9 +216,7 @@ divs = [divergence(test_distribution[feat], mixture_distribution[feat]) for feat in range(n_feats)] return np.mean(divs) - return F.argmin_prevalence(loss, n_classes, method=self.search)
-
- + return F.argmin_prevalence(loss, n_classes, method=self.search)
diff --git a/docs/build/html/_modules/quapy/model_selection.html b/docs/build/html/_modules/quapy/model_selection.html index 84fd962..172c8f3 100644 --- a/docs/build/html/_modules/quapy/model_selection.html +++ b/docs/build/html/_modules/quapy/model_selection.html @@ -1,22 +1,23 @@ - + quapy.model_selection — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -89,19 +90,14 @@ from time import time -
-[docs] -class Status(Enum): +
[docs]class Status(Enum): SUCCESS = 1 TIMEOUT = 2 INVALID = 3 ERROR = 4
- -
-[docs] -class ConfigStatus: +
[docs]class ConfigStatus: def __init__(self, params, status, msg=''): self.params = params self.status = status @@ -113,23 +109,14 @@ def __repr__(self): return str(self) -
-[docs] - def success(self): +
[docs] def success(self): return self.status == Status.SUCCESS
- -
-[docs] - def failed(self): - return self.status != Status.SUCCESS
-
+
[docs] def failed(self): + return self.status != Status.SUCCESS
- -
-[docs] -class GridSearchQ(BaseQuantifier): +
[docs]class GridSearchQ(BaseQuantifier): """Grid Search optimization targeting a quantification-oriented metric. Optimizes the hyperparameters of a quantification method, based on an evaluation method and on an evaluation @@ -296,9 +283,7 @@ else: self._sout(f'error={status}') -
-[docs] - def fit(self, training: LabelledCollection): +
[docs] def fit(self, training: LabelledCollection): """ Learning routine. Fits methods with all combinations of hyperparameters and selects the one minimizing the error metric. @@ -362,10 +347,7 @@ return self
- -
-[docs] - def quantify(self, instances): +
[docs] def quantify(self, instances): """Estimate class prevalence values using the best model found after calling the :meth:`fit` method. :param instances: sample contanining the instances @@ -375,20 +357,14 @@ assert hasattr(self, 'best_model_'), 'quantify called before fit' return self.best_model().quantify(instances)
- -
-[docs] - def set_params(self, **parameters): +
[docs] def set_params(self, **parameters): """Sets the hyper-parameters to explore. :param parameters: a dictionary with keys the parameter names and values the list of values to explore """ self.param_grid = parameters
- -
-[docs] - def get_params(self, deep=True): +
[docs] def get_params(self, deep=True): """Returns the dictionary of hyper-parameters to explore (`param_grid`) :param deep: Unused @@ -396,10 +372,7 @@ """ return self.param_grid
- -
-[docs] - def best_model(self): +
[docs] def best_model(self): """ Returns the best model found after calling the :meth:`fit` method, i.e., the one trained on the combination of hyper-parameters that minimized the error function. @@ -410,7 +383,6 @@ return self.best_model_ raise ValueError('best_model called before fit')
- def _error_handler(self, func, params): """ Endorses one job with two returned values: the status, and the time of execution @@ -449,10 +421,7 @@ return output, status, took
- -
-[docs] -def cross_val_predict(quantifier: BaseQuantifier, data: LabelledCollection, nfolds=3, random_state=0): +
[docs]def cross_val_predict(quantifier: BaseQuantifier, data: LabelledCollection, nfolds=3, random_state=0): """ Akin to `scikit-learn's cross_val_predict <https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_predict.html>`_ but for quantification. @@ -475,10 +444,7 @@ return total_prev
- -
-[docs] -def expand_grid(param_grid: dict): +
[docs]def expand_grid(param_grid: dict): """ Expands a param_grid dictionary as a list of configurations. Example: @@ -497,10 +463,7 @@ return configs
- -
-[docs] -def group_params(param_grid: dict): +
[docs]def group_params(param_grid: dict): """ Partitions a param_grid dictionary as two lists of configurations, one for the classifier-specific hyper-parameters, and another for que quantifier-specific hyper-parameters @@ -521,7 +484,6 @@ return classifier_configs, quantifier_configs
-
diff --git a/docs/build/html/_modules/quapy/protocol.html b/docs/build/html/_modules/quapy/protocol.html index f0330c2..7d96338 100644 --- a/docs/build/html/_modules/quapy/protocol.html +++ b/docs/build/html/_modules/quapy/protocol.html @@ -1,22 +1,23 @@ - + quapy.protocol — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -82,9 +83,7 @@ from glob import glob -
-[docs] -class AbstractProtocol(metaclass=ABCMeta): +
[docs]class AbstractProtocol(metaclass=ABCMeta): """ Abstract parent class for sample generation protocols. """ @@ -99,22 +98,16 @@ """ ... -
-[docs] - def total(self): +
[docs] def total(self): """ Indicates the total number of samples that the protocol generates. :return: The number of samples to generate if known, or `None` otherwise. """ - return None
-
+ return None
- -
-[docs] -class IterateProtocol(AbstractProtocol): +
[docs]class IterateProtocol(AbstractProtocol): """ A very simple protocol which simply iterates over a list of previously generated samples @@ -133,22 +126,16 @@ for sample in self.samples: yield sample.Xp -
-[docs] - def total(self): +
[docs] def total(self): """ Returns the number of samples in this protocol :return: int """ - return len(self.samples)
-
+ return len(self.samples)
- -
-[docs] -class AbstractStochasticSeededProtocol(AbstractProtocol): +
[docs]class AbstractStochasticSeededProtocol(AbstractProtocol): """ An `AbstractStochasticSeededProtocol` is a protocol that generates, via any random procedure (e.g., via random sampling), sequences of :class:`quapy.data.base.LabelledCollection` samples. @@ -176,9 +163,7 @@ def random_state(self, random_state): self._random_state = random_state -
-[docs] - @abstractmethod +
[docs] @abstractmethod def samples_parameters(self): """ This function has to return all the necessary parameters to replicate the samples @@ -187,10 +172,7 @@ """ ...
- -
-[docs] - @abstractmethod +
[docs] @abstractmethod def sample(self, params): """ Extract one sample determined by the given parameters @@ -200,7 +182,6 @@ """ ...
- def __call__(self): """ Yields one sample at a time. The type of object returned depends on the `collator` function. The @@ -218,9 +199,7 @@ for params in self.samples_parameters(): yield self.collator(self.sample(params)) -
-[docs] - def collator(self, sample, *args): +
[docs] def collator(self, sample, *args): """ The collator prepares the sample to accommodate the desired output format before returning the output. This collator simply returns the sample as it is. Classes inheriting from this abstract class can @@ -230,23 +209,17 @@ :param args: additional arguments :return: the sample adhering to a desired output format (in this case, the sample is returned as it is) """ - return sample
-
+ return sample
- -
-[docs] -class OnLabelledCollectionProtocol: +
[docs]class OnLabelledCollectionProtocol: """ Protocols that generate samples from a :class:`qp.data.LabelledCollection` object. """ RETURN_TYPES = ['sample_prev', 'labelled_collection', 'index'] -
-[docs] - def get_labelled_collection(self): +
[docs] def get_labelled_collection(self): """ Returns the labelled collection on which this protocol acts. @@ -254,10 +227,7 @@ """ return self.data
- -
-[docs] - def on_preclassified_instances(self, pre_classifications, in_place=False): +
[docs] def on_preclassified_instances(self, pre_classifications, in_place=False): """ Returns a copy of this protocol that acts on a modified version of the original :class:`qp.data.LabelledCollection` in which the original instances have been replaced @@ -280,10 +250,7 @@ new = deepcopy(self) return new.on_preclassified_instances(pre_classifications, in_place=True)
- -
-[docs] - @classmethod +
[docs] @classmethod def get_collator(cls, return_type='sample_prev'): """ Returns a collator function, i.e., a function that prepares the yielded data @@ -299,14 +266,10 @@ if return_type=='sample_prev': return lambda lc:lc.Xp elif return_type=='labelled_collection': - return lambda lc:lc
-
+ return lambda lc:lc
- -
-[docs] -class APP(AbstractStochasticSeededProtocol, OnLabelledCollectionProtocol): +
[docs]class APP(AbstractStochasticSeededProtocol, OnLabelledCollectionProtocol): """ Implementation of the artificial prevalence protocol (APP). The APP consists of exploring a grid of prevalence values containing `n_prevalences` points (e.g., @@ -350,9 +313,7 @@ self.collator = OnLabelledCollectionProtocol.get_collator(return_type) -
-[docs] - def prevalence_grid(self): +
[docs] def prevalence_grid(self): """ Generates vectors of prevalence values from an exhaustive grid of prevalence values. The number of prevalence values explored for each dimension depends on `n_prevalences`, so that, if, for example, @@ -377,10 +338,7 @@ prevs = np.repeat(prevs, self.repeats, axis=0) return prevs
- -
-[docs] - def samples_parameters(self): +
[docs] def samples_parameters(self): """ Return all the necessary parameters to replicate the samples as according to the APP protocol. @@ -392,10 +350,7 @@ indexes.append(index) return indexes
- -
-[docs] - def sample(self, index): +
[docs] def sample(self, index): """ Realizes the sample given the index of the instances. @@ -404,23 +359,16 @@ """ return self.data.sampling_from_index(index)
- -
-[docs] - def total(self): +
[docs] def total(self): """ Returns the number of samples that will be generated :return: int """ - return F.num_prevalence_combinations(self.n_prevalences, self.data.n_classes, self.repeats)
-
+ return F.num_prevalence_combinations(self.n_prevalences, self.data.n_classes, self.repeats)
- -
-[docs] -class NPP(AbstractStochasticSeededProtocol, OnLabelledCollectionProtocol): +
[docs]class NPP(AbstractStochasticSeededProtocol, OnLabelledCollectionProtocol): """ A generator of samples that implements the natural prevalence protocol (NPP). The NPP consists of drawing samples uniformly at random, therefore approximately preserving the natural prevalence of the collection. @@ -444,9 +392,7 @@ self.random_state = random_state self.collator = OnLabelledCollectionProtocol.get_collator(return_type) -
-[docs] - def samples_parameters(self): +
[docs] def samples_parameters(self): """ Return all the necessary parameters to replicate the samples as according to the NPP protocol. @@ -458,10 +404,7 @@ indexes.append(index) return indexes
- -
-[docs] - def sample(self, index): +
[docs] def sample(self, index): """ Realizes the sample given the index of the instances. @@ -470,23 +413,16 @@ """ return self.data.sampling_from_index(index)
- -
-[docs] - def total(self): +
[docs] def total(self): """ Returns the number of samples that will be generated (equals to "repeats") :return: int """ - return self.repeats
-
+ return self.repeats
- -
-[docs] -class UPP(AbstractStochasticSeededProtocol, OnLabelledCollectionProtocol): +
[docs]class UPP(AbstractStochasticSeededProtocol, OnLabelledCollectionProtocol): """ A variant of :class:`APP` that, instead of using a grid of equidistant prevalence values, relies on the Kraemer algorithm for sampling unit (k-1)-simplex uniformly at random, with @@ -514,9 +450,7 @@ self.random_state = random_state self.collator = OnLabelledCollectionProtocol.get_collator(return_type) -
-[docs] - def samples_parameters(self): +
[docs] def samples_parameters(self): """ Return all the necessary parameters to replicate the samples as according to the UPP protocol. @@ -528,10 +462,7 @@ indexes.append(index) return indexes
- -
-[docs] - def sample(self, index): +
[docs] def sample(self, index): """ Realizes the sample given the index of the instances. @@ -540,23 +471,16 @@ """ return self.data.sampling_from_index(index)
- -
-[docs] - def total(self): +
[docs] def total(self): """ Returns the number of samples that will be generated (equals to "repeats") :return: int """ - return self.repeats
-
+ return self.repeats
- -
-[docs] -class DomainMixer(AbstractStochasticSeededProtocol): +
[docs]class DomainMixer(AbstractStochasticSeededProtocol): """ Generates mixtures of two domains (A and B) at controlled rates, but preserving the original class prevalence. @@ -607,9 +531,7 @@ self.random_state = random_state self.collator = OnLabelledCollectionProtocol.get_collator(return_type) -
-[docs] - def samples_parameters(self): +
[docs] def samples_parameters(self): """ Return all the necessary parameters to replicate the samples as according to the this protocol. @@ -626,10 +548,7 @@ indexesB.append(sampleBidx) return list(zip(indexesA, indexesB))
- -
-[docs] - def sample(self, indexes): +
[docs] def sample(self, indexes): """ Realizes the sample given a pair of indexes of the instances from A and B. @@ -641,18 +560,13 @@ sampleB = self.B.sampling_from_index(indexesB) return sampleA+sampleB
- -
-[docs] - def total(self): +
[docs] def total(self): """ Returns the number of samples that will be generated (equals to "repeats * mixture_points") :return: int """ - return self.repeats * len(self.mixture_points)
-
- + return self.repeats * len(self.mixture_points)
# aliases diff --git a/docs/build/html/_modules/quapy/util.html b/docs/build/html/_modules/quapy/util.html index be2ae3b..25532bd 100644 --- a/docs/build/html/_modules/quapy/util.html +++ b/docs/build/html/_modules/quapy/util.html @@ -1,22 +1,23 @@ - + quapy.util — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -94,9 +95,7 @@ return [slice(job * batch, (job + 1) * batch + (remainder if job == n_jobs - 1 else 0)) for job in range(n_jobs)] -
-[docs] -def map_parallel(func, args, n_jobs): +
[docs]def map_parallel(func, args, n_jobs): """ Applies func to n_jobs slices of args. E.g., if args is an array of 99 items and n_jobs=2, then func is applied in two parallel processes to args[0:50] and to args[50:99]. func is a function @@ -114,10 +113,7 @@ return list(itertools.chain.from_iterable(results))
- -
-[docs] -def parallel(func, args, n_jobs, seed=None, asarray=True, backend='loky'): +
[docs]def parallel(func, args, n_jobs, seed=None, asarray=True, backend='loky'): """ A wrapper of multiprocessing: @@ -151,10 +147,7 @@ return out
- -
-[docs] -@contextlib.contextmanager +
[docs]@contextlib.contextmanager def temp_seed(random_state): """ Can be used in a "with" context to set a temporal seed without modifying the outer numpy's current state. E.g.: @@ -176,10 +169,7 @@ np.random.set_state(state)
- -
-[docs] -def download_file(url, archive_filename): +
[docs]def download_file(url, archive_filename): """ Downloads a file from a url @@ -195,10 +185,7 @@ print("")
- -
-[docs] -def download_file_if_not_exists(url, archive_filename): +
[docs]def download_file_if_not_exists(url, archive_filename): """ Dowloads a function (using :meth:`download_file`) if the file does not exist. @@ -211,10 +198,7 @@ download_file(url, archive_filename)
- -
-[docs] -def create_if_not_exist(path): +
[docs]def create_if_not_exist(path): """ An alias to `os.makedirs(path, exist_ok=True)` that also returns the path. This is useful in cases like, e.g.: @@ -227,10 +211,7 @@ return path
- -
-[docs] -def get_quapy_home(): +
[docs]def get_quapy_home(): """ Gets the home directory of QuaPy, i.e., the directory where QuaPy saves permanent data, such as dowloaded datasets. This directory is `~/quapy_data` @@ -242,10 +223,7 @@ return home
- -
-[docs] -def create_parent_dir(path): +
[docs]def create_parent_dir(path): """ Creates the parent dir (if any) of a given path, if not exists. E.g., for `./path/to/file.txt`, the path `./path/to` is created. @@ -257,10 +235,7 @@ os.makedirs(parentdir, exist_ok=True)
- -
-[docs] -def save_text_file(path, text): +
[docs]def save_text_file(path, text): """ Saves a text file to disk, given its full path, and creates the parent directory if missing. @@ -272,10 +247,7 @@ fout.write(text)
- -
-[docs] -def pickled_resource(pickle_path:str, generation_func:callable, *args): +
[docs]def pickled_resource(pickle_path:str, generation_func:callable, *args): """ Allows for fast reuse of resources that are generated only once by calling generation_func(\\*args). The next times this function is invoked, it loads the pickled resource. Example: @@ -302,7 +274,6 @@ return instance
- def _check_sample_size(sample_size): if sample_size is None: assert qp.environ['SAMPLE_SIZE'] is not None, \ @@ -313,9 +284,7 @@ return sample_size -
-[docs] -class EarlyStop: +
[docs]class EarlyStop: """ A class implementing the early-stopping condition typically used for training neural networks. @@ -370,10 +339,7 @@ self.STOP = True
- -
-[docs] -@contextlib.contextmanager +
[docs]@contextlib.contextmanager def timeout(seconds): """ Opens a context that will launch an exception if not closed after a given number of seconds @@ -404,7 +370,6 @@ if seconds > 0: signal.alarm(0)
-
diff --git a/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js index 8141580..8549469 100644 --- a/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +++ b/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js @@ -1,9 +1,20 @@ -/* Compatability shim for jQuery and underscores.js. +/* + * _sphinx_javascript_frameworks_compat.js + * ~~~~~~~~~~ + * + * Compatability shim for jQuery and underscores.js. + * + * WILL BE REMOVED IN Sphinx 6.0 + * xref RemovedInSphinx60Warning * - * Copyright Sphinx contributors - * Released under the two clause BSD licence */ +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + + /** * small helper function to urldecode strings * diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css index f316efc..4e9a9f1 100644 --- a/docs/build/html/_static/basic.css +++ b/docs/build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -237,10 +237,6 @@ a.headerlink { visibility: hidden; } -a:visited { - color: #551A8B; -} - h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -328,7 +324,6 @@ aside.sidebar { p.sidebar-title { font-weight: bold; } - nav.contents, aside.topic, div.admonition, div.topic, blockquote { @@ -336,7 +331,6 @@ div.admonition, div.topic, blockquote { } /* -- topics ---------------------------------------------------------------- */ - nav.contents, aside.topic, div.topic { @@ -612,7 +606,6 @@ ol.simple p, ul.simple p { margin-bottom: 0; } - aside.footnote > span, div.citation > span { float: left; @@ -674,16 +667,6 @@ dd { margin-left: 30px; } -.sig dd { - margin-top: 0px; - margin-bottom: 0px; -} - -.sig dl { - margin-top: 0px; - margin-bottom: 0px; -} - dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -752,14 +735,6 @@ abbr, acronym { cursor: help; } -.translated { - background-color: rgba(207, 255, 207, 0.2) -} - -.untranslated { - background-color: rgba(255, 207, 207, 0.2) -} - /* -- code displays --------------------------------------------------------- */ pre { diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js index 4d67807..527b876 100644 --- a/docs/build/html/_static/doctools.js +++ b/docs/build/html/_static/doctools.js @@ -4,7 +4,7 @@ * * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/build/html/_static/documentation_options.js b/docs/build/html/_static/documentation_options.js index 4099efb..05c1a51 100644 --- a/docs/build/html/_static/documentation_options.js +++ b/docs/build/html/_static/documentation_options.js @@ -1,4 +1,5 @@ -const DOCUMENTATION_OPTIONS = { +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), VERSION: '0.1.8', LANGUAGE: 'en', COLLAPSE_INDEX: false, diff --git a/docs/build/html/_static/language_data.js b/docs/build/html/_static/language_data.js index 017600c..2e22b06 100644 --- a/docs/build/html/_static/language_data.js +++ b/docs/build/html/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/build/html/_static/searchtools.js b/docs/build/html/_static/searchtools.js index 8bb1af5..e89e34d 100644 --- a/docs/build/html/_static/searchtools.js +++ b/docs/build/html/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -57,12 +57,12 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, searchTerms, highlightTerms) => { +const _displayItem = (item, searchTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; - const contentRoot = document.documentElement.dataset.content_root; const [docName, title, anchor, descr, score, _filename] = item; @@ -75,24 +75,20 @@ const _displayItem = (item, searchTerms, highlightTerms) => { if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; - requestUrl = contentRoot + dirname; + requestUrl = docUrlRoot + dirname; linkUrl = requestUrl; } else { // normal html builders - requestUrl = contentRoot + docName + docFileSuffix; + requestUrl = docUrlRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } let linkEl = listItem.appendChild(document.createElement("a")); linkEl.href = linkUrl + anchor; linkEl.dataset.score = score; linkEl.innerHTML = title; - if (descr) { + if (descr) listItem.appendChild(document.createElement("span")).innerHTML = " (" + descr + ")"; - // highlight search terms in the description - if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js - highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); - } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) @@ -101,9 +97,6 @@ const _displayItem = (item, searchTerms, highlightTerms) => { listItem.appendChild( Search.makeSearchSummary(data, searchTerms) ); - // highlight search terms in the summary - if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js - highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); }); Search.output.appendChild(listItem); }; @@ -122,15 +115,14 @@ const _finishSearch = (resultCount) => { const _displayNextItem = ( results, resultCount, - searchTerms, - highlightTerms, + searchTerms ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), searchTerms, highlightTerms); + _displayItem(results.pop(), searchTerms); setTimeout( - () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + () => _displayNextItem(results, resultCount, searchTerms), 5 ); } @@ -164,7 +156,7 @@ const Search = { const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); const docContent = htmlElement.querySelector('[role="main"]'); - if (docContent) return docContent.textContent; + if (docContent !== undefined) return docContent.textContent; console.warn( "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." ); @@ -288,9 +280,9 @@ const Search = { let results = []; _removeChildren(document.getElementById("search-progress")); - const queryLower = query.toLowerCase().trim(); + const queryLower = query.toLowerCase(); for (const [title, foundTitles] of Object.entries(allTitles)) { - if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { for (const [file, id] of foundTitles) { let score = Math.round(100 * queryLower.length / title.length) results.push([ @@ -368,7 +360,7 @@ const Search = { // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, searchTerms, highlightTerms); + _displayNextItem(results, results.length, searchTerms); }, /** diff --git a/docs/build/html/_static/sphinx_highlight.js b/docs/build/html/_static/sphinx_highlight.js index 8a96c69..aae669d 100644 --- a/docs/build/html/_static/sphinx_highlight.js +++ b/docs/build/html/_static/sphinx_highlight.js @@ -29,19 +29,14 @@ const _highlight = (node, addItems, text, className) => { } span.appendChild(document.createTextNode(val.substr(pos, text.length))); - const rest = document.createTextNode(val.substr(pos + text.length)); parent.insertBefore( span, parent.insertBefore( - rest, + document.createTextNode(val.substr(pos + text.length)), node.nextSibling ) ); node.nodeValue = val.substr(0, pos); - /* There may be more occurrences of search term in this node. So call this - * function recursively on the remaining fragment. - */ - _highlight(rest, addItems, text, className); if (isInSVG) { const rect = document.createElementNS( @@ -145,10 +140,5 @@ const SphinxHighlight = { }, }; -_ready(() => { - /* Do not call highlightSearchWords() when we are on the search page. - * It will highlight words from the *previous* search query. - */ - if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); - SphinxHighlight.initEscapeListener(); -}); +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index c2451c9..77a4444 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -1,22 +1,23 @@ - + Index — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -686,7 +687,7 @@ module
" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/build/html/_static/sphinxdoc.css b/docs/build/html/_static/sphinxdoc.css new file mode 100644 index 0000000..b03830b --- /dev/null +++ b/docs/build/html/_static/sphinxdoc.css @@ -0,0 +1,354 @@ +/* + * sphinxdoc.css_t + * ~~~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- sphinxdoc theme. Originally created by + * Armin Ronacher for Werkzeug. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; + font-size: 14px; + letter-spacing: -0.01em; + line-height: 150%; + text-align: center; + background-color: #BFD1D4; + color: black; + padding: 0; + border: 1px solid #aaa; + + margin: 0px 80px 0px 80px; + min-width: 740px; +} + +div.document { + background-color: white; + text-align: left; + background-image: url(contents.png); + background-repeat: repeat-x; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 calc(230px + 10px) 0 0; + border-right: 1px solid #ccc; +} + +div.body { + margin: 0; + padding: 0.5em 20px 20px 20px; +} + +div.related { + font-size: 1em; +} + +div.related ul { + background-image: url(navigation.png); + height: 2em; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} + +div.related ul li { + margin: 0; + padding: 0; + height: 2em; + float: left; +} + +div.related ul li.right { + float: right; + margin-right: 5px; +} + +div.related ul li a { + margin: 0; + padding: 0 5px 0 5px; + line-height: 1.75em; + color: #EE9816; +} + +div.related ul li a:hover { + color: #3CA8E7; +} + +div.sphinxsidebarwrapper { + padding: 0; +} + +div.sphinxsidebar { + padding: 0.5em 15px 15px 0; + width: calc(230px - 20px); + float: right; + font-size: 1em; + text-align: left; +} + +div.sphinxsidebar h3, div.sphinxsidebar h4 { + margin: 1em 0 0.5em 0; + font-size: 1em; + padding: 0.1em 0 0.1em 0.5em; + color: white; + border: 1px solid #86989B; + background-color: #AFC1C4; +} + +div.sphinxsidebar h3 a { + color: white; +} + +div.sphinxsidebar ul { + padding-left: 1.5em; + margin-top: 7px; + padding: 0; + line-height: 130%; +} + +div.sphinxsidebar ul ul { + margin-left: 20px; +} + +div.footer { + background-color: #E3EFF1; + color: #86989B; + padding: 3px 8px 3px 0; + clear: both; + font-size: 0.8em; + text-align: right; +} + +div.footer a { + color: #86989B; + text-decoration: underline; +} + +/* -- body styles ----------------------------------------------------------- */ + +p { + margin: 0.8em 0 0.5em 0; +} + +a { + color: #CA7900; + text-decoration: none; +} + +a:hover { + color: #2491CF; +} + +a:visited { + color: #551A8B; +} + +div.body a { + text-decoration: underline; +} + +h1 { + margin: 0; + padding: 0.7em 0 0.3em 0; + font-size: 1.5em; + color: #11557C; +} + +h2 { + margin: 1.3em 0 0.2em 0; + font-size: 1.35em; + padding: 0; +} + +h3 { + margin: 1em 0 -0.3em 0; + font-size: 1.2em; +} + +div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { + color: black!important; +} + +h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor { + display: none; + margin: 0 0 0 0.3em; + padding: 0 0.2em 0 0.2em; + color: #aaa!important; +} + +h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, +h5:hover a.anchor, h6:hover a.anchor { + display: inline; +} + +h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, +h5 a.anchor:hover, h6 a.anchor:hover { + color: #777; + background-color: #eee; +} + +a.headerlink { + color: #c60f0f!important; + font-size: 1em; + margin-left: 6px; + padding: 0 4px 0 4px; + text-decoration: none!important; +} + +a.headerlink:hover { + background-color: #ccc; + color: white!important; +} + +cite, code, code { + font-family: 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.01em; +} + +code { + background-color: #f2f2f2; + border-bottom: 1px solid #ddd; + color: #333; +} + +code.descname, code.descclassname, code.xref { + border: 0; +} + +hr { + border: 1px solid #abc; + margin: 2em; +} + +a code { + border: 0; + color: #CA7900; +} + +a code:hover { + color: #2491CF; +} + +pre { + font-family: 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.015em; + line-height: 120%; + padding: 0.5em; + border: 1px solid #ccc; +} + +pre a { + color: inherit; + text-decoration: underline; +} + +td.linenos pre { + padding: 0.5em 0; +} + +div.quotebar { + background-color: #f8f8f8; + max-width: 250px; + float: right; + padding: 2px 7px; + border: 1px solid #ccc; +} + +nav.contents, +aside.topic, +div.topic { + background-color: #f8f8f8; +} + +table { + border-collapse: collapse; + margin: 0 -0.5em 0 -0.5em; +} + +table td, table th { + padding: 0.2em 0.5em 0.2em 0.5em; +} + +div.admonition, div.warning { + font-size: 0.9em; + margin: 1em 0 1em 0; + border: 1px solid #86989B; + background-color: #f7f7f7; + padding: 0; +} + +div.admonition p, div.warning p { + margin: 0.5em 1em 0.5em 1em; + padding: 0; +} + +div.admonition pre, div.warning pre { + margin: 0.4em 1em 0.4em 1em; +} + +div.admonition p.admonition-title, +div.warning p.admonition-title { + margin: 0; + padding: 0.1em 0 0.1em 0.5em; + color: white; + border-bottom: 1px solid #86989B; + font-weight: bold; + background-color: #AFC1C4; +} + +div.warning { + border: 1px solid #940000; +} + +div.warning p.admonition-title { + background-color: #CF0000; + border-bottom-color: #940000; +} + +div.admonition ul, div.admonition ol, +div.warning ul, div.warning ol { + margin: 0.1em 0.5em 0.5em 3em; + padding: 0; +} + +div.versioninfo { + margin: 1em 0 0 0; + border: 1px solid #ccc; + background-color: #DDEAF0; + padding: 8px; + line-height: 1.3em; + font-size: 0.9em; +} + +.viewcode-back { + font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + background-color: #ddd; + color: #222; + border: 1px solid #ccc; +} \ No newline at end of file diff --git a/docs/build/html/api.html b/docs/build/html/api.html new file mode 100644 index 0000000..7c74701 --- /dev/null +++ b/docs/build/html/api.html @@ -0,0 +1,113 @@ + + + + + + + API — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

API

+ + + + + + +

quapy

QuaPy module for quantification

+
+ + +
+
+
+ +
+ +
+

© Copyright 2024, Alejandro Moreo.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/generated/quapy.html b/docs/build/html/generated/quapy.html new file mode 100644 index 0000000..61ce026 --- /dev/null +++ b/docs/build/html/generated/quapy.html @@ -0,0 +1,106 @@ + + + + + + + quapy — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

quapy

+

QuaPy module for quantification

+
+ + +
+
+
+ +
+ +
+

© Copyright 2024, Alejandro Moreo.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/quapy.benchmarking.html b/docs/build/html/quapy.benchmarking.html new file mode 100644 index 0000000..ab3831f --- /dev/null +++ b/docs/build/html/quapy.benchmarking.html @@ -0,0 +1,119 @@ + + + + + + + quapy.benchmarking package — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

quapy.benchmarking package

+
+

Submodules

+
+
+

quapy.benchmarking.typical module

+
+
+quapy.benchmarking.typical.wrap_cls_params(params)
+
+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2024, Alejandro Moreo.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file From 23bdc5654e9f48a6ad9ad9cac82aaa1ad0d39b92 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Wed, 14 Feb 2024 14:30:42 +0100 Subject: [PATCH 042/216] adding template to docs --- docs/Makefile | 20 +++++++ docs/leeme.txt | 10 ++++ docs/make.bat | 35 ++++++++++++ docs/source/index.rst | 41 ++++++++++++++ docs/source/modules.rst | 7 +++ docs/source/quapy.classification.rst | 45 ++++++++++++++++ docs/source/quapy.data.rst | 46 ++++++++++++++++ docs/source/quapy.method.rst | 61 +++++++++++++++++++++ docs/source/quapy.rst | 80 ++++++++++++++++++++++++++++ 9 files changed, 345 insertions(+) create mode 100644 docs/Makefile create mode 100644 docs/leeme.txt create mode 100644 docs/make.bat create mode 100644 docs/source/index.rst create mode 100644 docs/source/modules.rst create mode 100644 docs/source/quapy.classification.rst create mode 100644 docs/source/quapy.data.rst create mode 100644 docs/source/quapy.method.rst create mode 100644 docs/source/quapy.rst diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/leeme.txt b/docs/leeme.txt new file mode 100644 index 0000000..cabe457 --- /dev/null +++ b/docs/leeme.txt @@ -0,0 +1,10 @@ +Para meter los módulos dentro de doc hay que hacer un + +sphinx-apidoc -o docs/source/ quapy/ -P + +Eso importa todo lo que haya en quapy/ (incluidos los ficheros _ gracias a -P) en source y crea un rst para cada uno. + +Parece que lo del -P no funciona. Hay que meterlos a mano en quapy.method.rst + +Luego, simplemente +make html \ No newline at end of file diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..747ffb7 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..cc5b4dc --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,41 @@ +.. QuaPy: A Python-based open-source framework for quantification documentation master file, created by + sphinx-quickstart on Wed Feb 7 16:26:46 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to QuaPy's documentation! +========================================================================================== + +QuaPy is a Python-based open-source framework for quantification. + +This document contains the API of the modules included in QuaPy. + +Installation +------------ + +`pip install quapy` + +GitHub +------------ + +QuaPy is hosted in GitHub at `https://github.com/HLT-ISTI/QuaPy `_ + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + +Contents +-------- + +.. toctree:: + + modules + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/source/modules.rst b/docs/source/modules.rst new file mode 100644 index 0000000..5d84a54 --- /dev/null +++ b/docs/source/modules.rst @@ -0,0 +1,7 @@ +quapy +===== + +.. toctree:: + :maxdepth: 4 + + quapy diff --git a/docs/source/quapy.classification.rst b/docs/source/quapy.classification.rst new file mode 100644 index 0000000..cfc7d9b --- /dev/null +++ b/docs/source/quapy.classification.rst @@ -0,0 +1,45 @@ +quapy.classification package +============================ + +Submodules +---------- + +quapy.classification.calibration module +--------------------------------------- + +.. automodule:: quapy.classification.calibration + :members: + :undoc-members: + :show-inheritance: + +quapy.classification.methods module +----------------------------------- + +.. automodule:: quapy.classification.methods + :members: + :undoc-members: + :show-inheritance: + +quapy.classification.neural module +---------------------------------- + +.. automodule:: quapy.classification.neural + :members: + :undoc-members: + :show-inheritance: + +quapy.classification.svmperf module +----------------------------------- + +.. automodule:: quapy.classification.svmperf + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: quapy.classification + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/quapy.data.rst b/docs/source/quapy.data.rst new file mode 100644 index 0000000..cadace6 --- /dev/null +++ b/docs/source/quapy.data.rst @@ -0,0 +1,46 @@ +quapy.data package +================== + +Submodules +---------- + +quapy.data.base module +---------------------- + +.. automodule:: quapy.data.base + :members: + :undoc-members: + :show-inheritance: + +quapy.data.datasets module +-------------------------- + +.. automodule:: quapy.data.datasets + :members: + :undoc-members: + :show-inheritance: + + +quapy.data.preprocessing module +------------------------------- + +.. automodule:: quapy.data.preprocessing + :members: + :undoc-members: + :show-inheritance: + +quapy.data.reader module +------------------------ + +.. automodule:: quapy.data.reader + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: quapy.data + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/quapy.method.rst b/docs/source/quapy.method.rst new file mode 100644 index 0000000..8026e0a --- /dev/null +++ b/docs/source/quapy.method.rst @@ -0,0 +1,61 @@ +quapy.method package +==================== + +Submodules +---------- + +quapy.method.aggregative module +------------------------------- + +.. automodule:: quapy.method.aggregative + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: quapy.method._kdey + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: quapy.method._neural + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: quapy.method._threshold_optim + :members: + :undoc-members: + :show-inheritance: + + +quapy.method.base module +------------------------ + +.. automodule:: quapy.method.base + :members: + :undoc-members: + :show-inheritance: + +quapy.method.meta module +------------------------ + +.. automodule:: quapy.method.meta + :members: + :undoc-members: + :show-inheritance: + +quapy.method.non\_aggregative module +------------------------------------ + +.. automodule:: quapy.method.non_aggregative + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: quapy.method + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/quapy.rst b/docs/source/quapy.rst new file mode 100644 index 0000000..af2708b --- /dev/null +++ b/docs/source/quapy.rst @@ -0,0 +1,80 @@ +quapy package +============= + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + quapy.classification + quapy.data + quapy.method + + +Submodules +---------- + +quapy.error module +------------------ + +.. automodule:: quapy.error + :members: + :undoc-members: + :show-inheritance: + +quapy.evaluation module +----------------------- + +.. automodule:: quapy.evaluation + :members: + :undoc-members: + :show-inheritance: + +quapy.functional module +----------------------- + +.. automodule:: quapy.functional + :members: + :undoc-members: + :show-inheritance: + +quapy.model\_selection module +----------------------------- + +.. automodule:: quapy.model_selection + :members: + :undoc-members: + :show-inheritance: + +quapy.plot module +----------------- + +.. automodule:: quapy.plot + :members: + :undoc-members: + :show-inheritance: + +quapy.protocol module +--------------------- + +.. automodule:: quapy.protocol + :members: + :undoc-members: + :show-inheritance: + +quapy.util module +----------------- + +.. automodule:: quapy.util + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: quapy + :members: + :undoc-members: + :show-inheritance: From 43cb24bebf3b3ce6034986065b67d41c4d6d7cf6 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Wed, 14 Feb 2024 14:39:37 +0100 Subject: [PATCH 043/216] adding logos --- README.md | 17 +++++++++++++---- SoBigData.png | Bin 131577 -> 0 bytes 2 files changed, 13 insertions(+), 4 deletions(-) delete mode 100644 SoBigData.png diff --git a/README.md b/README.md index d9f697c..58ac900 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ for facilitating the analysis and interpretation of the experimental results. ### Last updates: * Version 0.1.8 is released! major changes can be consulted [here](CHANGE_LOG.txt). -* A detailed documentation is now available [here](https://hlt-isti.github.io/QuaPy/) +* A detailed wiki is available [here](https://github.com/HLT-ISTI/QuaPy/wiki) * The developer API documentation is available [here](https://hlt-isti.github.io/QuaPy/build/html/modules.html) ### Installation @@ -78,10 +78,12 @@ quantification methods based on structured output learning, HDy, QuaNet, quantif * Versatile functionality for performing evaluation based on sampling generation protocols (e.g., APP, NPP, etc.). * Implementation of most commonly used evaluation metrics (e.g., AE, RAE, NAE, NRAE, SE, KLD, NKLD, etc.). * Datasets frequently used in quantification (textual and numeric), including: - * 32 UCI Machine Learning datasets. + * 32 UCI Machine Learning binary datasets. + * 5 UCI Machine Learning multiclass datasets (_new in v0.1.8!_). * 11 Twitter quantification-by-sentiment datasets. * 3 product reviews quantification-by-sentiment datasets. * 4 tasks from LeQua competition (_new in v0.1.7!_) + * IFCB dataset of plankton water samples (_new in v0.1.8!_). * Native support for binary and single-label multiclass quantification scenarios. * Model selection functionality that minimizes quantification-oriented loss functions. * Visualization tools for analysing the experimental results. @@ -95,6 +97,7 @@ quantification methods based on structured output learning, HDy, QuaNet, quantif * tqdm * pandas, xlrd * matplotlib +* ucimlrepo ## Contributing @@ -102,7 +105,7 @@ In case you want to contribute improvements to quapy, please generate pull reque ## Documentation -The [developer API documentation](https://hlt-isti.github.io/QuaPy/build/html/modules.html) is available [here](https://hlt-isti.github.io/QuaPy/build/html/index.html). +The developer API documentation is available [here](https://hlt-isti.github.io/QuaPy/build/html/index.html). Check out our [Wiki](https://github.com/HLT-ISTI/QuaPy/wiki), in which many examples are provided: @@ -117,4 +120,10 @@ are provided: ## Acknowledgments: -SoBigData++ + + +SoBigData++ + +QuaDaSh + +QuaDaSh diff --git a/SoBigData.png b/SoBigData.png deleted file mode 100644 index f279e7b8c9e356a9fca770d3926e4b1b0e84cecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131577 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

{aIRJhjT7?H<#84mKI0zL9 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 From afd50eac77e9659580e9d0ca485467a79d07f6ce Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Wed, 14 Feb 2024 14:40:29 +0100 Subject: [PATCH 044/216] adding logo --- logo/LogoQuaDaSh.png | Bin 0 -> 49616 bytes logo/NextGenerationEU.jpg | Bin 0 -> 58306 bytes logo/SoBigData.png | Bin 0 -> 131577 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 logo/LogoQuaDaSh.png create mode 100644 logo/NextGenerationEU.jpg create mode 100644 logo/SoBigData.png diff --git a/logo/LogoQuaDaSh.png b/logo/LogoQuaDaSh.png new file mode 100644 index 0000000000000000000000000000000000000000..5daff4097620cdd55c7c6c6980c6a9bf0a2eb9aa GIT binary patch literal 49616 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 F`+r}z7100y literal 0 HcmV?d00001 diff --git a/logo/NextGenerationEU.jpg b/logo/NextGenerationEU.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3771012b12d4c5b04f2a1a799ee2e3b6622e6cf GIT binary patch literal 58306 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 SKYlH6|G)hI9`O4)`+oqvsmI*_ literal 0 HcmV?d00001 diff --git a/logo/SoBigData.png b/logo/SoBigData.png new file mode 100644 index 0000000000000000000000000000000000000000..f279e7b8c9e356a9fca770d3926e4b1b0e84cecc GIT binary patch literal 131577 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

{aIRJhjT7?H<#84mKI0zL9 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 literal 0 HcmV?d00001 From 390fa24103aafdbbbaf88119ba83413bb8fe5e71 Mon Sep 17 00:00:00 2001 From: Alejandro Moreo Date: Wed, 14 Feb 2024 16:57:05 +0100 Subject: [PATCH 045/216] doc update --- docs/build/html/_modules/index.html | 17 +- .../quapy/classification/calibration.html | 72 +--- .../html/_modules/quapy/data/datasets.html | 62 +-- docs/build/html/_modules/quapy/error.html | 107 ++--- .../build/html/_modules/quapy/evaluation.html | 37 +- .../build/html/_modules/quapy/functional.html | 102 ++--- .../html/_modules/quapy/method/_kdey.html | 95 ++--- .../html/_modules/quapy/method/_neural.html | 69 +--- .../quapy/method/_threshold_optim.html | 119 ++---- .../_modules/quapy/method/aggregative.html | 329 ++++------------ .../html/_modules/quapy/method/base.html | 64 +-- .../html/_modules/quapy/method/meta.html | 131 ++----- .../quapy/method/non_aggregative.html | 56 +-- .../html/_modules/quapy/model_selection.html | 84 ++-- docs/build/html/_modules/quapy/protocol.html | 178 +++------ docs/build/html/_modules/quapy/util.html | 77 +--- .../_sphinx_javascript_frameworks_compat.js | 17 +- docs/build/html/_static/basic.css | 27 +- docs/build/html/_static/doctools.js | 2 +- .../html/_static/documentation_options.js | 3 +- docs/build/html/_static/language_data.js | 2 +- docs/build/html/_static/searchtools.js | 34 +- docs/build/html/_static/sphinx_highlight.js | 16 +- docs/build/html/genindex.html | 31 +- docs/build/html/index.html | 32 +- docs/build/html/modules.html | 20 +- docs/build/html/objects.inv | Bin 3343 -> 3350 bytes docs/build/html/py-modindex.html | 17 +- docs/build/html/quapy.classification.html | 148 +++---- docs/build/html/quapy.data.html | 143 +++---- docs/build/html/quapy.html | 279 ++++++------- docs/build/html/quapy.method.html | 366 +++++++++--------- docs/build/html/search.html | 17 +- docs/build/html/searchindex.js | 2 +- 34 files changed, 1016 insertions(+), 1739 deletions(-) diff --git a/docs/build/html/_modules/index.html b/docs/build/html/_modules/index.html index f4894ba..9951ba2 100644 --- a/docs/build/html/_modules/index.html +++ b/docs/build/html/_modules/index.html @@ -1,22 +1,23 @@ - + Overview: module code — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + diff --git a/docs/build/html/_modules/quapy/classification/calibration.html b/docs/build/html/_modules/quapy/classification/calibration.html index d2d88ca..6576c6c 100644 --- a/docs/build/html/_modules/quapy/classification/calibration.html +++ b/docs/build/html/_modules/quapy/classification/calibration.html @@ -1,22 +1,23 @@ - + quapy.classification.calibration — QuaPy: A Python-based open-source framework for quantification 0.1.8 documentation - - + + - - - - - + + + + + + @@ -83,9 +84,7 @@ # see https://github.com/kundajelab/abstention -

g05L3+tj;dm#_*D%gnLp?J^2)N?bYCk@LMdqI8 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� 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