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

LightGBM回归模型预测出现无穷值及警告问题求助

问题解决:LightGBM预测后np.expm1输出全为Inf及SettingWithCopyWarning

一、预测结果全为Inf的解决

原因分析

np.expm1(x)等价于np.exp(x) - 1,当x的数值过大时(超过~709,因为np.exp(709)是Python浮点数能表示的最大有限值),计算会溢出返回Inf。这说明模型在测试集上输出的原始预测值(log转换后的房价)存在极大值,大概率是以下问题导致:

  • 训练集与测试集的特征处理不一致,测试集存在训练集未出现的极端特征值,引发模型异常预测
  • 模型过拟合,对训练集的log转换后目标拟合过度,在测试集上预测值飘到极大值

排查与解决步骤

  1. 查看原始预测值:
    先跳过np.expm1,打印模型的原始预测结果统计量:

    preds_log = gbm.predict(x_test, num_iteration=gbm.best_iteration_)
    print(f"预测log值的最大值: {preds_log.max()}")
    print(f"预测log值的最小值: {preds_log.min()}")
    

    如果最大值接近或超过700,就会触发溢出。

  2. 限制预测值上限再转换:
    先对原始预测值做截断,再执行expm1:

    preds_log_clipped = np.clip(preds_log, None, 700)  # 把最大值限制在700,避免溢出
    preds = np.expm1(preds_log_clipped)
    
  3. 检查特征一致性:
    对比训练集和测试集的所有特征的统计量(最大值、最小值、分位数),确保测试集没有超出训练集特征分布的极端值。比如:

    # 对比训练集与测试集特征的最大值
    train_max = x_train.max()
    test_max = x_test.max()
    print(train_max[train_max < test_max])  # 找出测试集最大值超过训练集的特征
    

    若存在这类特征,需要对测试集的该特征做截断(限制在训练集的最大值以内),或者重新做特征工程。

二、SettingWithCopyWarning的解决

这个警告是因为x_test是原始DataFrame的视图而非独立副本,后续对x_test的操作可能会影响原始数据。解决方法很简单:
在创建x_test时显式生成副本:

# 替换原来的x_test创建代码,加上.copy()
x_test = df_test[feature_cols].copy()

或者后续转换为独立DataFrame:

x_test = pd.DataFrame(x_test)

内容的提问来源于stack exchange,提问作者Luis Valencia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:36:17