LightGBM回归模型预测出现无穷值及警告问题求助
问题解决:LightGBM预测后
np.expm1输出全为Inf及SettingWithCopyWarning 一、预测结果全为Inf的解决
原因分析
np.expm1(x)等价于np.exp(x) - 1,当x的数值过大时(超过~709,因为np.exp(709)是Python浮点数能表示的最大有限值),计算会溢出返回Inf。这说明模型在测试集上输出的原始预测值(log转换后的房价)存在极大值,大概率是以下问题导致:
- 训练集与测试集的特征处理不一致,测试集存在训练集未出现的极端特征值,引发模型异常预测
- 模型过拟合,对训练集的log转换后目标拟合过度,在测试集上预测值飘到极大值
排查与解决步骤
查看原始预测值:
先跳过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,就会触发溢出。
限制预测值上限再转换:
先对原始预测值做截断,再执行expm1:preds_log_clipped = np.clip(preds_log, None, 700) # 把最大值限制在700,避免溢出 preds = np.expm1(preds_log_clipped)检查特征一致性:
对比训练集和测试集的所有特征的统计量(最大值、最小值、分位数),确保测试集没有超出训练集特征分布的极端值。比如:# 对比训练集与测试集特征的最大值 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
相关产品推荐
相关产品推荐

