Используя MapReduce, чтобы соответствовать модели логистической регрессии

Этот пример показывает, как использовать mapreduce, чтобы выполнить простую логистическую регрессию с помощью одного предиктора. Это демонстрирует объединение в цепочку нескольких вызовов mapreduce, чтобы выполнить итеративный алгоритм. Поскольку каждая итерация требует отдельного прохода через данные, анонимная функция передает информацию от одной итерации до рядом с, предоставляют информацию непосредственно к картопостроителю.

Подготовка данных

Создайте datastore с помощью набора данных airlinesmall.csv. Этот набор данных на 12 мегабайтов содержит 29 столбцов информации о рейсе для нескольких поставщиков услуг авиакомпании, включая прибытие и время отправления. В этом примере переменными интереса является ArrDelay (задержка прибытия рейса) и Distance (общее расстояние рейса).

ds = datastore('airlinesmall.csv', 'TreatAsMissing', 'NA');
ds.SelectedVariableNames = {'ArrDelay', 'Distance'};

Datastore обрабатывает значения 'NA' как пропавших без вести и заменяет отсутствующие значения на значения NaN по умолчанию. Кроме того, свойство SelectedVariableNames позволяет вам работать только с заданными переменными интереса, который можно проверить использование preview.

preview(ds)
ans =

  8x2 table

    ArrDelay    Distance
    ________    ________

        8         308   
        8         296   
       21         480   
       13         296   
        4         373   
       59         308   
        3         447   
       11         954   

Выполнение логистической регрессии

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

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

Отобразите файл функции карты.

function logitMapper(b,t,~,intermKVStore)
%logitMapper Mapper function for mapreduce to perform logistic regression.

% Copyright 2014 The MathWorks, Inc.

% Get data input table and remove any rows with missing values
y = t.ArrDelay;
x = t.Distance;
t = ~isnan(x) & ~isnan(y);
y = y(t)>20;                 % late by more than 20 min
x = x(t)/1000;               % distance in thousands of miles

% Compute the linear combination of the predictors, and the estimated mean
% probabilities, based on the coefficients from the previous iteration
if ~isempty(b)
    % Compute xb as the linear combination using the current coefficient
    % values, and derive mean probabilities mu from them
    xb = b(1)+b(2)*x;
    mu = 1./(1+exp(-xb));
else
    % This is the first iteration. Compute starting values for mu that are
    % 1/4 if y=0 and 3/4 if y=1. Derive xb values from them.
    mu = (y+.5)/2;
    xb = log(mu./(1-mu)); 
end

% To perform weighted least squares, compute a sum of squares and cross
% products matrix:
%      (X'*W*X) = (X1'*W1*X1) + (X2'*W2*X2) + ... + (Xn'*Wn*Xn),
% where X = [X1;X2;...;Xn]  and  W = [W1;W2;...;Wn].
%
% The mapper receives one chunk at a time and computes one of the terms on
% the right hand side. The reducer adds all of the terms to get the
% quantity on the left hand side, and then performs the regression.
w = (mu.*(1-mu));                  % weights
z = xb + (y - mu) .* 1./w;         % adjusted response

X = [ones(size(x)),x,z];           % matrix of unweighted data
wss = X' * bsxfun(@times,w,X);     % weighted cross-products X1'*W1*X1

% Store the results for this part of the data.
add(intermKVStore, 'key', wss);

Редуктор вычисляет оценки коэффициента регрессии из сумм квадратов и векторных произведений.

Отобразите уменьшать файл функции.

function logitReducer(~,intermValIter,outKVStore)
%logitReducer Reducer function for mapreduce to perform logistic regression

% Copyright 2014 The MathWorks, Inc.

% We will operate over chunks of the data, updating the count, mean, and
% covariance each time we add a new chunk
old = 0;

% We want to perform weighted least squares. We do this by computing a sum
% of squares and cross products matrix
%      M = (X'*W*X) = (X1'*W1*X1) + (X2'*W2*X2) + ... + (Xn'*Wn*Xn)
% where X = X1;X2;...;Xn]  and  W = [W1;W2;...;Wn].
%
% The mapper has computed the terms on the right hand side. Here in the
% reducer we just add them up.

while hasnext(intermValIter)
    new = getnext(intermValIter);
    old = old+new;
end
M = old;  % the value on the left hand side

% Compute coefficients estimates from M. M is a matrix of sums of squares
% and cross products for [X Y] where X is the design matrix including a
% constant term and Y is the adjusted response for this iteration. In other
% words, Y has been included as an additional column of X. First we
% separate them by extracting the X'*W*X part and the X'*W*Y part.
XtWX = M(1:end-1,1:end-1);
XtWY = M(1:end-1,end);

% Solve the normal equations.
b = XtWX\XtWY;

% Return the vector of coefficient estimates.
add(outKVStore, 'key', b);

Выполнение mapreduce

Запустите mapreduce итеративно путем включения вызовов mapreduce в цикле. Выполнениям цикла до критериев сходимости соответствуют, имеющие до пяти итераций.

% Define the coefficient vector, starting as empty for the first iteration.
b = [];

for iteration = 1:5
    b_old = b;
    iteration

    % Here we will use an anonymous function as our mapper. This function
    % definition includes the value of b computed in the previous
    % iteration.
    mapper = @(t,ignore,intermKVStore) logitMapper(b,t,ignore,intermKVStore);
    result = mapreduce(ds, mapper, @logitReducer, 'Display', 'off');

    tbl = readall(result);
    b = tbl.Value{1}

    % Stop iterating if we have converged.
    if ~isempty(b_old) && ...
       ~any(abs(b-b_old) > 1e-6 * abs(b_old))
       break
    end
end
iteration =

     1


b =

   -1.7674
    0.1209


iteration =

     2


b =

   -1.8327
    0.1807


iteration =

     3


b =

   -1.8331
    0.1806


iteration =

     4


b =

   -1.8331
    0.1806

Просмотр результатов

Используйте получившиеся оценки коэффициента регрессии, чтобы построить кривую вероятности. Эта кривая показывает вероятность рейса, являющегося больше чем 20 минутами поздно как функция расстояния рейса.

xx = linspace(0,4000);
yy = 1./(1+exp(-b(1)-b(2)*(xx/1000)));
plot(xx,yy);
xlabel('Distance');
ylabel('Prob[Delay>20]')

Смотрите также

|

Похожие темы