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

Python实现逻辑回归:如何在损失不再改善时终止训练过程?

实现逻辑回归的早停训练

要实现早停(Early Stopping),核心思路是跟踪测试集的损失,当损失连续多个epoch没有有效改善时就终止训练——这既能避免过拟合,又能节省不必要的计算资源。下面是修改后的代码,我会一步步拆解关键改动:

修改后的完整代码

def train(X_train, y_train, X_test, y_test, epochs, alpha, eta0, patience=5, epsilon=1e-6):
    N = len(X_train)
    dim = len(X_train[0])  # 修正:原代码的dim = X_train[0]是取样本而非特征维度,这里调整为特征数量
    w, b = initialize_weights(dim)
    
    # 初始化早停核心变量
    best_test_loss = float('inf')
    best_w, best_b = w.copy(), b.copy()
    patience_counter = 0
    
    for i in tqdm(range(epochs)):
        # 单轮梯度下降更新权重
        for x, y in zip(X_train, y_train):
            dw = gradient_dw(x, y, w, b, alpha, 1)
            db = gradient_db(x, y, w, b)
            w = w + (eta0 * dw)
            b = b + (eta0 * db)
        
        # 计算当前轮次的训练/测试损失
        train_prob = [sigmoid((np.dot(w.T, x)) + b) for x in X_train]
        train_loss = logloss(y_train, train_prob)
        test_prob = [sigmoid((np.dot(w.T, x)) + b) for x in X_test]
        test_loss = logloss(y_test, test_prob)
        
        # 早停逻辑判断
        # 只有当测试损失比最优值小至少epsilon时,才认为是有效改善
        if test_loss < best_test_loss - epsilon:
            best_test_loss = test_loss
            best_w, best_b = w.copy(), b.copy()  # 保存当前最优权重
            patience_counter = 0  # 重置耐心计数器
        else:
            patience_counter += 1
        
        # 连续patience轮无改善,终止训练
        if patience_counter >= patience:
            print(f"早停触发,在第{i+1}轮终止训练")
            break
    
    # 返回训练过程中最优的模型及对应损失,而非最后一轮的结果
    final_train_loss = logloss(y_train, [sigmoid((np.dot(best_w.T, x)) + best_b) for x in X_train])
    return best_w, best_b, final_train_loss, best_test_loss

关键改动说明

  • 修正特征维度获取:原代码的dim = X_train[0]是取单个样本而非特征数量,这里调整为len(X_train[0])更合理。
  • 早停变量初始化:
    • best_test_loss:初始化为无穷大,用来记录训练过程中出现的最小测试损失。
    • best_w/best_b:保存对应最小测试损失的权重和偏置,确保最终返回的是最优模型。
    • patience_counter:计数连续多少轮测试损失没有有效改善。
  • 损失改善的严谨判断:加入epsilon小阈值,避免因浮点精度误差把微小的损失波动当成“没有改善”——只有当测试损失比之前最优值小至少epsilon时,才认为是有效提升。
  • 耐心机制:设置patience参数(默认5轮),如果连续patience轮都没有有效改善,就终止训练。这能避免因偶然的损失上升就提前停止,给模型足够的收敛空间。
  • 返回最优模型:最后返回的是训练过程中测试损失最小的模型,而非最后一轮的模型,这是早停策略的核心价值。

额外实用建议

  1. 优先用验证集而非测试集:实际训练中,建议把训练集再拆分出一个验证集来做早停判断,避免测试集信息泄露导致最终评估结果失真。
  2. 同步监控训练损失:如果训练损失还在下降但测试损失持续上升,说明模型开始过拟合,此时早停会及时终止训练。
  3. 灵活调整参数:根据数据集大小和模型收敛速度,调整patience和epsilon——比如复杂模型可以把patience设大一点,epsilon则根据损失的量级调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:22:33