В этом примере показано, как использовать логистическую регрессию и другие методы, чтобы выполнить анализ данных длинных массивов. Длинные массивы представляют данные, которые являются слишком большими, чтобы поместиться в память компьютера.
Когда вы выполняете вычисления на длинных массивах, 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 0.93 sec - Pass 2 of 2: Completed in 1.2 sec Evaluation completed in 2.8 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.4 sec Evaluation completed in 3 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 1 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 1 sec - Pass 2 of 2: Completed in 0.85 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.76 sec - Pass 2 of 2: Completed in 0.75 sec Evaluation completed in 1.8 sec
hold off legend('Late','On time')
Расстояние рейса не имеет резкого значения в том, является ли рейс ранним или поздним. Однако плотность, кажется, немного выше для вовремя рейсов на расстояниях приблизительно 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.94 sec Evaluation completed in 1.2 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 до 3 000 миль. Составьте таблицу, чтобы содержать значения предиктора путем индексации первых 100 строк в исходной таблице tt
.
x = gather(tt(1:100,{'Distance' 'DayOfWeek'}));
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.23 sec Evaluation completed in 0.39 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%, как рейс в пятницу приблизительно 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.97 sec Evaluation completed in 1.1 sec
C = 2×2
99613 4391
18394 1125
Среди рейсов, предсказанных, чтобы иметь 20%-е или более высокую вероятность того, чтобы быть поздним, приблизительно 20% был последний 1125/(1125 + 4391)
. Среди остатка меньше чем 16% был последний 18394/(18394 + 99613)
.