【问题标题】:SMOTE with missing values缺少值的 SMOTE
【发布时间】:2018-12-21 16:23:53
【问题描述】:

我正在尝试在 Python 中使用 imblearn 包中的 SMOTE,但我的数据有很多缺失值,并且出现以下错误:

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

查了here的参数,好像没有处理缺失值的。

有没有办法生成缺失值的合成样本?

【问题讨论】:

    标签: python scikit-learn imblearn


    【解决方案1】:

    一个简单的例子如下:

    # Imports
    from collections import Counter
    import numpy as np
    from sklearn.datasets import load_breast_cancer
    from sklearn.preprocessing import Imputer
    from imblearn.over_sampling import SMOTE
    from imblearn.pipeline import make_pipeline
    
    # Load data
    bc = load_breast_cancer()
    X, y = bc.data, bc.target
    
    # Initial number of samples per class
    print('Number of samples for both classes: {} and {}.'.format(*Counter(y).values()))
    
    # SMOTEd class distribution
    print('Dataset has %s missing values.' % np.isnan(X).sum())
    _, y_resampled = SMOTE().fit_sample(X, y)
    print('Number of samples for both classes: {} and {}.'.format(*Counter(y_resampled).values()))
    
    # Generate artificial missing values
    X[X > 1.0] = np.nan
    print('Dataset has %s missing values.' % np.isnan(X).sum())
    _, y_resampled = make_pipeline(Imputer(), SMOTE()).fit_sample(X, y)
    print('Number of samples for both classes: {} and {}.'.format(*Counter(y_resampled).values()))
    

    【讨论】:

    • 看起来 SMOTE 无法处理 NaN。 ValueError:输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值。
    【解决方案2】:

    SMOTE 不会填充您的缺失值或 NaN 值。您需要将它们填满,然后进行 SMOTE 分析。处理缺失值完全是一项不同的任务,您可以从 sklearn 开始查看Imputer。这是关于缺失值的另一篇关于 sklearn 的文章:Imputing missing values

    完成对 NaN 值的处理后,将修改后的数据提供给 SMOTE

    参考文献

    【讨论】:

    • Xgboost 和 lightgbm 拟合缺失值的数据,因此我认为即使存在缺失值也有可能生成一些合成数据。也许不是 SMOTE,但我直觉地认为可能有某种方式。感谢您的回答!
    猜你喜欢
    • 2022-06-30
    • 1970-01-01
    • 2012-04-07
    • 2015-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多