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

问题描述 投票:85回答:11

我正在使用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。

python python-2.7 scikit-learn valueerror
11个回答
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,而不是qazxsw poi函数的返回值是否为数字...


0
投票

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


0
投票

尝试

df.fillna(-99999, inplace=True)

如果您的数据总和是无穷大(大于最大浮点值3.402823e + 38),您将得到该错误。

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

mat.sum()

24
投票

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

df

当我删除df = df.reset_index() 中的一些条目时,我多次遇到此问题,例如

df

11
投票

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


8
投票

这是它失败的检查:

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

哪个说

https://github.com/scikit-learn/scikit-learn/blob/0.17.X/sklearn/utils/validation.py#L51

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


6
投票

这是我的函数(基于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) )来清理thisnan和缺失单元格的数据集(对于倾斜的数据集):

Inf

4
投票

有了这个版本的python 3:

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)

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

/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

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


3
投票

尝试选择行的子集后,我遇到了错误:

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
...

事实证明,df = df.reindex(index=my_index) 包含my_index中未包含的值,因此reindex函数插入了一些新行并用df.index填充它们。


2
投票

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

nan

1
投票

我得到了同样的错误。在进行任何替换,替换等之前,它与X = X.as_matrix().astype(np.float) y = y.as_matrix().astype(np.float) 合作

© www.soinside.com 2019 - 2024. All rights reserved.