0

我正在尝试在 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()。

4

1 回答 1

0

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

可接受的比率类型有:

float, str, dict 或 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)

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

于 2019-07-22T17:27:08.750 回答