Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Uso de MapReduce para ajustar un modelo de regresión logística

Este ejemplo muestra cómo utilizar para llevar a cabo la regresión logística simple mediante un predictor único.mapreduce Muestra el encadenamiento de varias llamadas para llevar a cabo un algoritmo iterativo.mapreduce Dado que cada iteración requiere un paso independiente a través de los datos, una función anónima pasa información de una iteración a la siguiente para proporcionar información directamente al asignador.

Preparar datos

Cree un almacén de datos utilizando el conjunto de información.airlinesmall.csv Este conjunto de datos de 12 megabyte contiene 29 columnas de información de vuelo para varias aerolíneas, incluidas las horas de llegada y salida. En este ejemplo, las variables de interés son (retardo de llegada del vuelo) y (distancia total del vuelo).ArrDelayDistance

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

El almacén de datos trata los valores como ausentes y reemplaza los valores que faltan por valores predeterminados.'NA'NaN Además, la propiedad le permite trabajar solo con las variables de interés especificadas, que puede comprobar mediante.SelectedVariableNamespreview

preview(ds) 
 ans =    8x2 table      ArrDelay    Distance     ________    ________          8         308            8         296           21         480           13         296            4         373           59         308            3         447           11         954     

Realizar regresión logística

La regresión logística es una forma de modelar la probabilidad de un evento como una función de otra variable. En este ejemplo, la regresión logística modela la probabilidad de que un vuelo tenga más de 20 minutos de retraso en función de la distancia de vuelo, en miles de millas.

Para lograr esta regresión logística, las funciones Map y reduce deben realizar colectivamente una regresión de mínimos cuadrados ponderada basada en los valores de coeficiente actuales. El asignador calcula una suma ponderada de cuadrados y un producto cruzado para cada fragmento de datos de entrada.

Mostrar el archivo de función de mapa.

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

El reductor calcula las estimaciones del coeficiente de regresión a partir de las sumas de cuadrados y productos cruzados.

Visualice el archivo de función de reducción.

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

Ejecute MapReduce

Ejecutar de forma iterativa mediante la inclusión de las llamadas en un bucle.mapreducemapreduce El bucle se ejecuta hasta que se cumplen los criterios de convergencia, con un máximo de cinco iteraciones.

% 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  

Ver resultados

Utilice las estimaciones de coeficiente de regresión resultantes para trazar una curva de probabilidad. Esta curva muestra la probabilidad de que un vuelo tenga más de 20 minutos de retraso en función de la distancia de vuelo.

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

Consulte también

|

Temas relacionados