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

Как спрогнозировать задержку рейсов в авиакомпании?

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

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

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

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

Прогнозирование задержек рейсов в авиакомпании

Это классическая задача машинного обучения, которая решается комплексным подходом. Расскажу о методологии, которую я применил бы на практике.

Фаза 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 — ловить большинство реальных задержек
  • Бизнес-метрика — сокращение времени пассажиров в ожидании

Выводы

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

Как спрогнозировать задержку рейсов в авиакомпании? | PrepBro