Логистическая регрессия с длинными массивами

Этот пример показывает, как использовать логистическую регрессию и другие методы, чтобы выполнить анализ данных длинных массивов. Длинные массивы представляют данные, которые являются слишком большими, чтобы поместиться в память компьютера.

Задайте среду выполнения

Когда вы выполняете вычисления на длинных массивах, среда выполнения по умолчанию использует или локальный сеанс MATLAB® или локальный параллельный пул (если у вас есть Parallel Computing Toolbox™). Можно использовать функцию mapreducer, чтобы изменить среду выполнения. Установите глобальную среду выполнения быть локальным сеансом работы с MATLAB.

mapreducer(0)

Получите данные в MATLAB

Создайте 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).

Для просмотра документации необходимо авторизоваться на сайте