首页 > 解决方案 > 识别具有无穷大值的特征列并在 pandas,Python 3.6 中处理它

问题描述

关于这个主题有很多问题和答案,但我无法解决我的问题。

我正在尝试使用 imblearn 的 ADASYN 模型来平衡我的数据集。

到目前为止,这是我的代码:

    df = pd.read_csv("data/"+filename, nrows=1000)
    df.replace([np.inf, -np.inf], np.nan, inplace=True)
    df_imputed = df.fillna(df.mean())
    X = df_imputed.drop(['target'], axis=1)
    y = df_imputed.target
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
    from imblearn.over_sampling import ADASYN
    ada = ADASYN()
    X_resampled, y_resampled = ada.fit_sample(X, y)

但我收到一个错误:

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

在线上

    X_resampled, y_resampled = ada.fit_sample(X, y)

这里有几个问题:

  1. 您如何解决此问题?这意味着您如何识别导致此问题的数据。我的数据集有近 2300 多个特征列。
  2. 你如何解决它?

感谢您的时间!

标签: pythonpython-3.xpandasimblearn

解决方案


fillna使用的问题之一df.mean()是,如果该列仅包含nan(或inf在您之前replacenan),那么该列仍然nanfillna. 一种方法是删除只有 的列nan,因为无论如何这些列对 ML 模型没有用处。为此,您可以使用dropna并链接所有方法。

df_imputed = (df.replace([np.inf, -np.inf], np.nan)
                .fillna(df.mean())
                .dropna(axis=1, how='all'))

推荐阅读