我使用 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 分类器上。该模型通过随机森林和逻辑回归训练得很好。该数据集是经过标签编码的分类数据集。有什么建议吗?
verbose=True
来打开进度消息并在此处报告这些消息可能会很有用。默认优化器是
solver='adam'
,它根本不使用
momentum
设置(根据sklearn 文档
,它仅对
solver='sgd'
有效)。我也想知道你是怎么想出learning_rate_init=0.3
的?对于
adam
来说相当高,但我认为
adam
对于像您这样的小型数据集来说并不是最佳选择。所以我的猜测是你应该尝试
solver='lbfgs'
或
solver='sgd'
。对于后者,您应该尝试调整学习率和动量参数。如果事情开始起作用,我认为也值得通过参数
hidden_layer_sizes
调整网络结构......