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

如何在循环内提取DataFrame中列表最大值并保留迭代最优验证准确率

解决方案

核心思路

每次训练完成后,从hy.history中提取各指标的最大值(重点是验证准确率的最大值),同时记录本次训练使用的超参数,将这些数据整合成单个字典后存入结果列表,最后直接转成DataFrame即可得到每行对应一次迭代的结构化数据。

修改后的完整代码

import random
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Flatten, Dense
import keras

# 超参数
lr = [0.001, 0.005, 0.01, 0.02]
bs = [25, 50, 75, 100]
neurons = [8, 10, 12]
optimizer = ['keras.optimizers.Adam', 'keras.optimizers.SGD', 'keras.optimizers.RMSprop']

results = []

for x in range(2):
    lr_rand = random.choice(lr)
    bs_rand = random.choice(bs)
    opt_rand = random.choice(optimizer)
    neu_rand = random.choice(neurons)

    model = Sequential()
    model.add(Flatten(input_shape=[28, 28]))
    model.add(Dense(neu_rand, activation="relu"))
    model.add(Dense(neu_rand, activation="relu"))
    model.add(Dense(neu_rand, activation="relu"))
    model.add(Dense(10, activation="softmax"))
    
    model.summary()
    
    model.compile(loss=keras.losses.sparse_categorical_crossentropy,
                  optimizer=eval(opt_rand)(learning_rate=lr_rand),
                  metrics=[keras.metrics.sparse_categorical_accuracy])
    hy = model.fit(x_train_scaled, y_train, batch_size=bs_rand, epochs=3, validation_data=(x_valid_scaled, y_valid))
    
    # 提取本次训练各指标最大值,同时记录超参数
    iteration_result = {
        "learning_rate": lr_rand,
        "batch_size": bs_rand,
        "optimizer": opt_rand,
        "neurons": neu_rand,
        "max_train_loss": max(hy.history['loss']),
        "max_train_accuracy": max(hy.history['sparse_categorical_accuracy']),
        "max_val_loss": max(hy.history['val_loss']),
        "max_val_accuracy": max(hy.history['val_sparse_categorical_accuracy'])
    }
    results.append(iteration_result)
    
    # 保留绘图逻辑
    pd.DataFrame(hy.history).plot(figsize=(16, 8), ls='-')
    plt.grid(True)
    plt.gca().set_ylim(0, 1.01)
    plt.title(f"损失函数与准确率(训练/验证): 学习率:{lr_rand*100:3.1f}%, {opt_rand}, 批次大小: {bs_rand}, 神经元数: {neu_rand}")
    plt.show()

# 生成最终结果DataFrame
final_results_df = pd.DataFrame(results)
print(final_results_df)

关键修改说明

  1. 重构结果收集逻辑:不再直接存入hy.history,而是计算每个指标的最大值,搭配超参数组成字典存入列表,确保每个字典对应一行数据,彻底解决单元格为列表的问题。
  2. 匹配Keras指标键名:验证准确率的键是val_sparse_categorical_accuracy,需与hy.history中的键完全对应,避免取值错误。
  3. 正确生成DataFrame:直接将字典列表传入pd.DataFrame(),即可得到每行对应一次迭代的结构化表格,所有单元格均为单个数值。

原代码错误原因

你之前直接results.append(hy.history)得到的是多个字典的集合,每个字典的键对应包含3个epoch数值的列表。此时用pd.concat(results)是错误的——concat用于拼接DataFrame对象,而非字典列表,正确做法是将字典列表直接传入pd.DataFrame()生成表格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:35:25