В этом примере показано, как использовать логистическую регрессию и другие методы для анализа данных на длинных массивах. Длинные массивы представляют данные, которые являются слишком большими, чтобы помещаться в память компьютера».
При выполнении вычислений на длинные массивы MATLAB ® использует либо параллельный пул (по умолчанию, если у вас есть Parallel Computing Toolbox™), либо локальный сеанс работы с MATLAB. Чтобы запустить пример с использованием локального сеанса работы с MATLAB, когда у вас есть Parallel Computing Toolbox, измените глобальное окружение выполнения с помощью mapreducer
функция.
mapreducer(0)
Создайте datastore, которое ссылается на расположение папки с данными. Данные могут содержаться в одном файле, наборе файлов или целой папке. Лечите 'NA'
значения как отсутствующие данные, так что datastore
заменяет их на NaN
значения. Выберите подмножество переменных для работы и включите имя авиакомпании (UniqueCarrier
) как категориальная переменная. Составьте длинная таблица в верхней части datastore.
ds = datastore('airlinesmall.csv'); ds.TreatAsMissing = 'NA'; ds.SelectedVariableNames = {'DayOfWeek','UniqueCarrier',... 'ArrDelay','DepDelay','Distance'}; ds.SelectedFormats{2} = '%C'; tt = tall(ds); tt.DayOfWeek = categorical(tt.DayOfWeek,1:7,... {'Sun','Mon','Tues','Wed','Thu','Fri','Sat'},'Ordinal',true)
tt = Mx5 tall table DayOfWeek UniqueCarrier ArrDelay DepDelay Distance _________ _____________ ________ ________ ________ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : : : : : : : : : :
Определите рейсы, которые опоздали на 20 минут или больше, путем определения логической переменной, которая верна для позднего полета. Добавьте эту переменную в длинная таблица данных, отметив, что она еще не оценена. Предварительный просмотр этой переменной включает первые несколько строк.
tt.LateFlight = tt.ArrDelay>=20
tt = Mx6 tall table DayOfWeek UniqueCarrier ArrDelay DepDelay Distance LateFlight _________ _____________ ________ ________ ________ __________ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : : : : : : : : : : : :
Вычислим среднее значение LateFlight
определить общую долю поздних рейсов. Использование gather
чтобы запустить оценку длинный массив и принести результат в память.
m = mean(tt.LateFlight)
m = tall double ?
m = gather(m)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 1.1 sec - Pass 2 of 2: Completed in 0.95 sec Evaluation completed in 2.6 sec
m = 0.1580
Исследуйте, имеют ли тенденцию к опозданию определенные типы рейсов. Во-первых, проверьте, есть ли у определенных перевозчиков вероятность опоздания рейсов.
tt.LateFlight = double(tt.LateFlight); late_by_carrier = gather(grpstats(tt,'UniqueCarrier','mean','DataVar','LateFlight'))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 2.7 sec Evaluation completed in 3.4 sec
late_by_carrier=29×4 table
GroupLabel UniqueCarrier GroupCount mean_LateFlight
__________ _____________ __________ _______________
{'9E' } 9E 521 0.13436
{'AA' } AA 14930 0.16236
{'AQ' } AQ 154 0.051948
{'AS' } AS 2910 0.16014
{'B6' } B6 806 0.23821
{'CO' } CO 8138 0.16319
{'DH' } DH 696 0.17672
{'DL' } DL 16578 0.15261
{'EA' } EA 920 0.15217
{'EV' } EV 1699 0.21248
{'F9' } F9 335 0.18209
{'FL' } FL 1263 0.19952
{'HA' } HA 273 0.047619
{'HP' } HP 3660 0.13907
{'ML (1)'} ML (1) 69 0.043478
{'MQ' } MQ 3962 0.18778
⋮
Несущие B6
и EV
имеют более высокие пропорции поздних рейсов. Несущие AQ
, ML(1)
, и HA
имеют относительно мало рейсов, но более низкие пропорции из них опаздывают.
Затем проверьте, имеют ли место более поздние рейсы в разные дни недели.
late_by_day = gather(grpstats(tt,'DayOfWeek','mean','DataVar','LateFlight'))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.97 sec Evaluation completed in 1.2 sec
late_by_day=7×4 table
GroupLabel DayOfWeek GroupCount mean_LateFlight
__________ _________ __________ _______________
{'Fri' } Fri 15839 0.12899
{'Mon' } Mon 18077 0.14234
{'Sat' } Sat 16958 0.15603
{'Sun' } Sun 18019 0.15117
{'Thu' } Thu 18227 0.18418
{'Tues'} Tues 18163 0.15526
{'Wed' } Wed 18240 0.18399
В средах и четвергах самая высокая доля поздних рейсов, в то время как в пятницах самая низкая доля.
Проверьте, что более длинные или более короткие рейсы, как правило, опаздывают. Во-первых, посмотрите на плотность расстояния рейса для рейсов, которые опоздали, и сравните это с рейсами, которые вовремя.
ksdensity(tt.Distance(tt.LateFlight==1))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.86 sec - Pass 2 of 2: Completed in 0.89 sec Evaluation completed in 2.3 sec
hold on
ksdensity(tt.Distance(tt.LateFlight==0))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.78 sec - Pass 2 of 2: Completed in 1.1 sec Evaluation completed in 2.1 sec
hold off legend('Late','On time')
Расстояние полета не делает существенного различия в том, рано ли или поздно рейс. Однако плотность, по-видимому, немного выше для временных рейсов на расстояниях около 400 миль. Плотность также выше для поздних рейсов на расстояниях около 2000 миль. Вычислите некоторую простую описательную статистику для поздних и своевременных рейсов.
late_by_distance = gather(grpstats(tt,'LateFlight',{'mean' 'std'},'DataVar','Distance'))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.87 sec Evaluation completed in 1.1 sec
late_by_distance=2×5 table
GroupLabel LateFlight GroupCount mean_Distance std_Distance
__________ __________ __________ _____________ ____________
{'0'} 0 1.04e+05 693.14 544.75
{'1'} 1 19519 750.24 574.12
Поздние рейсы в среднее значение на 60 миль длиннее, хотя это значение составляет лишь небольшой фрагмент стандартного отклонения значений расстояния.
Создайте модель для вероятности позднего рейса, используя обе непрерывные переменные (такие как Distance
) и категориальные переменные (такие как DayOfWeek
), чтобы предсказать вероятности. Эта модель может помочь определить, верны ли предыдущие результаты, наблюдаемые для каждого предиктора по отдельности, когда вы рассматриваете их вместе.
glm = fitglm(tt,'LateFlight~Distance+DayOfWeek','Distribution','binomial')
Iteration [1]: 0% completed Iteration [1]: 100% completed Iteration [2]: 0% completed Iteration [2]: 100% completed Iteration [3]: 0% completed Iteration [3]: 100% completed Iteration [4]: 0% completed Iteration [4]: 100% completed Iteration [5]: 0% completed Iteration [5]: 100% completed
glm = Compact generalized linear regression model: logit(LateFlight) ~ 1 + DayOfWeek + Distance Distribution = Binomial Estimated Coefficients: Estimate SE tStat pValue __________ __________ _______ __________ (Intercept) -1.855 0.023052 -80.469 0 DayOfWeek_Mon -0.072603 0.029798 -2.4365 0.01483 DayOfWeek_Tues 0.026909 0.029239 0.92029 0.35742 DayOfWeek_Wed 0.2359 0.028276 8.343 7.2452e-17 DayOfWeek_Thu 0.23569 0.028282 8.3338 7.8286e-17 DayOfWeek_Fri -0.19285 0.031583 -6.106 1.0213e-09 DayOfWeek_Sat 0.033542 0.029702 1.1293 0.25879 Distance 0.00018373 1.3507e-05 13.602 3.8741e-42 123319 observations, 123311 error degrees of freedom Dispersion: 1 Chi^2-statistic vs. constant model: 504, p-value = 8.74e-105
Модель подтверждает, что ранее наблюдавшиеся выводы также верны здесь:
Коэффициенты среды и четверга положительны, что указывает на более высокую вероятность позднего рейса в эти дни. Коэффициент пятницы отрицательный, что указывает на более низкую вероятность.
Коэффициент Distance положителен, что указывает на то, что более длинные рейсы имеют более высокую вероятность опоздания.
Все эти коэффициенты имеют очень маленькие p-значения. Это часто встречается с наборами данных, которые имеют много наблюдений, поскольку можно надежно оценить небольшие эффекты с большими объемами данных. На самом деле, неопределенность в модели больше, чем неопределенность в оценках для параметров в модели.
Предсказать вероятность позднего рейса для каждого дня недели, и для расстояний от 0 до 3000 миль. Создайте таблицу, чтобы удерживать значения предиктора путем индексации первых 100 строк в исходной таблице tt
.
x = gather(tt(1:100,{'Distance' 'DayOfWeek'}));
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.22 sec Evaluation completed in 0.41 sec
x.Distance = linspace(0,3000)'; x.DayOfWeek(:) = 'Sun'; plot(x.Distance,predict(glm,x)); days = {'Sun' 'Mon' 'Tues' 'Wed' 'Thu' 'Fri' 'Sat'}; hold on for j=2:length(days) x.DayOfWeek(:) = days{j}; plot(x.Distance,predict(glm,x)); end legend(days)
Согласно этой модели, полет в среду или четверг в 500 миль имеет такую же вероятность опоздания, около 18%, как рейс в пятницу около 3000 миль.
Поскольку все эти вероятности намного меньше 50%, модель вряд ли спрогнозирует, что любой данный рейс опоздает с использованием этой информации. Исследуйте модель больше, фокусируясь на рейсах, для которых модель прогнозирует вероятность опоздания на 20% или более, и сравните это с фактическими результатами.
C = gather(crosstab(tt.LateFlight,predict(glm,tt)>.20))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.89 sec Evaluation completed in 1 sec
C = 2×2
99613 4391
18394 1125
Среди рейсов, по прогнозам, вероятность опоздания на 20% или выше, около 20% опоздали 1125/(1125 + 4391)
. Среди остальных менее 16% опоздали 18394/(18394 + 99613)
.