From 9f5dad1c630cd0246c90e911bb388d695e6dddf2 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Sat, 3 Dec 2022 13:25:31 +0100 Subject: [PATCH] MAINT use isort for imports --- .pre-commit-config.yaml | 4 ++ azure-pipelines.yml | 5 +- conftest.py | 1 + doc/conf.py | 2 +- doc/sphinxext/github_link.py | 4 +- examples/api/plot_sampling_strategy_usage.py | 1 + .../plot_impact_imbalanced_classes.py | 14 +++--- .../plot_multi_class_under_sampling.py | 4 +- .../applications/plot_outlier_rejections.py | 5 +- .../plot_over_sampling_benchmark_lfw.py | 7 +-- .../applications/plot_topic_classication.py | 3 +- .../porto_seguro_keras_under_sampling.py | 19 +++----- examples/combine/plot_comparison_combine.py | 6 ++- examples/ensemble/plot_bagging_classifier.py | 5 +- .../plot_comparison_ensemble_classifier.py | 7 ++- .../evaluation/plot_classification_report.py | 2 +- examples/evaluation/plot_metrics.py | 8 ++-- .../model_selection/plot_validation_curve.py | 3 +- .../plot_comparison_over_sampling.py | 8 ++-- .../plot_illustration_generation_sample.py | 2 +- .../over-sampling/plot_shrinkage_effect.py | 1 + .../pipeline/plot_pipeline_classification.py | 3 +- .../plot_comparison_under_sampling.py | 5 +- imblearn/__init__.py | 23 +++++----- imblearn/base.py | 4 +- imblearn/combine/_smote_enn.py | 6 +-- imblearn/combine/_smote_tomek.py | 6 +-- imblearn/combine/tests/test_smote_enn.py | 8 ++-- imblearn/combine/tests/test_smote_tomek.py | 6 +-- imblearn/datasets/__init__.py | 1 - imblearn/datasets/_zenodo.py | 8 ++-- imblearn/datasets/tests/test_imbalance.py | 3 +- imblearn/datasets/tests/test_zenodo.py | 2 +- imblearn/ensemble/__init__.py | 2 +- imblearn/ensemble/_bagging.py | 6 +-- imblearn/ensemble/_easy_ensemble.py | 11 ++--- imblearn/ensemble/_forest.py | 23 ++++------ imblearn/ensemble/_weight_boosting.py | 5 +- imblearn/ensemble/tests/test_bagging.py | 25 +++++----- imblearn/ensemble/tests/test_easy_ensemble.py | 13 ++---- imblearn/ensemble/tests/test_forest.py | 12 ++--- .../ensemble/tests/test_weight_boosting.py | 8 ++-- imblearn/keras/__init__.py | 3 +- imblearn/keras/_generator.py | 3 +- imblearn/keras/tests/test_generator.py | 13 ++---- imblearn/metrics/__init__.py | 16 ++++--- imblearn/metrics/_classification.py | 12 ++--- imblearn/metrics/tests/test_classification.py | 46 +++++++++++-------- imblearn/metrics/tests/test_pairwise.py | 1 - imblearn/metrics/tests/test_score_objects.py | 14 +++--- imblearn/over_sampling/__init__.py | 7 +-- imblearn/over_sampling/_adasyn.py | 12 ++--- .../over_sampling/_random_over_sampler.py | 8 ++-- imblearn/over_sampling/_smote/__init__.py | 9 +--- imblearn/over_sampling/_smote/base.py | 20 ++++---- imblearn/over_sampling/_smote/cluster.py | 7 +-- imblearn/over_sampling/_smote/filter.py | 13 ++---- .../_smote/tests/test_borderline_smote.py | 6 +-- .../_smote/tests/test_kmeans_smote.py | 13 ++---- .../over_sampling/_smote/tests/test_smote.py | 5 +- .../_smote/tests/test_smote_nc.py | 7 +-- .../_smote/tests/test_svm_smote.py | 7 +-- imblearn/over_sampling/tests/test_adasyn.py | 6 +-- imblearn/over_sampling/tests/test_common.py | 6 +-- .../tests/test_random_over_sampler.py | 9 ++-- imblearn/tensorflow/_generator.py | 4 +- imblearn/tensorflow/tests/test_generator.py | 6 +-- imblearn/tests/test_base.py | 13 ++---- imblearn/tests/test_common.py | 15 +++--- imblearn/tests/test_docstring_parameters.py | 17 +++---- imblearn/tests/test_pipeline.py | 31 ++++++------- imblearn/under_sampling/__init__.py | 23 +++++----- .../_cluster_centroids.py | 3 +- .../tests/test_cluster_centroids.py | 5 +- .../_prototype_selection/__init__.py | 18 ++++---- .../_condensed_nearest_neighbour.py | 9 ++-- .../_edited_nearest_neighbours.py | 7 +-- .../_instance_hardness_threshold.py | 12 ++--- .../_prototype_selection/_nearmiss.py | 6 +-- .../_neighbourhood_cleaning_rule.py | 9 ++-- .../_one_sided_selection.py | 10 ++-- .../_random_under_sampler.py | 9 ++-- .../_prototype_selection/_tomek_links.py | 2 +- .../_prototype_selection/tests/test_allknn.py | 7 ++- .../tests/test_condensed_nearest_neighbour.py | 5 +- .../tests/test_edited_nearest_neighbours.py | 6 +-- .../tests/test_instance_hardness_threshold.py | 7 +-- .../tests/test_nearmiss.py | 5 +- .../tests/test_neighbourhood_cleaning_rule.py | 3 +- .../tests/test_one_sided_selection.py | 5 +- .../tests/test_random_under_sampler.py | 1 - ...test_repeated_edited_nearest_neighbours.py | 5 +- imblearn/utils/__init__.py | 9 ++-- imblearn/utils/_show_versions.py | 2 +- imblearn/utils/_validation.py | 3 +- imblearn/utils/estimator_checks.py | 22 ++++----- imblearn/utils/fixes.py | 1 - imblearn/utils/testing.py | 1 - imblearn/utils/tests/test_docstring.py | 3 +- imblearn/utils/tests/test_estimator_checks.py | 19 ++++---- imblearn/utils/tests/test_min_dependencies.py | 3 +- imblearn/utils/tests/test_show_versions.py | 3 +- imblearn/utils/tests/test_testing.py | 6 +-- imblearn/utils/tests/test_validation.py | 19 ++++---- maint_tools/test_docstring.py | 6 +-- pyproject.toml | 3 ++ 106 files changed, 386 insertions(+), 491 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6519a8498..0f1caa607 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,3 +20,7 @@ repos: - id: mypy files: sklearn/ additional_dependencies: [pytest==6.2.4] +- repo: https://github.com/PyCQA/isort + rev: 5.10.1 + hooks: + - id: isort diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e733ed93f..2c5ec9af2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -45,11 +45,14 @@ jobs: versionSpec: '3.9' - bash: | # Include pytest compatibility with mypy - pip install pytest flake8 mypy==0.782 black==22.3 + pip install pytest flake8 mypy==0.782 black==22.3 isort displayName: Install linters - bash: | black --check --diff . displayName: Run black + - bash: | + isort --check --diff . + displayName: Run isort - bash: | ./build_tools/azure/linting.sh displayName: Run linting diff --git a/conftest.py b/conftest.py index f771096cd..45a5ce679 100644 --- a/conftest.py +++ b/conftest.py @@ -6,6 +6,7 @@ # rather than the one from site-packages. import os + import pytest diff --git a/doc/conf.py b/doc/conf.py index 3fe844a99..bfb9e9546 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -15,8 +15,8 @@ import os import sys from datetime import datetime -from pathlib import Path from io import StringIO +from pathlib import Path # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the diff --git a/doc/sphinxext/github_link.py b/doc/sphinxext/github_link.py index 44d3bcd97..8f63a39a8 100644 --- a/doc/sphinxext/github_link.py +++ b/doc/sphinxext/github_link.py @@ -1,9 +1,9 @@ -from operator import attrgetter import inspect -import subprocess import os +import subprocess import sys from functools import partial +from operator import attrgetter REVISION_CMD = "git rev-parse --short HEAD" diff --git a/examples/api/plot_sampling_strategy_usage.py b/examples/api/plot_sampling_strategy_usage.py index 290e22763..ecb881fbb 100644 --- a/examples/api/plot_sampling_strategy_usage.py +++ b/examples/api/plot_sampling_strategy_usage.py @@ -26,6 +26,7 @@ # %% from sklearn.datasets import load_iris + from imblearn.datasets import make_imbalance iris = load_iris(as_frame=True) diff --git a/examples/applications/plot_impact_imbalanced_classes.py b/examples/applications/plot_impact_imbalanced_classes.py index 40db83a11..4e18e7256 100644 --- a/examples/applications/plot_impact_imbalanced_classes.py +++ b/examples/applications/plot_impact_imbalanced_classes.py @@ -60,9 +60,10 @@ # As a baseline, we could use a classifier which will always predict the # majority class independently of the features provided. +from sklearn.dummy import DummyClassifier + # %% from sklearn.model_selection import cross_validate -from sklearn.dummy import DummyClassifier dummy_clf = DummyClassifier(strategy="most_frequent") scoring = ["accuracy", "balanced_accuracy"] @@ -121,9 +122,8 @@ # %% from sklearn.impute import SimpleImputer -from sklearn.preprocessing import StandardScaler -from sklearn.preprocessing import OneHotEncoder from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import OneHotEncoder, StandardScaler num_pipe = make_pipeline( StandardScaler(), SimpleImputer(strategy="mean", add_indicator=True) @@ -139,8 +139,8 @@ # numerical pipeline # %% -from sklearn.compose import make_column_transformer from sklearn.compose import make_column_selector as selector +from sklearn.compose import make_column_transformer preprocessor_linear = make_column_transformer( (num_pipe, selector(dtype_include="number")), @@ -176,9 +176,10 @@ # classifier, we will not need to scale the numerical data, and we will only # need to ordinal encode the categorical data. +from sklearn.ensemble import RandomForestClassifier + # %% from sklearn.preprocessing import OrdinalEncoder -from sklearn.ensemble import RandomForestClassifier num_pipe = SimpleImputer(strategy="mean", add_indicator=True) cat_pipe = make_pipeline( @@ -336,8 +337,9 @@ # applying a single random under-sampling. We will use a gradient-boosting # classifier within a :class:`~imblearn.ensemble.BalancedBaggingClassifier`. -from sklearn.experimental import enable_hist_gradient_boosting # noqa from sklearn.ensemble import HistGradientBoostingClassifier +from sklearn.experimental import enable_hist_gradient_boosting # noqa + from imblearn.ensemble import BalancedBaggingClassifier bag_clf = make_pipeline( diff --git a/examples/applications/plot_multi_class_under_sampling.py b/examples/applications/plot_multi_class_under_sampling.py index 3fb5884d6..7dc2d8465 100644 --- a/examples/applications/plot_multi_class_under_sampling.py +++ b/examples/applications/plot_multi_class_under_sampling.py @@ -20,9 +20,9 @@ from sklearn.preprocessing import StandardScaler from imblearn.datasets import make_imbalance -from imblearn.under_sampling import NearMiss -from imblearn.pipeline import make_pipeline from imblearn.metrics import classification_report_imbalanced +from imblearn.pipeline import make_pipeline +from imblearn.under_sampling import NearMiss print(__doc__) diff --git a/examples/applications/plot_outlier_rejections.py b/examples/applications/plot_outlier_rejections.py index 059e6f3b1..55f03e273 100644 --- a/examples/applications/plot_outlier_rejections.py +++ b/examples/applications/plot_outlier_rejections.py @@ -13,10 +13,9 @@ # Authors: Guillaume Lemaitre # License: MIT -import numpy as np import matplotlib.pyplot as plt - -from sklearn.datasets import make_moons, make_blobs +import numpy as np +from sklearn.datasets import make_blobs, make_moons from sklearn.ensemble import IsolationForest from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report diff --git a/examples/applications/plot_over_sampling_benchmark_lfw.py b/examples/applications/plot_over_sampling_benchmark_lfw.py index 67fc89640..3de32cf9d 100644 --- a/examples/applications/plot_over_sampling_benchmark_lfw.py +++ b/examples/applications/plot_over_sampling_benchmark_lfw.py @@ -72,11 +72,12 @@ # # We will create different pipelines and evaluate them. +from sklearn.neighbors import KNeighborsClassifier + # %% from imblearn import FunctionSampler -from imblearn.over_sampling import ADASYN, RandomOverSampler, SMOTE +from imblearn.over_sampling import ADASYN, SMOTE, RandomOverSampler from imblearn.pipeline import make_pipeline -from sklearn.neighbors import KNeighborsClassifier classifier = KNeighborsClassifier(n_neighbors=3) @@ -98,7 +99,7 @@ # cross-validation. # %% -from sklearn.metrics import RocCurveDisplay, roc_curve, auc +from sklearn.metrics import RocCurveDisplay, auc, roc_curve disp = [] for model in pipeline: diff --git a/examples/applications/plot_topic_classication.py b/examples/applications/plot_topic_classication.py index cf667cda0..0663e399e 100644 --- a/examples/applications/plot_topic_classication.py +++ b/examples/applications/plot_topic_classication.py @@ -87,9 +87,10 @@ # :class:`~imblearn.pipeline.make_pipeline` function implemented in # imbalanced-learn to properly handle the samplers. +from imblearn.pipeline import make_pipeline as make_pipeline_imb + # %% from imblearn.under_sampling import RandomUnderSampler -from imblearn.pipeline import make_pipeline as make_pipeline_imb model = make_pipeline_imb(TfidfVectorizer(), RandomUnderSampler(), MultinomialNB()) diff --git a/examples/applications/porto_seguro_keras_under_sampling.py b/examples/applications/porto_seguro_keras_under_sampling.py index 021129e3a..9e9550bf9 100644 --- a/examples/applications/porto_seguro_keras_under_sampling.py +++ b/examples/applications/porto_seguro_keras_under_sampling.py @@ -25,8 +25,9 @@ ############################################################################### from collections import Counter -import pandas as pd + import numpy as np +import pandas as pd ############################################################################### # First, you should download the Porto Seguro data set from Kaggle. See the @@ -49,11 +50,9 @@ ############################################################################### from sklearn.compose import ColumnTransformer -from sklearn.pipeline import make_pipeline -from sklearn.preprocessing import OneHotEncoder -from sklearn.preprocessing import StandardScaler -from sklearn.preprocessing import FunctionTransformer from sklearn.impute import SimpleImputer +from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import FunctionTransformer, OneHotEncoder, StandardScaler def convert_float64(X): @@ -95,16 +94,12 @@ def convert_float64(X): os.environ["CUDA_VISIBLE_DEVICES"] = "-1" +from tensorflow.keras.layers import Activation, BatchNormalization, Dense, Dropout + ############################################################################### # Create a neural-network ############################################################################### from tensorflow.keras.models import Sequential -from tensorflow.keras.layers import ( - Activation, - Dense, - Dropout, - BatchNormalization, -) def make_model(n_features): @@ -235,8 +230,8 @@ def fit_predict_balanced_model(X_train, y_train, X_test, y_test): ) df_time = df_time.unstack().reset_index() -import seaborn as sns import matplotlib.pyplot as plt +import seaborn as sns plt.figure() sns.boxplot(y="level_0", x=0, data=df_time) diff --git a/examples/combine/plot_comparison_combine.py b/examples/combine/plot_comparison_combine.py index 7a794547c..48f35aa57 100644 --- a/examples/combine/plot_comparison_combine.py +++ b/examples/combine/plot_comparison_combine.py @@ -102,11 +102,13 @@ def plot_decision_function(X, y, clf, ax): # :class:`~imblearn.combine.SMOTEENN` cleans more noisy data than # :class:`~imblearn.combine.SMOTETomek`. +from sklearn.svm import LinearSVC + +from imblearn.combine import SMOTEENN, SMOTETomek + # %% from imblearn.over_sampling import SMOTE -from imblearn.combine import SMOTEENN, SMOTETomek from imblearn.pipeline import make_pipeline -from sklearn.svm import LinearSVC samplers = [SMOTE(random_state=0), SMOTEENN(random_state=0), SMOTETomek(random_state=0)] diff --git a/examples/ensemble/plot_bagging_classifier.py b/examples/ensemble/plot_bagging_classifier.py index 9e392c506..503684547 100644 --- a/examples/ensemble/plot_bagging_classifier.py +++ b/examples/ensemble/plot_bagging_classifier.py @@ -46,9 +46,10 @@ # :class:`~imblearn.ensemble.BalancedBaggingClassifier` by passing different # sampler. +from sklearn.ensemble import BaggingClassifier + # %% from sklearn.model_selection import cross_validate -from sklearn.ensemble import BaggingClassifier ebb = BaggingClassifier() cv_results = cross_validate(ebb, X, y, scoring="balanced_accuracy") @@ -119,7 +120,9 @@ # %% from collections import Counter + import numpy as np + from imblearn import FunctionSampler diff --git a/examples/ensemble/plot_comparison_ensemble_classifier.py b/examples/ensemble/plot_comparison_ensemble_classifier.py index 65bcf9965..516c7f853 100644 --- a/examples/ensemble/plot_comparison_ensemble_classifier.py +++ b/examples/ensemble/plot_comparison_ensemble_classifier.py @@ -27,9 +27,10 @@ # (number of majority sample for a minority sample). The data are then split # into training and testing. +from sklearn.model_selection import train_test_split + # %% from imblearn.datasets import fetch_datasets -from sklearn.model_selection import train_test_split satimage = fetch_datasets()["satimage"] X, y = satimage.data, satimage.target @@ -55,6 +56,7 @@ # %% from sklearn.metrics import balanced_accuracy_score + from imblearn.metrics import geometric_mean_score print("Decision tree classifier performance:") @@ -83,6 +85,7 @@ # %% from sklearn.ensemble import BaggingClassifier + from imblearn.ensemble import BalancedBaggingClassifier bagging = BaggingClassifier(n_estimators=50, random_state=0) @@ -132,6 +135,7 @@ # %% from sklearn.ensemble import RandomForestClassifier + from imblearn.ensemble import BalancedRandomForestClassifier rf = RandomForestClassifier(n_estimators=50, random_state=0) @@ -180,6 +184,7 @@ # %% from sklearn.ensemble import AdaBoostClassifier + from imblearn.ensemble import EasyEnsembleClassifier, RUSBoostClassifier base_estimator = AdaBoostClassifier(n_estimators=10) diff --git a/examples/evaluation/plot_classification_report.py b/examples/evaluation/plot_classification_report.py index 7823903a8..4723fa812 100644 --- a/examples/evaluation/plot_classification_report.py +++ b/examples/evaluation/plot_classification_report.py @@ -14,9 +14,9 @@ from sklearn import datasets +from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import LinearSVC -from sklearn.model_selection import train_test_split from imblearn import over_sampling as os from imblearn import pipeline as pl diff --git a/examples/evaluation/plot_metrics.py b/examples/evaluation/plot_metrics.py index 5b46145cd..9b319465f 100644 --- a/examples/evaluation/plot_metrics.py +++ b/examples/evaluation/plot_metrics.py @@ -50,12 +50,14 @@ # We will create a pipeline made of a :class:`~imblearn.over_sampling.SMOTE` # over-sampler followed by a :class:`~sklearn.svm.LinearSVC` classifier. -# %% -from imblearn.pipeline import make_pipeline from sklearn.preprocessing import StandardScaler -from imblearn.over_sampling import SMOTE from sklearn.svm import LinearSVC +from imblearn.over_sampling import SMOTE + +# %% +from imblearn.pipeline import make_pipeline + model = make_pipeline( StandardScaler(), SMOTE(random_state=RANDOM_STATE), diff --git a/examples/model_selection/plot_validation_curve.py b/examples/model_selection/plot_validation_curve.py index d928ab79d..78469c09a 100644 --- a/examples/model_selection/plot_validation_curve.py +++ b/examples/model_selection/plot_validation_curve.py @@ -48,10 +48,11 @@ # search which `k_neighbors` parameter is the most adequate with the dataset # that we generated. +from sklearn.tree import DecisionTreeClassifier + # %% from imblearn.over_sampling import SMOTE from imblearn.pipeline import make_pipeline -from sklearn.tree import DecisionTreeClassifier model = make_pipeline( SMOTE(random_state=RANDOM_STATE), DecisionTreeClassifier(random_state=RANDOM_STATE) diff --git a/examples/over-sampling/plot_comparison_over_sampling.py b/examples/over-sampling/plot_comparison_over_sampling.py index 5ed0da22d..1f9dce797 100644 --- a/examples/over-sampling/plot_comparison_over_sampling.py +++ b/examples/over-sampling/plot_comparison_over_sampling.py @@ -134,9 +134,10 @@ def plot_decision_function(X, y, clf, ax, title=None): # class. The class :class:`~imblearn.over_sampling.RandomOverSampler` # implements such of a strategy. +from imblearn.over_sampling import RandomOverSampler + # %% from imblearn.pipeline import make_pipeline -from imblearn.over_sampling import RandomOverSampler X, y = create_dataset(n_samples=100, weights=(0.05, 0.25, 0.7)) @@ -185,7 +186,7 @@ def plot_decision_function(X, y, clf, ax, title=None): # %% from imblearn import FunctionSampler # to use a idendity sampler -from imblearn.over_sampling import SMOTE, ADASYN +from imblearn.over_sampling import ADASYN, SMOTE X, y = create_dataset(n_samples=150, weights=(0.1, 0.2, 0.7)) @@ -261,7 +262,7 @@ def plot_decision_function(X, y, clf, ax, title=None): # density. # %% -from imblearn.over_sampling import BorderlineSMOTE, KMeansSMOTE, SVMSMOTE +from imblearn.over_sampling import SVMSMOTE, BorderlineSMOTE, KMeansSMOTE X, y = create_dataset(n_samples=5000, weights=(0.01, 0.05, 0.94), class_sep=0.8) @@ -292,6 +293,7 @@ def plot_decision_function(X, y, clf, ax, title=None): # %% from collections import Counter + from imblearn.over_sampling import SMOTENC rng = np.random.RandomState(42) diff --git a/examples/over-sampling/plot_illustration_generation_sample.py b/examples/over-sampling/plot_illustration_generation_sample.py index 7e83e7be8..ba081584b 100644 --- a/examples/over-sampling/plot_illustration_generation_sample.py +++ b/examples/over-sampling/plot_illustration_generation_sample.py @@ -14,8 +14,8 @@ # %% print(__doc__) -import numpy as np import matplotlib.pyplot as plt +import numpy as np import seaborn as sns sns.set_context("poster") diff --git a/examples/over-sampling/plot_shrinkage_effect.py b/examples/over-sampling/plot_shrinkage_effect.py index 6e0af4d7e..be3bfc7c5 100644 --- a/examples/over-sampling/plot_shrinkage_effect.py +++ b/examples/over-sampling/plot_shrinkage_effect.py @@ -22,6 +22,7 @@ # First, we will generate a toy classification dataset with only few samples. # The ratio between the classes will be imbalanced. from collections import Counter + from sklearn.datasets import make_classification X, y = make_classification( diff --git a/examples/pipeline/plot_pipeline_classification.py b/examples/pipeline/plot_pipeline_classification.py index b9fee59b7..c19a86c1c 100644 --- a/examples/pipeline/plot_pipeline_classification.py +++ b/examples/pipeline/plot_pipeline_classification.py @@ -43,8 +43,9 @@ # %% from sklearn.decomposition import PCA from sklearn.neighbors import KNeighborsClassifier -from imblearn.under_sampling import EditedNearestNeighbours + from imblearn.over_sampling import SMOTE +from imblearn.under_sampling import EditedNearestNeighbours pca = PCA(n_components=2) enn = EditedNearestNeighbours() diff --git a/examples/under-sampling/plot_comparison_under_sampling.py b/examples/under-sampling/plot_comparison_under_sampling.py index 571db658a..ba6739134 100644 --- a/examples/under-sampling/plot_comparison_under_sampling.py +++ b/examples/under-sampling/plot_comparison_under_sampling.py @@ -103,6 +103,7 @@ def plot_decision_function(X, y, clf, ax, title=None): # %% import matplotlib.pyplot as plt + from imblearn import FunctionSampler from imblearn.pipeline import make_pipeline from imblearn.under_sampling import ClusterCentroids @@ -208,9 +209,9 @@ def plot_decision_function(X, y, clf, ax, title=None): # %% from imblearn.under_sampling import ( + AllKNN, EditedNearestNeighbours, RepeatedEditedNearestNeighbours, - AllKNN, ) X, y = create_dataset(n_samples=500, weights=(0.2, 0.3, 0.5), class_sep=0.8) @@ -249,8 +250,8 @@ def plot_decision_function(X, y, clf, ax, title=None): # %% from imblearn.under_sampling import ( CondensedNearestNeighbour, - OneSidedSelection, NeighbourhoodCleaningRule, + OneSidedSelection, ) X, y = create_dataset(n_samples=500, weights=(0.2, 0.3, 0.5), class_sep=0.8) diff --git a/imblearn/__init__.py b/imblearn/__init__.py index 188b253f2..8a8e7ee2d 100644 --- a/imblearn/__init__.py +++ b/imblearn/__init__.py @@ -49,18 +49,19 @@ # We are not importing the rest of scikit-learn during the build # process, as it may not be compiled yet else: - from . import combine - from . import ensemble - from . import exceptions - from . import metrics - from . import over_sampling - from . import tensorflow - from . import under_sampling - from . import utils - from . import pipeline - - from .base import FunctionSampler + from . import ( + combine, + ensemble, + exceptions, + metrics, + over_sampling, + pipeline, + tensorflow, + under_sampling, + utils, + ) from ._version import __version__ + from .base import FunctionSampler from .utils._show_versions import show_versions # noqa: F401 # FIXME: When we get Python 3.7 as minimal version, we will need to switch to diff --git a/imblearn/base.py b/imblearn/base.py index df4702236..75424341d 100644 --- a/imblearn/base.py +++ b/imblearn/base.py @@ -7,14 +7,12 @@ from abc import ABCMeta, abstractmethod import numpy as np - from sklearn.base import BaseEstimator from sklearn.preprocessing import label_binarize from sklearn.utils.multiclass import check_classification_targets from .utils import check_sampling_strategy, check_target_type -from .utils._validation import ArraysTransformer -from .utils._validation import _deprecate_positional_args +from .utils._validation import ArraysTransformer, _deprecate_positional_args class SamplerMixin(BaseEstimator, metaclass=ABCMeta): diff --git a/imblearn/combine/_smote_enn.py b/imblearn/combine/_smote_enn.py index df84b07c9..b13b47a32 100644 --- a/imblearn/combine/_smote_enn.py +++ b/imblearn/combine/_smote_enn.py @@ -11,10 +11,8 @@ from ..over_sampling import SMOTE from ..over_sampling.base import BaseOverSampler from ..under_sampling import EditedNearestNeighbours -from ..utils import check_target_type -from ..utils import Substitution -from ..utils._docstring import _n_jobs_docstring -from ..utils._docstring import _random_state_docstring +from ..utils import Substitution, check_target_type +from ..utils._docstring import _n_jobs_docstring, _random_state_docstring from ..utils._validation import _deprecate_positional_args diff --git a/imblearn/combine/_smote_tomek.py b/imblearn/combine/_smote_tomek.py index ad2303ff0..80d9675a8 100644 --- a/imblearn/combine/_smote_tomek.py +++ b/imblearn/combine/_smote_tomek.py @@ -12,10 +12,8 @@ from ..over_sampling import SMOTE from ..over_sampling.base import BaseOverSampler from ..under_sampling import TomekLinks -from ..utils import check_target_type -from ..utils import Substitution -from ..utils._docstring import _n_jobs_docstring -from ..utils._docstring import _random_state_docstring +from ..utils import Substitution, check_target_type +from ..utils._docstring import _n_jobs_docstring, _random_state_docstring from ..utils._validation import _deprecate_positional_args diff --git a/imblearn/combine/tests/test_smote_enn.py b/imblearn/combine/tests/test_smote_enn.py index 0162c79b4..97cb6bead 100644 --- a/imblearn/combine/tests/test_smote_enn.py +++ b/imblearn/combine/tests/test_smote_enn.py @@ -3,15 +3,13 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal +import pytest +from sklearn.utils._testing import assert_allclose, assert_array_equal from imblearn.combine import SMOTEENN -from imblearn.under_sampling import EditedNearestNeighbours from imblearn.over_sampling import SMOTE +from imblearn.under_sampling import EditedNearestNeighbours RND_SEED = 0 X = np.array( diff --git a/imblearn/combine/tests/test_smote_tomek.py b/imblearn/combine/tests/test_smote_tomek.py index 91f6f182d..ca3ce98b6 100644 --- a/imblearn/combine/tests/test_smote_tomek.py +++ b/imblearn/combine/tests/test_smote_tomek.py @@ -3,11 +3,9 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal +import pytest +from sklearn.utils._testing import assert_allclose, assert_array_equal from imblearn.combine import SMOTETomek from imblearn.over_sampling import SMOTE diff --git a/imblearn/datasets/__init__.py b/imblearn/datasets/__init__.py index db7ec5405..67eadb13f 100644 --- a/imblearn/datasets/__init__.py +++ b/imblearn/datasets/__init__.py @@ -4,7 +4,6 @@ """ from ._imbalance import make_imbalance - from ._zenodo import fetch_datasets __all__ = ["make_imbalance", "fetch_datasets"] diff --git a/imblearn/datasets/_zenodo.py b/imblearn/datasets/_zenodo.py index 345580252..323317963 100644 --- a/imblearn/datasets/_zenodo.py +++ b/imblearn/datasets/_zenodo.py @@ -43,18 +43,16 @@ # Author: Guillaume Lemaitre # License: BSD 3 clause -from collections import OrderedDict import tarfile +from collections import OrderedDict from io import BytesIO from os import makedirs -from os.path import join, isfile +from os.path import isfile, join from urllib.request import urlopen import numpy as np - from sklearn.datasets import get_data_home -from sklearn.utils import Bunch -from sklearn.utils import check_random_state +from sklearn.utils import Bunch, check_random_state from ..utils._validation import _deprecate_positional_args diff --git a/imblearn/datasets/tests/test_imbalance.py b/imblearn/datasets/tests/test_imbalance.py index 4cf2eedd2..1b98d3aae 100644 --- a/imblearn/datasets/tests/test_imbalance.py +++ b/imblearn/datasets/tests/test_imbalance.py @@ -5,9 +5,8 @@ from collections import Counter -import pytest import numpy as np - +import pytest from sklearn.datasets import load_iris from imblearn.datasets import make_imbalance diff --git a/imblearn/datasets/tests/test_zenodo.py b/imblearn/datasets/tests/test_zenodo.py index 168351e6e..cfd7007a0 100644 --- a/imblearn/datasets/tests/test_zenodo.py +++ b/imblearn/datasets/tests/test_zenodo.py @@ -7,9 +7,9 @@ # License: MIT import pytest +from sklearn.utils._testing import SkipTest from imblearn.datasets import fetch_datasets -from sklearn.utils._testing import SkipTest DATASET_SHAPE = { "ecoli": (336, 7), diff --git a/imblearn/ensemble/__init__.py b/imblearn/ensemble/__init__.py index fdda4e155..4aa9ea7d2 100644 --- a/imblearn/ensemble/__init__.py +++ b/imblearn/ensemble/__init__.py @@ -3,8 +3,8 @@ under-sampled subsets combined inside an ensemble. """ -from ._easy_ensemble import EasyEnsembleClassifier from ._bagging import BalancedBaggingClassifier +from ._easy_ensemble import EasyEnsembleClassifier from ._forest import BalancedRandomForestClassifier from ._weight_boosting import RUSBoostClassifier diff --git a/imblearn/ensemble/_bagging.py b/imblearn/ensemble/_bagging.py index 9afc4fc1d..56b19c06f 100644 --- a/imblearn/ensemble/_bagging.py +++ b/imblearn/ensemble/_bagging.py @@ -9,7 +9,6 @@ import warnings import numpy as np - from sklearn.base import clone from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier @@ -17,9 +16,8 @@ from ..pipeline import Pipeline from ..under_sampling import RandomUnderSampler from ..under_sampling.base import BaseUnderSampler -from ..utils import Substitution, check_target_type, check_sampling_strategy -from ..utils._docstring import _n_jobs_docstring -from ..utils._docstring import _random_state_docstring +from ..utils import Substitution, check_sampling_strategy, check_target_type +from ..utils._docstring import _n_jobs_docstring, _random_state_docstring from ..utils._validation import _deprecate_positional_args diff --git a/imblearn/ensemble/_easy_ensemble.py b/imblearn/ensemble/_easy_ensemble.py index 16030020d..9303af8d4 100644 --- a/imblearn/ensemble/_easy_ensemble.py +++ b/imblearn/ensemble/_easy_ensemble.py @@ -9,18 +9,15 @@ import warnings import numpy as np - from sklearn.base import clone -from sklearn.ensemble import AdaBoostClassifier -from sklearn.ensemble import BaggingClassifier +from sklearn.ensemble import AdaBoostClassifier, BaggingClassifier +from ..pipeline import Pipeline from ..under_sampling import RandomUnderSampler from ..under_sampling.base import BaseUnderSampler -from ..utils import Substitution, check_target_type, check_sampling_strategy -from ..utils._docstring import _n_jobs_docstring -from ..utils._docstring import _random_state_docstring +from ..utils import Substitution, check_sampling_strategy, check_target_type +from ..utils._docstring import _n_jobs_docstring, _random_state_docstring from ..utils._validation import _deprecate_positional_args -from ..pipeline import Pipeline MAX_INT = np.iinfo(np.int32).max diff --git a/imblearn/ensemble/_forest.py b/imblearn/ensemble/_forest.py index 3af09c8f7..e753ef450 100644 --- a/imblearn/ensemble/_forest.py +++ b/imblearn/ensemble/_forest.py @@ -4,26 +4,25 @@ # License: MIT import numbers -from warnings import warn from copy import deepcopy +from warnings import warn import numpy as np +from joblib import Parallel from numpy import float32 as DTYPE from numpy import float64 as DOUBLE from scipy.sparse import issparse - -from joblib import Parallel - from sklearn.base import clone, is_classifier from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble._base import _set_random_states -from sklearn.ensemble._forest import _get_n_samples_bootstrap -from sklearn.ensemble._forest import _parallel_build_trees -from sklearn.ensemble._forest import _generate_unsampled_indices +from sklearn.ensemble._forest import ( + _generate_unsampled_indices, + _get_n_samples_bootstrap, + _parallel_build_trees, +) from sklearn.exceptions import DataConversionWarning from sklearn.tree import DecisionTreeClassifier -from sklearn.utils import check_random_state -from sklearn.utils import _safe_indexing +from sklearn.utils import _safe_indexing, check_random_state from sklearn.utils.fixes import delayed from sklearn.utils.multiclass import type_of_target from sklearn.utils.validation import _check_sample_weight @@ -32,10 +31,8 @@ from ..under_sampling import RandomUnderSampler from ..under_sampling.base import BaseUnderSampler from ..utils import Substitution -from ..utils._docstring import _n_jobs_docstring -from ..utils._docstring import _random_state_docstring -from ..utils._validation import check_sampling_strategy -from ..utils._validation import _deprecate_positional_args +from ..utils._docstring import _n_jobs_docstring, _random_state_docstring +from ..utils._validation import _deprecate_positional_args, check_sampling_strategy MAX_INT = np.iinfo(np.int32).max diff --git a/imblearn/ensemble/_weight_boosting.py b/imblearn/ensemble/_weight_boosting.py index b7fdd2f65..db817e150 100644 --- a/imblearn/ensemble/_weight_boosting.py +++ b/imblearn/ensemble/_weight_boosting.py @@ -4,7 +4,6 @@ from copy import deepcopy import numpy as np - from sklearn.base import clone from sklearn.ensemble import AdaBoostClassifier from sklearn.ensemble._base import _set_random_states @@ -12,9 +11,9 @@ from sklearn.utils import _safe_indexing from sklearn.utils.validation import has_fit_parameter -from ..under_sampling.base import BaseUnderSampler -from ..under_sampling import RandomUnderSampler from ..pipeline import make_pipeline +from ..under_sampling import RandomUnderSampler +from ..under_sampling.base import BaseUnderSampler from ..utils import Substitution, check_target_type from ..utils._docstring import _random_state_docstring from ..utils._validation import _deprecate_positional_args diff --git a/imblearn/ensemble/tests/test_bagging.py b/imblearn/ensemble/tests/test_bagging.py index c398f1ded..c2b580d7f 100644 --- a/imblearn/ensemble/tests/test_bagging.py +++ b/imblearn/ensemble/tests/test_bagging.py @@ -7,30 +7,27 @@ import numpy as np import pytest - import sklearn -from sklearn.datasets import load_iris, make_hastie_10_2, make_classification -from sklearn.model_selection import ( - GridSearchCV, - ParameterGrid, - train_test_split, -) from sklearn.cluster import KMeans +from sklearn.datasets import load_iris, make_classification, make_hastie_10_2 from sklearn.dummy import DummyClassifier -from sklearn.linear_model import Perceptron, LogisticRegression -from sklearn.tree import DecisionTreeClassifier +from sklearn.feature_selection import SelectKBest +from sklearn.linear_model import LogisticRegression, Perceptron +from sklearn.model_selection import GridSearchCV, ParameterGrid, train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import SVC -from sklearn.feature_selection import SelectKBest +from sklearn.tree import DecisionTreeClassifier +from sklearn.utils._testing import ( + assert_allclose, + assert_array_almost_equal, + assert_array_equal, +) from sklearn.utils.fixes import parse_version -from sklearn.utils._testing import assert_array_equal -from sklearn.utils._testing import assert_array_almost_equal -from sklearn.utils._testing import assert_allclose from imblearn import FunctionSampler from imblearn.datasets import make_imbalance from imblearn.ensemble import BalancedBaggingClassifier -from imblearn.over_sampling import RandomOverSampler, SMOTE +from imblearn.over_sampling import SMOTE, RandomOverSampler from imblearn.pipeline import make_pipeline from imblearn.under_sampling import ClusterCentroids, RandomUnderSampler diff --git a/imblearn/ensemble/tests/test_easy_ensemble.py b/imblearn/ensemble/tests/test_easy_ensemble.py index e5d8f6d93..34bf72208 100644 --- a/imblearn/ensemble/tests/test_easy_ensemble.py +++ b/imblearn/ensemble/tests/test_easy_ensemble.py @@ -3,23 +3,20 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - +import pytest import sklearn from sklearn.datasets import load_iris, make_hastie_10_2 from sklearn.ensemble import AdaBoostClassifier -from sklearn.model_selection import train_test_split -from sklearn.model_selection import GridSearchCV from sklearn.feature_selection import SelectKBest +from sklearn.model_selection import GridSearchCV, train_test_split +from sklearn.utils._testing import assert_allclose, assert_array_equal from sklearn.utils.fixes import parse_version -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal -from imblearn.ensemble import EasyEnsembleClassifier from imblearn.datasets import make_imbalance -from imblearn.under_sampling import RandomUnderSampler +from imblearn.ensemble import EasyEnsembleClassifier from imblearn.pipeline import make_pipeline +from imblearn.under_sampling import RandomUnderSampler sklearn_version = parse_version(sklearn.__version__) iris = load_iris() diff --git a/imblearn/ensemble/tests/test_forest.py b/imblearn/ensemble/tests/test_forest.py index 5e35eb43f..8a5077fa8 100644 --- a/imblearn/ensemble/tests/test_forest.py +++ b/imblearn/ensemble/tests/test_forest.py @@ -1,14 +1,10 @@ -import pytest - import numpy as np - +import pytest import sklearn -from sklearn.datasets import make_classification, load_iris -from sklearn.model_selection import GridSearchCV -from sklearn.model_selection import train_test_split +from sklearn.datasets import load_iris, make_classification +from sklearn.model_selection import GridSearchCV, train_test_split +from sklearn.utils._testing import assert_allclose, assert_array_equal from sklearn.utils.fixes import parse_version -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal from imblearn.ensemble import BalancedRandomForestClassifier diff --git a/imblearn/ensemble/tests/test_weight_boosting.py b/imblearn/ensemble/tests/test_weight_boosting.py index c69e39500..93ac8e13d 100644 --- a/imblearn/ensemble/tests/test_weight_boosting.py +++ b/imblearn/ensemble/tests/test_weight_boosting.py @@ -1,13 +1,11 @@ -import pytest - import numpy as np - +import pytest import sklearn -from sklearn.datasets import make_classification, load_iris +from sklearn.datasets import load_iris, make_classification from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier -from sklearn.utils.fixes import parse_version from sklearn.utils._testing import assert_array_equal +from sklearn.utils.fixes import parse_version from imblearn.ensemble import RUSBoostClassifier diff --git a/imblearn/keras/__init__.py b/imblearn/keras/__init__.py index ae6a7df4c..7590c4fb8 100644 --- a/imblearn/keras/__init__.py +++ b/imblearn/keras/__init__.py @@ -1,7 +1,6 @@ """The :mod:`imblearn.keras` provides utilities to deal with imbalanced dataset in keras.""" -from ._generator import BalancedBatchGenerator -from ._generator import balanced_batch_generator +from ._generator import BalancedBatchGenerator, balanced_batch_generator __all__ = ["BalancedBatchGenerator", "balanced_batch_generator"] diff --git a/imblearn/keras/_generator.py b/imblearn/keras/_generator.py index 8841d5ca3..2870ea47b 100644 --- a/imblearn/keras/_generator.py +++ b/imblearn/keras/_generator.py @@ -51,15 +51,14 @@ def import_from_tensforflow(): ParentClass, HAS_KERAS = import_keras() from scipy.sparse import issparse # noqa - from sklearn.base import clone # noqa from sklearn.utils import _safe_indexing # noqa from sklearn.utils import check_random_state # noqa +from ..tensorflow import balanced_batch_generator as tf_bbg # noqa from ..under_sampling import RandomUnderSampler # noqa from ..utils import Substitution # noqa from ..utils._docstring import _random_state_docstring # noqa -from ..tensorflow import balanced_batch_generator as tf_bbg # noqa from ..utils._validation import _deprecate_positional_args # noqa diff --git a/imblearn/keras/tests/test_generator.py b/imblearn/keras/tests/test_generator.py index 30364fdb1..b94671f23 100644 --- a/imblearn/keras/tests/test_generator.py +++ b/imblearn/keras/tests/test_generator.py @@ -1,22 +1,19 @@ -import pytest - import numpy as np +import pytest from scipy import sparse - from sklearn.datasets import load_iris keras = pytest.importorskip("keras") -from keras.models import Sequential # noqa: E402 from keras.layers import Dense # noqa: E402 +from keras.models import Sequential # noqa: E402 from keras.utils.np_utils import to_categorical # noqa: E402 from imblearn.datasets import make_imbalance # noqa: E402 -from imblearn.under_sampling import ClusterCentroids # noqa: E402 -from imblearn.under_sampling import NearMiss # noqa: E402 -from imblearn.over_sampling import RandomOverSampler # noqa: E402 - from imblearn.keras import BalancedBatchGenerator # noqa: E402 from imblearn.keras import balanced_batch_generator # noqa: E402 +from imblearn.over_sampling import RandomOverSampler # noqa: E402 +from imblearn.under_sampling import ClusterCentroids # noqa: E402 +from imblearn.under_sampling import NearMiss # noqa: E402 @pytest.fixture diff --git a/imblearn/metrics/__init__.py b/imblearn/metrics/__init__.py index ffab645a1..a95bab00f 100644 --- a/imblearn/metrics/__init__.py +++ b/imblearn/metrics/__init__.py @@ -3,13 +3,15 @@ metrics and pairwise metrics and distance computations. """ -from ._classification import sensitivity_specificity_support -from ._classification import sensitivity_score -from ._classification import specificity_score -from ._classification import geometric_mean_score -from ._classification import make_index_balanced_accuracy -from ._classification import classification_report_imbalanced -from ._classification import macro_averaged_mean_absolute_error +from ._classification import ( + classification_report_imbalanced, + geometric_mean_score, + macro_averaged_mean_absolute_error, + make_index_balanced_accuracy, + sensitivity_score, + sensitivity_specificity_support, + specificity_score, +) __all__ = [ "sensitivity_specificity_support", diff --git a/imblearn/metrics/_classification.py b/imblearn/metrics/_classification.py index 49a59fadc..bcb0ef225 100644 --- a/imblearn/metrics/_classification.py +++ b/imblearn/metrics/_classification.py @@ -20,17 +20,11 @@ import numpy as np import scipy as sp - -from sklearn.metrics import mean_absolute_error -from sklearn.metrics import precision_recall_fscore_support -from sklearn.metrics._classification import _check_targets -from sklearn.metrics._classification import _prf_divide +from sklearn.metrics import mean_absolute_error, precision_recall_fscore_support +from sklearn.metrics._classification import _check_targets, _prf_divide from sklearn.preprocessing import LabelEncoder from sklearn.utils.multiclass import unique_labels -from sklearn.utils.validation import ( - check_consistent_length, - column_or_1d, -) +from sklearn.utils.validation import check_consistent_length, column_or_1d from ..utils._validation import _deprecate_positional_args diff --git a/imblearn/metrics/tests/test_classification.py b/imblearn/metrics/tests/test_classification.py index f5a273e22..cb9d25309 100644 --- a/imblearn/metrics/tests/test_classification.py +++ b/imblearn/metrics/tests/test_classification.py @@ -7,29 +7,35 @@ from functools import partial import numpy as np - import pytest - -from sklearn import datasets -from sklearn import svm - +from sklearn import datasets, svm +from sklearn.metrics import ( + accuracy_score, + average_precision_score, + brier_score_loss, + cohen_kappa_score, + jaccard_score, + precision_score, + recall_score, + roc_auc_score, +) from sklearn.preprocessing import label_binarize +from sklearn.utils._testing import ( + assert_allclose, + assert_array_equal, + assert_no_warnings, +) from sklearn.utils.validation import check_random_state -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal -from sklearn.utils._testing import assert_no_warnings -from sklearn.metrics import accuracy_score, average_precision_score -from sklearn.metrics import brier_score_loss, cohen_kappa_score -from sklearn.metrics import jaccard_score, precision_score -from sklearn.metrics import recall_score, roc_auc_score - -from imblearn.metrics import sensitivity_specificity_support -from imblearn.metrics import sensitivity_score -from imblearn.metrics import specificity_score -from imblearn.metrics import geometric_mean_score -from imblearn.metrics import make_index_balanced_accuracy -from imblearn.metrics import classification_report_imbalanced -from imblearn.metrics import macro_averaged_mean_absolute_error + +from imblearn.metrics import ( + classification_report_imbalanced, + geometric_mean_score, + macro_averaged_mean_absolute_error, + make_index_balanced_accuracy, + sensitivity_score, + sensitivity_specificity_support, + specificity_score, +) RND_SEED = 42 R_TOL = 1e-2 diff --git a/imblearn/metrics/tests/test_pairwise.py b/imblearn/metrics/tests/test_pairwise.py index 7c8b30e9e..d72459125 100644 --- a/imblearn/metrics/tests/test_pairwise.py +++ b/imblearn/metrics/tests/test_pairwise.py @@ -5,7 +5,6 @@ import numpy as np import pytest - from sklearn.exceptions import NotFittedError from sklearn.preprocessing import LabelEncoder, OrdinalEncoder from sklearn.utils._testing import _convert_container diff --git a/imblearn/metrics/tests/test_score_objects.py b/imblearn/metrics/tests/test_score_objects.py index 88c7d2c93..c77a46169 100644 --- a/imblearn/metrics/tests/test_score_objects.py +++ b/imblearn/metrics/tests/test_score_objects.py @@ -4,17 +4,17 @@ # License: MIT import pytest - from sklearn.datasets import make_blobs from sklearn.metrics import make_scorer +from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.svm import LinearSVC -from sklearn.model_selection import train_test_split -from sklearn.model_selection import GridSearchCV -from imblearn.metrics import sensitivity_score -from imblearn.metrics import specificity_score -from imblearn.metrics import geometric_mean_score -from imblearn.metrics import make_index_balanced_accuracy +from imblearn.metrics import ( + geometric_mean_score, + make_index_balanced_accuracy, + sensitivity_score, + specificity_score, +) R_TOL = 1e-2 diff --git a/imblearn/over_sampling/__init__.py b/imblearn/over_sampling/__init__.py index a959cbb43..6dd0ef554 100644 --- a/imblearn/over_sampling/__init__.py +++ b/imblearn/over_sampling/__init__.py @@ -5,12 +5,7 @@ from ._adasyn import ADASYN from ._random_over_sampler import RandomOverSampler -from ._smote import SMOTE -from ._smote import BorderlineSMOTE -from ._smote import KMeansSMOTE -from ._smote import SVMSMOTE -from ._smote import SMOTENC -from ._smote import SMOTEN +from ._smote import SMOTE, SMOTEN, SMOTENC, SVMSMOTE, BorderlineSMOTE, KMeansSMOTE __all__ = [ "ADASYN", diff --git a/imblearn/over_sampling/_adasyn.py b/imblearn/over_sampling/_adasyn.py index a0f4383ed..caaa4b91d 100644 --- a/imblearn/over_sampling/_adasyn.py +++ b/imblearn/over_sampling/_adasyn.py @@ -8,16 +8,12 @@ import numpy as np from scipy import sparse +from sklearn.utils import _safe_indexing, check_random_state -from sklearn.utils import check_random_state -from sklearn.utils import _safe_indexing - -from .base import BaseOverSampler -from ..utils import check_neighbors_object -from ..utils import Substitution -from ..utils._docstring import _n_jobs_docstring -from ..utils._docstring import _random_state_docstring +from ..utils import Substitution, check_neighbors_object +from ..utils._docstring import _n_jobs_docstring, _random_state_docstring from ..utils._validation import _deprecate_positional_args +from .base import BaseOverSampler @Substitution( diff --git a/imblearn/over_sampling/_random_over_sampler.py b/imblearn/over_sampling/_random_over_sampler.py index 6323e04da..bd7f4026c 100644 --- a/imblearn/over_sampling/_random_over_sampler.py +++ b/imblearn/over_sampling/_random_over_sampler.py @@ -9,15 +9,13 @@ import numpy as np from scipy import sparse -from sklearn.utils import check_array, check_random_state -from sklearn.utils import _safe_indexing +from sklearn.utils import _safe_indexing, check_array, check_random_state from sklearn.utils.sparsefuncs import mean_variance_axis -from .base import BaseOverSampler -from ..utils import check_target_type -from ..utils import Substitution +from ..utils import Substitution, check_target_type from ..utils._docstring import _random_state_docstring from ..utils._validation import _deprecate_positional_args +from .base import BaseOverSampler @Substitution( diff --git a/imblearn/over_sampling/_smote/__init__.py b/imblearn/over_sampling/_smote/__init__.py index aaf4dd348..fcac6d4f5 100644 --- a/imblearn/over_sampling/_smote/__init__.py +++ b/imblearn/over_sampling/_smote/__init__.py @@ -1,11 +1,6 @@ -from .base import SMOTE -from .base import SMOTEN -from .base import SMOTENC - +from .base import SMOTE, SMOTEN, SMOTENC from .cluster import KMeansSMOTE - -from .filter import BorderlineSMOTE -from .filter import SVMSMOTE +from .filter import SVMSMOTE, BorderlineSMOTE __all__ = [ "SMOTE", diff --git a/imblearn/over_sampling/_smote/base.py b/imblearn/over_sampling/_smote/base.py index 8fdf2fe9f..0f3ae0592 100644 --- a/imblearn/over_sampling/_smote/base.py +++ b/imblearn/over_sampling/_smote/base.py @@ -12,23 +12,19 @@ import numpy as np from scipy import sparse - from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder -from sklearn.utils import check_random_state -from sklearn.utils import _safe_indexing -from sklearn.utils import check_array -from sklearn.utils.sparsefuncs_fast import csr_mean_variance_axis0 -from sklearn.utils.sparsefuncs_fast import csc_mean_variance_axis0 +from sklearn.utils import _safe_indexing, check_array, check_random_state +from sklearn.utils.sparsefuncs_fast import ( + csc_mean_variance_axis0, + csr_mean_variance_axis0, +) -from ..base import BaseOverSampler from ...metrics.pairwise import ValueDifferenceMetric -from ...utils import check_neighbors_object -from ...utils import check_target_type -from ...utils import Substitution -from ...utils._docstring import _n_jobs_docstring -from ...utils._docstring import _random_state_docstring +from ...utils import Substitution, check_neighbors_object, check_target_type +from ...utils._docstring import _n_jobs_docstring, _random_state_docstring from ...utils._validation import _deprecate_positional_args from ...utils.fixes import _mode +from ..base import BaseOverSampler class BaseSMOTE(BaseOverSampler): diff --git a/imblearn/over_sampling/_smote/cluster.py b/imblearn/over_sampling/_smote/cluster.py index d47db6046..21d2dd10c 100644 --- a/imblearn/over_sampling/_smote/cluster.py +++ b/imblearn/over_sampling/_smote/cluster.py @@ -9,18 +9,15 @@ import numpy as np from scipy import sparse - from sklearn.base import clone from sklearn.cluster import MiniBatchKMeans from sklearn.metrics import pairwise_distances from sklearn.utils import _safe_indexing -from ..base import BaseOverSampler from ...utils import Substitution -from ...utils._docstring import _n_jobs_docstring -from ...utils._docstring import _random_state_docstring +from ...utils._docstring import _n_jobs_docstring, _random_state_docstring from ...utils._validation import _deprecate_positional_args - +from ..base import BaseOverSampler from .base import BaseSMOTE diff --git a/imblearn/over_sampling/_smote/filter.py b/imblearn/over_sampling/_smote/filter.py index b3ec3d46c..ca968224d 100644 --- a/imblearn/over_sampling/_smote/filter.py +++ b/imblearn/over_sampling/_smote/filter.py @@ -10,19 +10,14 @@ import numpy as np from scipy import sparse - from sklearn.base import clone from sklearn.svm import SVC -from sklearn.utils import check_random_state -from sklearn.utils import _safe_indexing +from sklearn.utils import _safe_indexing, check_random_state -from ..base import BaseOverSampler -from ...utils import check_neighbors_object -from ...utils import Substitution -from ...utils._docstring import _n_jobs_docstring -from ...utils._docstring import _random_state_docstring +from ...utils import Substitution, check_neighbors_object +from ...utils._docstring import _n_jobs_docstring, _random_state_docstring from ...utils._validation import _deprecate_positional_args - +from ..base import BaseOverSampler from .base import BaseSMOTE diff --git a/imblearn/over_sampling/_smote/tests/test_borderline_smote.py b/imblearn/over_sampling/_smote/tests/test_borderline_smote.py index eee2981d7..f15420384 100644 --- a/imblearn/over_sampling/_smote/tests/test_borderline_smote.py +++ b/imblearn/over_sampling/_smote/tests/test_borderline_smote.py @@ -1,9 +1,7 @@ -import pytest import numpy as np - +import pytest from sklearn.neighbors import NearestNeighbors -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal +from sklearn.utils._testing import assert_allclose, assert_array_equal from imblearn.over_sampling import BorderlineSMOTE diff --git a/imblearn/over_sampling/_smote/tests/test_kmeans_smote.py b/imblearn/over_sampling/_smote/tests/test_kmeans_smote.py index 05d3e20b9..3e0a5042a 100644 --- a/imblearn/over_sampling/_smote/tests/test_kmeans_smote.py +++ b/imblearn/over_sampling/_smote/tests/test_kmeans_smote.py @@ -1,16 +1,11 @@ -import pytest import numpy as np - -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal - -from sklearn.cluster import KMeans -from sklearn.cluster import MiniBatchKMeans +import pytest +from sklearn.cluster import KMeans, MiniBatchKMeans from sklearn.datasets import make_classification from sklearn.neighbors import NearestNeighbors +from sklearn.utils._testing import assert_allclose, assert_array_equal -from imblearn.over_sampling import KMeansSMOTE -from imblearn.over_sampling import SMOTE +from imblearn.over_sampling import SMOTE, KMeansSMOTE @pytest.fixture diff --git a/imblearn/over_sampling/_smote/tests/test_smote.py b/imblearn/over_sampling/_smote/tests/test_smote.py index 27e8e8b79..060ac8cbf 100644 --- a/imblearn/over_sampling/_smote/tests/test_smote.py +++ b/imblearn/over_sampling/_smote/tests/test_smote.py @@ -4,14 +4,11 @@ # License: MIT import numpy as np - -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal from sklearn.neighbors import NearestNeighbors +from sklearn.utils._testing import assert_allclose, assert_array_equal from imblearn.over_sampling import SMOTE - RND_SEED = 0 X = np.array( [ diff --git a/imblearn/over_sampling/_smote/tests/test_smote_nc.py b/imblearn/over_sampling/_smote/tests/test_smote_nc.py index 00b3d8bac..b59a54c87 100644 --- a/imblearn/over_sampling/_smote/tests/test_smote_nc.py +++ b/imblearn/over_sampling/_smote/tests/test_smote_nc.py @@ -6,14 +6,11 @@ from collections import Counter -import pytest - import numpy as np +import pytest from scipy import sparse - from sklearn.datasets import make_classification -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal +from sklearn.utils._testing import assert_allclose, assert_array_equal from imblearn.over_sampling import SMOTENC diff --git a/imblearn/over_sampling/_smote/tests/test_svm_smote.py b/imblearn/over_sampling/_smote/tests/test_svm_smote.py index c6ae61d0c..cf753b275 100644 --- a/imblearn/over_sampling/_smote/tests/test_svm_smote.py +++ b/imblearn/over_sampling/_smote/tests/test_svm_smote.py @@ -1,12 +1,9 @@ -import pytest import numpy as np - +import pytest from sklearn.linear_model import LogisticRegression from sklearn.neighbors import NearestNeighbors from sklearn.svm import SVC - -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal +from sklearn.utils._testing import assert_allclose, assert_array_equal from imblearn.over_sampling import SVMSMOTE diff --git a/imblearn/over_sampling/tests/test_adasyn.py b/imblearn/over_sampling/tests/test_adasyn.py index 65ce69182..b6397041c 100644 --- a/imblearn/over_sampling/tests/test_adasyn.py +++ b/imblearn/over_sampling/tests/test_adasyn.py @@ -3,12 +3,10 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal +import pytest from sklearn.neighbors import NearestNeighbors +from sklearn.utils._testing import assert_allclose, assert_array_equal from imblearn.over_sampling import ADASYN diff --git a/imblearn/over_sampling/tests/test_common.py b/imblearn/over_sampling/tests/test_common.py index c2c046317..7f407aeee 100644 --- a/imblearn/over_sampling/tests/test_common.py +++ b/imblearn/over_sampling/tests/test_common.py @@ -1,16 +1,16 @@ from collections import Counter -import pytest import numpy as np +import pytest from imblearn.over_sampling import ( ADASYN, - BorderlineSMOTE, - KMeansSMOTE, SMOTE, SMOTEN, SMOTENC, SVMSMOTE, + BorderlineSMOTE, + KMeansSMOTE, ) from imblearn.utils.testing import _CustomNearestNeighbors diff --git a/imblearn/over_sampling/tests/test_random_over_sampler.py b/imblearn/over_sampling/tests/test_random_over_sampler.py index 802dac6c3..e7663d168 100644 --- a/imblearn/over_sampling/tests/test_random_over_sampler.py +++ b/imblearn/over_sampling/tests/test_random_over_sampler.py @@ -7,10 +7,11 @@ import numpy as np import pytest - -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal -from sklearn.utils._testing import _convert_container +from sklearn.utils._testing import ( + _convert_container, + assert_allclose, + assert_array_equal, +) from imblearn.over_sampling import RandomOverSampler diff --git a/imblearn/tensorflow/_generator.py b/imblearn/tensorflow/_generator.py index 1f746649e..bcf833d1d 100644 --- a/imblearn/tensorflow/_generator.py +++ b/imblearn/tensorflow/_generator.py @@ -1,10 +1,8 @@ """Implement generators for ``tensorflow`` which will balance the data.""" from scipy.sparse import issparse - from sklearn.base import clone -from sklearn.utils import _safe_indexing -from sklearn.utils import check_random_state +from sklearn.utils import _safe_indexing, check_random_state from ..under_sampling import RandomUnderSampler from ..utils import Substitution diff --git a/imblearn/tensorflow/tests/test_generator.py b/imblearn/tensorflow/tests/test_generator.py index ca34edc8f..bcc10b8f1 100644 --- a/imblearn/tensorflow/tests/test_generator.py +++ b/imblearn/tensorflow/tests/test_generator.py @@ -1,16 +1,14 @@ from distutils.version import LooseVersion -import pytest import numpy as np +import pytest from scipy import sparse - from sklearn.datasets import load_iris from imblearn.datasets import make_imbalance -from imblearn.under_sampling import NearMiss from imblearn.over_sampling import RandomOverSampler - from imblearn.tensorflow import balanced_batch_generator +from imblearn.under_sampling import NearMiss tf = pytest.importorskip("tensorflow") diff --git a/imblearn/tests/test_base.py b/imblearn/tests/test_base.py index 47568f9cd..6c16541d4 100644 --- a/imblearn/tests/test_base.py +++ b/imblearn/tests/test_base.py @@ -3,25 +3,20 @@ # Authors: Guillaume Lemaitre # License: MIT -import pytest - import numpy as np +import pytest from scipy import sparse - -from sklearn.datasets import load_iris -from sklearn.datasets import make_regression +from sklearn.datasets import load_iris, make_regression from sklearn.linear_model import LinearRegression from sklearn.utils import _safe_indexing +from sklearn.utils._testing import assert_allclose_dense_sparse, assert_array_equal from sklearn.utils.multiclass import type_of_target -from sklearn.utils._testing import assert_array_equal -from sklearn.utils._testing import assert_allclose_dense_sparse +from imblearn import FunctionSampler from imblearn.datasets import make_imbalance from imblearn.pipeline import make_pipeline from imblearn.under_sampling import RandomUnderSampler -from imblearn import FunctionSampler - iris = load_iris() X, y = make_imbalance( iris.data, iris.target, sampling_strategy={0: 10, 1: 25}, random_state=0 diff --git a/imblearn/tests/test_common.py b/imblearn/tests/test_common.py index 6bbb944d5..f1d780ba2 100644 --- a/imblearn/tests/test_common.py +++ b/imblearn/tests/test_common.py @@ -4,21 +4,20 @@ # License: MIT import pytest - from sklearn.base import clone from sklearn.exceptions import ConvergenceWarning +from sklearn.utils._testing import SkipTest, ignore_warnings, set_random_state +from sklearn.utils.estimator_checks import _construct_instance from sklearn.utils.estimator_checks import ( parametrize_with_checks as parametrize_with_checks_sklearn, ) -from sklearn.utils.estimator_checks import _construct_instance -from sklearn.utils._testing import ignore_warnings -from sklearn.utils._testing import set_random_state -from sklearn.utils._testing import SkipTest -from imblearn.utils.estimator_checks import parametrize_with_checks -from imblearn.utils.estimator_checks import _set_checking_parameters -from imblearn.utils.testing import all_estimators from imblearn.under_sampling import NearMiss +from imblearn.utils.estimator_checks import ( + _set_checking_parameters, + parametrize_with_checks, +) +from imblearn.utils.testing import all_estimators @pytest.mark.parametrize("name, Estimator", all_estimators()) diff --git a/imblearn/tests/test_docstring_parameters.py b/imblearn/tests/test_docstring_parameters.py index 2636b4070..3663d1bc8 100644 --- a/imblearn/tests/test_docstring_parameters.py +++ b/imblearn/tests/test_docstring_parameters.py @@ -2,20 +2,21 @@ # Raghav RV # License: BSD 3 clause +import importlib import inspect import warnings -import importlib -from pkgutil import walk_packages from inspect import signature +from pkgutil import walk_packages import pytest - from sklearn.datasets import make_classification from sklearn.linear_model import LogisticRegression from sklearn.utils import IS_PYPY -from sklearn.utils._testing import check_docstring_parameters -from sklearn.utils._testing import _get_func_name -from sklearn.utils._testing import ignore_warnings +from sklearn.utils._testing import ( + _get_func_name, + check_docstring_parameters, + ignore_warnings, +) from sklearn.utils.estimator_checks import _enforce_estimator_tags_y try: @@ -25,15 +26,15 @@ from sklearn.utils.estimator_checks import ( _enforce_estimator_tags_X as _enforce_estimator_tags_x, ) -from sklearn.utils.estimator_checks import _construct_instance + from sklearn.utils.deprecation import _is_deprecated +from sklearn.utils.estimator_checks import _construct_instance import imblearn from imblearn.base import is_sampler from imblearn.utils.estimator_checks import _set_checking_parameters from imblearn.utils.testing import all_estimators - # walk_packages() ignores DeprecationWarnings, now we need to ignore # FutureWarnings with warnings.catch_warnings(): diff --git a/imblearn/tests/test_pipeline.py b/imblearn/tests/test_pipeline.py index 6a3a80462..d2f0b8f5c 100644 --- a/imblearn/tests/test_pipeline.py +++ b/imblearn/tests/test_pipeline.py @@ -13,31 +13,28 @@ import numpy as np import pytest -from pytest import raises - from joblib import Memory - -from sklearn.utils._testing import assert_array_equal -from sklearn.utils._testing import assert_array_almost_equal -from sklearn.utils._testing import assert_allclose - -from sklearn.base import clone, BaseEstimator -from sklearn.svm import SVC -from sklearn.neighbors import LocalOutlierFactor -from sklearn.decomposition import PCA -from sklearn.linear_model import LogisticRegression -from sklearn.linear_model import LinearRegression +from pytest import raises +from sklearn.base import BaseEstimator, clone from sklearn.cluster import KMeans -from sklearn.feature_selection import SelectKBest, f_classif from sklearn.datasets import load_iris, make_classification -from sklearn.preprocessing import StandardScaler +from sklearn.decomposition import PCA +from sklearn.feature_selection import SelectKBest, f_classif +from sklearn.linear_model import LinearRegression, LogisticRegression +from sklearn.neighbors import LocalOutlierFactor from sklearn.pipeline import FeatureUnion +from sklearn.preprocessing import StandardScaler +from sklearn.svm import SVC +from sklearn.utils._testing import ( + assert_allclose, + assert_array_almost_equal, + assert_array_equal, +) from imblearn.datasets import make_imbalance from imblearn.pipeline import Pipeline, make_pipeline -from imblearn.under_sampling import RandomUnderSampler from imblearn.under_sampling import EditedNearestNeighbours as ENN - +from imblearn.under_sampling import RandomUnderSampler JUNK_FOOD_DOCS = ( "the pizza pizza beer copyright", diff --git a/imblearn/under_sampling/__init__.py b/imblearn/under_sampling/__init__.py index 55872743b..73f3d0412 100644 --- a/imblearn/under_sampling/__init__.py +++ b/imblearn/under_sampling/__init__.py @@ -4,17 +4,18 @@ """ from ._prototype_generation import ClusterCentroids - -from ._prototype_selection import RandomUnderSampler -from ._prototype_selection import TomekLinks -from ._prototype_selection import NearMiss -from ._prototype_selection import CondensedNearestNeighbour -from ._prototype_selection import OneSidedSelection -from ._prototype_selection import NeighbourhoodCleaningRule -from ._prototype_selection import EditedNearestNeighbours -from ._prototype_selection import RepeatedEditedNearestNeighbours -from ._prototype_selection import AllKNN -from ._prototype_selection import InstanceHardnessThreshold +from ._prototype_selection import ( + AllKNN, + CondensedNearestNeighbour, + EditedNearestNeighbours, + InstanceHardnessThreshold, + NearMiss, + NeighbourhoodCleaningRule, + OneSidedSelection, + RandomUnderSampler, + RepeatedEditedNearestNeighbours, + TomekLinks, +) __all__ = [ "ClusterCentroids", diff --git a/imblearn/under_sampling/_prototype_generation/_cluster_centroids.py b/imblearn/under_sampling/_prototype_generation/_cluster_centroids.py index 8295adf84..a470187f5 100644 --- a/imblearn/under_sampling/_prototype_generation/_cluster_centroids.py +++ b/imblearn/under_sampling/_prototype_generation/_cluster_centroids.py @@ -8,16 +8,15 @@ import numpy as np from scipy import sparse - from sklearn.base import clone from sklearn.cluster import KMeans from sklearn.neighbors import NearestNeighbors from sklearn.utils import _safe_indexing -from ..base import BaseUnderSampler from ...utils import Substitution from ...utils._docstring import _random_state_docstring from ...utils._validation import _deprecate_positional_args +from ..base import BaseUnderSampler VOTING_KIND = ("auto", "hard", "soft") diff --git a/imblearn/under_sampling/_prototype_generation/tests/test_cluster_centroids.py b/imblearn/under_sampling/_prototype_generation/tests/test_cluster_centroids.py index 02f9aaf1b..e7cf7403f 100644 --- a/imblearn/under_sampling/_prototype_generation/tests/test_cluster_centroids.py +++ b/imblearn/under_sampling/_prototype_generation/tests/test_cluster_centroids.py @@ -1,13 +1,12 @@ """Test the module cluster centroids.""" from collections import Counter -import pytest import numpy as np +import pytest from scipy import sparse - -from sklearn.linear_model import LogisticRegression from sklearn.cluster import KMeans from sklearn.datasets import make_classification +from sklearn.linear_model import LogisticRegression from imblearn.under_sampling import ClusterCentroids from imblearn.utils.testing import _CustomClusterer diff --git a/imblearn/under_sampling/_prototype_selection/__init__.py b/imblearn/under_sampling/_prototype_selection/__init__.py index 9ed9455c4..528e0cae4 100644 --- a/imblearn/under_sampling/_prototype_selection/__init__.py +++ b/imblearn/under_sampling/_prototype_selection/__init__.py @@ -3,16 +3,18 @@ methods that select samples in order to balance the dataset. """ -from ._random_under_sampler import RandomUnderSampler -from ._tomek_links import TomekLinks -from ._nearmiss import NearMiss from ._condensed_nearest_neighbour import CondensedNearestNeighbour -from ._one_sided_selection import OneSidedSelection -from ._neighbourhood_cleaning_rule import NeighbourhoodCleaningRule -from ._edited_nearest_neighbours import EditedNearestNeighbours -from ._edited_nearest_neighbours import RepeatedEditedNearestNeighbours -from ._edited_nearest_neighbours import AllKNN +from ._edited_nearest_neighbours import ( + AllKNN, + EditedNearestNeighbours, + RepeatedEditedNearestNeighbours, +) from ._instance_hardness_threshold import InstanceHardnessThreshold +from ._nearmiss import NearMiss +from ._neighbourhood_cleaning_rule import NeighbourhoodCleaningRule +from ._one_sided_selection import OneSidedSelection +from ._random_under_sampler import RandomUnderSampler +from ._tomek_links import TomekLinks __all__ = [ "RandomUnderSampler", diff --git a/imblearn/under_sampling/_prototype_selection/_condensed_nearest_neighbour.py b/imblearn/under_sampling/_prototype_selection/_condensed_nearest_neighbour.py index df4afce76..0378e43fb 100644 --- a/imblearn/under_sampling/_prototype_selection/_condensed_nearest_neighbour.py +++ b/imblearn/under_sampling/_prototype_selection/_condensed_nearest_neighbour.py @@ -8,18 +8,15 @@ from collections import Counter import numpy as np - from scipy.sparse import issparse - from sklearn.base import clone from sklearn.neighbors import KNeighborsClassifier -from sklearn.utils import check_random_state, _safe_indexing +from sklearn.utils import _safe_indexing, check_random_state -from ..base import BaseCleaningSampler from ...utils import Substitution -from ...utils._docstring import _n_jobs_docstring -from ...utils._docstring import _random_state_docstring +from ...utils._docstring import _n_jobs_docstring, _random_state_docstring from ...utils._validation import _deprecate_positional_args +from ..base import BaseCleaningSampler @Substitution( diff --git a/imblearn/under_sampling/_prototype_selection/_edited_nearest_neighbours.py b/imblearn/under_sampling/_prototype_selection/_edited_nearest_neighbours.py index 77a7afd5b..2390db065 100644 --- a/imblearn/under_sampling/_prototype_selection/_edited_nearest_neighbours.py +++ b/imblearn/under_sampling/_prototype_selection/_edited_nearest_neighbours.py @@ -9,16 +9,13 @@ from collections import Counter import numpy as np - from sklearn.utils import _safe_indexing -from ..base import BaseCleaningSampler -from ...utils import check_neighbors_object -from ...utils import Substitution +from ...utils import Substitution, check_neighbors_object from ...utils._docstring import _n_jobs_docstring from ...utils._validation import _deprecate_positional_args from ...utils.fixes import _mode - +from ..base import BaseCleaningSampler SEL_KIND = ("all", "mode") diff --git a/imblearn/under_sampling/_prototype_selection/_instance_hardness_threshold.py b/imblearn/under_sampling/_prototype_selection/_instance_hardness_threshold.py index 32e2d754c..6835753b4 100644 --- a/imblearn/under_sampling/_prototype_selection/_instance_hardness_threshold.py +++ b/imblearn/under_sampling/_prototype_selection/_instance_hardness_threshold.py @@ -9,20 +9,16 @@ from collections import Counter import numpy as np - from sklearn.base import ClassifierMixin, clone from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble._base import _set_random_states -from sklearn.model_selection import StratifiedKFold -from sklearn.model_selection import cross_val_predict -from sklearn.utils import check_random_state -from sklearn.utils import _safe_indexing +from sklearn.model_selection import StratifiedKFold, cross_val_predict +from sklearn.utils import _safe_indexing, check_random_state -from ..base import BaseUnderSampler from ...utils import Substitution -from ...utils._docstring import _n_jobs_docstring -from ...utils._docstring import _random_state_docstring +from ...utils._docstring import _n_jobs_docstring, _random_state_docstring from ...utils._validation import _deprecate_positional_args +from ..base import BaseUnderSampler @Substitution( diff --git a/imblearn/under_sampling/_prototype_selection/_nearmiss.py b/imblearn/under_sampling/_prototype_selection/_nearmiss.py index 8913b4c4f..d9571b82c 100644 --- a/imblearn/under_sampling/_prototype_selection/_nearmiss.py +++ b/imblearn/under_sampling/_prototype_selection/_nearmiss.py @@ -8,14 +8,12 @@ from collections import Counter import numpy as np - from sklearn.utils import _safe_indexing -from ..base import BaseUnderSampler -from ...utils import check_neighbors_object -from ...utils import Substitution +from ...utils import Substitution, check_neighbors_object from ...utils._docstring import _n_jobs_docstring from ...utils._validation import _deprecate_positional_args +from ..base import BaseUnderSampler @Substitution( diff --git a/imblearn/under_sampling/_prototype_selection/_neighbourhood_cleaning_rule.py b/imblearn/under_sampling/_prototype_selection/_neighbourhood_cleaning_rule.py index 016c6d6be..e67eca5a8 100644 --- a/imblearn/under_sampling/_prototype_selection/_neighbourhood_cleaning_rule.py +++ b/imblearn/under_sampling/_prototype_selection/_neighbourhood_cleaning_rule.py @@ -7,17 +7,14 @@ from collections import Counter import numpy as np - from sklearn.utils import _safe_indexing -from ..base import BaseCleaningSampler -from ._edited_nearest_neighbours import EditedNearestNeighbours -from ...utils import check_neighbors_object -from ...utils import Substitution +from ...utils import Substitution, check_neighbors_object from ...utils._docstring import _n_jobs_docstring from ...utils._validation import _deprecate_positional_args from ...utils.fixes import _mode - +from ..base import BaseCleaningSampler +from ._edited_nearest_neighbours import EditedNearestNeighbours SEL_KIND = ("all", "mode") diff --git a/imblearn/under_sampling/_prototype_selection/_one_sided_selection.py b/imblearn/under_sampling/_prototype_selection/_one_sided_selection.py index bd7863791..616bd1c16 100644 --- a/imblearn/under_sampling/_prototype_selection/_one_sided_selection.py +++ b/imblearn/under_sampling/_prototype_selection/_one_sided_selection.py @@ -7,17 +7,15 @@ from collections import Counter import numpy as np - from sklearn.base import clone from sklearn.neighbors import KNeighborsClassifier -from sklearn.utils import check_random_state, _safe_indexing +from sklearn.utils import _safe_indexing, check_random_state -from ..base import BaseCleaningSampler -from ._tomek_links import TomekLinks from ...utils import Substitution -from ...utils._docstring import _n_jobs_docstring -from ...utils._docstring import _random_state_docstring +from ...utils._docstring import _n_jobs_docstring, _random_state_docstring from ...utils._validation import _deprecate_positional_args +from ..base import BaseCleaningSampler +from ._tomek_links import TomekLinks @Substitution( diff --git a/imblearn/under_sampling/_prototype_selection/_random_under_sampler.py b/imblearn/under_sampling/_prototype_selection/_random_under_sampler.py index 4447efbfb..d54704c05 100644 --- a/imblearn/under_sampling/_prototype_selection/_random_under_sampler.py +++ b/imblearn/under_sampling/_prototype_selection/_random_under_sampler.py @@ -5,15 +5,12 @@ # License: MIT import numpy as np +from sklearn.utils import _safe_indexing, check_random_state -from sklearn.utils import check_random_state -from sklearn.utils import _safe_indexing - -from ..base import BaseUnderSampler -from ...utils import check_target_type -from ...utils import Substitution +from ...utils import Substitution, check_target_type from ...utils._docstring import _random_state_docstring from ...utils._validation import _deprecate_positional_args +from ..base import BaseUnderSampler @Substitution( diff --git a/imblearn/under_sampling/_prototype_selection/_tomek_links.py b/imblearn/under_sampling/_prototype_selection/_tomek_links.py index 3e7907939..f7cacacdb 100644 --- a/imblearn/under_sampling/_prototype_selection/_tomek_links.py +++ b/imblearn/under_sampling/_prototype_selection/_tomek_links.py @@ -9,10 +9,10 @@ from sklearn.neighbors import NearestNeighbors from sklearn.utils import _safe_indexing -from ..base import BaseCleaningSampler from ...utils import Substitution from ...utils._docstring import _n_jobs_docstring from ...utils._validation import _deprecate_positional_args +from ..base import BaseCleaningSampler @Substitution( diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_allknn.py b/imblearn/under_sampling/_prototype_selection/tests/test_allknn.py index e4e91b91a..131f95929 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_allknn.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_allknn.py @@ -3,12 +3,11 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - -from sklearn.utils._testing import assert_allclose, assert_array_equal -from sklearn.neighbors import NearestNeighbors +import pytest from sklearn.datasets import make_classification +from sklearn.neighbors import NearestNeighbors +from sklearn.utils._testing import assert_allclose, assert_array_equal from imblearn.under_sampling import AllKNN diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_condensed_nearest_neighbour.py b/imblearn/under_sampling/_prototype_selection/tests/test_condensed_nearest_neighbour.py index 1c683e5fd..ea98906b8 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_condensed_nearest_neighbour.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_condensed_nearest_neighbour.py @@ -3,11 +3,10 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - -from sklearn.utils._testing import assert_array_equal +import pytest from sklearn.neighbors import KNeighborsClassifier +from sklearn.utils._testing import assert_array_equal from imblearn.under_sampling import CondensedNearestNeighbour diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_edited_nearest_neighbours.py b/imblearn/under_sampling/_prototype_selection/tests/test_edited_nearest_neighbours.py index 50680f632..914cfd7ec 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_edited_nearest_neighbours.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_edited_nearest_neighbours.py @@ -3,13 +3,11 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - -from sklearn.utils._testing import assert_array_equal - +import pytest from sklearn.datasets import make_classification from sklearn.neighbors import NearestNeighbors +from sklearn.utils._testing import assert_array_equal from imblearn.under_sampling import EditedNearestNeighbours diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_instance_hardness_threshold.py b/imblearn/under_sampling/_prototype_selection/tests/test_instance_hardness_threshold.py index fcfe1f56b..3d815d197 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_instance_hardness_threshold.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_instance_hardness_threshold.py @@ -3,12 +3,9 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - - -from sklearn.ensemble import GradientBoostingClassifier -from sklearn.ensemble import RandomForestClassifier +import pytest +from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier from sklearn.naive_bayes import GaussianNB as NB from sklearn.utils._testing import assert_array_equal diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_nearmiss.py b/imblearn/under_sampling/_prototype_selection/tests/test_nearmiss.py index 6a3fc04fb..cc8678a59 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_nearmiss.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_nearmiss.py @@ -3,11 +3,10 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - -from sklearn.utils._testing import assert_array_equal +import pytest from sklearn.neighbors import NearestNeighbors +from sklearn.utils._testing import assert_array_equal from imblearn.under_sampling import NearMiss diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_neighbourhood_cleaning_rule.py b/imblearn/under_sampling/_prototype_selection/tests/test_neighbourhood_cleaning_rule.py index 78119dde7..a37c61953 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_neighbourhood_cleaning_rule.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_neighbourhood_cleaning_rule.py @@ -3,9 +3,8 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - +import pytest from sklearn.utils._testing import assert_array_equal from imblearn.under_sampling import NeighbourhoodCleaningRule diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_one_sided_selection.py b/imblearn/under_sampling/_prototype_selection/tests/test_one_sided_selection.py index 9138d600d..3bbdb736a 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_one_sided_selection.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_one_sided_selection.py @@ -3,11 +3,10 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - -from sklearn.utils._testing import assert_array_equal +import pytest from sklearn.neighbors import KNeighborsClassifier +from sklearn.utils._testing import assert_array_equal from imblearn.under_sampling import OneSidedSelection diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_random_under_sampler.py b/imblearn/under_sampling/_prototype_selection/tests/test_random_under_sampler.py index e915ca8c0..2e845e83a 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_random_under_sampler.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_random_under_sampler.py @@ -7,7 +7,6 @@ import numpy as np import pytest - from sklearn.utils._testing import assert_array_equal from imblearn.under_sampling import RandomUnderSampler diff --git a/imblearn/under_sampling/_prototype_selection/tests/test_repeated_edited_nearest_neighbours.py b/imblearn/under_sampling/_prototype_selection/tests/test_repeated_edited_nearest_neighbours.py index 348a620cd..b7c7301a2 100644 --- a/imblearn/under_sampling/_prototype_selection/tests/test_repeated_edited_nearest_neighbours.py +++ b/imblearn/under_sampling/_prototype_selection/tests/test_repeated_edited_nearest_neighbours.py @@ -3,11 +3,10 @@ # Christos Aridas # License: MIT -import pytest import numpy as np - -from sklearn.utils._testing import assert_array_equal +import pytest from sklearn.neighbors import NearestNeighbors +from sklearn.utils._testing import assert_array_equal from imblearn.under_sampling import RepeatedEditedNearestNeighbours diff --git a/imblearn/utils/__init__.py b/imblearn/utils/__init__.py index 4e74d2ee3..527578895 100644 --- a/imblearn/utils/__init__.py +++ b/imblearn/utils/__init__.py @@ -3,10 +3,11 @@ """ from ._docstring import Substitution - -from ._validation import check_neighbors_object -from ._validation import check_target_type -from ._validation import check_sampling_strategy +from ._validation import ( + check_neighbors_object, + check_sampling_strategy, + check_target_type, +) __all__ = [ "check_neighbors_object", diff --git a/imblearn/utils/_show_versions.py b/imblearn/utils/_show_versions.py index c7635a9e2..ecf1bb839 100644 --- a/imblearn/utils/_show_versions.py +++ b/imblearn/utils/_show_versions.py @@ -8,8 +8,8 @@ # Author: Alexander L. Hayes # License: MIT -import sys import importlib +import sys def _get_deps_info(): diff --git a/imblearn/utils/_validation.py b/imblearn/utils/_validation.py index c3fa53357..007f90e02 100644 --- a/imblearn/utils/_validation.py +++ b/imblearn/utils/_validation.py @@ -6,11 +6,10 @@ import warnings from collections import OrderedDict from functools import wraps -from inspect import signature, Parameter +from inspect import Parameter, signature from numbers import Integral, Real import numpy as np - from sklearn.base import clone from sklearn.neighbors import NearestNeighbors from sklearn.utils import column_or_1d diff --git a/imblearn/utils/estimator_checks.py b/imblearn/utils/estimator_checks.py index 532d227a9..14c5d9a1a 100644 --- a/imblearn/utils/estimator_checks.py +++ b/imblearn/utils/estimator_checks.py @@ -7,29 +7,27 @@ import sys import traceback import warnings - from collections import Counter from functools import partial -import pytest - import numpy as np +import pytest from scipy import sparse - from sklearn.base import clone -from sklearn.datasets import ( +from sklearn.cluster import KMeans +from sklearn.datasets import ( # noqa load_iris, make_classification, make_multilabel_classification, -) # noqa -from sklearn.cluster import KMeans +) from sklearn.exceptions import SkipTestWarning from sklearn.preprocessing import label_binarize -from sklearn.utils.estimator_checks import _maybe_mark_xfail -from sklearn.utils.estimator_checks import _get_check_estimator_ids -from sklearn.utils._testing import assert_allclose -from sklearn.utils._testing import assert_array_equal -from sklearn.utils._testing import assert_raises_regex +from sklearn.utils._testing import ( + assert_allclose, + assert_array_equal, + assert_raises_regex, +) +from sklearn.utils.estimator_checks import _get_check_estimator_ids, _maybe_mark_xfail from sklearn.utils.multiclass import type_of_target from imblearn.datasets import make_imbalance diff --git a/imblearn/utils/fixes.py b/imblearn/utils/fixes.py index ce8d52831..94e6825b5 100644 --- a/imblearn/utils/fixes.py +++ b/imblearn/utils/fixes.py @@ -7,7 +7,6 @@ import scipy import scipy.stats - from sklearn.utils.fixes import parse_version sp_version = parse_version(scipy.__version__) diff --git a/imblearn/utils/testing.py b/imblearn/utils/testing.py index 4f3f1c8b9..357af7283 100644 --- a/imblearn/utils/testing.py +++ b/imblearn/utils/testing.py @@ -11,7 +11,6 @@ from pathlib import Path from scipy import sparse - from sklearn.base import BaseEstimator from sklearn.neighbors import KDTree from sklearn.utils._testing import ignore_warnings diff --git a/imblearn/utils/tests/test_docstring.py b/imblearn/utils/tests/test_docstring.py index 89746de1c..acfa1e162 100644 --- a/imblearn/utils/tests/test_docstring.py +++ b/imblearn/utils/tests/test_docstring.py @@ -6,8 +6,7 @@ import pytest from imblearn.utils import Substitution -from imblearn.utils._docstring import _random_state_docstring -from imblearn.utils._docstring import _n_jobs_docstring +from imblearn.utils._docstring import _n_jobs_docstring, _random_state_docstring func_docstring = """A function. diff --git a/imblearn/utils/tests/test_estimator_checks.py b/imblearn/utils/tests/test_estimator_checks.py index 862550882..f8ebc4701 100644 --- a/imblearn/utils/tests/test_estimator_checks.py +++ b/imblearn/utils/tests/test_estimator_checks.py @@ -1,19 +1,20 @@ -import pytest import numpy as np - +import pytest from sklearn.base import BaseEstimator from sklearn.utils.multiclass import check_classification_targets from imblearn.base import BaseSampler from imblearn.over_sampling.base import BaseOverSampler from imblearn.utils import check_target_type as target_check -from imblearn.utils.estimator_checks import check_target_type -from imblearn.utils.estimator_checks import check_samplers_one_label -from imblearn.utils.estimator_checks import check_samplers_fit -from imblearn.utils.estimator_checks import check_samplers_sparse -from imblearn.utils.estimator_checks import check_samplers_preserve_dtype -from imblearn.utils.estimator_checks import check_samplers_string -from imblearn.utils.estimator_checks import check_samplers_nan +from imblearn.utils.estimator_checks import ( + check_samplers_fit, + check_samplers_nan, + check_samplers_one_label, + check_samplers_preserve_dtype, + check_samplers_sparse, + check_samplers_string, + check_target_type, +) class BaseBadSampler(BaseEstimator): diff --git a/imblearn/utils/tests/test_min_dependencies.py b/imblearn/utils/tests/test_min_dependencies.py index 5e0d1b4c2..cd537030c 100644 --- a/imblearn/utils/tests/test_min_dependencies.py +++ b/imblearn/utils/tests/test_min_dependencies.py @@ -5,9 +5,10 @@ from pathlib import Path import pytest +from sklearn.utils.fixes import parse_version + import imblearn from imblearn._min_dependencies import dependent_packages -from sklearn.utils.fixes import parse_version @pytest.mark.skipif( diff --git a/imblearn/utils/tests/test_show_versions.py b/imblearn/utils/tests/test_show_versions.py index 9b9dcd2f1..73ff1f94f 100644 --- a/imblearn/utils/tests/test_show_versions.py +++ b/imblearn/utils/tests/test_show_versions.py @@ -2,8 +2,7 @@ # Author: Alexander L. Hayes # License: MIT -from imblearn.utils._show_versions import _get_deps_info -from imblearn.utils._show_versions import show_versions +from imblearn.utils._show_versions import _get_deps_info, show_versions def test_get_deps_info(): diff --git a/imblearn/utils/tests/test_testing.py b/imblearn/utils/tests/test_testing.py index 9d1aaa5e9..1b37978c2 100644 --- a/imblearn/utils/tests/test_testing.py +++ b/imblearn/utils/tests/test_testing.py @@ -3,14 +3,12 @@ # Christos Aridas # License: MIT -import pytest - import numpy as np - +import pytest from sklearn.neighbors._base import KNeighborsMixin from imblearn.base import SamplerMixin -from imblearn.utils.testing import all_estimators, _CustomNearestNeighbors +from imblearn.utils.testing import _CustomNearestNeighbors, all_estimators def test_all_estimators(): diff --git a/imblearn/utils/tests/test_validation.py b/imblearn/utils/tests/test_validation.py index 2cfe8e018..6a40ca171 100644 --- a/imblearn/utils/tests/test_validation.py +++ b/imblearn/utils/tests/test_validation.py @@ -3,22 +3,21 @@ # Christos Aridas # License: MIT -from collections import Counter -from collections import OrderedDict +from collections import Counter, OrderedDict -import pytest import numpy as np - -from sklearn.neighbors._base import KNeighborsMixin +import pytest from sklearn.neighbors import NearestNeighbors +from sklearn.neighbors._base import KNeighborsMixin from sklearn.utils._testing import assert_array_equal -from imblearn.utils import check_neighbors_object -from imblearn.utils import check_sampling_strategy -from imblearn.utils import check_target_type +from imblearn.utils import ( + check_neighbors_object, + check_sampling_strategy, + check_target_type, +) +from imblearn.utils._validation import ArraysTransformer, _deprecate_positional_args from imblearn.utils.testing import _CustomNearestNeighbors -from imblearn.utils._validation import ArraysTransformer -from imblearn.utils._validation import _deprecate_positional_args multiclass_target = np.array([1] * 50 + [2] * 100 + [3] * 25) binary_target = np.array([1] * 25 + [0] * 100) diff --git a/maint_tools/test_docstring.py b/maint_tools/test_docstring.py index 990525b56..2f75b07f6 100644 --- a/maint_tools/test_docstring.py +++ b/maint_tools/test_docstring.py @@ -1,7 +1,7 @@ -import inspect import importlib -import re +import inspect import pkgutil +import re from inspect import signature from typing import Optional @@ -260,8 +260,8 @@ def test_docstring(Estimator, method, request): if __name__ == "__main__": - import sys import argparse + import sys parser = argparse.ArgumentParser(description="Validate docstring with numpydoc.") parser.add_argument("import_path", help="Import path to validate") diff --git a/pyproject.toml b/pyproject.toml index 641894a8a..664c56a61 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,6 @@ [tool.black] target-version = ['py38'] include = '\.pyi?$' + +[tool.isort] +profile = "black"