SMOTETomek - 如何将比率设置为固定余额的字典

Mat*_*ski 5 python python-3.x scikit-learn data-science

我尝试使用这种技术来纠正非常不平衡的类别。

我的数据集有类,例如:

In [123]:
data['CON_CHURN_TOTAL'].value_counts()

Out[123]:
0    100
1     10
Name: CON_CHURN_TOTAL, dtype: int64
Run Code Online (Sandbox Code Playgroud)

我想使用 SMOTETomek 对 0 类进行欠采样并对 1 类进行采样,以达到 80 : 20 的比例。但是,我找不到纠正字典的方法。当然,在完整代码中,80:20 的比例将根据行数计算。

当我尝试时:

from imblearn.combine import SMOTETomek
smt = SMOTETomek(ratio={1:20, 0:80})
Run Code Online (Sandbox Code Playgroud)

我有错误:

ValueError:使用过采样方法时,类中的样本数应大于或等于原始样本数。本来有100个样品,问了80个样品。

但这种方法应该适合同时进行欠采样和过采样。

不幸的是,由于 404 错误,该纪录片现在无法播放。

Mat*_*ski 3

我再次遇到了问题,因此我直接在不平衡学习github上提出了这个问题。

这是完整的答案:github.com/scikit-learn-contrib/imbalanced-learn

最重要的:

SMOTETomek没有做你想做的事。

SMOTETomek 应用 SMOTE,然后删除 Tomek 链路,而不是同时进行过采样和欠采样。

请注意,使用 Tomek 时您无法定义要使用的样本数量: http://imbalanced-learn.org/en/stable/under_sampling.html#tomek-s-links

如果你确实想要欠采样,你可以管道化 2 个采样器:

from sklearn.datasets import load_breast_cancer
import pandas as pd
from imblearn.pipeline import make_pipeline
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import NearMiss

data = load_breast_cancer()
X = pd.DataFrame(data=data.data, columns=data.feature_names)

count_class_0 = 300
count_class_1 = 300
pipe = make_pipeline(
    SMOTE(sampling_strategy={0: count_class_0}),
    NearMiss(sampling_strategy={1: count_class_1}
)

X_smt, y_smt = pipe.fit_resample(X, data.target)
Run Code Online (Sandbox Code Playgroud)