【问题标题】:SMOTE in pythonpython中的SMOTE
【发布时间】:2019-11-30 16:30:33
【问题描述】:

我正在尝试在 python 中使用 SMOTE,并查看是否有任何方法可以手动指定少数样本的数量。

假设我们有一个类的 100 条记录和另一个类的 10 条记录,如果我们使用 ratio = 1,我们得到 100:100,如果我们使用 ratio 1/2,我们得到 100:200。但我正在寻找是否有任何方法可以手动指定要为这两个类生成的实例数。

    Ndf_class_0_records = trainData[trainData['DIED'] == 0]
    Ndf_class_1_records = trainData[trainData['DIED'] == 1]
    Ndf_class_0_record_counts = Ndf_class_0_records.DIED.value_counts()
    Ndf_class_1_record_counts = Ndf_class_1_records.DIED.value_counts()
    X_smote = trainData.drop("DIED", axis=1)
    y_smote = trainData["DIED"]
    smt = SMOTE(ratio={0:Ndf_class_0_record_counts, 1:Ndf_class_1_record_counts*2})
    X_smote_res, y_smote_res = smt.fit_sample(X_smote, y_smote)

在上面的代码中,我尝试手动指定每个类的编号,但在代码的最后一行出现以下错误

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

【问题讨论】:

  • 您使用的是哪种 SMOTE 实现?你能展示你的进口吗?例如,imblearn.over_sampling.SMOTE
  • 嗨,贝克,我正在使用您指定的那个 - from imblearn.over_sampling import SMOTE

标签: python dataframe machine-learning oversampling


【解决方案1】:

如果我正确理解您和文档here,您不会将数字作为比率传递。您正在传递一个系列对象。

接受的比率类型有:

float, str, dict or callable, (default='auto')

请尝试做:

Ndf_class_0_records = trainData[trainData['DIED'] == 0]
Ndf_class_1_records = trainData[trainData['DIED'] == 1]
Ndf_class_0_record_counts = len(Ndf_class_0_records) ##### CHANGED THIS
Ndf_class_1_record_counts = len(Ndf_class_1_records) ##### CHANGED THIS
X_smote = trainData.drop("DIED", axis=1)
y_smote = trainData["DIED"]
smt = SMOTE(ratio={0:Ndf_class_0_record_counts, 1:Ndf_class_1_record_counts*2})
X_smote_res, y_smote_res = smt.fit_sample(X_smote, y_smote)

现在应该可以了,请尝试!

【讨论】:

    猜你喜欢
    • 2018-12-02
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2018-05-19
    • 2019-05-24
    • 1970-01-01
    相关资源
    最近更新 更多