Статистика и машинное обучение с Большими данными Используя длинные массивы

Этот пример показывает, как выполнить статистический анализ и машинное обучение на данных, которые не помещаются в память, с MATLAB® и Statistics and Machine Learning Toolbox™.

Длинные массивы и таблицы разработаны для работы с данными, которые не помещаются в память. Этот тип данных состоит из очень большого количества строк (наблюдения) по сравнению с меньшим числом столбцов (переменные). Вместо того, чтобы писать специализированный код, который учитывает огромный размер данных, такой как с MapReduce, длинные массивы позволяют вам работать с большими наборами данных способом, подобным массивам MATLAB в оперативной памяти. Принципиальное различие - то, что длинные массивы обычно остаются неоцененными, пока вы не запрашиваете, чтобы вычисления были выполнены.

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

Этот пример работает с подмножеством данных по одиночному компьютеру, чтобы разработать модель линейной регрессии, и затем это масштабирует, чтобы анализировать весь набор данных. Можно увеличить этот анализ еще больше к:

  • Работа с данными, которые не могут быть считаны в память

  • Работа с данными, распределенными на кластерах с помощью MATLAB Parallel Server™

  • Объединяйтесь с большими системами передачи и обработки данных как Hadoop® и Spark®

Введение в машинное обучение с длинными массивами

Несколько безнадзорных и контролируемых алгоритмов изучения в Statistics and Machine Learning Toolbox доступны, чтобы работать с длинными массивами, чтобы выполнить анализ данных и прогнозирующее моделирование с данными, которые не помещаются в память. Эти алгоритмы подходят для данных, которые не помещаются в память, и могут включать небольшие изменения из алгоритмов в оперативной памяти. Возможности включают:

  • кластеризация k-средств

  • Линейная регрессия

  • Обобщенная линейная регрессия

  • Логистическая регрессия

  • Дискриминантный анализ

Рабочий процесс машинного обучения для данных, которые не помещаются в память, в MATLAB подобен данным в оперативной памяти:

  1. Предварительно обработать

  2. Исследовать

  3. Модель Develop

  4. Модель Validate

  5. Масштабируйте до больших данных

Этот пример следует за подобной структурой в разработке прогнозирующей модели для задержек авиакомпании. Данные включают большой файл информации о полете от 1 987 до 2008. Цель в качестве примера состоит в том, чтобы предсказать исходную задержку на основе многих переменных.

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

Составьте длинную таблицу данных авиакомпании

Datastore является репозиторием для наборов данных, которые являются слишком большими, чтобы уместиться в памяти. Можно создать datastore из многих различных форматов файлов как первый шаг, чтобы создать длинный массив из внешнего источника данных.

Создайте datastore для файла примера airlinesmall.csv. Выберите переменные интереса, обработайте значения 'NA' как недостающие данные и сгенерируйте таблицу предварительного просмотра данных.

ds = datastore(fullfile(matlabroot,'toolbox','matlab','demos','airlinesmall.csv'));
ds.SelectedVariableNames = {'Year','Month','DayofMonth','DayOfWeek',...
    'DepTime','ArrDelay','DepDelay','Distance'};
ds.TreatAsMissing = 'NA';
pre = preview(ds)
pre =

  8×8 table

    Year    Month    DayofMonth    DayOfWeek    DepTime    ArrDelay    DepDelay    Distance
    ____    _____    __________    _________    _______    ________    ________    ________

    1987     10          21            3          642          8          12         308   
    1987     10          26            1         1021          8           1         296   
    1987     10          23            5         2055         21          20         480   
    1987     10          23            5         1332         13          12         296   
    1987     10          22            4          629          4          -1         373   
    1987     10          28            3         1446         59          63         308   
    1987     10           8            4          928          3          -2         447   
    1987     10          10            6          859         11          -1         954   

Составьте длинную таблицу, поддержанную datastore, чтобы упростить работу с данными. Базовый тип данных длинного массива зависит от типа datastore. В этом случае datastore является табличным текстом и возвращает tall table. Отображение включает предварительный просмотр данных с индикацией, что размер неизвестен.

