Постановка задачи заключалась в том, чтобы изучить пять самых загруженных аэропортов США и предсказать задержки прибытия в этих аэропортах. Это была задача регрессии, в которой выходной переменной была задержка прибытия. Кроме того, была построена классификационная модель, позволяющая определить, будет ли задержка для данного маршрута. Было три набора данных с информацией о разных авиакомпаниях, аэропортах и ​​рейсах. При анализе количества рейсов самыми загруженными оказались 5 аэропортов: Атланты, Чикаго, Далласа, Денвера и Лос-Анджелеса.

После объединения трех наборов данных по соответствующим ключам была сформирована составная таблица. Затем были выполнены некоторые шаги по очистке данных, такие как удаление пропущенных значений и форматирование типов данных времени. Наконец, очищенный основной набор данных был проанализирован, чтобы определить соответствующие функции для проблемы машинного обучения. В случае числовых непрерывных переменных для понимания зависимостей использовалась следующая матрица корреляции.

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

Теперь для задачи регрессии сначала была обучена модель линейной регрессии с переменной «Задержка прибытия» в качестве выходного параметра, тогда как остальные переменные были входными параметрами с коэффициентом разделения поезд-тест 0,25.

from sklearn.linear_model import LinearRegression
LinR = LinearRegression()
from sklearn.metrics import mean_absolute_error,mean_squared_error,r2_score

fitResult = LinR.fit(X_train_sc,y_train)
y_pred = fitResult.predict(X_test_sc)
print ('MAE:' ,  mean_absolute_error(y_test, y_pred))
print ('MSE:' , mean_squared_error(y_test, y_pred))
print('RMSE:' , np.sqrt(mean_squared_error(y_test, y_pred)))
print ('R2:' , r2_score(y_test, y_pred))

Затем модель AdaboostRegressor была обучена на том же наборе данных с тем же коэффициентом разделения тестового поезда.

from sklearn.ensemble import AdaBoostRegressor
AdBoost_Lin = AdaBoostRegressor(base_estimator=LinR,random_state=2)

fitResultABl =AdBoost_Lin.fit(X_train_sc,y_train)
predictedValues = fitResultABl.predict(X_test_sc)
print ('MAE:' ,  mean_absolute_error(y_test, predictedValues))
print ('MSE:' , mean_squared_error(y_test, predictedValues))
print('RMSE:' , np.sqrt(mean_squared_error(y_test, predictedValues)))
print ('R2:' , r2_score(y_test, predictedValues))

При сравнении показателей точности был сделан вывод, что модель линейной регрессии работает лучше, чем регрессор Adaboost. Возможной причиной может быть переобучение в случае с Adaboost. Важно отметить, что «задержка прибытия» и «задержка отправления» сильно коррелировали, как видно из корреляционной матрицы. Функция Departure Delay может сделать модель очень подверженной утечке данных. Таким образом, регрессионные прогностические модели были снова построены без учета «задержки отправления» из входных параметров.

X1 = Flights1.drop(['ARRIVAL_DELAY','DEPARTURE_DELAY'],axis = 1)
y1 = Flights1['DEPARTURE_DELAY']
X_train,X_test,y_train,y_test = train_test_split(X1,y1,test_size=0.25,random_state = 5)
sc1=StandardScaler()
X_train_sc=sc1.fit_transform(X_train)
X_test_sc=sc1.transform(X_test)

Как видно из метрик точности, ошибки значительно увеличились при исключении «Задержки отправления» из набора переменных-предикторов. Теперь к проблеме был применен другой подход: вместо прогнозирования «задержки прибытия» была реализована бинарная классификация, в которой модель предсказывала, будет ли рейс задержан или нет. Для этого в набор данных была добавлена ​​новая функция под названием «Is_Delayed», которая помечала рейсы с «задержкой прибытия» менее 15 минут как 0 (без задержки), а рейсы с «задержкой прибытия» более 15 минут как 1 (с задержкой). )

Flights1['Is_Delayed'] = np.where(Flights1['ARRIVAL_DELAY']<=15, 0,1)
X2 = Flights1.drop(['ARRIVAL_DELAY','Is_Delayed'],axis = 1)
y2 = Flights1['Is_Delayed']

Теперь мы смотрим на набор данных и видим количество каждой метки.

Из приведенных выше цифр видно, что это был случай дисбаланса классов. Для преобразования данных и устранения проблемы использовался метод передискретизации синтетического меньшинства или метод SMOTE. Этот метод основан на идее дублирования примеров из класса меньшинства для синтеза новых примеров из класса меньшинства. Алгоритм случайным образом выбирает экземпляр класса меньшинства «a», а затем находит его k ближайших соседей класса меньшинства. Затем создается синтетический экземпляр путем случайного выбора одного из k ближайших соседей b и соединения a и b для формирования сегмента линии в пространстве признаков.

from imblearn.over_sampling import SMOTE
smt = SMOTE()
X_train, y_train = smt.fit_resample(X_train, y_train)

Сначала был обучен классификатор дерева решений, что дало неудовлетворительные результаты.

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

Теперь ошибок типа 1 и типа 2 стало относительно намного меньше, а оценка F1, оценка точности и оценка отзыва были очень впечатляющими. Таким образом, модель логистической регрессии, похоже, работала достаточно хорошо и была выбрана в качестве классификатора для прогнозирования того, будет ли рейс задержан или нет.

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

Ссылки: