LinearRegression报NaN/无穷值错误但无空值的解决方法
线性回归报float64类型值异常的排查解决方法
df.isnull().sum()只能识别标准NaN空值,覆盖不到触发该报错的另外两类原因:无穷值、超出float64精度范围的极值,也容易漏检训练标签、预测集的异常,按以下步骤逐一排查即可:
第一步:排查全量数据集的无穷值
数据计算过程中(比如除0、对数运算处理不当)很容易生成np.inf(正无穷)、-np.inf(负无穷),这类值不会被isnull()识别。对训练特征、训练标签、待预测特征三个数据集分别执行以下代码统计无穷值:import numpy as np # 替换为你要检查的数据集变量,比如X_train、y_train、X_test都要单独检查 print(np.isinf(your_dataset).sum())查到无穷值后先替换为空值,再走你之前的空值处理逻辑即可:
your_dataset = your_dataset.replace([np.inf, -np.inf], np.nan) # 后续接你常用的空值处理:删除、均值/中位数填充都可以第二步:排查超出float64精度范围的极值
float64支持的数值范围约为-1.8e308 ~ 1.8e308,如果做特征工程时做了无约束的指数变换、未平滑的比值计算,很容易生成超出这个范围的极值,这类值既不会被isnull()识别,也不属于常规无穷值。用以下代码逐字段校验:# 返回False的字段就是存在非有限值的异常字段 print(np.isfinite(your_dataset).all())这类极值推荐用分位数截断法处理,避免溢出同时保留数据分布:
import pandas as pd # 提取所有数值型字段 num_cols = your_dataset.select_dtypes(include=[np.number]).columns for col in num_cols: # 取1%和99%分位作为截断边界 lower = your_dataset[col].quantile(0.01) upper = your_dataset[col].quantile(0.99) your_dataset[col] = your_dataset[col].clip(lower, upper)第三步:排查高频遗漏的校验盲区
90%以上“已经洗过数据还是报错”的情况,都是漏了以下场景:- 漏查训练标签列:大部分人清洗数据时只处理特征表
X,忘了检查标签列y是否存在空值、无穷值、极值,拟合阶段就会触发报错 - 漏查待预测数据集:如果模型拟合阶段没报错,调用
predict()时才弹错,基本是待预测的测试集/新数据集没有和训练集走完全一致的清洗流程,残留了异常值 - 非数值类型残留:如果建模字段里混了object类型的内容(比如没转干净的带特殊符号的字符串、空字符串),
isnull()识别不到这类异常,但建模时强制转float失败也会报同类错。先执行your_dataset.dtypes检查所有入模字段类型,非数值字段统一做强制转换,转换失败的内容置为空值再处理:for col in num_cols: your_dataset[col] = pd.to_numeric(your_dataset[col], errors='coerce') # 转换完成后再补一次空值处理
- 漏查训练标签列:大部分人清洗数据时只处理特征表
内容的提问来源于stack exchange,提问作者Goodness Adewuyi
相关产品推荐
相关产品推荐