tt = tall(ds)
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

tt =

  M×8 tall table

    Year    Month    DayofMonth    DayOfWeek    DepTime    ArrDelay    DepDelay    Distance
    ____    _____    __________    _________    _______    ________    ________    ________

    1987     10          21            3          642          8          12         308   
    1987     10          26            1         1021          8           1         296   
    1987     10          23            5         2055         21          20         480   
    1987     10          23            5         1332         13          12         296   
    1987     10          22            4          629          4          -1         373   
    1987     10          28            3         1446         59          63         308   
    1987     10           8            4          928          3          -2         447   
    1987     10          10            6          859         11          -1         954   
     :        :          :             :           :          :           :           :
     :        :          :             :           :          :           :           :

Предварительно обработайте данные

Этот пример стремится исследовать время суток и день недели более подробно. Преобразуйте день недели к категориальным данным с метками и определите час дня от числовой переменной времени отправления.

tt.DayOfWeek = categorical(tt.DayOfWeek,1:7,{'Sun','Mon','Tues',...
    'Wed','Thu','Fri','Sat'});
tt.Hr = discretize(tt.DepTime,0:100:2400,0:23)
tt =

  M×9 tall table

    Year    Month    DayofMonth    DayOfWeek    DepTime    ArrDelay    DepDelay    Distance    Hr
    ____    _____    __________    _________    _______    ________    ________    ________    __

    1987     10          21          Tues         642          8          12         308        6
    1987     10          26          Sun         1021          8           1         296       10
    1987     10          23          Thu         2055         21          20         480       20
    1987     10          23          Thu         1332         13          12         296       13
    1987     10          22          Wed          629          4          -1         373        6
    1987     10          28          Tues        1446         59          63         308       14
    1987     10           8          Wed          928          3          -2         447        9
    1987     10          10          Fri          859         11          -1         954        8
     :        :          :             :           :          :           :           :        :
     :        :          :             :           :          :           :           :        :

Включайте только спустя годы после этого 2000 и проигнорируйте строки с недостающими данными. Идентифицируйте данные интереса логическим условием.

idx = tt.Year >= 2000 & ...
    ~any(ismissing(tt),2);
tt = tt(idx,:);

Исследуйте данные группой

Много исследовательских функций доступны для длинных массивов. Для списка поддерживаемых функций статистики смотрите Поддержку Длинного массива, Указания по применению и Ограничения.

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

g = grpstats(tt(:,{'ArrDelay','DepDelay','DayOfWeek'}),'DayOfWeek',...
    {'mean','std','skewness','kurtosis'})
g =

  M×11 tall table

    GroupLabel    DayOfWeek    GroupCount    mean_ArrDelay    std_ArrDelay    skewness_ArrDelay    kurtosis_ArrDelay    mean_DepDelay    std_DepDelay    skewness_DepDelay    kurtosis_DepDelay
    __________    _________    __________    _____________    ____________    _________________    _________________    _____________    ____________    _________________    _________________

        ?             ?            ?               ?               ?                  ?                    ?                  ?               ?                  ?                    ?        
        ?             ?            ?               ?               ?                  ?                    ?                  ?               ?                  ?                    ?        
        ?             ?            ?               ?               ?                  ?                    ?                  ?               ?                  ?                    ?        
        :             :            :               :               :                  :                    :                  :               :                  :                    :
        :             :            :               :               :                  :                    :                  :               :                  :                    :

C = corr(tt.DepDelay,tt.ArrDelay)
C =

  M×N×... tall array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

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

[statsByDay,C] = gather(g,C)
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: Completed in 13 sec
Evaluation completed in 22 sec

