Стратифицированное разбиение временных рядов с одинаковым отношением дисбаланса

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

В последнее время я занимаюсь задачей бинарной классификации с несбалансированными данными, где данные упорядочены во времени. Я хотел бы проверить свою модель, используя тренировочные и валидационные разделы с одинаковым соотношением классов (аналогично стратифицированному k-fold в Scikit-learn).

Я пробовал использовать timeseriesSplit из Scikit-learn. Однако их реализация не гарантирует, что оба класса существуют с аналогичным соотношением несбалансированности в тренировочных и валидационных разделах. Есть ли способ сделать это?

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

Сначала я бы проверил, как соотношение классов изменяется с течением времени. Если оно не изменяется значительно, вам не обязательно беспокоиться о стратификации.

Если изменяется, способ правильного разделения данных зависит от специфики того, что вы пытаетесь сделать.

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

Стратфицированное разбиение временных рядов с сохранением одинакового отношения дисбаланса классов является интересной задачей, особенно в контексте задач бинарной классификации.

  1. Анализ структур классов: Прежде всего, вам следует проанализировать, как соотношение классов меняется с течением времени. Если соотношение классов не меняется значительно, возможно, вам не потребуется беспокоиться о стратификации. Если же соотношение изменяется, это может существенно повлиять на вашу модель и требования к валидации.

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

    • Создание окон: Разбейте ваш временной ряд на несколько окон, каждое из которых будет содержать последовательные временные точки (например, дни, недели или месяцы).

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

  3. Пример кода:
    Вот пример, как это может выглядеть в коде на Python:

    import pandas as pd
    from sklearn.model_selection import train_test_split
    
    # Загрузка ваших данных
    data = pd.read_csv("your_data.csv")
    
    # Предполагаем, что 'target' — это ваша целевая переменная
    time_series_data = data.sort_values(by='date')  # Сортируем данные по времени
    
    # Определите размер ваших окон (например, 30 дней)
    window_size = 30
    n_windows = len(time_series_data) // window_size
    
    for i in range(n_windows):
       window_data = time_series_data.iloc[i * window_size : (i + 1) * window_size]
    
       # Разделите данные на обучающую и валидационную выборки с сохранением отношения классов
       train, test = train_test_split(window_data, test_size=0.2, stratify=window_data['target'])
    
       # Здесь вы можете продолжить обучение вашей модели на train и валидацию на test
  4. Методы учёта временной зависимости: Если ваши данные имеют сильную временную зависимость, вы можете внедрить дополнительные подходы. Например:

    • Используйте кросс-валидацию, которая сохраняет порядок временных рядов (TimeSeriesSplit из sklearn), и для каждой итерации добавьте стратификацию после разбиения.
    • Используйте методы машинного обучения, которые учитывают временные зависимости, такие как рекуррентные нейронные сети (RNN).
  5. Вывод: Сохранение дисбаланса классов в временных рядах требует внимательного подхода к разбиению данных. Убедитесь, что вы проверяете результаты на полноценной выборке, чтобы ваша модель могла обобщать информацию и работать эффективно. Если соотношение классов меняется, увеличивайте контроль за этим аспектом, позволяя вашему процессу обучения и валидации учесть временные зависимости.

Надеюсь, это поможет вам в вашей задаче!

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

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