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

数据挖掘 Python scikit-学习 熊猫 随机森林 python-3.x
2021-09-28 19:45:07

使用 RandomForest 模型预测测试数据时出现 ValueError。

我的代码:

clf = RandomForestClassifier(n_estimators=10, max_depth=6, n_jobs=1, verbose=2)
clf.fit(X_fit, y_fit)

df_test.fillna(df_test.mean())
X_test = df_test.values  
y_pred = clf.predict(X_test)

错误:

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

如何在测试数据集中找到错误的值?另外,我不想删除这些记录,我可以用平均值或中位数替换它们吗?

谢谢。

4个回答

对于包含snp.isnan(X)的位置,您将获得一个带有 True 的布尔掩码。NaN

随着np.where(np.isnan(X))您返回一个元组,其中 i, j 坐标为NaNs。

最后,与np.nan_to_num(X)您一起“将 nan 替换为零,将 inf 替换为有限数”。

或者,您可以使用:

  • sklearn.impute.SimpleImputer用于缺失值的均值/中值插补,或
  • pandas' pd.DataFrame(X).fillna(),如果您需要其他东西而不是用零填充它。

对于发生在这件事上的任何人,要实际修改原始文件:

X_test.fillna(X_train.mean(), inplace=True)

要覆盖原始文件:

X_test = X_test.fillna(X_train.mean())

要检查您是否在副本与视图中:

X_test._is_view

假设X_test是一个熊猫数据框,您可以使用DataFrame.fillna平均值替换 NaN 值:

X_test.fillna(X_test.mean())

我遇到了类似的问题,发现 numpy 处理 NaN 和 Inf 的方式不同。
如果您的数据有 Inf,请尝试以下操作:

np.where(x.values >= np.finfo(np.float64).max)
Where x is my pandas Dataframe 

这将给出存在 NA 值的位置的元组。

如果您的数据有 Nan,请尝试以下操作:

np.isnan(x.values.any())