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

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

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

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

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 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')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent 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)

Figure contains an axes. The axes contains 7 objects of type line. These objects represent Sun, Mon, Tues, Wed, Thu, Fri, Sat.

Согласно этой модели, полет в среду или четверг в 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).