Анализ прогнозов выживания вне выборки (CoxTimeVaryingFitter)

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

Я пытаюсь предсказать вероятность выживания клиентов в течение следующих 24 месяцев. Я использую CoxTimeVaryingFitter из библиотеки lifelines.

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

Могу ли я использовать следующий код для получения предсказаний вне выборки? Я осознаю предпосылки TimeVarying для вневыборочных данных, но в данный момент меня в основном интересует получение предсказаний вне выборки.

    # Получить базовую кумулятивную опасность из модели
    baseline_cumulative_hazard = ctv_model.baseline_cumulative_hazard_

    # Получить диапазон временных точек базовой опасности
    min_time = baseline_cumulative_hazard.index.min()
    max_time = baseline_cumulative_hazard.index.max()

    # Изменить индексацию базовой кумулятивной опасности, чтобы включить все временные точки (для интерполяции)
    full_index = pd.RangeIndex(start=int(min_time), stop=int(max_time) + 1)  # Создать диапазон временных точек
    baseline_cumulative_hazard = baseline_cumulative_hazard.reindex(full_index)

    # Интерполировать, чтобы заполнить пропуски между временными точками
    baseline_cumulative_hazard = baseline_cumulative_hazard.interpolate(method='linear')

    # Получить максимальное и минимальное доступное базовое время
    max_baseline_time = baseline_cumulative_hazard.index.max()
    min_baseline_time = baseline_cumulative_hazard.index.min()

    survival_results = {}

    for customer_id in extrapolated_data['customer_id'].unique():

        # Фильтровать данные по клиенту
        customer_data = extrapolated_data[extrapolated_data['klt_rle_nummer'] == customer_id]

        # Получить текущее `relation_duration` (отправная точка длительности отношений) для клиента
        relationship_duration = customer_data['end_date'].iloc[0]  # Предполагая, что все строки для клиента имеют одинаковое `relation_duration`

        # Если длительность отношений клиента превышает доступную базовую линию, использовать последнее доступное значение базовой линии
        if relationship_duration > max_baseline_time:
            baseline_hazard_from_relation_duration = baseline_cumulative_hazard.loc[max_baseline_time].iloc[0]

        # Если длительность отношений клиента меньше максимальной доступной базовой, использовать базовую линию из последнего доступного значения
        elif relationship_duration < min_baseline_time:
            baseline_hazard_from_relation_duration = baseline_cumulative_hazard.loc[min_baseline_time].iloc[0] 

        # Если длительность отношений клиента находится в пределах доступной базы, использовать базовую линию из `relation_duration` клиента
        else:
            baseline_hazard_from_relation_duration = baseline_cumulative_hazard.loc[relationship_duration].iloc[0]

        # Предсказать частичные риски для этого клиента
        partial_hazards = ctv_model.predict_partial_hazard(customer_data).values.flatten()

        # Рассчитать кумулятивную опасность как базовую кумулятивную опасность, умноженную на частичные риски
        cumulative_hazard = baseline_hazard_from_relation_duration * partial_hazards

        # Рассчитать вероятность выживания как S(t) = exp(-кумулятивная опасность)
        survival_prob = np.exp(-cumulative_hazard)

        # Сохранить результат в словарь с customer_id в качестве ключа
        survival_results[customer_id] = survival_prob

    # Преобразовать результаты в DataFrame с вероятностями выживания и оттока
    survival_df = pd.DataFrame(survival_results, index=time_horizon)

У меня есть цикл, в котором я получаю экстраполированные данные на месяц вперед, и я использую код выше для получения предсказания на месяц вперед. Это означает, что я экстраполирую 24 раза и использую функцию выше, чтобы получить 24 предсказания на 24 месяца. Правильно ли я рассуждаю и действительно ли кумулятивная опасность = базовая опасность из длительности отношений * частичные риски является правильным методом получения кумулятивной опасности?

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

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

Основная структура вашего кода

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

  1. Получение базового кумулятивного риска: Вы правильно получаете базовый кумулятивный риск из вашей модели.
  2. Интерполяция кумулятивного риска: Вы создаете полный индекс временных точек, чтобы интерполировать значения, что является хорошей практикой, чтобы избежать пропусков.
  3. Фильтрация по клиенту: Вы используете цикл для фильтрации данных по каждому клиенту и получения их уникальной характеристики длительности отношений.
  4. Предсказание частичных рисков: Использование predict_partial_hazard — это верный способ оценить, как различные факторы влияют на риск для каждого клиента.
  5. Расчет кумулятивного риска и вероятности выживания: Формула ( S(t) = \exp(-cumulative_hazard) ) является стандартной в анализе выживаемости и верна для расчета вероятности выживания.

Оценка правильности определения кумулятивного риска

Ваше выражение для вычисления кумулятивного риска:
[ cumulative_hazard = baseline_hazard_from_relation_duration \times partial_hazards ]
в целом корректно, однако важно уточнить, что это выражение предполагает, что вы рассматриваете базовый риск в контексте «времени» для каждого клиента и в определенном горизонте.

Важные моменты для уточнения

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

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

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

Заключение

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

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

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

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