Лучшее приложение для отслеживания рейсов Flighty использует машинное обучение, а также данные авиационных властей, чтобы теперь подавать ранние сигналы предупреждения о задержках и точно определять точную причину задержек. С этой последней версией приложение теперь способно определять две основные причины задержек — опоздание самолетов и проблемы с воздушным пространством — предоставляя пользователям заблаговременное предупреждение о задержках до того, как это сделают авиакомпании. Идея обновления заключается в том, чтобы помочь вам принимать более обоснованные решения о ваших планах путешествий, предоставляя вам информацию, которую авиакомпании обычно не предоставляют.
Например, авиакомпания может задержать ваш рейс на полчаса, затем на час и так далее. Flighty может заранее предупредить вас о том, что ваш рейс, скорее всего, будет задержан как минимум на пять часов из-за чего-то вроде официальной остановки на земле в вашем аэропорту или проблем с погодой. Возможно, вам захочется предпринять такие шаги, как перебронирование или немного подождать, прежде чем отправиться в аэропорт.
Мы подробно рассмотрим механизм работы новой функции Flighty и покажем, как добавить эту мощную функцию в ваш проект: прогнозирование задержек рейсов с использованием LSTM.
Прогнозирование задержки рейса может быть очень сложным из-за ряда факторов, которые могут оказаться влияющими причинами задержек, в основном связанных с погодой, воздушным движением и техническими проблемами. Такие модели прогнозирования могут быть важны для помощи авиакомпаниям в оптимизации операций, повышении удовлетворенности пассажиров и снижении эксплуатационных расходов.
Для построения эффективной модели прогнозирования задержки рейсов необходимо использовать различные признаки, которые могут влиять на задержки. В этой статье мы будем использовать следующие признаки:
FL_DATE
: Дата полета.DEP_DELAY
: Задержка отправления в минутах.ORIGIN_CITY_NAME
: Город, из которого отправляется рейс.DEST_CITY_NAME
: Город назначения.CRS_DEP_TIME
: Запланированное время отправления.DISTANCE
: Расстояние полета в милях.Подготовка данных — один из основных шагов в процессе построения модели машинного обучения. Мы будем использовать некоторые исторические данные о полетах и выполним несколько шагов предварительной обработки: обработку пропущенных значений, кодирование категориальных признаков и нормализацию данных.
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout # Load the flight data flights_df = pd.read_csv('path_to_your_flight_data.csv') # Convert FL_DATE to datetime and set as index flights_df['FL_DATE'] = pd.to_datetime(flights_df['FL_DATE']) flights_df.set_index('FL_DATE', inplace=True) # Select relevant columns and drop rows with NaN values features = ['DEP_DELAY', 'ORIGIN_CITY_NAME', 'DEST_CITY_NAME', 'CRS_DEP_TIME', 'DISTANCE'] flights_df = flights_df[features].dropna() # Convert categorical features to dummy variables flights_df = pd.get_dummies(flights_df, columns=['ORIGIN_CITY_NAME', 'DEST_CITY_NAME']) # Normalize the data scaler = MinMaxScaler() scaled_data = scaler.fit_transform(flights_df)
Одним из видов рекуррентной нейронной сети является сеть с долговременной краткосрочной памятью или LSTM, которая специально разработана для изучения долгосрочных зависимостей в данных временных рядов. Сначала необходимо создать последовательность точек данных с использованием LSTM.
# Create sequences def create_sequences(data, seq_length): sequences = [] for i in range(len(data) - seq_length): seq = data[i:i+seq_length] target = data[i+seq_length][0] # DEP_DELAY is the target sequences.append((seq, target)) return sequences seq_length = 30 sequences = create_sequences(scaled_data, seq_length)
Затем мы разделяем последовательности на обучающие и тестовые наборы, чтобы оценить эффективность модели.
# Split into train and test sets train_size = int(len(sequences) * 0.8) train_sequences = sequences[:train_size] test_sequences = sequences[train_size:] # Prepare the input and output X_train, y_train = zip(*train_sequences) X_train, y_train = np.array(X_train), np.array(y_train) X_test, y_test = zip(*test_sequences) X_test, y_test = np.array(X_test), np.array(y_test)
Затем мы определяем и обучаем модель LSTM. Модель включает два слоя LSTM со слоями исключения для предотвращения переобучения и плотный выходной слой.
# Build the LSTM model model = Sequential() model.add(LSTM(50, return_sequences=True, input_shape=(seq_length, X_train.shape[2]))) model.add(Dropout(0.2)) model.add(LSTM(50)) model.add(Dropout(0.2)) model.add(Dense(1)) model.compile(optimizer='adam', loss='mean_squared_error') # Train the model model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(X_test, y_test))
После обучения модели мы можем использовать ее для составления прогнозов на основе тестовых данных и визуализации результатов.
# Make predictions predictions = model.predict(X_test) predictions = scaler.inverse_transform(np.concatenate((predictions, np.zeros((predictions.shape[0], scaled_data.shape[1] - 1))), axis=1))[:, 0] from sklearn.preprocessing import MinMaxScaler future_flight_data = { 'DEP_DELAY': 0, 'ORIGIN_CITY_NAME': 'San Francisco, CA', 'DEST_CITY_NAME': 'New York, NY', 'CRS_DEP_TIME': 1230, 'DISTANCE': 2904 } future_flight_df = pd.DataFrame([future_flight_data]) future_flight_df = pd.get_dummies(future_flight_df, columns=['ORIGIN_CITY_NAME', 'DEST_CITY_NAME']) scaler_columns = list(scaler.feature_names_in_) for col in scaler_columns: if col not in future_flight_df.columns: future_flight_df[col] = 0 future_flight_df = future_flight_df[scaler_columns] # Normalize the data using the fitted scaler scaled_future_flight = scaler.transform(future_flight_df) seq_length = 30 # Repeat the future flight data to create a sequence future_sequence = np.array([scaled_future_flight] * seq_length) future_sequence = future_sequence.reshape(1, seq_length, future_sequence.shape[2]) predicted_delay = model.predict(future_sequence) predicted_delay = scaler.inverse_transform( np.concatenate( (predicted_delay, np.zeros((predicted_delay.shape[0], scaled_future_flight.shape[1] - 1))), axis=1 ) )[:, 0] print(f"Predicted delay for the specific future flight: {predicted_delay[0]:.2f} minutes")
Predicted delay for the specific future flight: 4.10 minutes
На приведенном выше графике показаны фактические и прогнозируемые задержки. Если две линии показывают очень небольшое отклонение, то модель отлично справляется с прогнозированием задержек. Однако всегда есть возможность улучшить модель путем тонкой настройки гиперпараметров или путем добавления дополнительных функций или использования более продвинутых архитектур.
Несмотря на преимущества, существует ряд проблем и соображений:
В целом, машинное обучение в прогнозировании задержки рейсов является очень мощным инструментом; оно может помочь обеспечить гигантскую эффективность авиакомпаний в их работе и обеспечить лучший опыт путешествия для пассажиров. Ознакомьтесь с примерами, приведенными в этой статье, чтобы реализовать собственную модель предиктора задержки рейсов и почувствовать силу машинного обучения, работающего в этой области.
Это лишь одна из новых функций Flighty, демонстрирующая возможности машинного обучения для решения реальных проблем. В процессе развития технологий и науки о данных этот тип модели будет совершенствоваться в плане точности и типов проблем, к которым он может быть применен, прокладывая путь к более умным и эффективным авиаперевозкам.
Тем, кто заинтересован в дальнейшем совершенствовании своей модели, следует рассмотреть следующее:
Благодаря непрерывной итерации и совершенствованию можно добиться более высокой точности и более надежных прогнозов, а значит, более плавных и эффективных авиаперелетов.