如何用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
相关产品推荐
相关产品推荐

