diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ac5bf36b8..4aab8ed6c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,15 +15,9 @@ jobs: strategy: matrix: include: - - os: ubuntu-latest - python-version: "3.7" - numpy-version: 1.21.4 - - os: ubuntu-latest - python-version: "3.8" - numpy-version: 1.21.4 - os: ubuntu-latest python-version: "3.9" - numpy-version: 1.21.4 + numpy-version: 1.22.4 - os: ubuntu-latest python-version: "3.10" numpy-version: 1.22.4 diff --git a/README.rst b/README.rst index bca9b5fee..0183d8998 100644 --- a/README.rst +++ b/README.rst @@ -79,8 +79,8 @@ Implemented methods in **MAPIE** respect three fundamental pillars: 🔗 Requirements =============== -- **MAPIE** runs on Python 3.7+. -- **MAPIE** stands on the shoulders of giants. Its only internal dependencies are `scikit-learn `_ and `numpy=>1.21 `_. +- **MAPIE** runs on Python 3.9+. +- **MAPIE** stands on the shoulders of giants. Its only internal dependencies are `scikit-learn `_ and `numpy=>1.22 `_. 🛠 Installation diff --git a/doc/v1_migration_guide.rst b/doc/v1_migration_guide.rst index abd1b4192..3af25c2b1 100644 --- a/doc/v1_migration_guide.rst +++ b/doc/v1_migration_guide.rst @@ -5,7 +5,14 @@ MAPIE v1 introduces several updates, enhancements, and structural changes that s This guide outlines the differences between MAPIE v0.x and MAPIE v1 and provides instructions for migrating your code to the new API. -1. Overview of class restructuring +1. Python and NumPy versions support +------------------------------------------------- + +We now support Python >= 3.9 (formerly >=3.7), and NumPy >= 1.22 (formerly >=1.21). + +MAPIE v1 may run with Python < 3.9, but we do not recommend it. + +2. Class restructuring ----------------------------------- MAPIE v1 breaks down the ``MapieRegressor`` and ``MapieClassifier`` classes into 5 classes, each dedicated to a particular conformal prediction technique. ``MapieQuantileRegressor`` has also been revamped, and renamed ``ConformalizedQuantileRegressor``. @@ -48,7 +55,7 @@ The ``cv`` parameter is key to understand what new class to use in the v1 API: For more details regarding the difference between split and cross conformal types, see :doc:`split_cross_conformal` -2. Method changes +3. Method changes ----------------- In MAPIE v1, the conformal prediction workflow is more streamlined and modular, with distinct methods for training, conformalization (named calibration in the scientific literature), and prediction. The conformalization process in v1 consists of four steps. @@ -91,7 +98,7 @@ The ``.predict()`` method now focuses solely on producing point predictions. -3. Parameters change +4. Parameters change ------------------------ ``alpha`` @@ -182,7 +189,7 @@ No more parameters with incorrect ``None`` defaults. - **v1**: All parameters now have explicit defaults. -4. Migration example: MAPIE v0.x to MAPIE v1 +5. Migration examples: MAPIE v0.x to MAPIE v1 ---------------------------------------------------------------------------------------- Below is a side-by-side example of code in MAPIE v0.x and its equivalent in MAPIE v1 diff --git a/examples/calibration/1-quickstart/plot_calibration_hypothesis_testing.py b/examples/calibration/1-quickstart/plot_calibration_hypothesis_testing.py index 894add6aa..286b374a8 100644 --- a/examples/calibration/1-quickstart/plot_calibration_hypothesis_testing.py +++ b/examples/calibration/1-quickstart/plot_calibration_hypothesis_testing.py @@ -29,7 +29,7 @@ from matplotlib import pyplot as plt from sklearn.utils import check_random_state -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.metrics import (cumulative_differences, kolmogorov_smirnov_p_value, length_scale) diff --git a/examples/calibration/2-advanced-analysis/plot_asymptotic_convergence_of_p_values.py b/examples/calibration/2-advanced-analysis/plot_asymptotic_convergence_of_p_values.py index ae5cb8b24..decc5d944 100644 --- a/examples/calibration/2-advanced-analysis/plot_asymptotic_convergence_of_p_values.py +++ b/examples/calibration/2-advanced-analysis/plot_asymptotic_convergence_of_p_values.py @@ -39,7 +39,7 @@ from matplotlib import pyplot as plt from sklearn.utils import check_random_state -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.metrics import (kolmogorov_smirnov_p_value, kuiper_p_value, spiegelhalter_p_value) diff --git a/examples/classification/1-quickstart/plot_comp_methods_on_2d_dataset.py b/examples/classification/1-quickstart/plot_comp_methods_on_2d_dataset.py index 014ed943a..4fb5725c2 100644 --- a/examples/classification/1-quickstart/plot_comp_methods_on_2d_dataset.py +++ b/examples/classification/1-quickstart/plot_comp_methods_on_2d_dataset.py @@ -53,7 +53,7 @@ from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.classification import MapieClassifier from mapie.metrics import (classification_coverage_score, classification_mean_width_score) diff --git a/examples/classification/4-tutorials/plot_crossconformal.py b/examples/classification/4-tutorials/plot_crossconformal.py index f9469300b..c78587377 100644 --- a/examples/classification/4-tutorials/plot_crossconformal.py +++ b/examples/classification/4-tutorials/plot_crossconformal.py @@ -35,7 +35,7 @@ from sklearn.naive_bayes import GaussianNB from typing_extensions import TypedDict -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.classification import MapieClassifier from mapie.metrics import (classification_coverage_score, classification_mean_width_score) diff --git a/examples/classification/4-tutorials/plot_main-tutorial-binary-classification.py b/examples/classification/4-tutorials/plot_main-tutorial-binary-classification.py index f83d24011..9fb66b142 100644 --- a/examples/classification/4-tutorials/plot_main-tutorial-binary-classification.py +++ b/examples/classification/4-tutorials/plot_main-tutorial-binary-classification.py @@ -33,7 +33,7 @@ from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.classification import MapieClassifier from mapie.metrics import (classification_coverage_score, classification_mean_width_score) diff --git a/examples/regression/1-quickstart/plot_heteroscedastic_1d_data.py b/examples/regression/1-quickstart/plot_heteroscedastic_1d_data.py index b2d9bc72f..f89ee5cde 100644 --- a/examples/regression/1-quickstart/plot_heteroscedastic_1d_data.py +++ b/examples/regression/1-quickstart/plot_heteroscedastic_1d_data.py @@ -25,7 +25,7 @@ from sklearn.preprocessing import PolynomialFeatures from sklearn.model_selection import train_test_split -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie_v1.regression import ( CrossConformalRegressor, JackknifeAfterBootstrapRegressor, diff --git a/examples/regression/1-quickstart/plot_homoscedastic_1d_data.py b/examples/regression/1-quickstart/plot_homoscedastic_1d_data.py index 4668d75f9..504579248 100644 --- a/examples/regression/1-quickstart/plot_homoscedastic_1d_data.py +++ b/examples/regression/1-quickstart/plot_homoscedastic_1d_data.py @@ -23,7 +23,7 @@ from sklearn.model_selection import train_test_split -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie_v1.regression import ( CrossConformalRegressor, JackknifeAfterBootstrapRegressor, diff --git a/examples/regression/1-quickstart/plot_prefit.py b/examples/regression/1-quickstart/plot_prefit.py index 83b68ee2c..22714a2ac 100644 --- a/examples/regression/1-quickstart/plot_prefit.py +++ b/examples/regression/1-quickstart/plot_prefit.py @@ -26,7 +26,7 @@ from matplotlib import pyplot as plt from sklearn.neural_network import MLPRegressor -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.metrics import regression_coverage_score from mapie_v1.regression import SplitConformalRegressor, ConformalizedQuantileRegressor from mapie_v1.utils import train_conformalize_test_split diff --git a/examples/regression/2-advanced-analysis/plot_both_uncertainties.py b/examples/regression/2-advanced-analysis/plot_both_uncertainties.py index 6e87cb273..574164bbd 100644 --- a/examples/regression/2-advanced-analysis/plot_both_uncertainties.py +++ b/examples/regression/2-advanced-analysis/plot_both_uncertainties.py @@ -19,7 +19,7 @@ from sklearn.preprocessing import PolynomialFeatures from sklearn.model_selection import train_test_split -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie_v1.regression import ( CrossConformalRegressor, ConformalizedQuantileRegressor, diff --git a/examples/regression/2-advanced-analysis/plot_conditional_coverage.py b/examples/regression/2-advanced-analysis/plot_conditional_coverage.py index 62f0b72b6..f9a6b52dc 100644 --- a/examples/regression/2-advanced-analysis/plot_conditional_coverage.py +++ b/examples/regression/2-advanced-analysis/plot_conditional_coverage.py @@ -26,7 +26,7 @@ from lightgbm import LGBMRegressor from sklearn.model_selection import train_test_split -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.conformity_scores import (GammaConformityScore, ResidualNormalisedScore) from mapie.metrics import (hsic, regression_coverage_score_v2, regression_ssc, diff --git a/examples/regression/2-advanced-analysis/plot_timeseries_enbpi.py b/examples/regression/2-advanced-analysis/plot_timeseries_enbpi.py index 3ac2f5de0..249338548 100644 --- a/examples/regression/2-advanced-analysis/plot_timeseries_enbpi.py +++ b/examples/regression/2-advanced-analysis/plot_timeseries_enbpi.py @@ -34,7 +34,7 @@ from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import RandomizedSearchCV, TimeSeriesSplit -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.metrics import (regression_coverage_score, regression_mean_width_score) from mapie.regression import MapieTimeSeriesRegressor diff --git a/examples/regression/3-scientific-articles/plot_barber2020_simulations.py b/examples/regression/3-scientific-articles/plot_barber2020_simulations.py index a3071cf34..9021ab70c 100644 --- a/examples/regression/3-scientific-articles/plot_barber2020_simulations.py +++ b/examples/regression/3-scientific-articles/plot_barber2020_simulations.py @@ -35,7 +35,7 @@ from matplotlib import pyplot as plt from sklearn.linear_model import LinearRegression -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.metrics import (regression_coverage_score, regression_mean_width_score) from mapie_v1.regression import CrossConformalRegressor diff --git a/examples/regression/3-scientific-articles/plot_kim2020_simulations.py b/examples/regression/3-scientific-articles/plot_kim2020_simulations.py index a795b2480..45ceb0477 100644 --- a/examples/regression/3-scientific-articles/plot_kim2020_simulations.py +++ b/examples/regression/3-scientific-articles/plot_kim2020_simulations.py @@ -45,7 +45,7 @@ from sklearn.linear_model import Ridge from sklearn.model_selection import train_test_split -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.metrics import (regression_coverage_score, regression_mean_width_score) from mapie_v1.regression import ( diff --git a/examples/regression/3-scientific-articles/plot_zaffran2022_comparison.py b/examples/regression/3-scientific-articles/plot_zaffran2022_comparison.py index 46acc788f..d62a1efc3 100644 --- a/examples/regression/3-scientific-articles/plot_zaffran2022_comparison.py +++ b/examples/regression/3-scientific-articles/plot_zaffran2022_comparison.py @@ -45,7 +45,7 @@ from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import PredefinedSplit -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.conformity_scores import AbsoluteConformityScore from mapie.time_series_regression import MapieTimeSeriesRegressor diff --git a/mapie/_compatibility.py b/mapie/_compatibility.py deleted file mode 100644 index 5ead5c201..000000000 --- a/mapie/_compatibility.py +++ /dev/null @@ -1,58 +0,0 @@ -from typing import Any - -import numpy as np -from packaging.version import parse as parse_version - -from ._typing import ArrayLike, NDArray - - -def np_quantile_version_below_122( - a: ArrayLike, - q: ArrayLike, - method: str = "linear", - **kwargs: Any -) -> NDArray: - """Wrapper of np.quantile function for numpy version < 1.22.""" - return np.quantile(a, q, interpolation=method, **kwargs) # type: ignore - - -def np_quantile_version_above_122( - a: ArrayLike, - q: ArrayLike, - method: str = "linear", - **kwargs: Any -) -> NDArray: - """Wrapper of np.quantile function for numpy version >= 1.22.""" - return np.quantile(a, q, method=method, **kwargs) # type: ignore - - -def np_nanquantile_version_below_122( - a: ArrayLike, - q: ArrayLike, - method: str = "linear", - **kwargs: Any -) -> NDArray: - """Wrapper of np.quantile function for numpy version < 1.22.""" - # Does not work if `a` is of dtype object. Converting `a` to a float array - # is necessary in order to use this function safely. - return np.nanquantile(a, q, interpolation=method, **kwargs) - - -def np_nanquantile_version_above_122( - a: ArrayLike, - q: ArrayLike, - method: str = "linear", - **kwargs: Any -) -> NDArray: - """Wrapper of np.quantile function for numpy version >= 1.22.""" - return np.nanquantile(a, q, method=method, **kwargs) # type: ignore - - -numpy_version = parse_version(np.__version__) -if numpy_version < parse_version("1.22"): - np_quantile = np_quantile_version_below_122 - np_nanquantile = np_nanquantile_version_below_122 - -else: - np_quantile = np_quantile_version_above_122 - np_nanquantile = np_nanquantile_version_above_122 diff --git a/mapie/_typing.py b/mapie/_typing.py deleted file mode 100644 index af5839e8c..000000000 --- a/mapie/_typing.py +++ /dev/null @@ -1,3 +0,0 @@ -from numpy.typing import ArrayLike, NDArray - -__all__ = ["ArrayLike", "NDArray"] diff --git a/mapie/aggregation_functions.py b/mapie/aggregation_functions.py index ad9a8181c..ad35f2214 100644 --- a/mapie/aggregation_functions.py +++ b/mapie/aggregation_functions.py @@ -2,7 +2,7 @@ import numpy as np -from ._typing import NDArray +from numpy.typing import NDArray def phi1D( diff --git a/mapie/calibration.py b/mapie/calibration.py index ea3834a38..09edf9957 100644 --- a/mapie/calibration.py +++ b/mapie/calibration.py @@ -12,7 +12,7 @@ from sklearn.utils.validation import (_check_y, _num_samples, check_is_fitted, indexable) -from ._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from .utils import (check_estimator_classification, check_estimator_fit_predict, check_n_features_in, check_null_weight, fit_estimator, get_calib_set) diff --git a/mapie/classification.py b/mapie/classification.py index fb73ad7ec..da8cd04b1 100644 --- a/mapie/classification.py +++ b/mapie/classification.py @@ -10,7 +10,7 @@ from sklearn.utils import check_random_state from sklearn.utils.validation import (_check_y, check_is_fitted, indexable) -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.conformity_scores import BaseClassificationScore from mapie.conformity_scores.sets.raps import RAPSConformityScore from mapie.conformity_scores.utils import ( diff --git a/mapie/conformity_scores/bounds/absolute.py b/mapie/conformity_scores/bounds/absolute.py index 90c1c3e94..7a53d3cf5 100644 --- a/mapie/conformity_scores/bounds/absolute.py +++ b/mapie/conformity_scores/bounds/absolute.py @@ -1,6 +1,6 @@ import numpy as np -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.conformity_scores import BaseRegressionScore diff --git a/mapie/conformity_scores/bounds/gamma.py b/mapie/conformity_scores/bounds/gamma.py index 09f161e02..5eb05b031 100644 --- a/mapie/conformity_scores/bounds/gamma.py +++ b/mapie/conformity_scores/bounds/gamma.py @@ -1,6 +1,6 @@ import numpy as np -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.conformity_scores import BaseRegressionScore diff --git a/mapie/conformity_scores/bounds/residuals.py b/mapie/conformity_scores/bounds/residuals.py index 5ce0d799a..f41a257f4 100644 --- a/mapie/conformity_scores/bounds/residuals.py +++ b/mapie/conformity_scores/bounds/residuals.py @@ -9,7 +9,7 @@ from sklearn.utils.validation import (check_is_fitted, check_random_state, indexable) -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.conformity_scores import BaseRegressionScore diff --git a/mapie/conformity_scores/classification.py b/mapie/conformity_scores/classification.py index 5dda679cf..0239089d6 100644 --- a/mapie/conformity_scores/classification.py +++ b/mapie/conformity_scores/classification.py @@ -6,7 +6,7 @@ from mapie.conformity_scores.interface import BaseConformityScore from mapie.estimator.classifier import EnsembleClassifier -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray class BaseClassificationScore(BaseConformityScore, metaclass=ABCMeta): diff --git a/mapie/conformity_scores/conformity_scores.py b/mapie/conformity_scores/conformity_scores.py index e6953a81d..691f76163 100644 --- a/mapie/conformity_scores/conformity_scores.py +++ b/mapie/conformity_scores/conformity_scores.py @@ -4,7 +4,7 @@ from mapie.conformity_scores.regression import BaseConformityScore from mapie._machine_precision import EPSILON -from mapie._typing import NDArray +from numpy.typing import NDArray @deprecated( diff --git a/mapie/conformity_scores/interface.py b/mapie/conformity_scores/interface.py index 07345d3e4..e8dd3834b 100644 --- a/mapie/conformity_scores/interface.py +++ b/mapie/conformity_scores/interface.py @@ -4,8 +4,7 @@ import numpy as np from sklearn.base import BaseEstimator -from mapie._compatibility import np_nanquantile -from mapie._typing import NDArray +from numpy.typing import NDArray class BaseConformityScore(metaclass=ABCMeta): @@ -155,7 +154,7 @@ def get_quantile( # Otherwise, the quantile is calculated as the corrected lower quantile # of the signed conformity scores. quantile = signed * np.column_stack([ - np_nanquantile( + np.nanquantile( signed * conformity_scores, _alpha_cor, axis=axis, method="lower" ) if not (unbounded and _alpha >= 1) else np.inf * np.ones(n_ref) diff --git a/mapie/conformity_scores/regression.py b/mapie/conformity_scores/regression.py index 35c3985f1..e28867f17 100644 --- a/mapie/conformity_scores/regression.py +++ b/mapie/conformity_scores/regression.py @@ -7,9 +7,8 @@ from mapie.conformity_scores.interface import BaseConformityScore from mapie.estimator.regressor import EnsembleRegressor -from mapie._compatibility import np_nanquantile from mapie._machine_precision import EPSILON -from mapie._typing import NDArray +from numpy.typing import NDArray class BaseRegressionScore(BaseConformityScore, metaclass=ABCMeta): @@ -238,13 +237,13 @@ def _beta_optimize( num=len(lower_bounds), endpoint=True, ) - one_alpha_beta = np_nanquantile( + one_alpha_beta = np.nanquantile( upper_bounds.astype(float), 1 - _alpha + betas, axis=1, method="higher", ) - beta = np_nanquantile( + beta = np.nanquantile( lower_bounds.astype(float), betas, axis=1, diff --git a/mapie/conformity_scores/sets/aps.py b/mapie/conformity_scores/sets/aps.py index 9847f8b7d..5ed36021f 100644 --- a/mapie/conformity_scores/sets/aps.py +++ b/mapie/conformity_scores/sets/aps.py @@ -11,7 +11,7 @@ from mapie.estimator.classifier import EnsembleClassifier from mapie._machine_precision import EPSILON -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.utils import compute_quantiles diff --git a/mapie/conformity_scores/sets/lac.py b/mapie/conformity_scores/sets/lac.py index e5f088158..0a94e0258 100644 --- a/mapie/conformity_scores/sets/lac.py +++ b/mapie/conformity_scores/sets/lac.py @@ -7,7 +7,7 @@ from mapie.estimator.classifier import EnsembleClassifier from mapie._machine_precision import EPSILON -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.utils import compute_quantiles diff --git a/mapie/conformity_scores/sets/naive.py b/mapie/conformity_scores/sets/naive.py index 09bafa181..1a2a868e7 100644 --- a/mapie/conformity_scores/sets/naive.py +++ b/mapie/conformity_scores/sets/naive.py @@ -9,7 +9,7 @@ from mapie.estimator.classifier import EnsembleClassifier from mapie._machine_precision import EPSILON -from mapie._typing import NDArray +from numpy.typing import NDArray class NaiveConformityScore(BaseClassificationScore): diff --git a/mapie/conformity_scores/sets/raps.py b/mapie/conformity_scores/sets/raps.py index 435c135ba..78dc356e7 100644 --- a/mapie/conformity_scores/sets/raps.py +++ b/mapie/conformity_scores/sets/raps.py @@ -11,7 +11,7 @@ from mapie.estimator.classifier import EnsembleClassifier from mapie._machine_precision import EPSILON -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.metrics import classification_mean_width_score from mapie.utils import check_alpha_and_n_samples, compute_quantiles diff --git a/mapie/conformity_scores/sets/topk.py b/mapie/conformity_scores/sets/topk.py index cfad29a0a..3ec248b5b 100644 --- a/mapie/conformity_scores/sets/topk.py +++ b/mapie/conformity_scores/sets/topk.py @@ -9,7 +9,7 @@ from mapie.estimator.classifier import EnsembleClassifier from mapie._machine_precision import EPSILON -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.utils import compute_quantiles diff --git a/mapie/conformity_scores/sets/utils.py b/mapie/conformity_scores/sets/utils.py index 5912607fb..46ad064cc 100644 --- a/mapie/conformity_scores/sets/utils.py +++ b/mapie/conformity_scores/sets/utils.py @@ -1,7 +1,7 @@ from typing import Optional, Union import numpy as np -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie._machine_precision import EPSILON diff --git a/mapie/conformity_scores/utils.py b/mapie/conformity_scores/utils.py index 59f171d93..d0271f40f 100644 --- a/mapie/conformity_scores/utils.py +++ b/mapie/conformity_scores/utils.py @@ -12,7 +12,7 @@ RAPSConformityScore, TopKConformityScore ) -from mapie._typing import ArrayLike +from numpy.typing import ArrayLike METHOD_SCORE_MAP = { diff --git a/mapie/control_risk/ltt.py b/mapie/control_risk/ltt.py index 67686df54..9b7d7e124 100644 --- a/mapie/control_risk/ltt.py +++ b/mapie/control_risk/ltt.py @@ -3,7 +3,7 @@ import numpy as np -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from .p_values import compute_hoeffdding_bentkus_p_value diff --git a/mapie/control_risk/p_values.py b/mapie/control_risk/p_values.py index 63623f3e5..81800cd5b 100644 --- a/mapie/control_risk/p_values.py +++ b/mapie/control_risk/p_values.py @@ -3,7 +3,7 @@ import numpy as np from scipy.stats import binom -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.utils import check_alpha diff --git a/mapie/control_risk/risks.py b/mapie/control_risk/risks.py index 76bbf6c7b..490be62a6 100644 --- a/mapie/control_risk/risks.py +++ b/mapie/control_risk/risks.py @@ -3,7 +3,7 @@ import numpy as np from sklearn.utils.validation import column_or_1d -from mapie._typing import NDArray +from numpy.typing import NDArray def compute_risk_recall( diff --git a/mapie/estimator/classifier.py b/mapie/estimator/classifier.py index 9cd45e64e..e5eeb5a64 100644 --- a/mapie/estimator/classifier.py +++ b/mapie/estimator/classifier.py @@ -9,7 +9,7 @@ from sklearn.utils import _safe_indexing from sklearn.utils.validation import _num_samples, check_is_fitted -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.utils import check_no_agg_cv, fit_estimator, fix_number_of_classes diff --git a/mapie/estimator/regressor.py b/mapie/estimator/regressor.py index a5c8c0fb2..be03fe4dc 100644 --- a/mapie/estimator/regressor.py +++ b/mapie/estimator/regressor.py @@ -9,7 +9,7 @@ from sklearn.utils import _safe_indexing, deprecated from sklearn.utils.validation import _num_samples, check_is_fitted -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.aggregation_functions import aggregate_all, phi2D from mapie.utils import (check_nan_in_aposteriori_prediction, check_no_agg_cv, fit_estimator) diff --git a/mapie/metrics.py b/mapie/metrics.py index 9990f4cb9..97d9d2ee7 100644 --- a/mapie/metrics.py +++ b/mapie/metrics.py @@ -6,7 +6,7 @@ from sklearn.utils.validation import check_array, column_or_1d from ._machine_precision import EPSILON -from ._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from .utils import (calc_bins, check_alpha, check_array_inf, check_array_nan, check_array_shape_classification, check_split_strategy, check_array_shape_regression, check_arrays_length, diff --git a/mapie/mondrian.py b/mapie/mondrian.py index d461a8498..564816583 100644 --- a/mapie/mondrian.py +++ b/mapie/mondrian.py @@ -24,7 +24,7 @@ MapieTimeSeriesRegressor ) from mapie.utils import check_alpha -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray class MondrianCP(BaseEstimator): diff --git a/mapie/multi_label_classification.py b/mapie/multi_label_classification.py index e47a8e5e5..01a9130a4 100644 --- a/mapie/multi_label_classification.py +++ b/mapie/multi_label_classification.py @@ -14,7 +14,7 @@ from sklearn.utils.validation import (_check_y, _num_samples, check_is_fitted, indexable) -from ._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from .control_risk.crc_rcps import find_lambda_star, get_r_hat_plus from .control_risk.ltt import find_lambda_control_star, ltt_procedure from .control_risk.risks import compute_risk_precision, compute_risk_recall diff --git a/mapie/regression/quantile_regression.py b/mapie/regression/quantile_regression.py index 1b18731ff..ec62b3026 100644 --- a/mapie/regression/quantile_regression.py +++ b/mapie/regression/quantile_regression.py @@ -11,8 +11,7 @@ from sklearn.utils.validation import (_check_y, _num_samples, check_is_fitted, indexable) -from mapie._compatibility import np_quantile -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.utils import (check_alpha_and_n_samples, check_defined_variables_predict_cqr, check_estimator_fit_predict, check_lower_upper_bounds, @@ -745,17 +744,17 @@ def predict( if symmetry: quantile = np.full( 2, - np_quantile( + np.quantile( self.conformity_scores_[2], q, method="higher" ) ) else: quantile = np.array( [ - np_quantile( + np.quantile( self.conformity_scores_[0], q, method="higher" ), - np_quantile( + np.quantile( self.conformity_scores_[1], q, method="higher" ) ] diff --git a/mapie/regression/regression.py b/mapie/regression/regression.py index 0a9025d44..88963dd39 100644 --- a/mapie/regression/regression.py +++ b/mapie/regression/regression.py @@ -10,7 +10,7 @@ from sklearn.utils import check_random_state from sklearn.utils.validation import _check_y, check_is_fitted, indexable -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.conformity_scores import (BaseRegressionScore, ResidualNormalisedScore) from mapie.conformity_scores.utils import check_regression_conformity_score diff --git a/mapie/regression/time_series_regression.py b/mapie/regression/time_series_regression.py index e4e6f5520..3d74e2fec 100644 --- a/mapie/regression/time_series_regression.py +++ b/mapie/regression/time_series_regression.py @@ -8,7 +8,7 @@ from sklearn.model_selection import BaseCrossValidator from sklearn.utils.validation import check_is_fitted -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.conformity_scores import BaseRegressionScore from mapie.regression import MapieRegressor from mapie.utils import check_alpha, check_gamma diff --git a/mapie/subsample.py b/mapie/subsample.py index 88293bc5e..3bef3c393 100644 --- a/mapie/subsample.py +++ b/mapie/subsample.py @@ -9,7 +9,7 @@ from sklearn.utils import check_random_state, resample from sklearn.utils.validation import _num_samples -from ._typing import NDArray +from numpy.typing import NDArray from .utils import check_n_samples diff --git a/mapie/tests/test_classification.py b/mapie/tests/test_classification.py index d04c3683b..9ea7d6e13 100644 --- a/mapie/tests/test_classification.py +++ b/mapie/tests/test_classification.py @@ -22,7 +22,7 @@ from sklearn.utils.validation import check_is_fitted from typing_extensions import TypedDict -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.classification import MapieClassifier from mapie.conformity_scores import LACConformityScore from mapie.conformity_scores.utils import METHOD_SCORE_MAP diff --git a/mapie/tests/test_common.py b/mapie/tests/test_common.py index 328350135..557da1a76 100644 --- a/mapie/tests/test_common.py +++ b/mapie/tests/test_common.py @@ -11,7 +11,7 @@ from sklearn.utils.estimator_checks import parametrize_with_checks from sklearn.utils.validation import check_is_fitted -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.classification import MapieClassifier from mapie.regression import MapieQuantileRegressor, MapieRegressor diff --git a/mapie/tests/test_conformity_scores_bounds.py b/mapie/tests/test_conformity_scores_bounds.py index bd7b9209d..ac30e7a57 100644 --- a/mapie/tests/test_conformity_scores_bounds.py +++ b/mapie/tests/test_conformity_scores_bounds.py @@ -5,7 +5,7 @@ from sklearn.pipeline import Pipeline from sklearn.preprocessing import PolynomialFeatures -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.conformity_scores import ( AbsoluteConformityScore, BaseRegressionScore, GammaConformityScore, ResidualNormalisedScore diff --git a/mapie/tests/test_conformity_scores_sets.py b/mapie/tests/test_conformity_scores_sets.py index f8aa1e9ab..02b86032a 100644 --- a/mapie/tests/test_conformity_scores_sets.py +++ b/mapie/tests/test_conformity_scores_sets.py @@ -5,7 +5,7 @@ from sklearn.datasets import make_classification from sklearn.linear_model import LogisticRegression -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.classification import MapieClassifier from mapie.conformity_scores import BaseClassificationScore from mapie.conformity_scores.sets import ( diff --git a/mapie/tests/test_conformity_scores_utils.py b/mapie/tests/test_conformity_scores_utils.py index 9d07fa8bc..4636d2396 100644 --- a/mapie/tests/test_conformity_scores_utils.py +++ b/mapie/tests/test_conformity_scores_utils.py @@ -4,7 +4,7 @@ import pytest from mapie.conformity_scores.sets.utils import get_true_label_position -from mapie._typing import NDArray +from numpy.typing import NDArray Y_TRUE_PROBA_PLACE = [ [ diff --git a/mapie/tests/test_control_risk.py b/mapie/tests/test_control_risk.py index f1171335b..66eaab09f 100644 --- a/mapie/tests/test_control_risk.py +++ b/mapie/tests/test_control_risk.py @@ -7,7 +7,7 @@ import numpy as np import pytest -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.control_risk.ltt import find_lambda_control_star, ltt_procedure from mapie.control_risk.p_values import compute_hoeffdding_bentkus_p_value from mapie.control_risk.risks import (compute_risk_precision, diff --git a/mapie/tests/test_metrics.py b/mapie/tests/test_metrics.py index 5607c2b98..ec05bc652 100644 --- a/mapie/tests/test_metrics.py +++ b/mapie/tests/test_metrics.py @@ -8,7 +8,7 @@ from numpy.random import RandomState from typing_extensions import TypedDict -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.metrics import (add_jitter, classification_coverage_score, classification_coverage_score_v2, classification_mean_width_score, classification_ssc, diff --git a/mapie/tests/test_multi_label_classification.py b/mapie/tests/test_multi_label_classification.py index ad21c027a..4ce0021e2 100644 --- a/mapie/tests/test_multi_label_classification.py +++ b/mapie/tests/test_multi_label_classification.py @@ -13,7 +13,7 @@ from sklearn.utils.validation import check_is_fitted from typing_extensions import TypedDict -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.multi_label_classification import MapieMultiLabelClassifier Params = TypedDict( diff --git a/mapie/tests/test_quantile_regression.py b/mapie/tests/test_quantile_regression.py index ca463ae51..8b017e8dd 100644 --- a/mapie/tests/test_quantile_regression.py +++ b/mapie/tests/test_quantile_regression.py @@ -18,7 +18,7 @@ from sklearn.utils.validation import check_is_fitted from typing_extensions import TypedDict -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.metrics import regression_coverage_score from mapie.regression import MapieQuantileRegressor diff --git a/mapie/tests/test_regression.py b/mapie/tests/test_regression.py index bcf34c7e4..6a298c215 100644 --- a/mapie/tests/test_regression.py +++ b/mapie/tests/test_regression.py @@ -24,7 +24,7 @@ from sklearn.utils.validation import check_is_fitted from typing_extensions import TypedDict -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.aggregation_functions import aggregate_all from mapie.conformity_scores import ( AbsoluteConformityScore, BaseRegressionScore, GammaConformityScore, diff --git a/mapie/tests/test_time_series_regression.py b/mapie/tests/test_time_series_regression.py index bc594a435..a4220ee09 100644 --- a/mapie/tests/test_time_series_regression.py +++ b/mapie/tests/test_time_series_regression.py @@ -10,7 +10,7 @@ from sklearn.utils.estimator_checks import check_estimator from typing_extensions import TypedDict -from mapie._typing import NDArray +from numpy.typing import NDArray from mapie.aggregation_functions import aggregate_all from mapie.conformity_scores import AbsoluteConformityScore from mapie.metrics import regression_coverage_score diff --git a/mapie/tests/test_utils.py b/mapie/tests/test_utils.py index 871a3af16..057ee0335 100644 --- a/mapie/tests/test_utils.py +++ b/mapie/tests/test_utils.py @@ -13,7 +13,7 @@ ShuffleSplit) from sklearn.utils.validation import check_is_fitted -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.regression import MapieQuantileRegressor from mapie.utils import (check_alpha, check_alpha_and_n_samples, check_array_inf, check_array_nan, check_arrays_length, diff --git a/mapie/utils.py b/mapie/utils.py index b7fbf0047..b40e9fb22 100644 --- a/mapie/utils.py +++ b/mapie/utils.py @@ -15,8 +15,7 @@ from sklearn.utils.validation import (_check_sample_weight, _num_features, check_is_fitted, column_or_1d) -from ._compatibility import np_quantile -from ._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray SPLIT_STRATEGIES = ["uniform", "quantile", "array split"] @@ -718,7 +717,7 @@ def compute_quantiles(vector: NDArray, alpha: NDArray) -> NDArray: if len(vector.shape) <= 2: quantiles_ = np.stack( [ - np_quantile( + np.quantile( vector, ((n + 1) * (1 - _alpha)) / n, method="higher", diff --git a/mapie_v1/classification.py b/mapie_v1/classification.py index 35b0ebf56..aeb35847c 100644 --- a/mapie_v1/classification.py +++ b/mapie_v1/classification.py @@ -8,7 +8,7 @@ from sklearn.model_selection import BaseCrossValidator from sklearn.linear_model import LogisticRegression -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.classification import MapieClassifier from mapie.conformity_scores import BaseClassificationScore from mapie_v1.utils import ( diff --git a/mapie_v1/regression.py b/mapie_v1/regression.py index f2b18963d..cf34f0dee 100644 --- a/mapie_v1/regression.py +++ b/mapie_v1/regression.py @@ -8,7 +8,7 @@ from sklearn.pipeline import Pipeline from mapie.subsample import Subsample -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.conformity_scores import BaseRegressionScore from mapie.regression import MapieRegressor, MapieQuantileRegressor from mapie.utils import check_estimator_fit_predict diff --git a/mapie_v1/utils.py b/mapie_v1/utils.py index 1afa0257d..1deec7dcd 100644 --- a/mapie_v1/utils.py +++ b/mapie_v1/utils.py @@ -2,7 +2,7 @@ from typing import Union, Tuple, cast, Optional, Iterable from collections.abc import Iterable as IterableType -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from sklearn.model_selection import BaseCrossValidator from sklearn.model_selection import train_test_split from decimal import Decimal diff --git a/pyproject.toml b/pyproject.toml index a00f28078..abdd14598 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,12 +16,11 @@ maintainers = [ {name = "Louis Lacombe", email = "louis.lacombe@capgemini.com"}, {name = "Vincent Blot", email = "vincent.blot@capgemini.com"}, ] -requires-python = ">=3.7" +requires-python = ">=3.9" dependencies = [ "scikit-learn<1.6.0", "scipy", - "numpy>=1.21", - "packaging" + "numpy>=1.22" ] classifiers = [ "Intended Audience :: Science/Research", diff --git a/tests_v1/test_functional/test_non_regression_classification.py b/tests_v1/test_functional/test_non_regression_classification.py index eb6fbaf9f..db762b392 100644 --- a/tests_v1/test_functional/test_non_regression_classification.py +++ b/tests_v1/test_functional/test_non_regression_classification.py @@ -16,7 +16,7 @@ DummyClassifierWithFitAndPredictParams, train_test_split_shuffle, ) -from mapie._typing import ArrayLike +from numpy.typing import ArrayLike RANDOM_STATE = 1 diff --git a/tests_v1/test_functional/test_non_regression_regression.py b/tests_v1/test_functional/test_non_regression_regression.py index 5a3d22f5a..28799687f 100644 --- a/tests_v1/test_functional/test_non_regression_regression.py +++ b/tests_v1/test_functional/test_non_regression_regression.py @@ -12,7 +12,7 @@ from sklearn.model_selection import train_test_split from mapie.subsample import Subsample -from mapie._typing import ArrayLike, NDArray +from numpy.typing import ArrayLike, NDArray from mapie.conformity_scores import GammaConformityScore, \ AbsoluteConformityScore, ResidualNormalisedScore from mapie_v1.regression import SplitConformalRegressor, \ diff --git a/tests_v1/test_functional/utils.py b/tests_v1/test_functional/utils.py index bd41315e8..576f3054d 100644 --- a/tests_v1/test_functional/utils.py +++ b/tests_v1/test_functional/utils.py @@ -4,7 +4,7 @@ from sklearn.base import BaseEstimator, ClassifierMixin from typing_extensions import Self -from mapie._typing import NDArray, ArrayLike +from numpy.typing import NDArray, ArrayLike import inspect from sklearn.model_selection import ShuffleSplit