我有一个大约45000
个样本的数据集,每个样本的二进制输出为0
或1
。但是在sklearn包中使用MLP分类器之后,我获得了一个模型,无论输入是什么,它总是具有1
的输出。类0
的精度为零。我试过改变模型的超参数,但输出是一样的。任何人都可以提出一种方法来克服它吗?
precision recall f1-score support
0 0.00 0.00 0.00 19967
1 0.57 1.00 0.73 26688
avg / total 0.33 0.57 0.42 46655
PS:我的代码
loc = './new_attributes_66.csv'
data = pd.read_csv(loc)
scaler = MinMaxScaler(feature_range = (-1,1))
scaler.fit(data)
data = scaler.transform(data)
print data
input = data[:,0:64]
output = data[:,65]
X_tr, X_tst, y_tr, y_tst = train_test_split(input, output, test_size=0.1)
clf = MLPClassifier(solver='sgd', alpha=1e-5, hidden_layer_sizes=(40,121), random_state=0, warm_start = True, tol = 0.0000001, early_stopping = False, learning_rate='adaptive',learning_rate_init = 0.1, max_iter=10000,shuffle=True,verbose=True)
clf.fit(X_tr,y_tr)
predicted = clf.predict(input)
#print "Accuracy using MLP classifier: "
print metrics.precision_score(output, predicted)
#print confusion_matrix(y_tst,predicted)
print metrics.classification_report(output,predicted)
#print clf.coefs_
链接到数据集(csv):https://app.box.com/s/vfqgool2u9ovdc9oyi9elq99aor6c6gk
更新: 我已根据最新结果修改了我的代码和结果。我可以提高精确度并召回:
precision recall f1-score support
-1.0 0.53 0.10 0.17 19967
1.0 0.58 0.93 0.72 26688
avg / total 0.56 0.58 0.48 46655
准确度为58.14 %
。在其他方面可以改变超参数吗?
答案 0 :(得分:3)
您的数据可能会遇到类不平衡问题。可能是标签1
的样本数远远超过标签0
的样本数。解决阶级不平衡问题有多种方法:
您还可以尝试检查不同的alpha值或不同形状的隐藏图层。也许您正在使用的当前配置无法正确学习。
答案 1 :(得分:1)
嘿,经过Mohammed Kasif的建议,我尝试了AdaBoostClassifier
数据并将数据缩放到-1,1
并获得了以下结果:
准确度:0.682432189042
precision recall f1-score support
-1.0 0.59 0.56 0.57 19967
1.0 0.68 0.71 0.70 26688
avg / total 0.64 0.65 0.64 46655
与57-58 %
相比,这是一个很大的改进,我们能够在没有缩放的情况下进入MLPclassifier
甚至是AdaBoostclassifier
。任何有更好结果的人都可以自由发表他们的想法:)