Работа с данными дисбаланса для кадра данных измерений (13961,862) после кодирования для классификации проблем точности
У меня есть данные измерения (13961,48) вначале, а после одного горячего кодирования, а также базового массирования данных измерение наблюдается вокруг (13961,862). данные представляют собой дисбаланс с двумя категориями "удержано" около 6% и "не удержано" около 94%.
При выполнении любых алгоритмов, таких как логистика,knn, дерево решений, случайный лес, данные дают очень высокую точность даже без выполнения какого-либо процесса выбора признаков, и точность превышает 94% в основном, за исключением "наивного классификатора смещения".
Это кажется странным и даже при случайном наличии двух любых особенностей -> что дает точность более 94%, что в целом нереально.
Применение SMOTE также обеспечивает точность результатов более 94% даже для базовой модели любых вышеперечисленных алгоритмов, таких как логистика,knn, дерево решений, случайный лес,
После удаления 20 лучших функций это дает точность хорошего результата более чем на 94% (проверено на предмет подлинности)
g = data[Target_col_Y_name]
df = pd.concat([g.value_counts(),
g.value_counts(normalize=True).mul(100)],axis=1, keys=('counts','percentage'))
print('The % distribution between the retention and non-retention flag\n')
print (df)
# The code o/p to show the imbalance is
The % distribution between the retention and non-retention flag
counts percentage
Non Retained 13105 93.868634
Retained 856 6.131366
Мои данные содержат 7 числовых переменных, таких как месяц, сумма, процентная ставка и все остальные (около 855) в виде преобразованных категориальных переменных с горячим кодированием.
Любая методология, чтобы обрабатывать такого рода данные на базовых, выбор функций или методы оптимизации дисбаланса? пожалуйста, руководствоваться, глядя на размерность и количество дисбалансов для каждого уровня.
2 ответа
Я хотел бы добавить что-то в дополнение к ответу Элиаса.
Во-первых, вы должны понимать, что даже если вы создадите "тупой классификатор", который всегда предсказывает "не сохранено", вы все равно будете правы 94% раз. Так что точность явно слабая метрика в этом случае.
Вы должны определенно узнать о матрице путаницы и метрики, которые идут вместе с ней (например, AUC).
Одним из таких показателей является оценка F1, которая является гармоническим средним значением точности и отзыва. Лучше такая точность в несбалансированном классе, но... она не должна быть лучшей. F1 будет отдавать предпочтение тем, которые имеют одинаковую точность и отзыв. Но это не обязательно то, что важно для вас.
Например, если вы создадите фильтр содержимого sfw, вы бы хорошо пометили часть SFW-содержимого как nsfw (отрицательный класс), что увеличило бы вероятность ложного отрицания (и уменьшило отзыв), но вы хотели бы быть уверены, что вы сохранили только безопасные (высокая точность).
В вашем случае вы можете рассуждать о том, что хуже: сохранить что-то плохое или отказаться от чего-то хорошего, и таким образом выбрать метрику.
Что касается стратегии: существует множество способов справиться с дисбалансом классов: методы выборки (попробуйте понизить выборку, повысить выборку помимо SMOTE или ROSE) и проверить, улучшился ли ваш показатель валидации (одни только показатели обучения практически бесполезны). В некоторых моделях есть специальные гиперпараметры, чтобы больше фокусироваться на редких классах (например, в xgboost есть параметр scale_pos_weight).
Удачи
Точность не очень хорошая мера в целом, особенно для несбалансированных классов. Я бы порекомендовал этот другой ответ stackru, который объясняет, когда использовать счет F1 и когда использовать AUROC, которые являются гораздо лучшими показателями, чем точность; в этом случае F1 лучше.
Несколько моментов, чтобы прояснить:
Для таких моделей, как случайный лес, вам не нужно удалять элементы, чтобы повысить точность, так как они будут рассматривать их как незначительные элементы. Я рекомендую случайные леса, поскольку они имеют тенденцию быть очень точными ( за исключением некоторых случаев) и могут показывать существенные особенности, просто используя
clf.feature_significances_
(если используется случайный лес).Деревья решений почти всегда работают хуже, чем случайные леса, так как случайные леса - это множество агрегированных деревьев решений.