SMOTE с пропущенными значениями

Я пытаюсь использовать SMOTE из пакета imblearn в Python, но в моих данных много пропущенных значений, и я получил следующую ошибку:

ValueError: Вход содержит NaN, бесконечность или значение слишком велико для dtype('float64').

Я проверил параметры здесь, и кажется, что нет ни одного дела с пропущенным значением.

Есть ли способ генерировать синтетические образцы с пропущенными значениями?


person MJeremy    schedule 13.07.2018    source источник


Ответы (2)


SMOTE не выполняет заполнение отсутствующих значений или значений NaN. Вам нужно заполнить их, а затем отправить для анализа SMOTE. Работа с пропущенными значениями — это совсем другая задача, вы можете взглянуть на Imputer от sklearn для начала. Вот еще одна статья о sklearn относительно отсутствующих значений: Вменение отсутствующих значений

Как только вы закончите работать со значениями NaN, отправьте измененные данные в SMOTE.

Рекомендации

person Gambit1614    schedule 13.07.2018
comment
Xgboost и lightgbm подгоняют данные с отсутствующими значениями, поэтому я подумал, что возможно генерировать некоторые синтетические данные, даже если отсутствует значение. Может быть, не SMOTE, но я интуитивно подумал, что может быть какой-то способ. Спасибо за Ваш ответ! - person MJeremy; 13.07.2018

Простой пример следующий:

# 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()))
person Community    schedule 14.07.2018
comment
Похоже, SMOTE не может обрабатывать NaN. ValueError: Вход содержит NaN, бесконечность или значение слишком велико для dtype('float64'). - person Anuj Gupta; 12.08.2019