statsByDay =

  7×11 table

    GroupLabel    DayOfWeek    GroupCount    mean_ArrDelay    std_ArrDelay    skewness_ArrDelay    kurtosis_ArrDelay    mean_DepDelay    std_DepDelay    skewness_DepDelay    kurtosis_DepDelay
    __________    _________    __________    _____________    ____________    _________________    _________________    _____________    ____________    _________________    _________________

      'Wed'         Wed           8489          9.3324           37.406            5.1638               57.479                 10           33.426            6.4336               85.426      
      'Fri'         Fri           7339          4.1512             32.1             7.082               120.53             7.0857           29.339            8.9387               168.37      
      'Sat'         Sat           8045           7.132           33.108            3.6457               22.991             9.1557           29.731            4.5135               31.228      
      'Tues'        Tues          8381          6.4786           32.322             4.374               38.694             7.6083           28.394            5.2012               46.249      
      'Mon'         Mon           8443          5.2487           32.453            4.5811               37.175             6.8319           28.573            5.6468               50.271      
      'Sun'         Sun           8570          7.7515           36.003            5.7943                80.91             9.3324           32.516            7.2146               118.25      
      'Thu'         Thu           8601          10.053            36.18            4.1381               37.051             10.923           34.708            1.1414               138.38      


C =

    0.8966

Переменные, содержащие результаты, являются теперь переменными в оперативной памяти в Рабочей области. На основе этих вычислений изменение происходит в данных и существует корреляция между задержками, которые можно исследовать далее.

Исследуйте эффект дня недели и часа дня и получите дополнительную статистическую информацию, такую как стандартная погрешность среднего значения и 95%-го доверительного интервала для среднего значения. Можно передать целую длинную таблицу и задать который переменные выполнить вычисления на.

byDayHr = grpstats(tt,{'Hr','DayOfWeek'},...
    {'mean','sem','meanci'},'DataVar','DepDelay');
byDayHr = gather(byDayHr);
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: Completed in 3 sec
Evaluation completed in 6.7 sec

Из-за разделения данных длинного массива, вывод может быть не упорядочен. Перестройте данные в памяти для дальнейшего исследования.

x = unstack(byDayHr(:,{'Hr','DayOfWeek','mean_DepDelay'}),...
    'mean_DepDelay','DayOfWeek');
x = sortrows(x)
x =

  24×8 table

    Hr      Sun        Mon         Tues        Wed        Thu        Fri        Sat  
    __    _______    ________    ________    _______    _______    _______    _______

     0     38.519      71.914      39.656     34.667         90     25.536     65.579
     1     45.846      27.875        93.6     125.23     52.765     38.091     29.182
     2        NaN          39         102        NaN      78.25       -1.5        NaN
     3        NaN         NaN         NaN        NaN     -377.5       53.5        NaN
     4         -7     -6.2857          -7    -7.3333      -10.5         -5        NaN
     5    -2.2409     -3.7099     -4.0146    -3.9565    -3.5897    -3.5766    -4.1474
     6        0.4     -1.8909     -1.9802    -1.8304    -1.3578    0.84161    -2.2537
     7     3.4173    -0.47222    -0.18893    0.71546       0.08      1.069    -1.3221
     8     2.3759      1.4054      1.6745     2.2345     2.9668     1.6727    0.88213
     9     2.5325      1.6805      2.7656      2.683     5.6138     3.4838     2.5011
    10       6.37      5.2868      3.6822     7.5773     5.3372     6.9391     4.9979
    11     6.9946      4.9165      5.5639     5.5936     7.0435     4.8989     5.2839
    12      5.673      5.1193      5.7081     7.9178     7.5269     8.0625     7.4686
    13     8.0879      7.1017      5.0857     8.8082     8.2878     8.0675     6.2107
    14     9.5164      5.8343       7.416     9.5954     8.6667     6.0677      8.444
    15     8.1257      4.8802      7.4726     9.8674     10.235      7.167     8.6219
    16     12.302      7.4968      11.406     12.413     12.874     10.962     12.908
    17      11.47      8.9495      10.658     12.961     13.487     7.9034     8.9327
    18     15.148      13.849      11.266     15.406     16.706     11.022     13.042
    19      14.77      11.618      15.053     17.561     21.032     12.644     16.404
    20     17.711      13.942      17.105     22.382     25.945     11.223     22.152
    21     23.727      17.276      23.092     25.794     28.828     14.011     22.682
    22     29.383      24.949      28.265     30.649      37.38     24.328     36.272
    23     38.296      33.966      34.904     47.592     49.523       29.5     44.122

