SMOTENC#

class imblearn.over_sampling.SMOTENC(categorical_features, *, categorical_encoder=None, sampling_strategy='auto', random_state=None, k_neighbors=5)[source]#

针对名义和连续数据的合成少数类过采样技术。

SMOTE不同,SMOTE-NC适用于包含数值和分类特征的数据集。然而,它并不是设计用来仅处理分类特征的。

更多内容请参阅用户指南

在版本0.4中添加。

Parameters:
categorical_features“infer” or array-like of shape (n_cat_features,) or (n_features,), dtype={bool, int, str}

指定哪些特征是分类的。可以是以下之一:

  • “auto”(默认)自动检测分类特征。仅在Xpandas.DataFrame且对应于具有pandas.CategoricalDtype的列时支持。

  • 对应于指定分类特征的int数组;

  • 对应于特征名称的str数组。在这种情况下,X应该是一个pandas pandas.DataFrame

  • 形状为 (n_features, ) 的掩码数组和 bool 数据类型,其中 True 表示分类特征。

categorical_encoderestimator, default=None

One-hot编码器用于编码分类特征。如果None,则使用OneHotEncoder,除了handle_unknown设置为'ignore'之外,其他参数均为默认值。

sampling_strategyfloat, str, dict or callable, default=’auto’

用于重新采样数据集的采样信息。

  • float时,它对应于重采样后少数类样本数量与多数类样本数量的期望比率。因此,比率表示为\(\alpha_{os} = N_{rm} / N_{M}\),其中\(N_{rm}\)是重采样后少数类样本的数量,\(N_{M}\)是多数类样本的数量。

    警告

    float 仅适用于二分类。对于多类分类会引发错误。

  • str 时,指定重采样所针对的类别。不同类别中的样本数量将被均衡化。可能的选择有:

    'minority': 仅对少数类进行重采样;

    'not minority': 对除少数类之外的所有类进行重采样;

    'not majority': 重新采样除多数类之外的所有类;

    'all': 对所有类别进行重采样;

    'auto': 等同于 'not majority'.

  • dict时,键对应于目标类别。值对应于每个目标类别所需的样本数量。

  • 当可调用时,函数接受 y 并返回一个 dict。键对应于目标类别。值对应于每个类别所需的样本数量。

random_stateint, RandomState instance, default=None

控制算法的随机化。

  • 如果是整数,random_state 是随机数生成器使用的种子;

  • 如果 RandomState 实例,random_state 是随机数生成器;

  • 如果 None,随机数生成器是 np.random 使用的 RandomState 实例。

k_neighborsint or object, default=5

用于定义样本邻域的最近邻,以生成合成样本。您可以传递:

  • 一个int,对应于要使用的邻居数量。在这种情况下,将拟合一个~sklearn.neighbors.NearestNeighbors实例。

  • 一个兼容的最近邻算法实例,应该实现kneighborskneighbors_graph两种方法。例如,它可以对应于NearestNeighbors,但也可以扩展到任何兼容的类。

Attributes:
sampling_strategy_dict

包含用于采样数据集信息的字典。键对应于从中采样的类标签,值是要采样的样本数量。

nn_k_estimator object

k_neighbors参数创建的已验证k近邻。

categorical_encoder_estimator

用于编码分类特征的编码器。

categorical_features_ndarray of shape (n_cat_features,), dtype=np.int64

分类特征的索引。

continuous_features_ndarray of shape (n_cont_features,), dtype=np.int64

连续特征的索引。

median_std_dict of int -> float

每个类别的连续特征的标准差的中位数,用于过采样。

n_features_int

fit时观察到的特征数量。

n_features_in_int

输入数据集中的特征数量。

在版本0.9中添加。

feature_names_in_ndarray of shape (n_features_in_,)

fit期间看到的特征名称。仅在X具有全部为字符串的特征名称时定义。

在版本0.10中添加。

另请参阅

SMOTE

使用SMOTE进行过采样。

SMOTEN

使用专门针对分类特征的SMOTE变体进行过采样。

SVMSMOTE

使用SVM-SMOTE变体进行过采样。

BorderlineSMOTE

