Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions doc/whats_new/v0.7.rst
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ Maintenance
- Remove `FutureWarning` issued by `scikit-learn` 0.23.
:pr:`710` by :user:`Guillaume Lemaitre <glemaitre>`.

- Impose keywords only argument as in `scikit-learn`.
:pr:`721` by :user:`Guillaume Lemaitre <glemaitre>`.

Changed models
..............

Expand Down Expand Up @@ -63,3 +66,7 @@ Deprecation
:class:`imblearn.under_sampling.ClusterCentroids` since it was used by
:class:`sklearn.cluster.KMeans` which deprecated it.
:pr:`710` by :user:`Guillaume Lemaitre <glemaitre>`.

- Deprecation of passing keyword argument by position similarly to
`scikit-learn`.
:pr:`721` by :user:`Guillaume lemaitre <glemaitre>`.
4 changes: 3 additions & 1 deletion imblearn/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

from .utils import check_sampling_strategy, check_target_type
from .utils._validation import ArraysTransformer
from .utils._validation import _deprecate_positional_args


class SamplerMixin(BaseEstimator, metaclass=ABCMeta):
Expand Down Expand Up @@ -213,7 +214,8 @@ class FunctionSampler(BaseSampler):

_sampling_type = "bypass"

def __init__(self, func=None, accept_sparse=True, kw_args=None,
@_deprecate_positional_args
def __init__(self, *, func=None, accept_sparse=True, kw_args=None,
validate=True):
super().__init__()
self.func = func
Expand Down
3 changes: 3 additions & 0 deletions imblearn/combine/_smote_enn.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from ..utils import Substitution
from ..utils._docstring import _n_jobs_docstring
from ..utils._docstring import _random_state_docstring
from ..utils._validation import _deprecate_positional_args


@Substitution(
Expand Down Expand Up @@ -85,8 +86,10 @@ class SMOTEENN(BaseSampler):

_sampling_type = "over-sampling"

@_deprecate_positional_args
def __init__(
self,
*,
sampling_strategy="auto",
random_state=None,
smote=None,
Expand Down
3 changes: 3 additions & 0 deletions imblearn/combine/_smote_tomek.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from ..utils import Substitution
from ..utils._docstring import _n_jobs_docstring
from ..utils._docstring import _random_state_docstring
from ..utils._validation import _deprecate_positional_args


@Substitution(
Expand Down Expand Up @@ -85,8 +86,10 @@ class SMOTETomek(BaseSampler):

_sampling_type = "over-sampling"

@_deprecate_positional_args
def __init__(
self,
*,
sampling_strategy="auto",
random_state=None,
smote=None,
Expand Down
4 changes: 3 additions & 1 deletion imblearn/datasets/_imbalance.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@

from ..under_sampling import RandomUnderSampler
from ..utils import check_sampling_strategy
from ..utils._validation import _deprecate_positional_args


@_deprecate_positional_args
def make_imbalance(
X, y, sampling_strategy=None, random_state=None, verbose=False, **kwargs
X, y, *, sampling_strategy=None, random_state=None, verbose=False, **kwargs
):
"""Turns a dataset into an imbalanced dataset with a specific sampling
strategy.
Expand Down
4 changes: 4 additions & 0 deletions imblearn/datasets/_zenodo.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@
from sklearn.utils import Bunch
from sklearn.utils import check_random_state

from ..utils._validation import _deprecate_positional_args

URL = (
"https://zenodo.org/record/61452/files/"
"benchmark-imbalanced-learn.tar.gz"
Expand Down Expand Up @@ -101,7 +103,9 @@
MAP_ID_NAME[v + 1] = k


@_deprecate_positional_args
def fetch_datasets(
*,
data_home=None,
filter_data=None,
download_if_missing=True,
Expand Down
4 changes: 2 additions & 2 deletions imblearn/datasets/tests/test_imbalance.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,14 @@ def test_make_imbalance_error(iris, sampling_strategy, err_msg):
# cover in the common tests so we will repeat it here
X, y = iris
with pytest.raises(ValueError, match=err_msg):
make_imbalance(X, y, sampling_strategy)
make_imbalance(X, y, sampling_strategy=sampling_strategy)


def test_make_imbalance_error_single_class(iris):
X, y = iris
y = np.zeros_like(y)
with pytest.raises(ValueError, match="needs to have more than 1 class."):
make_imbalance(X, y, {0: 10})
make_imbalance(X, y, sampling_strategy={0: 10})


@pytest.mark.parametrize(
Expand Down
3 changes: 3 additions & 0 deletions imblearn/ensemble/_bagging.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
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._validation import _deprecate_positional_args


@Substitution(
Expand Down Expand Up @@ -175,10 +176,12 @@ class BalancedBaggingClassifier(BaggingClassifier):
[ 2 225]]
"""

@_deprecate_positional_args
def __init__(
self,
base_estimator=None,
n_estimators=10,
*,
max_samples=1.0,
max_features=1.0,
bootstrap=True,
Expand Down
3 changes: 3 additions & 0 deletions imblearn/ensemble/_easy_ensemble.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
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._validation import _deprecate_positional_args
from ..pipeline import Pipeline

MAX_INT = np.iinfo(np.int32).max
Expand Down Expand Up @@ -125,10 +126,12 @@ class EasyEnsembleClassifier(BaggingClassifier):
[ 2 225]]
"""

@_deprecate_positional_args
def __init__(
self,
n_estimators=10,
base_estimator=None,
*,
warm_start=False,
sampling_strategy="auto",
replacement=False,
Expand Down
3 changes: 3 additions & 0 deletions imblearn/ensemble/_forest.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
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

MAX_INT = np.iinfo(np.int32).max

Expand Down Expand Up @@ -297,9 +298,11 @@ class labels (multi-output problem).
[1]
"""

@_deprecate_positional_args
def __init__(
self,
n_estimators=100,
*,
criterion="gini",
max_depth=None,
min_samples_split=2,
Expand Down
3 changes: 3 additions & 0 deletions imblearn/ensemble/_weight_boosting.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from ..pipeline import make_pipeline
from ..utils import Substitution, check_target_type
from ..utils._docstring import _random_state_docstring
from ..utils._validation import _deprecate_positional_args


@Substitution(
Expand Down Expand Up @@ -120,9 +121,11 @@ class RUSBoostClassifier(AdaBoostClassifier):
array([...])
"""

@_deprecate_positional_args
def __init__(
self,
base_estimator=None,
*,
n_estimators=50,
learning_rate=1.0,
algorithm="SAMME.R",
Expand Down
21 changes: 13 additions & 8 deletions imblearn/keras/_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,17 @@ def import_from_tensforflow():

ParentClass, HAS_KERAS = import_keras()

from scipy.sparse import issparse
from scipy.sparse import issparse # noqa

from sklearn.base import clone
from sklearn.utils import _safe_indexing
from sklearn.utils import check_random_state
from sklearn.base import clone # noqa
from sklearn.utils import _safe_indexing # noqa
from sklearn.utils import check_random_state # noqa

from ..under_sampling import RandomUnderSampler
from ..utils import Substitution
from ..utils._docstring import _random_state_docstring
from ..tensorflow import balanced_batch_generator as tf_bbg
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


class BalancedBatchGenerator(*ParentClass):
Expand Down Expand Up @@ -130,10 +131,12 @@ class BalancedBatchGenerator(*ParentClass):
# flag for keras sequence duck-typing
use_sequence_api = True

@_deprecate_positional_args
def __init__(
self,
X,
y,
*,
sample_weight=None,
sampler=None,
batch_size=32,
Expand Down Expand Up @@ -199,9 +202,11 @@ def __getitem__(self, index):


@Substitution(random_state=_random_state_docstring)
@_deprecate_positional_args
def balanced_batch_generator(
X,
y,
*,
sample_weight=None,
sampler=None,
batch_size=32,
Expand Down
15 changes: 14 additions & 1 deletion imblearn/metrics/_classification.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,14 @@
except ImportError:
from sklearn.externals.funcsigs import signature

from ..utils._validation import _deprecate_positional_args


@_deprecate_positional_args
def sensitivity_specificity_support(
y_true,
y_pred,
*,
labels=None,
pos_label=1,
average=None,
Expand Down Expand Up @@ -279,9 +283,11 @@ def sensitivity_specificity_support(
return sensitivity, specificity, true_sum


@_deprecate_positional_args
def sensitivity_score(
y_true,
y_pred,
*,
labels=None,
pos_label=1,
average="binary",
Expand Down Expand Up @@ -382,9 +388,11 @@ def sensitivity_score(
return s


@_deprecate_positional_args
def specificity_score(
y_true,
y_pred,
*,
labels=None,
pos_label=1,
average="binary",
Expand Down Expand Up @@ -485,9 +493,11 @@ def specificity_score(
return s


@_deprecate_positional_args
def geometric_mean_score(
y_true,
y_pred,
*,
labels=None,
pos_label=1,
average="multiclass",
Expand Down Expand Up @@ -675,7 +685,8 @@ class is unrecognized by the classifier, G-mean resolves to zero. To
return gmean


def make_index_balanced_accuracy(alpha=0.1, squared=True):
@_deprecate_positional_args
def make_index_balanced_accuracy(*, alpha=0.1, squared=True):
"""Balance any scoring function using the index balanced accuracy

This factory function wraps scoring function to express it as the
Expand Down Expand Up @@ -785,9 +796,11 @@ def compute_score(*args, **kwargs):
return decorate


@_deprecate_positional_args
def classification_report_imbalanced(
y_true,
y_pred,
*,
labels=None,
target_names=None,
sample_weight=None,
Expand Down
3 changes: 3 additions & 0 deletions imblearn/over_sampling/_adasyn.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from ..utils import Substitution
from ..utils._docstring import _n_jobs_docstring
from ..utils._docstring import _random_state_docstring
from ..utils._validation import _deprecate_positional_args


@Substitution(
Expand Down Expand Up @@ -81,8 +82,10 @@ class ADASYN(BaseOverSampler):
Resampled dataset shape Counter({{0: 904, 1: 900}})
"""

@_deprecate_positional_args
def __init__(
self,
*,
sampling_strategy="auto",
random_state=None,
n_neighbors=5,
Expand Down
4 changes: 3 additions & 1 deletion imblearn/over_sampling/_random_over_sampler.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from ..utils import check_target_type
from ..utils import Substitution
from ..utils._docstring import _random_state_docstring
from ..utils._validation import _deprecate_positional_args

@Substitution(
sampling_strategy=BaseOverSampler._sampling_strategy_docstring,
Expand Down Expand Up @@ -68,7 +69,8 @@ class RandomOverSampler(BaseOverSampler):
Resampled dataset shape Counter({{0: 900, 1: 900}})
"""

def __init__(self, sampling_strategy="auto", random_state=None):
@_deprecate_positional_args
def __init__(self, *, sampling_strategy="auto", random_state=None):
super().__init__(sampling_strategy=sampling_strategy)
self.random_state = random_state

Expand Down
Loading