sklearn error ValueError:输入包含NaN,无穷大或对于dtype('float64')来说太大的值

时间:2015-07-09 16:40:02

标签: python python-2.7 scikit-learn valueerror

我正在使用sklearn并且遇到亲和力传播问题。我已经构建了一个输入矩阵,我不断收到以下错误。

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

我跑了

np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True

我尝试使用

mat[np.isfinite(mat) == True] = 0

删除无限值,但这也不起作用。 我该怎么做才能摆脱矩阵中的无限值,以便我可以使用亲和传播算法?

我正在使用anaconda和python 2.7.9。

16 个答案:

答案 0 :(得分:76)

这可能发生在scikit内部,这取决于你正在做什么。我建议您阅读您正在使用的功能的文档。你可能正在使用一个依赖于你的矩阵是肯定的,不符合这个标准。

编辑:我怎么能错过这个:

np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True

显然是错的。正确的是:

np.any(np.isnan(mat))

np.all(np.isfinite(mat))

您想检查任何元素是否为NaN,而不是any函数的返回值是否为数字...

答案 1 :(得分:23)

sklearn pandas 一起使用时,我收到了相同的错误消息。我的解决方案是在运行任何sklearn代码之前重置我的数据帧df的索引:

df = df.reset_index()

当我删除df中的某些条目时,我多次遇到此问题,例如

df = df[df.label=='desired_one']

答案 2 :(得分:11)

我的输入数组的Dimensions倾斜,因为我的输入csv有空格。

答案 3 :(得分:8)

这是它失败的检查:

其中说

def _assert_all_finite(X):
    """Like assert_all_finite, but only for ndarray."""
    X = np.asanyarray(X)
    # First try an O(n) time, O(1) space solution for the common case that
    # everything is finite; fall back to O(n) space np.isfinite to prevent
    # false positives from overflow in sum method.
    if (X.dtype.char in np.typecodes['AllFloat'] and not np.isfinite(X.sum())
            and not np.isfinite(X).all()):
        raise ValueError("Input contains NaN, infinity"
                         " or a value too large for %r." % X.dtype)

因此,请确保输入中有非NaN值。所有这些值实际上都是浮点值。这些值都不应该是Inf。

答案 4 :(得分:5)

这是我的功能(基于this)来清理nanInf和丢失的单元格(对于倾斜的数据集)的数据集:

import pandas as pd

def clean_dataset(df):
    assert isinstance(df, pd.DataFrame), "df needs to be a pd.DataFrame"
    df.dropna(inplace=True)
    indices_to_keep = ~df.isin([np.nan, np.inf, -np.inf]).any(1)
    return df[indices_to_keep].astype(np.float64)

答案 5 :(得分:4)

使用此版本的python 3:

/opt/anaconda3/bin/python --version
Python 3.6.0 :: Anaconda 4.3.0 (64-bit)

查看错误的详细信息,我发现导致失败的代码行:

/opt/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in _assert_all_finite(X)
     56             and not np.isfinite(X).all()):
     57         raise ValueError("Input contains NaN, infinity"
---> 58                          " or a value too large for %r." % X.dtype)
     59 
     60 

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

由此,我能够使用错误消息给出的相同测试提取正确的方法来测试我的数据发生了什么:np.isfinite(X)

然后通过一个快速而又脏的循环,我能够发现我的数据确实包含nans

print(p[:,0].shape)
index = 0
for i in p[:,0]:
    if not np.isfinite(i):
        print(index, i)
    index +=1

(367340,)
4454 nan
6940 nan
10868 nan
12753 nan
14855 nan
15678 nan
24954 nan
30251 nan
31108 nan
51455 nan
59055 nan
...

现在我所要做的就是删除这些索引的值。

答案 6 :(得分:3)

尝试选择行子集后出现错误:

df = df.reindex(index=my_index)

原来my_index包含df.index中未包含的值,因此reindex函数插入了一些新行,并用nan填充。

答案 7 :(得分:3)

这里的所有答案都不适合我。这是有效的。

Test_y = np.nan_to_num(Test_y)

它将无穷大值替换为高有限值,将 nan 值替换为数字

答案 8 :(得分:2)

我有同样的错误,在我的情况下,X和y是数据帧,所以我必须先将它们转换为矩阵:

X = X.as_matrix().astype(np.float)
y = y.as_matrix().astype(np.float)

答案 9 :(得分:2)

删除所有无限值:

(并用该列的min或max代替)

import numpy as np

# generate example matrix
matrix = np.random.rand(5,5)
matrix[0,:] = np.inf
matrix[2,:] = -np.inf
>>> matrix
array([[       inf,        inf,        inf,        inf,        inf],
       [0.87362809, 0.28321499, 0.7427659 , 0.37570528, 0.35783064],
       [      -inf,       -inf,       -inf,       -inf,       -inf],
       [0.72877665, 0.06580068, 0.95222639, 0.00833664, 0.68779902],
       [0.90272002, 0.37357483, 0.92952479, 0.072105  , 0.20837798]])

# find min and max values for each column, ignoring nan, -inf, and inf
mins = [np.nanmin(matrix[:, i][matrix[:, i] != -np.inf]) for i in range(matrix.shape[1])]
maxs = [np.nanmax(matrix[:, i][matrix[:, i] != np.inf]) for i in range(matrix.shape[1])]

# go through matrix one column at a time and replace  + and -infinity 
# with the max or min for that column
for i in range(matrix.shape[1]):
    matrix[:, i][matrix[:, i] == -np.inf] = mins[i]
    matrix[:, i][matrix[:, i] == np.inf] = maxs[i]

>>> matrix
array([[0.90272002, 0.37357483, 0.95222639, 0.37570528, 0.68779902],
       [0.87362809, 0.28321499, 0.7427659 , 0.37570528, 0.35783064],
       [0.72877665, 0.06580068, 0.7427659 , 0.00833664, 0.20837798],
       [0.72877665, 0.06580068, 0.95222639, 0.00833664, 0.68779902],
       [0.90272002, 0.37357483, 0.92952479, 0.072105  , 0.20837798]])

答案 10 :(得分:1)

我得到了同样的错误。在进行任何替换,替换等之前,它与df.fillna(-99999, inplace=True)一起使用

答案 11 :(得分:1)

在大多数情况下,消除无穷和空值可以解决此问题。

摆脱无限值。

df.replace([np.inf, -np.inf], np.nan, inplace=True)

以自己喜欢的方式消除空值,特定值(例如999)的均值,或创建自己的函数来估算缺失值

df.fillna(999, inplace=True)

答案 12 :(得分:0)

在我的情况下,问题是许多scikit函数返回的numpy数组没有熊猫索引。因此,当我使用这些numpy数组构建新的DataFrames,然后尝试将它们与原始数据混合时,索引不匹配。

答案 13 :(得分:0)

尝试

mat.sum()

如果您的数据总和为无穷大(最大浮动值大于3.402823e + 38),则会出现该错误。

从scikit源代码中查看validation.py中的_assert_all_finite函数:

if is_float and np.isfinite(X.sum()):
    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'
        # print(X.sum())
        raise ValueError(msg_err.format(type_err, X.dtype))

答案 14 :(得分:0)

我想为 numpy 提出一个对我来说效果很好的解决方案。线

from numpy import inf
inputArray[inputArray == inf] = np.finfo(np.float64).max

用最大的 float64 数替换 numpy 数组的所有无限值。

答案 15 :(得分:0)

dataset = dataset.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

这对我有用