В этом примере показано, как использовать логистическую регрессию и другие методы для анализа данных в массивах tall. Массивы Tall представляют данные, которые слишком велики для размещения в памяти компьютера.
При выполнении вычислений в массивах TALL MATLAB ® использует либо параллельный пул (по умолчанию при наличии Toolbox™ Parallel Computing), либо локальный сеанс MATLAB. Для выполнения примера с использованием локального сеанса MATLAB при наличии панели инструментов Parallel Computing Toolbox измените глобальную среду выполнения с помощью mapreducer функция.
mapreducer(0)
Создайте хранилище данных, которое ссылается на расположение папки с данными. Данные могут содержаться в одном файле, коллекции файлов или во всей папке. Удовольствие 'NA' значения как отсутствующие данные, так что datastore заменяет их на NaN значения. Выберите подмножество переменных для работы и укажите имя авиакомпании (UniqueCarrier) как категориальная переменная. Создайте высокую таблицу поверх хранилища данных.
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
Модель подтверждает, что ранее наблюдавшиеся выводы верны и здесь:
Коэффициенты среды и четверга являются положительными, что указывает на более высокую вероятность позднего полета в эти дни. Коэффициент пятницы отрицательный, что указывает на более низкую вероятность.
Коэффициент расстояния является положительным, указывая на то, что более длительные полеты имеют более высокую вероятность опоздания.
Все эти коэффициенты имеют очень малые 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).