Визуализация данных в длинных массивах

В настоящее время можно визуализировать данные о длинном массиве с помощью histogram, histogram2, binScatterPlot и ksdensity. Визуализация все триггерное выполнение, подобное вызыванию функции gather.

Используйте binScatterPlot, чтобы исследовать отношение между переменными Hr и DepDelay.

binScatterPlot(tt.Hr,tt.DepDelay,'Gamma',0.25)
ylim([0 500])
xlabel('Time of Day')
ylabel('Delay (Minutes)')
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: Completed in 1.5 sec
Evaluation completed in 1.7 sec
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: Completed in 1.4 sec
Evaluation completed in 1.4 sec

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

Разделение данных в наборы обучения и валидации

Чтобы разработать модель машинного обучения, полезно зарезервировать часть данных, чтобы обучить и разработать модель и другую часть данных, чтобы протестировать модель. Много путей существуют для вас, чтобы разделить данные в наборы обучения и валидации.

Используйте datasample, чтобы получить случайную выборку данных. Затем используйте cvpartition, чтобы разделить данные в наборы тестов и наборы обучающих данных. Чтобы получить нерасслоенные разделы, установите универсальную группирующую переменную путем умножения выборок данных на нуль.

Для воспроизводимости, набор seed генератора случайных чисел с помощью tallrng. Результаты могут отличаться в зависимости от количества рабочих и среды выполнения для длинных массивов. Для получения дополнительной информации смотрите Управление Где Ваши Выполнения Кода (MATLAB).

tallrng('default')
data = datasample(tt,25000,'Replace',false);
groups = 0*data.DepDelay;
y = cvpartition(groups,'HoldOut',1/3);
dataTrain = data(training(y),:);
dataTest = data(test(y),:);

Подходящее контролируемое изучение модели

Создайте модель, чтобы предсказать исходную задержку на основе нескольких переменных. Функция модели линейной регрессии fitlm ведет себя так же к функции в оперативной памяти. Однако вычисления с длинными массивами приводят к CompactLinearModel, который более эффективен для больших наборов данных. Модель, соответствующая триггерному выполнению, потому что это - итеративный процесс.

model = fitlm(dataTrain,'ResponseVar','DepDelay')
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 2: Completed in 2.3 sec
- Pass 2 of 2: Completed in 3.7 sec
Evaluation completed in 6.1 sec

model = 


Compact linear regression model:
    DepDelay ~ [Linear formula with 9 terms in 8 predictors]

Estimated Coefficients:
                       Estimate         SE         tStat        pValue  
                      __________    __________    ________    __________

    (Intercept)           30.715        75.873     0.40482       0.68562
    Year                -0.01585      0.037853    -0.41872       0.67543
    Month                0.03009      0.028097      1.0709       0.28421
    DayofMonth        -0.0094266      0.010903    -0.86457       0.38729
    DayOfWeek_Mon       -0.36333       0.35527     -1.0227       0.30648
    DayOfWeek_Tues       -0.2858       0.35245    -0.81091       0.41743
    DayOfWeek_Wed       -0.56082       0.35309     -1.5883       0.11224
    DayOfWeek_Thu       -0.25295       0.35239    -0.71782       0.47288
    DayOfWeek_Fri        0.91768       0.36625      2.5056      0.012234
    DayOfWeek_Sat        0.45668       0.35785      1.2762       0.20191
    DepTime            -0.011551     0.0053851      -2.145      0.031964
    ArrDelay              0.8081      0.002875      281.08             0
    Distance           0.0012881    0.00016887      7.6281    2.5106e-14
    Hr                    1.4058       0.53785      2.6138     0.0089613


