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

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

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

Когда вы выполняете вычисления на длинных массивах, 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 0.74 sec
- Pass 2 of 2: Completed in 0.81 sec
Evaluation completed in 2 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 1.9 sec
Evaluation completed in 2.5 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.98 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.91 sec
- Pass 2 of 2: Completed in 0.87 sec
Evaluation completed in 2.2 sec
hold on
ksdensity(tt.Distance(tt.LateFlight==0))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.63 sec
- Pass 2 of 2: Completed in 0.68 sec
Evaluation completed in 1.6 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.93 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.21 sec
Evaluation completed in 0.37 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.73 sec
Evaluation completed in 0.82 sec
C = 2×2

       99613        4391
       18394        1125

Среди рейсов, предсказанных, чтобы иметь 20%-е или более высокую вероятность того, чтобы быть поздним, приблизительно 20% был последний 1125/(1125 + 4391). Среди остатка меньше чем 16% был последний 18394/(18394 + 99613).