【问题标题】:Very low performance even after oversampling dataset即使在对数据集进行过采样之后,性能也非常低
【发布时间】:2019-12-04 22:21:47
【问题描述】:

我使用MLPClassifier 对心脏病进行分类。我使用imblearn.SMOTE 来平衡每个类的对象。我得到了很好的结果(85% 的平衡acc。),但我被告知我不会在测试数据上使用SMOTE,只用于训练数据。在我做出这些改变之后,我的分类器的性能下降太多(大约 35% 的平衡准确度),我不知道哪里出了问题。

这是一个简单的基准测试,训练数据平衡但测试数据不平衡:

这是代码:

    def makeOverSamplesSMOTE(X,y):
         from imblearn.over_sampling import SMOTE
         sm = SMOTE(sampling_strategy='all')
         X, y = sm.fit_sample(X, y)
         return X,y
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=20)

    ## Normalize data
    from sklearn.preprocessing import StandardScaler
    sc_X = StandardScaler()
    X_train = sc_X.fit_transform(X_train)
    X_test = sc_X.fit_transform(X_test)

    ## SMOTE only on training data
    X_train, y_train = makeOverSamplesSMOTE(X_train, y_train)

    clf = MLPClassifier(hidden_layer_sizes=(20),verbose=10,
                        learning_rate_init=0.5, max_iter=2000, 
                        activation='logistic', solver='sgd', shuffle=True, random_state=30)

    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)

我想知道我做错了什么,因为这似乎是准备数据的正确方法。

【问题讨论】:

  • 应该有一个可以设置的权重参数,这样当你在 SMOTE 之后训练 50% 的正类时,你不会预测没有 SMOTE 的 50% 的正类。
  • 不幸的是没有这样的东西

标签: machine-learning scikit-learn classification imblearn mlp


【解决方案1】:

代码中的第一个错误是在将数据转换为标准格式时。您只需要适合StandardScaler 一次,即在X_train 上。你不应该在X_test 上改装它。所以正确的代码是:

def makeOverSamplesSMOTE(X,y):
     from imblearn.over_sampling import SMOTE
     sm = SMOTE(sampling_strategy='all')
     X, y = sm.fit_sample(X, y)
     return X,y
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=20)

## Normalize data
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

## SMOTE only on training data
X_train, y_train = makeOverSamplesSMOTE(X_train, y_train)

clf = MLPClassifier(hidden_layer_sizes=(20),verbose=10,
                    learning_rate_init=0.5, max_iter=2000, 
                    activation='logistic', solver='sgd', shuffle=True, random_state=30)

clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

对于机器学习模型,请尝试降低学习率。它太高了。 sklearn 中的默认学习率为 0.001。尝试更改激活函数和层数。此外,并非每个 ML 模型都适用于每个数据集,因此您可能需要查看数据并相应地选择 ML 模型。

【讨论】:

  • 考虑到 SMOTE 应用程序,您能否更新您的代码?我不明白它的去向。另一件事:您的代码实际上是在测试数据上应用缩放器,但在您的回答中您说不要使用它。我很困惑
  • 我正在转换测试数据,但我没有在该数据上拟合 sc_X
  • 我按照你说的做了修改,但是没有更好的结果。关于分类器,没有错,因为 MLP 非常适合此类问题。在仅对 train 而不是整个数据集进行过采样之后,出现了这种低结果
  • 不,MLP 在不平衡数据集上并不是表现最好的。预测损失的一个原因是该模型只是过度拟合训练数据,而训练数据是较小数据的过采样版本。检查训练的准确性。还要检查每类的准确性。
  • 尝试交叉验证和NN算法,可能会提供更好的结果。
【解决方案2】:

希望您的模型已经获得了更好的结果。我尝试通过更改一些参数,我得到了 65% 的准确度,当我将其更改为 90:10 样本时,我得到了 70% 的准确度。 但是准确性会误导,所以我计算了 F1 分数,它可以让您更好地了解预测。

from sklearn.neural_network import MLPClassifier
clf = MLPClassifier(hidden_layer_sizes=(1,),verbose=False,
                    learning_rate_init=0.001, 
                    max_iter=2000, 
                    activation='logistic', solver='sgd', shuffle=True, random_state=50)

clf.fit(X_train_res, y_train_res)
y_pred = clf.predict(X_test)

from sklearn.metrics import accuracy_score, confusion_matrix ,classification_report
score=accuracy_score(y_test, y_pred, )
print(score)
cr=classification_report(y_test, clf.predict(X_test))
print(cr)

准确度 = 0.65

分类报告: 精确召回 f1 分数支持

       0       0.82      0.97      0.89        33
       1       0.67      0.31      0.42        13
       2       0.00      0.00      0.00         6
       3       0.00      0.00      0.00         4
       4       0.29      0.80      0.42         5

   micro avg       0.66      0.66      0.66        61
   macro avg       0.35      0.42      0.35        61
weighted avg       0.61      0.66      0.61        61

混淆矩阵:

array([[32,  0,  0,  0,  1],
       [ 4,  4,  2,  0,  3],
       [ 1,  1,  0,  0,  4],
       [ 1,  1,  0,  0,  2],
       [ 1,  0,  0,  0,  4]], dtype=int64)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 2018-10-29
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2019-05-09
    相关资源
    最近更新 更多