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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:06:02