从零实现Logistic regression模型所有预测值均接近0.5问题求助
问题排查结果
核心问题1:train函数存在全局变量硬编码错误
你定义的train函数参数中传入了模型实例net,但函数内部打印参数、更新权重和偏置时,全部硬编码使用了全局实例NN,而非传入的net参数。虽当前代码中你传入的实例恰好是NN可正常运行,但该写法存在极大隐患,若后续更换传入的模型实例会直接导致训练完全失效。
核心问题2:正则化项计算错误
你当前实现的L2正则损失使用numpy.mean(net._weights**2 * net._lam/2),等价于将正则损失除以权重的维度,而非按照常规实现与对数损失保持一致除以样本数量,导致正则项的实际惩罚系数与预期不符,若正则惩罚过强会直接抑制权重更新,最终权重全部趋近于0,模型输出始终接近sigmoid(0)=0.5,无法完成分类。
正确的正则损失计算方式为:
regularization_term = net._lam * numpy.sum(net._weights **2) / (2 * len(p))
其他可能导致问题的原因
- 特征未标准化:逻辑回归对特征尺度敏感,若输入特征的量纲差异过大,会导致梯度下降收敛速度慢甚至无法收敛到最优解,建议在训练前对输入特征做Z-score标准化处理。
- 训练参数匹配错误:你代码中调用train函数时传入的epochs参数为100,而你给出的训练输出是1000轮的结果,需确认实际运行时是否正确修改了轮次参数;同时当前学习率0.5可尝试调整到0.1、0.01等不同数值对比收敛效果。
- 数据集读取错误:代码中存在未定义的变量
x_combined,需确认你运行的完整代码是否存在数据集读取错误、标签与特征不匹配的问题,可直接打印读取后的x_logregdata、y_logregdata的形状和部分值校验是否和预期一致。 - 权重初始化不合理:当前使用
numpy.random.rand(n)初始化权重,生成的是0~1区间的均匀分布值,所有初始权重均为正数,建议改用均值为0的正态分布初始化numpy.random.randn(n),加快收敛速度。
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