使用Borderline-SMOTE变体进行过采样。

ADASYN

使用ADASYN进行过采样。

KMeansSMOTE

在应用SMOTE进行过采样之前,先进行聚类过采样。

注释

更多详情请参见原始论文 [1]

支持多类重采样。使用了一对多方案,如最初在[1]中提出的那样。

请参阅 比较过采样采样器, 以及 用于类似SMOTE采样器的样本生成器.

参考文献

[1] (1,2)

N. V. Chawla, K. W. Bowyer, L. O.Hall, W. P. Kegelmeyer, “SMOTE: 合成少数类过采样技术,” 人工智能研究杂志, 321-357, 2002.

示例

>>> from collections import Counter
>>> from numpy.random import RandomState
>>> from sklearn.datasets import make_classification
>>> from imblearn.over_sampling import SMOTENC
>>> 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(f'Original dataset shape {X.shape}')
Original dataset shape (1000, 20)
>>> print(f'Original dataset samples per class {Counter(y)}')
Original dataset samples per class Counter({1: 900, 0: 100})
>>> # simulate the 2 last columns to be categorical features
>>> X[:, -2:] = RandomState(10).randint(0, 4, size=(1000, 2))
>>> sm = SMOTENC(random_state=42, categorical_features=[18, 19])
>>> X_res, y_res = sm.fit_resample(X, y)
>>> print(f'Resampled dataset samples per class {Counter(y_res)}')
Resampled dataset samples per class Counter({0: 900, 1: 900})

方法

fit(X, y, **params)

检查采样器的输入和统计信息。

fit_resample(X, y, **params)

重新采样数据集。

get_feature_names_out([input_features])

获取转换的输出特征名称。

get_metadata_routing()

获取此对象的元数据路由。

get_params([deep])

获取此估计器的参数。

set_params(**params)

设置此估计器的参数。

fit(X, y, **params)[source]#

检查采样器的输入和统计信息。

在所有情况下,您都应该使用 fit_resample

Parameters:
X{array-like, dataframe, sparse matrix} of shape (n_samples, n_features)

数据数组。

yarray-like of shape (n_samples,)

目标数组。

Returns:
selfobject

返回实例本身。

fit_resample(X, y, **params)[source]#

重新采样数据集。

Parameters:
X{array-like, dataframe, sparse matrix} of shape (n_samples, n_features)

包含需要采样的数据的矩阵。

yarray-like of shape (n_samples,)

X中每个样本对应的标签。

Returns:
X_resampled{array-like, dataframe, sparse matrix} of shape (n_samples_new, n_features)

包含重采样数据的数组。

y_resampledarray-like of shape (n_samples_new,)

X_resampled 对应的标签。

get_feature_names_out(input_features=None)[source]#

获取转换的输出特征名称。

Parameters:
input_featuresarray-like of str or None, default=None

输入特征。

  • 如果 input_featuresNone,则使用 feature_names_in_ 作为特征名称。如果 feature_names_in_ 未定义,则生成以下输入特征名称: ["x0", "x1", ..., "x(n_features_in_ - 1)"]

  • 如果 input_features 是类似数组的,那么 input_features 必须 与 feature_names_in_ 匹配,如果 feature_names_in_ 已定义。

Returns:
feature_names_outndarray of str objects

与输入特征相同。

get_metadata_routing()[source]#

获取此对象的元数据路由。

请查看用户指南了解路由机制的工作原理。

Returns:
routingMetadataRequest

一个封装路由信息的MetadataRequest

get_params(deep=True)[source]#

获取此估计器的参数。

Parameters:
deepbool, default=True

如果为True,将返回此估计器及其包含的子对象的参数。

Returns:
paramsdict

参数名称映射到它们的值。

set_params(**params)[source]#

设置此估计器的参数。

该方法适用于简单的估计器以及嵌套对象(如Pipeline)。后者具有__形式的参数,以便可以更新嵌套对象的每个组件。

Parameters:
**paramsdict

估计器参数。

Returns:
selfestimator instance

估计器实例。

使用imblearn.over_sampling.SMOTENC的示例#

比较过采样采样器

Compare over-sampling samplers