← Назад к вопросам
Как 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
)
Практические рекомендации
- Логарифмирование — если время имеет экспоненциальное распределение
- Нормализация — нужна для интерпретируемости
- Категоризация — разделить на интервалы
- Взаимодействия — время × device_type
- Лаги — для временных рядов
Итоги
XGBoost работает с временем просмотра как с числовым признаком, но максимальный результат достигается при правильной инженерии признаков, учете структуры данных и применении взвешивания.