我正在尝试使用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的要素或标签中没有NaN值。
这意味着必须有无穷大或非常大的值,我很难相信这两者。有什么方法可以在数据框或np数组中打印以下任何值:
are NaN, infinity or a value too large for dtype('float64')?
由于我无法用眼睛找到它们并且没有NaN值,因此需要特别向我指出。
答案 0 :(得分:0)
假设这是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)
numpy.isinf(ar)
numpy.isneginf(ar)
分别。每个都返回一个bool数组,并将bool数组传递给numpy.where()
会给我们两个索引数组({{1}的每个维度一个索引数组):
ar
(array([1,2],dtype = int64),array([1,0],dtype = int64))#均值,nans 在(1,1)和(2,0)
和
ar_nan = np.where(np.isnan(ar))
print (ar_nan)
(array([2],dtype = int64),array([2],dtype = int64))#表示inf在 (2,2)
还要查看float64的限制:
ar_inf = np.where(np.isinf(ar))
print (ar_inf)
finfo(resolution = 1e-15,min = -1.7976931348623157e + 308, max = 1.7976931348623157e + 308,dtype = float64)