Number of observations: 16667, Error degrees of freedom: 16653
Root Mean Squared Error: 12.4
R-squared: 0.834,  Adjusted R-Squared: 0.833
F-statistic vs. constant model: 6.41e+03, p-value = 0

Предскажите и подтвердите модель

Отображение указывает на подходящую информацию, а также коэффициенты и сопоставленную содействующую статистику.

Переменная model содержит информацию о подобранной модели как свойства, которые можно получить доступ к записи через точку использования. Также дважды щелкните по переменной в Рабочей области, чтобы исследовать свойства в интерактивном режиме.

model.Rsquared
ans = 

  struct with fields:

    Ordinary: 0.8335
    Adjusted: 0.8334

Предскажите новые значения на основе модели, вычислите невязки и визуализируйте использование гистограммы. Функция predict предсказывает новые значения и для высоких и для данных в оперативной памяти.

pred = predict(model,dataTest);
err = pred - dataTest.DepDelay;
figure
histogram(err,'BinLimits',[-100 100],'Normalization','pdf')
title('Histogram of Residuals')
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 2: Completed in 3.6 sec
- Pass 2 of 2: Completed in 2.2 sec
Evaluation completed in 6.1 sec

Оцените и настройте модель

При рассмотрении выходных p-значений в отображении некоторые переменные могут быть ненужными в модели. Можно уменьшать сложность модели путем удаления этих переменных.

Исследуйте значение переменных в модели более тесно с помощью anova.

a = anova(model)
a =

  9×5 table

                    SumSq        DF        MeanSq         F         pValue  
                  __________    _____    __________    _______    __________

    Year               26.88        1         26.88    0.17533       0.67543
    Month             175.84        1        175.84     1.1469       0.28421
    DayofMonth         114.6        1         114.6    0.74749       0.38729
    DayOfWeek         3691.4        6        615.23     4.0129    0.00050851
    DepTime           705.42        1        705.42     4.6012      0.031964
    ArrDelay      1.2112e+07        1    1.2112e+07      79004             0
    Distance          8920.9        1        8920.9     58.188    2.5106e-14
    Hr                1047.5        1        1047.5     6.8321     0.0089613
    Error         2.5531e+06    16653        153.31                         

На основе p-значений переменные Year, Month и DayOfMonth не являются значительными к этой модели, таким образом, можно удалить их, негативно не влияя на образцовое качество.

Чтобы исследовать эти параметры модели далее, используйте интерактивную визуализацию, такую как plotSlice, plotInterations и plotEffects. Например, используйте plotEffects, чтобы исследовать предполагаемый эффект, который каждая переменная прогноза имеет на исходную задержку.

plotEffects(model)

На основе этих вычислений ArrDelay является основным эффектом в модели (это высоко коррелируется к DepDelay). Другие эффекты заметны, но оказывают намного меньше влияния. Кроме того, Hr был определен от DepTime, таким образом, только одна из этих переменных необходима для модели.

Сократите количество переменных, чтобы исключить все компоненты даты, и затем соответствовать новой модели.

model2 = fitlm(dataTrain,'DepDelay ~ DepTime + ArrDelay + Distance')
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 2: Completed in 1.2 sec
- Pass 2 of 2: Completed in 2 sec
Evaluation completed in 3.2 sec

model2 = 


Compact linear regression model:
    DepDelay ~ 1 + DepTime + ArrDelay + Distance

Estimated Coefficients:
                   Estimate         SE         tStat       pValue  
                   _________    __________    _______    __________

    (Intercept)      -1.4646       0.31696    -4.6207    3.8538e-06
    DepTime        0.0025087    0.00020401     12.297    1.3333e-34
    ArrDelay         0.80767     0.0028712      281.3             0
    Distance       0.0012981    0.00016886     7.6875    1.5838e-14


Number of observations: 16667, Error degrees of freedom: 16663
Root Mean Squared Error: 12.4
R-squared: 0.833,  Adjusted R-Squared: 0.833
F-statistic vs. constant model: 2.77e+04, p-value = 0

