Как спрогнозировать задержку рейсов в авиакомпании?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Прогнозирование задержек рейсов в авиакомпании
Это классическая задача машинного обучения, которая решается комплексным подходом. Расскажу о методологии, которую я применил бы на практике.
Фаза 1: Сбор и понимание данных
Для моделирования нужны следующие типы данных:
Операционные данные:
- Расписание вылета/прилёта
- История фактических вылетов/прилётов
- Тип воздушного судна
- Маршрут полёта и расстояние
- День недели, время года
Внешние данные:
- Погодные условия в аэропортах (осадки, видимость, ветер)
- Данные о перекрытиях ВПП
- Информация о трафике в аэропортах
- Праздники и события
Исторические данные:
- Прошлые задержки этого рейса
- Средние задержки в аэропортах вылета/прилёта
- Производительность авиалиний
Фаза 2: Feature Engineering
import pandas as pd
import numpy as np
from datetime import datetime
def create_features(df: pd.DataFrame) -> pd.DataFrame:
# Временные признаки
df['day_of_week'] = df['scheduled_departure'].dt.dayofweek
df['hour'] = df['scheduled_departure'].dt.hour
df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
df['month'] = df['scheduled_departure'].dt.month
# Признаки маршрута
df['route_key'] = df['origin'] + '_' + df['destination']
# Исторические признаки (rolling statistics)
route_stats = df.groupby('route_key')['delay_minutes'].agg([
'mean', 'std', 'max'
]).reset_index()
df = df.merge(route_stats, on='route_key')
# Статистика по аэропортам
origin_delays = df.groupby('origin')['delay_minutes'].mean().reset_index()
origin_delays.columns = ['origin', 'avg_origin_delay']
df = df.merge(origin_delays, on='origin')
# Статистика авиалинии
airline_delays = df.groupby('airline')['delay_minutes'].mean().reset_index()
airline_delays.columns = ['airline', 'avg_airline_delay']
df = df.merge(airline_delays, on='airline')
# Погодные признаки
df['has_precipitation'] = (df['precipitation_mm'] > 0).astype(int)
df['wind_speed_category'] = pd.cut(df['wind_speed_kmh'],
bins=[0, 10, 20, 50, float('inf')],
labels=['low', 'medium', 'high', 'severe'])
# Признаки загрузки аэропорта
df['flights_in_hour'] = df.groupby(['origin', 'hour'])['flight_id'].transform('count')
return df
Фаза 3: Постановка проблемы
Вариант 1: Классификация (более практичный)
- Класс 0: задержка < 15 минут (на время)
- Класс 1: задержка >= 15 минут (с задержкой)
Вариант 2: Регрессия (более точный)
- Прогноз конкретного количества минут задержки
Я бы выбрал классификацию, так как для авиакомпании важнее знать "будет ли задержка", чем точное её значение.
Фаза 4: Выбор моделей
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import precision_recall_curve, roc_auc_score, f1_score
# Подготовка данных
X = df[feature_columns].copy()
y = (df['actual_delay'] >= 15).astype(int) # Целевая переменная
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# Model 1: RandomForest (базовая модель)
rf_model = RandomForestClassifier(
n_estimators=100,
max_depth=15,
min_samples_split=20,
class_weight='balanced',
random_state=42,
n_jobs=-1
)
rf_model.fit(X_train, y_train)
# Model 2: Gradient Boosting (более мощная модель)
gb_model = GradientBoostingClassifier(
n_estimators=200,
learning_rate=0.05,
max_depth=5,
subsample=0.8,
random_state=42
)
gb_model.fit(X_train, y_train)
# Оценка
y_pred_rf = rf_model.predict(X_test)
y_pred_proba_gb = gb_model.predict_proba(X_test)[:, 1]
print(f"RF F1-score: {f1_score(y_test, y_pred_rf):.3f}")
print(f"GB ROC-AUC: {roc_auc_score(y_test, y_pred_proba_gb):.3f}")
Фаза 5: Обработка дисбаланса классов
Обычно задержанные рейсы — меньшинство. Решения:
- SMOTE — синтетическое создание примеров меньшинства
- Class weights — штраф за ошибки на меньшинстве
- Threshold tuning — смещение порога классификации
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_train_balanced, y_train_balanced = smote.fit_resample(X_train, y_train)
gb_model = GradientBoostingClassifier(random_state=42)
gb_model.fit(X_train_balanced, y_train_balanced)
Фаза 6: Интерпретируемость
Для авиакомпании важно понимать, какие факторы влияют на задержки:
# Feature Importance
importance = pd.DataFrame({
'feature': X_train.columns,
'importance': rf_model.feature_importances_
}).sort_values('importance', ascending=False)
print(importance.head(10))
# SHAP для детального анализа
import shap
explainer = shap.TreeExplainer(rf_model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
Фаза 7: Деплой и мониторинг
Практическое применение:
- API endpoint — REST API для прогнозов за 24 часа до вылета
- Batch prediction — ежедневный расчёт для всех рейсов
- Мониторинг дрейфа — отслеживание производительности модели
- A/B тестирование — проверка влияния на бизнес-метрики
Метрики успеха
- ROC-AUC >= 0.80 — хороший баланс между чувствительностью и специфичностью
- Precision >= 0.75 — не отправлять ложные предупреждения
- Recall >= 0.70 — ловить большинство реальных задержек
- Бизнес-метрика — сокращение времени пассажиров в ожидании
Выводы
Прогнозирование задержек — это многоуровневая задача, требующая интеграции исторических данных, погоды и характеристик маршрута. Главное — выбрать правильный баланс между точностью модели и её интерпретируемостью для бизнеса.