如何解决错误“ dtype('float32')的值太大?”

时间:2019-07-04 22:54:04

标签: python numpy scikit-learn

我阅读了许多与此类似的问题,但仍然无法解决。

clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)

X_to_predict = array([[  1.37097033e+002,   0.00000000e+000,  -1.82710826e+296,
          1.22703799e+002,   1.37097033e+002,  -2.56391552e+001,
          1.11457878e+002,   1.37097033e+002,  -2.56391552e+001,
          9.81898928e+001,   1.22703799e+002,  -2.45139066e+001,
          9.24341823e+001,   1.11457878e+002,  -1.90236954e+001]])

clf.predict_proba(X_to_predict)

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

我的问题既不是nan也不是inf值,因为:

np.isnan(X_to_predict).sum()
Out[147]: 0

np.isinf(X_to_predict).sum()
Out[148]: 0

问题: :如何将X_to_predict转换为对于float32来说不太大的值,同时保留尽可能多的小数点后的数字?

2 个答案:

答案 0 :(得分:1)

如果您检查数组dtype的{​​{1}},它应该显示X_to_predict

float64

sklearn的RandomForestClassifier静默将数组转换为# slightly modified array from the question X_to_predict = np.array([1.37097033e+002, 0.00000000e+000, -1.82710826e+296, 1.22703799e+002, 1.37097033e+002, -2.56391552e+001, 1.11457878e+002, 1.37097033e+002, -2.56391552e+001, 9.81898928e+001, 1.22703799e+002, -2.45139066e+001]).reshape((3, 4)) print(X_to_predict.dtype) >>> float64 ,有关错误消息的来源,请参见讨论here

您可以自己转换

float32

第三个值(-1.82710826e + 296)在float32中变为print(X_to_predict.astype(np.float32))) >>> array([[137.09703 , 0. , -inf, 122.7038 ], [137.09703 , -25.639154, 111.45788 , 137.09703 ], [-25.639154, 98.189896, 122.7038 , -24.513906]], dtype=float32) 。唯一的解决方法是将-inf值替换为float32的最大值。据我所知,除了更改sklearn中的实现并重新编译之外,您将失去一些精度,因为据我所知,目前尚无参数或解决方法。

如果使用inf,则数组应如下所示:

np.nan_to_num

您的分类器应该接受的


完整代码

new_X = np.nan_to_num(X_to_predict.astype(np.float32))
print(new_X)

>>> array([[ 1.3709703e+02,  0.0000000e+00, -3.4028235e+38,  1.2270380e+02],
           [ 1.3709703e+02, -2.5639154e+01,  1.1145788e+02,  1.3709703e+02],
           [-2.5639154e+01,  9.8189896e+01,  1.2270380e+02, -2.4513906e+01]],
          dtype=float32)

答案 1 :(得分:0)

该错误有时会引起误解。如果您在数据集中有空白值(这意味着数据集中的某些要素具有空白值),那么您仍然可以得到这种类型的错误。我们如何解决这个问题...

转换数据框并将其导出到csv中。下面是代码“ df”是数据框CSV的数据框 compression_opts = dict(方法='zip',archive_name ='out.csv') df.to_csv('out.zip',index = False,compression = compression_opts)您也可以尝试

df [df ['column_name'] ==''] .index

通过分析输出CSV来识别具有空白值的要素。

通过以下代码df = df.dropna(subset = ['column_name'])删除具有空值的完整记录