我阅读了许多与此类似的问题,但仍然无法解决。
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来说不太大的值,同时保留尽可能多的小数点后的数字?>
答案 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'])删除具有空值的完整记录