提问者:小点点

sklearn error ValueError:输入包含NaN、无穷大或对数据类型('float64'而言太大的值)


我正在使用skLearning,并有一个问题与亲和力传播。我已经建立了一个输入矩阵,我一直得到以下错误。

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

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

我使用蟒蛇和python 2.7.9。


共3个答案

匿名用户

这可能发生在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函数的返回值是否为数字。。。

匿名用户

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

df = df.reset_index()

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

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

匿名用户

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

import pandas as pd
import numpy as np

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)