sklearn接口报错Input contains NaN, infinity or a value too large for dtype(‘float64‘)

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

你可能感兴趣的:(机器学习and数据挖掘,数据挖掘,机器学习,python)