【发布时间】: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