如何为LSTM调参的Optuna函数添加5折交叉验证并输出AUC?
解决方案:给LSTM超参数调优的Optuna目标函数添加5折交叉验证
首先需要导入必要的库,然后修改目标函数以满足需求:
步骤1:导入依赖库
import time from sklearn.model_selection import KFold from sklearn.metrics import roc_auc_score # 确保create_model函数已定义,且X_train、y_train、X_test、y_test数据集已准备完成
步骤2:修改后的Optuna目标函数
def objective(trial): start_time = time.time() # 初始化5折交叉验证器,开启洗牌保证数据分布均匀 kf = KFold(n_splits=5, shuffle=True, random_state=42) train_aucs = [] # 执行5折交叉验证,计算每折训练集的AUC for fold, (train_idx, val_idx) in enumerate(kf.split(X_train)): # 拆分当前折的训练和验证数据(仅在训练集内部拆分) X_fold_train, X_fold_val = X_train[train_idx], X_train[val_idx] y_fold_train, y_fold_val = y_train[train_idx], y_train[val_idx] # 为每折创建全新模型,避免跨折权重复用 model = create_model(trial) model.fit(X_fold_train, y_fold_train, epochs=15, verbose=0) # 计算当前折训练集的AUC并收集 y_fold_train_pred = model.predict(X_fold_train) fold_train_auc = roc_auc_score(y_fold_train, y_fold_train_pred) train_aucs.append(fold_train_auc) # 计算训练集5折的平均AUC avg_train_auc = sum(train_aucs) / len(train_aucs) # 使用全部训练数据训练最终模型,计算测试集AUC(测试集不拆分) final_model = create_model(trial) final_model.fit(X_train, y_train, epochs=15, verbose=0) y_test_pred = final_model.predict(X_test) test_auc = roc_auc_score(y_test, y_test_pred) end_time = time.time() elapsed_time = end_time - start_time # 输出迭代信息 print(f"迭代编号: {trial.number}") print(f"训练集5折平均AUC: {avg_train_auc:.4f}") print(f"测试集AUC: {test_auc:.4f}") print(f"超参数: {trial.params}") print(f"耗时: {elapsed_time:.2f} 秒") print("-" * 50) # 返回测试集AUC作为Optuna的优化目标(可根据需求改为返回avg_train_auc) return test_auc
关键改动说明
- 5折交叉验证实现:用
KFold拆分训练集,每折都创建全新模型训练,避免权重共享导致的结果偏差 - 训练集平均AUC计算:收集每折训练数据的AUC值,最后求平均值并输出
- 测试集AUC计算:用当前超参数组合在全部训练数据上训练最终模型,再对固定的测试集进行预测和AUC计算
- 输出优化:调整打印内容,清晰展示迭代编号、训练集平均AUC、测试集AUC、超参数和耗时
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

