class imblearn.under_sampling.NeighbourhoodCleaningRule(*, sampling_strategy='auto', n_neighbors=3, kind_sel='all', threshold_cleaning=0.5, n_jobs=None)[source]

Undersample based on the neighbourhood cleaning rule.

This class uses ENN and a k-NN to remove noisy samples from the datasets.

Read more in the User Guide.

sampling_strategystr, list or callable

Sampling information to sample the data set.

  • When str, specify the class targeted by the resampling. Note the the number of samples will not be equal in each. Possible choices are:

    'majority': resample only the majority class;

    'not minority': resample all classes but the minority class;

    'not majority': resample all classes but the majority class;

    'all': resample all classes;

    'auto': equivalent to 'not minority'.

  • When list, the list contains the classes targeted by the resampling.

  • When callable, function taking y and returns a dict. The keys correspond to the targeted classes. The values correspond to the desired number of samples for each class.

n_neighborsint or object, default=3

If int, size of the neighbourhood to consider to compute the nearest neighbors. If object, an estimator that inherits from sklearn.neighbors.base.KNeighborsMixin that will be used to find the nearest-neighbors.

kind_sel{“all”, “mode”}, default=’all’

Strategy to use in order to exclude samples in the ENN sampling.

  • If 'all', all neighbours will have to agree with the samples of interest to not be excluded.

  • If 'mode', the majority vote of the neighbours will be used in order to exclude a sample.

threshold_cleaningfloat, default=0.5

Threshold used to whether consider a class or not during the cleaning after applying ENN. A class will be considered during cleaning when:

Ci > C x T ,

where Ci and C is the number of samples in the class and the data set, respectively and theta is the threshold.

n_jobsint, default=None

Number of CPU cores used during the cross-validation loop. None means 1 unless in a joblib.parallel_backend context. -1 means using all processors. See Glossary for more details.

See also


Undersample by editing noisy samples.


See the original paper: [1].

Supports multi-class resampling. A one-vs.-rest scheme is used when sampling a class as proposed in [1].



J. Laurikkala, “Improving identification of difficult small classes by balancing class distribution,” Springer Berlin Heidelberg, 2001.


>>> from collections import Counter
>>> from sklearn.datasets import make_classification
>>> from imblearn.under_sampling import NeighbourhoodCleaningRule 
>>> X, y = make_classification(n_classes=2, class_sep=2,
... weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,
... n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
>>> print('Original dataset shape %s' % Counter(y))
Original dataset shape Counter({1: 900, 0: 100})
>>> ncr = NeighbourhoodCleaningRule()
>>> X_res, y_res = ncr.fit_resample(X, y)
>>> print('Resampled dataset shape %s' % Counter(y_res))
Resampled dataset shape Counter({1: 877, 0: 100})
sample_indices_ndarray of shape (n_new_samples)

Indices of the samples selected.

New in version 0.4.

__init__(self, *, sampling_strategy='auto', n_neighbors=3, kind_sel='all', threshold_cleaning=0.5, n_jobs=None)[source]

Initialize self. See help(type(self)) for accurate signature.

Examples using imblearn.under_sampling.NeighbourhoodCleaningRule