Разработка моделей

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

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

Соберите подмножество данных в рабочую область и используйте stepwiselm, чтобы итеративно разработать модель в памяти.

subset = gather(dataTest);
sModel = stepwiselm(subset,'ResponseVar','DepDelay')
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: Completed in 1.8 sec
Evaluation completed in 1.8 sec
1. Adding ArrDelay, FStat = 42200.3016, pValue = 0
2. Adding DepTime, FStat = 51.7918, pValue = 6.70647e-13
3. Adding DepTime:ArrDelay, FStat = 42.4982, pValue = 7.48624e-11
4. Adding Distance, FStat = 15.4303, pValue = 8.62963e-05
5. Adding ArrDelay:Distance, FStat = 231.9012, pValue = 1.135326e-51
6. Adding DayOfWeek, FStat = 3.4704, pValue = 0.0019917
7. Adding DayOfWeek:ArrDelay, FStat = 26.334, pValue = 3.16911e-31
8. Adding DayOfWeek:DepTime, FStat = 2.1732, pValue = 0.042528

sModel = 


Linear regression model:
    DepDelay ~ [Linear formula with 9 terms in 4 predictors]

Estimated Coefficients:
                                Estimate          SE         tStat        pValue  
                               ___________    __________    ________    __________

    (Intercept)                     1.1799        1.0675      1.1053       0.26904
    DayOfWeek_Mon                  -2.1377        1.4298     -1.4951       0.13493
    DayOfWeek_Tues                 -4.2868        1.4683     -2.9196     0.0035137
    DayOfWeek_Wed                  -1.6233         1.476     -1.0998       0.27145
    DayOfWeek_Thu                 -0.74772        1.5226    -0.49109       0.62338
    DayOfWeek_Fri                  -1.7618        1.5079     -1.1683        0.2427
    DayOfWeek_Sat                  -2.1121        1.5214     -1.3882       0.16511
    DepTime                     7.5229e-05    0.00073613     0.10219        0.9186
    ArrDelay                        0.8671      0.013836      62.669             0
    Distance                     0.0015163    0.00023426      6.4728    1.0167e-10
    DayOfWeek_Mon:DepTime        0.0017633     0.0010106      1.7448      0.081056
    DayOfWeek_Tues:DepTime       0.0032578     0.0010331      3.1534     0.0016194
    DayOfWeek_Wed:DepTime       0.00097506      0.001044     0.93398       0.35034
    DayOfWeek_Thu:DepTime        0.0012517     0.0010694      1.1705       0.24184
    DayOfWeek_Fri:DepTime        0.0026464     0.0010711      2.4707      0.013504
    DayOfWeek_Sat:DepTime        0.0021477     0.0010646      2.0174      0.043689
    DayOfWeek_Mon:ArrDelay        -0.11023      0.014744     -7.4767     8.399e-14
    DayOfWeek_Tues:ArrDelay       -0.14589      0.014814     -9.8482    9.2943e-23
    DayOfWeek_Wed:ArrDelay       -0.041878      0.012849     -3.2593     0.0011215
    DayOfWeek_Thu:ArrDelay       -0.096741      0.013308     -7.2693    3.9414e-13
    DayOfWeek_Fri:ArrDelay       -0.077713      0.015462     -5.0259    5.1147e-07
    DayOfWeek_Sat:ArrDelay        -0.13669      0.014652      -9.329    1.3471e-20
    DepTime:ArrDelay            6.4148e-05    7.7372e-06      8.2909    1.3002e-16
    ArrDelay:Distance          -0.00010512    7.3888e-06     -14.227    2.1138e-45


Number of observations: 8333, Error degrees of freedom: 8309
Root Mean Squared Error: 12
R-squared: 0.845,  Adjusted R-Squared: 0.845
F-statistic vs. constant model: 1.97e+03, p-value = 0

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

