ValueError:输入包含NaN,无穷大或dtype('float32')太大的值


41

使用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').

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

谢谢。

Answers:


45

对于np.isnan(X)包含NaNs的位置,您将得到一个带True的布尔蒙版。

np.where(np.isnan(X))您一起返回一个具有NaNs的i,j坐标的元组。

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

或者,您可以使用:

  • sklearn.impute.SimpleImputer用于缺失值的均值/中位数插补,或者
  • pandas' pd.DataFrame(X).fillna(),如果您需要除零以外的其他东西。

我更喜欢使用身份条件来检查nan,如果x!= x返回None,那么很多次np.isnan(x)对我而言失败了,不记得原因了
Itachi

1
不建议将NaN值替换为零。NaN值可能仍然具有遗漏的重要性,并且使用零进行插补可能是您最糟糕的事情,也是您使用的最差的插补方法。您不仅会随意引入零,这可能会使变量倾斜,而且0甚至在变量中甚至都不是可接受的值,这意味着变量可能没有真正的零。
侯赛姆

我意识到我没有提供任何指导。如果要估算数据,请使用滚动平均值,用.rolling()滚动窗口的平均值替换缺失值。如果您想使用模块<b> missingpy </ b>来MissForest增强功能,则可以用于基于随机森林的插补。
侯赛姆

7

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

X_test.fillna(X_test.mean())

X_test是numpy数组。刚刚在原始问题中更新了df_test,仍然遇到了相同的错误...
Edamame

6

对于发生这种情况的任何人,请实际修改原始文件:

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

覆盖原始文件:

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

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

X_test._is_view

2
尽管从技术上讲这是正确的,但实际上却是错误的。您无法用X_test平均值填充X_test NA,因为在现实生活中,当您预测样本时,您将没有X_test平均值。您应该使用X_train的平均值,因为这是您实际掌握的唯一数据(在99%的方案中)
Omri374

4

别忘了

col_mask=df.isnull().any(axis=0) 

返回一个布尔掩码,指示np.nan值。

row_mask=df.isnull().any(axis=1)

返回np.nan出现的行。然后,通过简单的索引,您可以标记所有np.nan的点。

df.loc[row_mask,col_mask]

2

我遇到了类似的问题,看到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())

2

不要忘记也检查inf值。唯一对我有用的东西:

df[df==np.inf]=np.nan
df.fillna(df.mean(), inplace=True)

如果您使用sklearn,甚至会更好

def replace_missing_value(df, number_features):

    imputer = Imputer(strategy="median")
    df_num = df[number_features]
    imputer.fit(df_num)
    X = imputer.transform(df_num)
    res_def = pd.DataFrame(X, columns=df_num.columns)
    return res_def

当number_features将是number_features标签的数组时,例如:

number_features = ['median_income', 'gdp']

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.