Почему понижение частоты дискредитации приводит к тому, что классификация предсказывает только один класс?

Вопрос или проблема

У меня есть задача классификации с несколькими классами. Она работает довольно хорошо, но на наименее представленных классах — нет. Действительно, вот распределение:

enter image description here

А вот результаты классификации моего предыдущего алгоритма (я убрал цифры с меток):

enter image description here.

Поэтому я попытался улучшить классификацию, уменьшив выборку для большинства классов.

import os
from sklearn.utils import resample

# ребалансировка данных
#df = resample_data(df)

if True:

    count_class_A, count_class_B, count_class_C, count_class_D, count_class_E, count_class_F, count_class_G = df.grade.value_counts()
    count_df = df.shape[0] 
    class_dict = {"A": count_class_A, "B": count_class_B, "C": count_class_C, "D": count_class_D, "E": count_class_E, "F": count_class_F, "G": count_class_G}
    counts = [count_class_A, count_class_B, count_class_C, count_class_D, count_class_E, count_class_F, count_class_G]
    median = statistics.median(counts)

    for key in class_dict:
        if class_dict[key] > median:
            print(key)
            df[df.grade == key] = df[df.grade == key].sample(int(count_df/7), replace=False) 
                                             #replace=False,    # без возврата
                                             #n_samples=int(count_df/7),     # чтобы соответствовать меньшинству
                                             #random_state=123)
# Разделение набора данных на обучающую и тестовую выборки
x_train, x_test, y_train, y_test = split_data(df, APPLICANT_NUMERIC + CREDIT_NUMERIC,
                  APPLICANT_CATEGORICAL,
                  TARGET,
                  test_size=0.2,
                  #row_limit=os.environ.get("sample"))
                  row_limit=552160)

Однако результаты были катастрофическими. Точность модели и потери модели, казалось, имели некоторые проблемы:

enter image description here

И всё было классифицировано как “A” на тестовом наборе.

На вид, метод выборки, который вы использовали, не сработал.
Способ, которым вы используете нарезку и присвоение pandas, немного неверен.

Что-то подобное может сработать:

dfs = []
for key in class_dict:

    if class_dict[key] > median:
        factor = int(count_df/7)
        key_df = df[df.grade == key].sample(factor, replace=False)
    else:
        key_df = df[df.grade == key]

    dfs.append(key_df)
new_train_df = pd.concat(dfs, sort=False)

Хотя это может сработать, есть более прямые способы уменьшения выборки данных (например, установка точного количества ожидаемых образцов из каждого класса).
Этот вопрос также содержит хорошие ответы.

Вы реализуете уменьшение выборки с нуля. В вашей реализации могут быть ошибки.

Другой вариант — использование установленного пакета для уменьшения выборки, такого как under_sampling из imblearn.

.

Ответ или решение

Ваша задача — многоклассовая классификация, где распределение классов не однородно, и вы пытаетесь улучшить производительность модели на менее популярных классах путем даунсемплинга более многочисленных классов. Однако результаты оказались неудачными, и модель начала предсказывать только один класс. Давайте рассмотрим, почему это произошло и как создать более эффективное решение.

Проблема

Основная проблема в данной ситуации заключается в неправильном балансировании данных. Когда вы применяете даунсемплинг, важно сохранить достаточное количество примеров от каждого класса, чтобы модель смогла выучить различия между классами.

Основные причины некорректных предсказаний

  1. Неправильная реализация даунсемплинга:
    Ваша реализация даунсемплинга создает дисбаланс, что потенциально уменьшает количество примеров для более многочисленных классов слишком сильно. В результате модель теряет эти классы, обучаясь только на той информации, которую получает.

  2. Отсутствие разнообразия в данных:
    Слишком малое количество примеров для определенных классов может привести к тому, что модель не может запомнить их характерные признаки должным образом и начинает предсказывать наиболее многочисленный класс (в данном случае класс "A").

  3. Проблемы с параметрами обучения:
    При изменении весов классов модель может стать излишне "чувствительной" к одному классу, если не применен правильный подход к балансировке.

Решения

  1. Используйте проверенные библиотеки:
    Вместо ручной реализации даунсемплинга, настройте его с помощью проверенных инструментов, таких как imblearn. Это поможет избежать ошибок в коде и обеспечить более надежное распределение классов.

  2. Пересмотрите стратегию даунсемплинга:
    Вместо даунсемплинга до медианного значения, оцените использование взвешенных потерь или сбалансированного переподбора (resampling), чтобы добиться равномерного распределения классов.

  3. Обучение с перераспределением весов:
    Воспользуйтесь техникой, где веса классов в функции потерь модели пересчитываются в зависимости от их частоты в обучающем наборе данных.

  4. Проверка данных на адекватность:
    Перед обучением проверьте подготовленные данные на целостность и достаточность для каждого класса, включая распределительное разнообразие значений признаков.

Заключение

Даунсемплинг может быть мощным инструментом, но его неправильная реализация способна существенно ухудшить результаты. Понимание деталей распределения ваших данных и правильное использование инструментов помогут вам избежать ошибок и обеспечить более надежное и эффективное обучение модели. Используйте проверенные методы и подходы для достижения лучших результатов.

Оцените материал
Добавить комментарий

Капча загружается...