使用 MLP 分类器,少数类精度、召回率、fscore 全部变为零

问题描述 投票:0回答:1

我使用 SkLearn 上提供的 MLP 分类器训练了我的模型。

我使用代码分割数据

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=1)

The X_train length = 9405
Class distribution for y_train = 0: 7562, 1: 1843
X_test length = 4032
class distribution on y_test = 0: 3242, 1: 790

MLP分类器的代码是

MLP = MLPClassifier(random_state=1, learning_rate = "constant", learning_rate_init=0.3, momentum = 0.2 )
MLP.fit(X_train, y_train)
R_y_pred = MLP.predict(X_test)
target_names = ['No', 'Yes']
print(classification_report(y_test, R_y_pred, target_names=target_names, zero_division=0))

zero_division= 0
已包含在分类报告中,因为它是从我之前的问题分类报告中的少数类别的准确率、召回率、F1 分数均为零值中建议的。我上一个问题的错误已得到纠正,但是我使用上述代码获得的分类报告似乎不正确。分类器未能将是类(少数类)分类,并将所有类分类为无类

分类报告看起来像

precision recall f1-score support No 0.80 1.00 0.89 3242 Yes 0.00 0.00 0.00 790 accuracy 0.80 4032 macro avg 0.40 0.50 0.45 4032 weighted avg 0.65 0.80 0.72 4032
该问题仅发生在 SVM 和 MLP 分类器上。该模型通过随机森林和逻辑回归训练得很好。该数据集是经过标签编码的分类数据集。

有什么建议吗?

machine-learning scikit-learn precision precision-recall mlp
1个回答
0
投票
能帮助您的信息很少,因此以下只是猜测。下次,通过传递

verbose=True

 来打开进度消息并在此处报告这些消息可能会很有用。

默认优化器是

solver='adam'

,它根本不使用 
momentum
 设置(根据 
sklearn 文档
,它仅对 
solver='sgd' 有效)。我也想知道你是怎么想出learning_rate_init=0.3
的?对于 
adam
 来说相当高,但我认为 
adam
 对于像您这样的小型数据集来说并不是最佳选择。所以我的猜测是你应该尝试 
solver='lbfgs'
solver='sgd'
。对于后者,您应该尝试调整学习率和动量参数。

如果事情开始起作用,我认为也值得通过参数

hidden_layer_sizes

调整网络结构......

© www.soinside.com 2019 - 2024. All rights reserved.