Этот пример показывает, как использовать логистическую регрессию и другие методы, чтобы выполнить анализ данных длинных массивов. Длинные массивы представляют данные, которые являются слишком большими, чтобы поместиться в память компьютера.
Когда вы выполняете вычисления на длинных массивах, среда выполнения по умолчанию использует или локальный сеанс MATLAB® или локальный параллельный пул (если у вас есть Parallel Computing Toolbox™). Можно использовать функцию mapreducer
, чтобы изменить среду выполнения. Установите глобальную среду выполнения быть локальным сеансом работы с MATLAB.
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 0.74 sec - Pass 2 of 2: Completed in 0.85 sec Evaluation completed in 1.9 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 sec Evaluation completed in 2.4 sec late_by_carrier = 29x4 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 'NW' NW 10349 0.14542 'OH' OH 1457 0.18874 'OO' OO 3090 0.13916 'PA (1)' PA (1) 318 0.16981 'PI' PI 871 0.1814 'PS' PS 83 0.13253 'TW' TW 3805 0.159 'TZ' TZ 216 0.125 'UA' UA 13286 0.17447 'US' US 13997 0.15296 'WN' WN 15931 0.13722 'XE' XE 2357 0.17947 'YV' YV 849 0.19081
У поставщиков услуг 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.91 sec Evaluation completed in 1.1 sec late_by_day = 7x4 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)) hold on ksdensity(tt.Distance(tt.LateFlight==0)) hold off legend('Late','On time')
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.77 sec - Pass 2 of 2: Completed in 0.81 sec Evaluation completed in 1.9 sec Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.68 sec - Pass 2 of 2: Completed in 0.66 sec Evaluation completed in 1.6 sec
Расстояние рейса не имеет резкого значения в том, является ли рейс ранним или поздним. Однако плотность, кажется, немного выше для вовремя рейсов на расстояниях приблизительно 400 миль. Плотность также выше для поздних рейсов на расстояниях приблизительно 2 000 миль. Вычислите некоторую простую описательную статистику для последнего и вовремя рейсов.
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.92 sec Evaluation completed in 1.2 sec late_by_distance = 2x5 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 до 3 000 миль. Составьте таблицу, чтобы содержать значения предиктора путем индексации первых 100 строк в исходной таблице tt
.
x = gather(tt(1:100,{'Distance' 'DayOfWeek'})); 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)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.19 sec Evaluation completed in 0.33 sec
Согласно этой модели, среда или в четверг рейс 500 миль имеет ту же вероятность того, чтобы быть поздним, приблизительно 18%, как рейс в пятницу приблизительно 3 000 миль.
Поскольку эти вероятности составляют все намного меньше чем 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.77 sec Evaluation completed in 0.84 sec C = 99613 4391 18394 1125
Среди рейсов, предсказанных, чтобы иметь 20%-е или более высокую вероятность того, чтобы быть поздним, приблизительно 20% был последний 1125/(1125 + 4391)
. Среди остатка меньше чем 16% был последний 18394/(18394 + 99613)
.