You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用scikit-learn的MLPClassifier绘制Epoch准确率曲线及解决测试问题

如何在scikit-learn的MLPClassifier中按Epoch评估模型准确率

我来帮你解决这个问题——要实现每Epoch测试MLPClassifier的准确率,你只需要在现有循环训练的基础上,加入每轮训练后的评估步骤就行。我帮你修改了代码,并解释关键细节:

完整修正代码

from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score

NUM_EPOCHS = 1000
LOG_FOR_EVERY = 10

# 假设X和y是你的特征与标签数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 初始化MLP分类器,核心设置逐Epoch训练的参数
clf = MLPClassifier(
    hidden_layer_sizes=(18, 175, 256),
    batch_size=528,
    learning_rate_init=0.0001,
    beta_1=0.001,
    beta_2=0.001,
    max_iter=1,          # 每次fit只执行1个Epoch的训练
    warm_start=True,     # 开启热启动,保留上一轮训练的权重
    random_state=42      # 固定随机种子,保证实验可复现
)

# 存储训练过程中的准确率变化
train_acc_history = []
test_acc_history = []

for epoch in range(1, NUM_EPOCHS + 1):
    # 训练1个Epoch
    clf.fit(X_train, y_train.ravel())
    
    # 计算当前Epoch的训练集与测试集准确率
    train_pred = clf.predict(X_train)
    train_acc = accuracy_score(y_train, train_pred)
    train_acc_history.append(train_acc)
    
    test_pred = clf.predict(X_test)
    test_acc = accuracy_score(y_test, test_pred)
    test_acc_history.append(test_acc)
    
    # 每指定次数打印一次训练状态
    if epoch % LOG_FOR_EVERY == 0:
        print(f"Epoch {epoch:4d} | 训练准确率: {train_acc:.4f} | 测试准确率: {test_acc:.4f}")

# 可选:绘制准确率变化曲线,直观观察训练趋势
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(range(1, NUM_EPOCHS+1), train_acc_history, label='训练集准确率', alpha=0.7)
plt.plot(range(1, NUM_EPOCHS+1), test_acc_history, label='测试集准确率', alpha=0.7)
plt.xlabel('Epoch 次数')
plt.ylabel('准确率')
plt.title('MLP训练过程中准确率变化')
plt.legend()
plt.grid(alpha=0.3)
plt.show()

关键细节解释

  • warm_start=True:这是逐Epoch训练的核心,开启后每次调用fit()时,模型会基于上一轮训练的权重继续优化,而不是重新初始化参数。
  • max_iter=1:MLPClassifier的max_iter参数代表训练的总Epoch数,设置为1后,每次fit()只会执行一轮完整的训练(即一个Epoch)。
  • 准确率评估:每轮训练结束后,用predict()生成预测结果,再通过accuracy_score计算准确率,同时记录训练集和测试集的结果,方便后续分析模型的拟合情况。
  • 日志打印控制:通过epoch % LOG_FOR_EVERY == 0的判断,实现每N个Epoch输出一次结果,避免日志过多影响观察。

额外建议

  • 如果你的数据集规模较大,每轮都做全量预测可能耗时,可以适当降低评估频率(比如每50个Epoch评估一次)。
  • 若需要早停机制(避免过拟合或无效训练),可以在循环中加入判断逻辑:比如连续20个Epoch测试集准确率没有提升,就提前终止训练。
  • 固定random_state能保证每次训练的初始权重一致,让实验结果可复现。

内容的提问来源于stack exchange,提问作者Hopark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:25:53