1. 错误场景
某个包调用了sklearn接口,在fit(x,y)时报错Input contains NaN, infinity or a value too large for dtype('float64')
2. 错误原因
通过查看/sklearn/utils/validation.py文件,发现有一段这样的代码:
if is_float and (np.isfinite(_safe_accumulator_op(np.sum, X))):
pass
elif is_float:
msg_err = "Input contains {} or a value too large for {!r}."
if (allow_nan and np.isinf(X).any() or
not allow_nan and not np.isfinite(X).all()):
type_err = 'infinity' if allow_nan else 'NaN, infinity'
raise ValueError(
msg_err.format
(type_err,
msg_dtype if msg_dtype is not None else X.dtype)
)
# for object dtype data, we only check for NaNs (GH-13254)
elif X.dtype == np.dtype('object') and not allow_nan:
if _object_dtype_isnan(X).any():
raise ValueError("Input contains NaN")
会通过
np.isinf(X).any()=True 或 np.isfinite(X).all()=False 判断数据集是否包含无穷值
3. 解决方案
any()是或操作,任意一个元素为True,输出为True
all()是与操作,所有元素为True,输出为True
检查数据集,若
np.isinf(X).any()=False
np.isfinite(X).all()=True
np.isnan(X).any()=False
则说明数据集不包含缺失值和无穷值
4.其他检查
已经完成了3的检查后,发现我的数据集没有问题!但依然会报Input contains NaN, infinity or a value too large for dtype('float64'),不禁陷入沉思
X.copy().fillna(-1).reset_index(drop=True)
X已经执行了缺失值填充操作,难道是y有问题?
执行了
y = y.reset_index(drop=True)
于是,程序恢复正常了.....
5.总结
遇到该错误时,需进行以下检查
- 缺失值
- 无穷值
- 对于dataframe或者series需reset_index