8

我正在尝试使用 scikit learn 拟合一个简单的机器学习模型。在这条线上:

clf.fit(features, labels)

我得到一个熟悉的错误:

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

每当我在我的数据中有 NaN 值之前遇到这种情况时。我已经确认数据中没有 NaN。.fit() 方法的两个输入(特征和标签)是 np 数组,但它们是从 pandas 数据帧生成的。就在拉出我打印的 NaN 值之前:

print(features_df[features_df.isnull().any(axis=1)])
print(labels_df[labels_df.isnull().any(axis=1)])

这打印了空数据帧,所以我知道其中没有包含 NaN 值的行。我还在转换后检查了 numpy 数组的 NaN 值,甚至使用 np sum() 方法成功地将它们求和,因此在传递给 fit 的特征或标签 np 数组中没有 NaN 值。

这意味着必须有无穷大的值或非常大的值,这两者我都很难相信。有什么方法可以打印数据框或 np 数组中的任何值:

are NaN, infinity or a value too large for dtype('float64')?

我需要让它们专门向我指出,因为我无法用我的眼睛找到它们并且没有 NaN 值。

4

1 回答 1

11

假设这是 numpy 数组,形状为(3,3)

ar = np.array([1, 2, 3, 4, np.nan, 5, np.nan, 6, np.inf]).reshape((3,3))
print (ar)
[[ 1.  2.  3.]
 [ 4. nan  5.]
 [nan  6. inf]]

要检查 NaN、正无穷大、负无穷大或它们的不同组合,我们可以使用:

numpy.isnan(ar)     # True wherever nan
numpy.isposinf(ar)  # True wherever pos-inf
numpy.isneginf(ar)  # True wherever neg-inf
numpy.isinf(ar)     # True wherever pos-inf or neg-inf
~numpy.isfinite(ar) # True wherever pos-inf or neg-inf or nan

分别。这些中的每一个都返回一个 bool 数组,并将 bool 数组传递numpy.where()给我们两个索引数组(每维一个索引数组ar):

ar_nan = np.where(np.isnan(ar))
print (ar_nan)

(array([1, 2], dtype=int64), array([1, 0], dtype=int64)) # 表示,nans 在 (1,1) 和 (2,0)

ar_inf = np.where(np.isinf(ar))
print (ar_inf)

(array([2], dtype=int64), array([2], dtype=int64)) # 意思是,inf 在 (2,2)

另外,要查看 float64 的限制:

np.finfo(np.float64)

finfo(分辨率=1e-15,最小值=-1.7976931348623157e+308,最大值=1.7976931348623157e+308,dtype=float64)

于 2019-03-16T06:08:03.687 回答