QuaPy/quapy/tests/integration_datasets.py

122 lines
4.5 KiB
Python

"""
Integration tests for dataset fetchers and large external resources.
This module is intentionally excluded from default ``unittest`` discovery by
using an ``integration_*.py`` filename.
"""
import os
import unittest
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
import quapy.functional as F
from quapy.data.datasets import *
from quapy.method.aggregative import PCC
class IntegrationDatasetsTest(unittest.TestCase):
def new_quantifier(self):
return PCC(LogisticRegression(C=0.001, max_iter=100))
def _check_dataset(self, dataset):
train, test = dataset.reduce().train_test
q = self.new_quantifier()
if len(train) > 500:
train = train.sampling(500)
q.fit(*dataset.training.Xy)
estim_prevalences = q.predict(dataset.test.instances)
self.assertTrue(F.check_prevalence_vector(estim_prevalences))
def _check_samples(self, gen, q, max_samples_test=5, vectorizer=None):
for X, p in gen():
if vectorizer is not None:
X = vectorizer.transform(X)
estim_prevalences = q.predict(X)
self.assertTrue(F.check_prevalence_vector(estim_prevalences))
max_samples_test -= 1
if max_samples_test == 0:
break
def test_reviews(self):
for dataset_name in REVIEWS_SENTIMENT_DATASETS:
dataset = fetch_reviews(dataset_name, tfidf=True, min_df=10)
dataset.reduce()
self._check_dataset(dataset)
def test_twitter(self):
for dataset_name in TWITTER_SENTIMENT_DATASETS_TEST[:1]:
dataset = fetch_twitter(dataset_name, min_df=10)
dataset.reduce()
self._check_dataset(dataset)
def test_UCIBinaryDataset(self):
for dataset_name in UCI_BINARY_DATASETS:
dataset = fetch_UCIBinaryDataset(dataset_name)
dataset.reduce()
self._check_dataset(dataset)
def test_UCIMultiDataset(self):
for dataset_name in UCI_MULTICLASS_DATASETS:
dataset = fetch_UCIMulticlassDataset(dataset_name)
n_classes = dataset.n_classes
uniform_prev = F.uniform_prevalence(n_classes)
dataset.training = dataset.training.sampling(100, *uniform_prev)
dataset.test = dataset.test.sampling(100, *uniform_prev)
self._check_dataset(dataset)
def test_lequa2022(self):
if os.environ.get('QUAPY_TESTS_OMIT_LARGE_DATASETS'):
return
for dataset_name in LEQUA2022_VECTOR_TASKS:
train, gen_val, gen_test = fetch_lequa2022(dataset_name)
n_classes = train.n_classes
train = train.sampling(100, *F.uniform_prevalence(n_classes))
q = self.new_quantifier()
q.fit(*train.Xy)
self._check_samples(gen_val, q, max_samples_test=5)
self._check_samples(gen_test, q, max_samples_test=5)
for dataset_name in LEQUA2022_TEXT_TASKS:
train, gen_val, gen_test = fetch_lequa2022(dataset_name)
n_classes = train.n_classes
train = train.sampling(100, *F.uniform_prevalence(n_classes))
tfidf = TfidfVectorizer()
train.instances = tfidf.fit_transform(train.instances)
q = self.new_quantifier()
q.fit(*train.Xy)
self._check_samples(gen_val, q, max_samples_test=5, vectorizer=tfidf)
self._check_samples(gen_test, q, max_samples_test=5, vectorizer=tfidf)
def test_lequa2024(self):
if os.environ.get('QUAPY_TESTS_OMIT_LARGE_DATASETS'):
return
for task in LEQUA2024_TASKS:
train, gen_val, gen_test = fetch_lequa2024(task, merge_T3=True)
n_classes = train.n_classes
train = train.sampling(100, *F.uniform_prevalence(n_classes))
q = self.new_quantifier()
q.fit(*train.Xy)
self._check_samples(gen_val, q, max_samples_test=5)
self._check_samples(gen_test, q, max_samples_test=5)
def test_IFCB(self):
if os.environ.get('QUAPY_TESTS_OMIT_LARGE_DATASETS'):
return
for mod_sel in [False, True]:
train, gen = fetch_IFCB(single_sample_train=True, for_model_selection=mod_sel)
n_classes = train.n_classes
train = train.sampling(100, *F.uniform_prevalence(n_classes))
q = self.new_quantifier()
q.fit(*train.Xy)
self._check_samples(gen, q, max_samples_test=5)
if __name__ == '__main__':
unittest.main()