如何在MLPRegressor中传入自定义划分的验证数据集
MLPRegressor使用自定义验证集的实现方案
sklearn的MLPRegressor确实没有直接传入自定义验证集的参数,你可以通过以下两种方式实现需求:
方案1:利用内置参数快速实现(无需手动写训练循环)
MLPRegressor的validation_fraction参数默认从传入的训练数据末尾切分验证集,只要关闭shuffle参数避免数据打乱,就可以让切出来的验证集刚好是你预先定义的部分。
import numpy as np from sklearn.neural_network import MLPRegressor # 你的原有数据 x = np.random.normal(1.0, 0.005, 100) y = np.random.normal(0, 1, 100) # 注意原切分逻辑x[81:100]会漏掉索引为80的样本,此处修正为80:100保证验证集为完整20个样本 x_train = x[0:80] x_valid = x[80:100] y_train = y[0:80] y_valid = y[80:100] # 拼接训练+验证集,顺序保持训练在前、验证在后 # MLP要求输入为2维数组,所以需要reshape调整维度 X_combined = np.vstack([x_train.reshape(-1,1), x_valid.reshape(-1,1)]) y_combined = np.hstack([y_train, y_valid]) # 初始化模型 mlp = MLPRegressor( hidden_layer_sizes=(16,8), # 可按需求调整网络结构 max_iter=1000, early_stopping=True, # 开启早停才会调用验证集逻辑 validation_fraction=len(y_valid)/len(y_combined), # 此处为0.2,和你的验证集占比一致 shuffle=False, # 关闭数据打乱,保证从末尾切出的验证集为自定义部分 random_state=42 ) # 训练模型 mlp.fit(X_combined, y_combined)
方案2:手动训练循环(灵活性更高)
通过partial_fit逐轮训练,每轮结束后自行在自定义验证集上计算指标,还可以自定义早停逻辑,适配所有验证集拆分场景。
import numpy as np from sklearn.neural_network import MLPRegressor # 数据准备同上 x = np.random.normal(1.0, 0.005, 100) y = np.random.normal(0, 1, 100) x_train = x[0:80].reshape(-1,1) x_valid = x[80:100].reshape(-1,1) y_train = y[0:80] y_valid = y[80:100] # 初始化模型 mlp = MLPRegressor( hidden_layer_sizes=(16,8), max_iter=1, # 每次partial_fit仅训练1轮 warm_start=True, # 开启热启动,保留上一轮训练的权重 random_state=42 ) # 自定义训练和早停逻辑 max_epochs = 1000 patience = 10 # 早停耐心值,连续10轮验证损失不下降则停止训练 best_valid_loss = float('inf') no_improve_count = 0 best_weights = None for epoch in range(max_epochs): mlp.partial_fit(x_train, y_train) # 计算验证集MSE损失,可替换为其他自定义指标 valid_pred = mlp.predict(x_valid) valid_loss = np.mean((valid_pred - y_valid)**2) # 早停判断 if valid_loss < best_valid_loss: best_valid_loss = valid_loss no_improve_count = 0 # 保存最优模型权重 best_weights = mlp.coefs_ + mlp.intercepts_ else: no_improve_count += 1 if no_improve_count >= patience: print(f"第{epoch+1}轮触发早停,最优验证损失:{best_valid_loss:.4f}") # 加载最优权重 mlp.coefs_ = best_weights[:len(mlp.coefs_)] mlp.intercepts_ = best_weights[len(mlp.coefs_):] break
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

