Использование SMOTE-NC только с категориальными переменными

#python-3.x #machine-learning #imbalanced-data #imblearn #smote

#python-3.x #машинное обучение #несбалансированный-данные #imblearn #Поразил

Вопрос:

Я имею дело с фреймом данных, содержащим только категориальные объекты. Чтобы воспроизвести проблему, с которой я столкнулся, я приведу следующий пример:

 d = {'col1':['a','b','c','a','c','c','c','c','c','c'],
     'col2':['a1','b1','c1','a1','c1','c1','c1','c1','c1','c1'],
     'col3':[1,2,3,2,3,3,3,3,3,3]}
data = pd.DataFrame(d)
  

Я собираюсь разделить данные на тестовые и обучающие и использовать col3 в качестве целевой функции.

 train_data, test_data = train_test_split(data, test_size=0.2)
train_data = train_data.reset_index(drop=True)
test_data = test_data.reset_index(drop=True)

X_train = train_data.drop(['col3'], axis = 1)
X_test = test_data.drop(['col3'], axis = 1)
y_train = train_data["col3"]
y_test = test_data["col3"]
  

Из X_train, col1 и col2 являются моими категориальными функциями, поэтому индексируйте 0 и 1, поэтому я делаю SMOTE-NC как:

 from imblearn.over_sampling import SMOTENC
cat_indx =[0,1]
sm = SMOTENC(categorical_features= cat_indx, random_state=0)
X_train_res, y_train_res = sm.fit_resample(X_train, y_train)
  

для чего я получаю следующую ошибку:

 ValueError: SMOTE-NC is not designed to work only with categorical features. It requires some numerical features.
  

Интересно, как можно решить эту проблему, учитывая тот факт, что SMOTE-NC предназначен для обработки категориальных переменных? Также обратите внимание, что моя целевая переменная является многоклассовой, а не двоичной, что, я думаю, не вызывает никаких проблем на этом уровне.

Ответ №1:

Обратите внимание, что сами инициалы NC в названии алгоритма означают номинально-непрерывный; как ясно указано в сообщении об ошибке, алгоритм не предназначен для работы только с категориальными (номинальными) функциями.

Чтобы понять, почему это так, вам нужно немного углубиться в оригинальную статью SMOTE; цитирую из соответствующего раздела (курсив мой):

Хотя наш подход SMOTE в настоящее время не обрабатывает наборы данных со всеми номинальными функциями, он был обобщен для обработки смешанных наборов данных с непрерывными и номинальными функциями. Мы называем этот подход синтетическим методом избыточной выборки меньшинства — номинальным непрерывным [SMOTE-NC]. Мы протестировали этот подход на наборе данных для взрослых из репозитория UCI. Алгоритм SMOTE-NC описан ниже.

  1. Вычисление медианы: вычислите медиану стандартных отклонений всех непрерывных объектов для класса меньшинства. Если номинальные характеристики различаются между образцом и его потенциальными ближайшими соседями, то эта медиана включается в вычисление евклидова расстояния. Мы используем медиану, чтобы оштрафовать разницу номинальных объектов на величину, которая связана с типичной разницей в значениях непрерывных объектов.
  2. Вычисление ближайшего соседа: Вычислите евклидово расстояние между вектором объектов, для которого идентифицируются k ближайших соседей (выборка класса меньшинства), и другими векторами объектов (выборки класса меньшинства), используя непрерывное пространство объектов. Для каждого отличающегося номинального объекта между рассматриваемым вектором признаков и его потенциальным ближайшим соседом включите медиану ранее вычисленных стандартных отклонений в вычисление евклидова расстояния.

Итак, очевидно, что для работы алгоритма ему нужна хотя бы одна непрерывная функция. Здесь это не так, поэтому алгоритм, что неудивительно, терпит неудачу на шаге 1 (вычисление медианы), поскольку для вычисления медианы нет никаких непрерывных функций.

Комментарии:

1. Существует ли какой-либо метод повторной выборки, если во всем наборе данных есть только двоичные объекты (как предикторы, так и целевые)?

2. @DOT Я не знаю ни одного, извините.