exponenta event banner

Логистическая регрессия с массивами Tall

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

Определение среды выполнения

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

mapreducer(0)

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

Создайте хранилище данных, которое ссылается на расположение папки с данными. Данные могут содержаться в одном файле, коллекции файлов или во всей папке. Удовольствие 'NA' значения как отсутствующие данные, так что datastore заменяет их на NaN значения. Выберите подмножество переменных для работы и укажите имя авиакомпании (UniqueCarrier) как категориальная переменная. Создайте высокую таблицу поверх хранилища данных.

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

Модель подтверждает, что ранее наблюдавшиеся выводы верны и здесь:

  • Коэффициенты среды и четверга являются положительными, что указывает на более высокую вероятность позднего полета в эти дни. Коэффициент пятницы отрицательный, что указывает на более низкую вероятность.

  • Коэффициент расстояния является положительным, указывая на то, что более длительные полеты имеют более высокую вероятность опоздания.

Все эти коэффициенты имеют очень малые 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).