Оцените функции плотности вероятности, применяя подход выживания

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

На первый взгляд, оценка функции выживания кажется сложной задачей, но после некоторого опыта и основных математических концепций это не так уж сложно! Лучшая отправная точка - это иметь в виду четкие идеи, нам нужно знать, что для нас Время и События. Только после этого мы сможем приступить к разработке модели, которая сможет обеспечить надежное предсказание функции выживания для интересующих нас объектов. С помощью некоторых уловок мы можем воспользоваться свойствами отображения функции выживания и работать с другими формами ее происхождения (например, функцией опасности).

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

ДАННЫЕ

Используемый нами набор данных содержит двухлетние исторические данные с 2011 по 2012 год системы Capital Bikeshare в Вашингтоне, округ Колумбия, доступные в дневном и почасовом формате. Предусмотрены различные предикторы для создания прогнозов, такие как временные регрессоры или регрессоры погоды. Теперь мы рассмотрим часовой формат, потому что нам нужен хороший объем данных, чтобы соответствовать нашим моделям нейронной сети.

Наша задача - предсказать, сколько почасовых прокатов велосипедов зарегистрировано при тех или иных временных и погодных условиях для случайных пользователей.

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

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

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

НЕЙРОННАЯ СЕТЬ С РЕГРЕССИЕЙ

Оценить функции выживания с помощью нейронной сети, а регрессия подразумевает непосредственную оценку CDF для каждого часа. CDF равны 0, когда количество случайных пользователей меньше истинного количества, а после этого значения - 1. Чтобы обеспечить одинаковую длину для наших функций целевой плотности, мы установили максимальное количество доступных пользователей, равное 400. Ниже приведена структура сети, которую мы используем. Он получает на входе значения наших внешних предикторов (погодные и временные характеристики), а на выходе пытается воспроизвести нашу функцию плотности. Активация сигмоида в последнем слое полезна для обрезки конечных значений между 0 и 1. Обучение вычисляется с минимизацией потери среднеквадратичной ошибки.

def get_model_reg():
    
    opt = Adam(lr=0.01)
    
    inp = Input(shape=(len(columns)))
    x = Dense(512, activation='relu')(inp)
    x = Dropout(0.3)(x)
    x = Dense(256, activation='relu')(x)
    x = Dropout(0.2)(x)
    x = Dense(256, activation='relu')(x)
    out = Dense(max_count, activation='sigmoid')(x)
    
    model = Model(inp, out)
    model.compile(optimizer=opt, loss='mse')
    
    return model

Мы рассчитываем качество нашей модели непосредственно на основе всей функции вероятности, задействованной в оценке нашей модели. По этой причине мы используем показатель непрерывной ранжированной вероятности (CRPS) в качестве показателя эффективности.

Мы прогнозируем полные кривые выживаемости для каждого почасового образца, и в итоге мы достигаем 0,074 CRPS по нашим тестовым данным, что лучше, чем простая модель, основанная на фиктивной оценке тестовых функций выживания с CDF, полученным из поезда (0,121 CRPS).

НЕЙРОННАЯ СЕТЬ С КЛАССИФИКАЦИЕЙ

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

def get_model_clas():
    
    opt = Adam(lr=0.0001)
    
    inp = Input(shape=(len(columns)))
    x = Dense(512, activation='relu')(inp)
    x = Dropout(0.3)(x)
    x = Dense(256, activation='relu')(x)
    x = Dropout(0.2)(x)
    x = Dense(256, activation='relu')(x)
    out = Dense(max_count, activation='softmax')(x)
    
    model = Model(inp, out)
    model.compile(optimizer=opt, loss='categorical_crossentropy')
    
    return model

Во время прогнозирования, чтобы получить желаемую функцию выживания, мы должны просто постобработать выходные данные, применяя преобразование кумулятивной суммы для каждого прогноза. С помощью наших оценочных функций выживания мы можем рассчитать нашу производительность на тестовой выборке, как это было сделано ранее. С классификационным подходом мы достигаем 0,091 CRPS, что лучше, чем простая модель, основанная на фиктивной оценке тестовых функций выживания с CDF, полученным из поезда (0,121 CRPS).

РЕЗЮМЕ

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

ПРОВЕРИТЬ РЕПО НА GITHUB

Оставайтесь на связи: Linkedin