Оптимальные веса для взвешенного среднего 3 моделей прогнозирования

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

У меня есть 3 модели sklearn, которые я использую для прогнозирования вероятности для задачи бинарной классификации. Я хочу создать взвешенное среднее значение всех предсказаний, сделанных этими моделями. Я затрудняюсь с тем, как найти оптимальные веса.

Я пытался создать метод взвешенного среднего, который поможет мне:

def weighted_average(prob: dict, weights: dict = base_weights):
    '''Взвешенное среднее всех вероятностей
    Структура словаря Prob: {
    'mfcc': вероятность спуфинга от модели MFCC,
    'lfcc': вероятность спуфинга от модели LFCC,
    'gfcc': вероятность спуфинга от модели GFCC
    }

    возвращает взвешенное среднее вероятности
    '''
    num = prob['mfcc']*weights['mfcc'] + prob['lfcc']*weights['lfcc'] + prob['gfcc']*weights['gfcc']
    denom = weights['mfcc'] + weights['lfcc'] + weights['gfcc']
    return num / denom

Для нахождения оптимальных весов (я оптимизирую accuracy_score) я пробовал следующее:

  1. Всеобъемлющий поиск по диапазону.
  2. Пробовал подгонять модель логистической регрессии с X как accuracy scores и Y как 0|1.

В конце концов, цель состоит в том, чтобы получить значение accuracy score, а не 0 или 1.

Sklearn имеет встроенные классы ансамблевого обучения, например взвешенный классификатор для этой задачи.

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

Оптимальные веса для взвешенного 평균а трёх моделей предсказаний

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

Описание Проблемы

Ваша задача заключается в создании взвешенного среднего предсказания для трёх различных моделей (например, MFCC, LFCC и GFCC), каждая из которых возвращает вероятность класса. Ваша функция для вычисления взвешенного среднего выглядит следующим образом:

def weighted_average(prob: dict, weights: dict = base_weights):
    num = prob['mfcc'] * weights['mfcc'] + prob['lfcc'] * weights['lfcc'] + prob['gfcc'] * weights['gfcc']
    denom = weights['mfcc'] + weights['lfcc'] + weights['gfcc']
    return num / denom

Подходы к Нахождению Оптимальных Весов

1. Exhaustive Search (Механический поиск)

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

  • Определите диапазон веса для каждой модели, например от 0 до 1 с шагом 0.1.
  • Создайте вложенные циклы для перебора всех возможных комбинаций весов.
  • Для каждой комбинации вычисляйте взвешенное среднее и используйте функцию оценки (например, accuracy_score) для определения эффективности конфигурации.
  • Сохраните максимальное значение точности и соответствующие веса.

Этот метод является простым, но можно столкнуться с чрезмерной вычислительной сложностью, особенно если речь идёт о большом количестве моделей или диапазонов.

2. Оптимизация с использованием Логистической Регрессии

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

  • Здесь следует использовать кросс-валидацию, чтобы избежать переобучения.
  • Для начала соберите данные о производительности моделей на валидационном наборе, определите, какие веса приводят к лучшей точности.
  • Обратите внимание на распределение весов: возможно, некоторые модели окажутся более значимыми, чем другие.

3. Использование встроенных классов Sklearn

Вы также упомянули встроенные классы для ансамблирования в Scikit-Learn, такие как VotingClassifier. Это действительно полезный способ, который упрощает процесс. Данные классы могут интуитивно находить оптимальные веса с использованием методов, таких как:

  • Voting: простой способ, который можно использовать без весов (например, hard voting или soft voting, в зависимости от вероятности).
  • Bagging и Boosting: применяя исторические предсказания моделей, можно быть уверенным в их взаимодействии, исключая меньше эффективные.

Пример использования VotingClassifier:

from sklearn.ensemble import VotingClassifier

# Создайте модели
model1 = ...  # MFCC
model2 = ...  # LFCC
model3 = ...  # GFCC

voting_clf = VotingClassifier(
    estimators=[('mfcc', model1), ('lfcc', model2), ('gfcc', model3)],
    voting='soft',  # Использовать вероятности
    weights=[0.3, 0.3, 0.4]  # Начальные веса
)

voting_clf.fit(X_train, y_train)
accuracy = voting_clf.score(X_test, y_test)

Это позволяет вам сразу использовать механизм ансамблирования без ручного подбора весов.

Заключение

Нахождение оптимальных весов для взвешенного среднего в ансамбле моделей – задача, требующая тщательных исследований и испытаний. Эксперименты с механическим поиском и логистической регрессией могут дать хорошие результаты, однако использование встроенных функций Scikit-Learn может существенно упростить процесс. Выбирайте метод в зависимости от ваших ресурсов и объёма данных, и попробуйте каждый из подходов, чтобы найти наилучшее решение для вашей задачи.

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

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