ValueError:输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值。为什么?

juk*_*box 5 python numpy pandas scikit-learn jupyter

我已经浏览了所有类似的问题,但没有一个回答我的问题。我使用随机森林分类器,如下所示:

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=100, max_depth=2, random_state=0)
clf.fit(X_train, y_train)
clf.predict(X_test)
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误:

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

但是,当我这样做时,X_train.describe()我没有看到任何缺失值。事实上,实际上,我什至在分割数据之前就已经处理了缺失值。

当我执行以下操作时:

np.where(X_train.values >= np.finfo(np.float32).max)

我得到:

(array([], dtype=int64), array([], dtype=int64))

对于这些命令:

np.any(np.isnan(X_train)) #true
np.all(np.isfinite(X_train)) #false
Run Code Online (Sandbox Code Playgroud)

得到上述结果后,我也尝试了这个:

X_train.fillna(X_train.mean())

但我遇到了同样的错误并且它没有解决任何问题。

请告诉我哪里出错了。谢谢你!

小智 1

解决方案
X_train = X_train.fillna(X_train.mean())

解释
np.any(np.isnan(X_train))等于True,因此X_train包含一些nan值。根据 pandas fillna() docs, DataFrame.fillna() 返回填充了缺失值的 DataFrame 的副本。您必须将 X_train 重新分配给 fillna() 的返回值,例如X_train = X_train.fillna(X_train.mean())

例子

>>> import pandas as pd
>>> import numpy as np
>>> 
>>> a = pd.DataFrame(np.arange(25).reshape(5, 5))
>>> a[2][2] = np.nan
>>> 
>>> a
    0   1     2   3   4
0   0   1   2.0   3   4
1   5   6   7.0   8   9
2  10  11   NaN  13  14
3  15  16  17.0  18  19
4  20  21  22.0  23  24
>>> 
>>> a.fillna(1)
    0   1     2   3   4
0   0   1   2.0   3   4
1   5   6   7.0   8   9
2  10  11   1.0  13  14
3  15  16  17.0  18  19
4  20  21  22.0  23  24
>>> 
>>> a
    0   1     2   3   4
0   0   1   2.0   3   4
1   5   6   7.0   8   9
2  10  11   NaN  13  14
3  15  16  17.0  18  19
4  20  21  22.0  23  24
>>> 
>>> a = a.fillna(1)
>>> a
    0   1     2   3   4
0   0   1   2.0   3   4
1   5   6   7.0   8   9
2  10  11   1.0  13  14
3  15  16  17.0  18  19
4  20  21  22.0  23  24
>>>
Run Code Online (Sandbox Code Playgroud)