← Назад к вопросам

Как XGBoost работает с временем просмотра сессий?

2.3 Middle🔥 121 комментариев
#Временные ряды#Машинное обучение#Опыт и проекты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как XGBoost работает с временем просмотра сессий

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

Базовый подход: XGBoost как числовой признак

Время просмотра (session view time) можно напрямую передать XGBoost как признак:

import xgboost as xgb
import pandas as pd
from datetime import datetime

# Данные сессий
df = pd.DataFrame({
    'session_id': [1, 2, 3, 4],
    'view_time_seconds': [120, 300, 45, 250],
    'conversion': [1, 1, 0, 1]
})

# XGBoost работает с числовыми признаками напрямую
X = df[['view_time_seconds']]
y = df['conversion']

model = xgb.XGBClassifier(random_state=42)
model.fit(X, y)

print(model.predict([[200]]))

Инженерия признаков для временных данных

Однако только сырое время недостаточно. Нужно создать признаки:

import numpy as np
from datetime import datetime, timedelta

def engineer_time_features(df):
    # 1. Логарифм времени (для нелинейности)
    df['log_view_time'] = np.log1p(df['view_time_seconds'])
    
    # 2. Категории времени
    df['time_category'] = pd.cut(
        df['view_time_seconds'],
        bins=[0, 30, 60, 300, np.inf],
        labels=['very_short', 'short', 'medium', 'long']
    ).astype('category').cat.codes
    
    # 3. Нелинейные признаки
    df['view_time_squared'] = df['view_time_seconds'] ** 2
    df['view_time_sqrt'] = np.sqrt(df['view_time_seconds'])
    
    # 4. Бинарный признак
    df['long_session'] = (df['view_time_seconds'] > 300).astype(int)
    
    return df

df = engineer_time_features(df)

Обработка последовательностей

Если данные - это последовательность событий:

events_data = pd.DataFrame({
    'session_id': [1, 1, 1, 2, 2, 3],
    'event_type': ['click', 'view', 'click', 'view', 'click', 'view'],
    'timestamp': pd.to_datetime([
        '2024-01-01 10:00:00',
        '2024-01-01 10:05:00',
        '2024-01-01 10:12:00',
        '2024-01-01 11:00:00',
        '2024-01-01 11:20:00',
        '2024-01-01 12:00:00'
    ])
})

# Агрегирование по сессиям
session_features = events_data.groupby('session_id').agg({
    'timestamp': lambda x: (x.max() - x.min()).total_seconds(),
    'event_type': 'count'
}).rename(columns={
    'timestamp': 'session_duration',
    'event_type': 'event_count'
})

X = session_features[['session_duration', 'event_count']]

Лаговые признаки для временных рядов

def create_lag_features(df, time_col, value_col, lags=[1, 2, 3]):
    df = df.sort_values(time_col)
    
    for lag in lags:
        df[f'{value_col}_lag_{lag}'] = df[value_col].shift(lag)
    
    df = df.dropna()
    return df

df = create_lag_features(df, 'date', 'view_time_seconds')

Взвешивание по времени сессии

XGBoost поддерживает взвешивание примеров:

# Взвешивание по времени просмотра
sample_weights = df['view_time_seconds'] / df['view_time_seconds'].max()

model = xgb.XGBClassifier()
model.fit(
    X, y,
    sample_weight=sample_weights,
    eval_set=[(X_val, y_val)],
    verbose=False
)

Практические рекомендации

  1. Логарифмирование — если время имеет экспоненциальное распределение
  2. Нормализация — нужна для интерпретируемости
  3. Категоризация — разделить на интервалы
  4. Взаимодействия — время × device_type
  5. Лаги — для временных рядов

Итоги

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