Теперь попытайтесь подобрать модель для высоких данных при помощи fitlm с формулой, возвращенной stepwiselm.

model3 = fitlm(dataTrain,sModel.Formula)
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 2: Completed in 1.5 sec
- Pass 2 of 2: Completed in 1.4 sec
Evaluation completed in 3 sec

model3 = 


Compact linear regression model:
    DepDelay ~ [Linear formula with 9 terms in 4 predictors]

Estimated Coefficients:
                                Estimate          SE         tStat        pValue  
                               ___________    __________    ________    __________

    (Intercept)                   -0.31595       0.74499     -0.4241        0.6715
    DayOfWeek_Mon                 -0.64218        1.0473    -0.61316       0.53978
    DayOfWeek_Tues                -0.90163        1.0383    -0.86836       0.38521
    DayOfWeek_Wed                  -1.0798        1.0417     -1.0365       0.29997
    DayOfWeek_Thu                  -3.2765        1.0379      -3.157     0.0015967
    DayOfWeek_Fri                  0.44193        1.0813     0.40869       0.68277
    DayOfWeek_Sat                   1.1428        1.0777      1.0604       0.28899
    DepTime                      0.0014188    0.00051612      2.7489     0.0059853
    ArrDelay                       0.72526      0.011907      60.913             0
    Distance                     0.0014824    0.00017027      8.7059    3.4423e-18
    DayOfWeek_Mon:DepTime       0.00040994    0.00073548     0.55738       0.57728
    DayOfWeek_Tues:DepTime      0.00051826    0.00073645     0.70373       0.48161
    DayOfWeek_Wed:DepTime       0.00058426    0.00073695     0.79281        0.4279
    DayOfWeek_Thu:DepTime        0.0026229    0.00073649      3.5614    0.00036991
    DayOfWeek_Fri:DepTime        0.0002959    0.00077194     0.38332       0.70149
    DayOfWeek_Sat:DepTime      -0.00060921    0.00075776    -0.80396       0.42143
    DayOfWeek_Mon:ArrDelay       -0.034886      0.010435     -3.3432    0.00082993
    DayOfWeek_Tues:ArrDelay     -0.0073661      0.010113    -0.72837        0.4664
    DayOfWeek_Wed:ArrDelay       -0.028158     0.0099004     -2.8441     0.0044594
    DayOfWeek_Thu:ArrDelay       -0.061065      0.010381     -5.8821    4.1275e-09
    DayOfWeek_Fri:ArrDelay        0.052437      0.010927      4.7987    1.6111e-06
    DayOfWeek_Sat:ArrDelay        0.014205       0.01039      1.3671        0.1716
    DepTime:ArrDelay            7.2632e-05    5.3946e-06      13.464     4.196e-41
    ArrDelay:Distance          -2.4743e-05    4.6508e-06     -5.3203    1.0496e-07


Number of observations: 16667, Error degrees of freedom: 16643
Root Mean Squared Error: 12.3
R-squared: 0.837,  Adjusted R-Squared: 0.836
F-statistic vs. constant model: 3.7e+03, p-value = 0

Можно повторить этот процесс, чтобы продолжить настраивать линейную модель. Однако в этом случае необходимо исследовать различные типы регрессии, которая может более подходить для этих данных. Например, если вы не хотите включать задержку прибытия, затем этот тип линейной модели более не не является соответствующим. Смотрите Логистическую регрессию с Длинными массивами для получения дополнительной информации.

Масштабируйтесь к Spark

Ключевая возможность длинных массивов в MATLAB и Statistics and Machine Learning Toolbox является возможностью соединения на платформы, такие как Hadoop и Spark. Можно даже скомпилировать код и запустить его на Spark с помощью MATLAB Compiler™. Смотрите Расширение длинных массивов с помощью других продуктов (MATLAB) для получения дополнительной информации об использовании этих продуктов:

  • Database Toolbox™

  • Parallel Computing Toolbox™

  • MATLAB® Parallel Server™

  • MATLAB Compiler™

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