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:TypeError:fit()缺少1个必需的位置参数:'X'