StandardScaler -ValueError:输入包含 NaN、无穷大或对于 dtype('float64')来说太大的值

Posted

技术标签:

【中文标题】StandardScaler -ValueError:输入包含 NaN、无穷大或对于 dtype(\'float64\')来说太大的值【英文标题】:StandardScaler -ValueError: Input contains NaN, infinity or a value too large for dtype('float64')StandardScaler -ValueError:输入包含 NaN、无穷大或对于 dtype('float64')来说太大的值 【发布时间】:2016-07-31 15:49:03 【问题描述】:

我有以下代码

X = df_X.as_matrix(header[1:col_num])
scaler = preprocessing.StandardScaler().fit(X)
X_nor = scaler.transform(X) 

并得到以下错误:

  File "/Users/edamame/Library/python_virenv/lib/python2.7/site-packages/sklearn/utils/validation.py", line 54, in _assert_all_finite
    " or a value too large for %r." % X.dtype)
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

我用过:

print(np.isinf(X))
print(np.isnan(X))

这给了我下面的输出。这并不能真正告诉我哪个元素有问题,因为我有数百万行。

[[False False False ..., False False False]
 [False False False ..., False False False]
 [False False False ..., False False False]
 ..., 
 [False False False ..., False False False]
 [False False False ..., False False False]
 [False False False ..., False False False]]

有没有办法确定矩阵 X 中的哪个值实际上导致了问题?人们一般如何避免它?

【问题讨论】:

【参考方案1】:

numpy 包含针对此类事物的各种逻辑元素测试。

在您的特定情况下,您需要使用isinf 和isnan。

响应您的编辑:

您可以将 np.isinf() 或 np.isnan() 的结果传递给 np.where(),这将返回条件为真的索引。这是一个简单的例子:

import numpy as np

test = np.array([0.1, 0.3, float("Inf"), 0.2])

bad_indices = np.where(np.isinf(test))

print(bad_indices)

然后您可以使用这些索引来替换数组的内容:

test[bad_indices] = -1

【讨论】:

谢谢。请看我上面修改过的问题,我需要从数百万条记录中找出具体的坏值……有什么好的方法吗? 我实际上得到了: ('bad_indices ', (array([], dtype=int64), array([], dtype=int64))) 从 print('bad_indices ', np.where( np.isinf(X))) ... 没有返回任何索引 ... 它返回了一个空的索引数组,这意味着数组中没有无限的值。改用 isnan() - 错误消息表明它可能是其中之一。 用 np.isnan() 找到它。谢谢!

以上是关于StandardScaler -ValueError:输入包含 NaN、无穷大或对于 dtype('float64')来说太大的值的主要内容,如果未能解决你的问题,请参考以下文章

保存 StandardScaler() 模型以用于新数据集

标准化数据-StandardScaler

StandardScaler:TypeError:fit()缺少1个必需的位置参数:'X'

带有管道和 GridSearchCV 的 StandardScaler

谁能解释一下StandardScaler?

如何仅在某些值上在管道内使用 StandardScaler?