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

时间:2018-09-25 13:47:19

标签: 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

我想使用SMOTETomek在样本0级以下,而在样本1级以上,以达到80:20的比率。但是,我找不到纠正字典的方法。当然,在完整代码中,比率80:20将基于行数来计算。

当我尝试时:

from imblearn.combine import SMOTETomek
smt = SMOTETomek(ratio={1:20, 0:80})

我有错误:

  

ValueError:使用过采样方法时,   类别应大于或等于原始样本数。   最初有100个样本,而要询问80个样本。

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

很遗憾,由于404错误,documentary现在无法正常工作。

1 个答案:

答案 0 :(得分:0)

我再次遇到问题,因此我直接在不平衡学习的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)