【问题标题】:SMOTETomek - how to set ratio as dictionary for fixed balanceSMOTETomek - 如何将比率设置为固定余额的字典
【发布时间】:2019-03-01 04:08:47
【问题描述】:

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

我的数据集有类,例如:

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

Out[123]:
0    100
1     10
Name: CON_CHURN_TOTAL, dtype: int64

我想使用 SMOTETomek 在样本 0-class 和样本 1-class 之下达到 80 : 20 的比率。但是,我找不到更正字典的方法。当然,在完整代码中,80:20 的比例将根据行数计算。

当我尝试时:

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

我有错误:

ValueError:使用过采样方法时,a 中的样本数 类应该大于或等于原始样本数。 原来是100个样本,求80个样本。

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

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

【问题讨论】:

    标签: python python-3.x scikit-learn data-science


    【解决方案1】:

    我又遇到了问题,所以我直接在不平衡学习github上问了这个问题。

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

    最重要的:

    SMOTETomek 没有做你想做的事。

    SMOTETomek 应用 SMOTE,然后删除 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)
    

    【讨论】:

    • 抱歉,count_class 是什么意思?为什么是 300? @mateusz
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多