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.

Selección de características robusta con NCA para regresión

Realice una selección de características robusta para los valores atípicos mediante una función de pérdida robusta personalizada en NCA.

Genere datos con valores atípicos

Genere datos de muestra para la regresión donde la respuesta depende de tres de los predictores, es decir, los predictores 4, 7 y 13.

rng(123,'twister'); % For reproducibility n = 200; X = randn(n,20); y = cos(X(:,7)) + sin(X(:,4).*X(:,13)) + 0.1*randn(n,1); 

Agregue valores atípicos a los datos.

numoutliers   = 25; outlieridx    = floor(linspace(10,90,numoutliers)); y(outlieridx) = 5*randn(numoutliers,1); 

Graficar los datos.

figure; plot(y); 

Utilice la función de pérdida no robusta

El rendimiento del algoritmo de selección de características depende en gran lo del valor del parámetro de regularización. Es una buena práctica ajustar el parámetro de regularización para el mejor valor a utilizar en la selección de características. Ajuste el parámetro de regularización utilizando la validación cruzada de cinco veces. Utilice el error cuadrado medio (MSE):

Primero, particionar los datos en cinco pliegues. En cada pliegue, el software utiliza el 4/5º de los datos para la formación y el 1/5th de los datos para la validación (pruebas).

cvp         = cvpartition(length(y),'kfold',5); numtestsets = cvp.NumTestSets; 

Calcule los valores lambda para probar y crear una matriz para almacenar los valores de pérdida.

lambdavals  = linspace(0,3,50)*std(y)/length(y); lossvals    = zeros(length(lambdavals),numtestsets); 

Realice NCA y calcule la pérdida para cada valor y cada pliegue.

    for i = 1:length(lambdavals)         for k = 1:numtestsets              Xtrain = X(cvp.training(k),:);             ytrain = y(cvp.training(k),:);             Xtest  = X(cvp.test(k),:);             ytest  = y(cvp.test(k),:);              nca = fsrnca(Xtrain,ytrain,'FitMethod','exact',...                 'Solver','lbfgs','Verbose',0,'Lambda',lambdavals(i),...                 'LossFunction','mse');              lossvals(i,k) = loss(nca,Xtest,ytest,'LossFunction','mse');         end     end 

Trace la pérdida media correspondiente a cada valor lambda.

meanloss = mean(lossvals,2); figure; plot(lambdavals,meanloss,'ro-'); xlabel('Lambda'); ylabel('Loss (MSE)'); grid on; 

Encuentra la valor que produce la pérdida promedio mínima.

[~,idx] = min(mean(lossvals,2)); bestlambda = lambdavals(idx) 
 bestlambda =      0.0231  

Realice la selección de características utilizando la mejor valor y MSE.

nca = fsrnca(X,y,'FitMethod','exact','Solver','lbfgs',...      'Verbose',1,'Lambda',bestlambda,'LossFunction','mse'); 
  o Solver = LBFGS, HessianHistorySize = 15, LineSearchMethod = weakwolfe  |====================================================================================================| |   ITER   |   FUN VALUE   |  NORM GRAD  |  NORM STEP  |  CURV  |    GAMMA    |    ALPHA    | ACCEPT | |====================================================================================================| |        0 |  6.414642e+00 |   8.430e-01 |   0.000e+00 |        |   7.117e-01 |   0.000e+00 |   YES  | |        1 |  6.066100e+00 |   9.952e-01 |   1.264e+00 |    OK  |   3.741e-01 |   1.000e+00 |   YES  | |        2 |  5.498221e+00 |   4.267e-01 |   4.250e-01 |    OK  |   4.016e-01 |   1.000e+00 |   YES  | |        3 |  5.108548e+00 |   3.933e-01 |   8.564e-01 |    OK  |   3.599e-01 |   1.000e+00 |   YES  | |        4 |  4.808456e+00 |   2.505e-01 |   9.352e-01 |    OK  |   8.798e-01 |   1.000e+00 |   YES  | |        5 |  4.677382e+00 |   2.085e-01 |   6.014e-01 |    OK  |   1.052e+00 |   1.000e+00 |   YES  | |        6 |  4.487789e+00 |   4.726e-01 |   7.374e-01 |    OK  |   5.593e-01 |   1.000e+00 |   YES  | |        7 |  4.310099e+00 |   2.484e-01 |   4.253e-01 |    OK  |   3.367e-01 |   1.000e+00 |   YES  | |        8 |  4.258539e+00 |   3.629e-01 |   4.521e-01 |    OK  |   4.705e-01 |   5.000e-01 |   YES  | |        9 |  4.175345e+00 |   1.972e-01 |   2.608e-01 |    OK  |   4.018e-01 |   1.000e+00 |   YES  | |       10 |  4.122340e+00 |   9.169e-02 |   2.947e-01 |    OK  |   3.487e-01 |   1.000e+00 |   YES  | |       11 |  4.095525e+00 |   9.798e-02 |   2.529e-01 |    OK  |   1.188e+00 |   1.000e+00 |   YES  | |       12 |  4.059690e+00 |   1.584e-01 |   5.213e-01 |    OK  |   9.930e-01 |   1.000e+00 |   YES  | |       13 |  4.029208e+00 |   7.411e-02 |   2.076e-01 |    OK  |   4.886e-01 |   1.000e+00 |   YES  | |       14 |  4.016358e+00 |   1.068e-01 |   2.696e-01 |    OK  |   6.919e-01 |   1.000e+00 |   YES  | |       15 |  4.004521e+00 |   5.434e-02 |   1.136e-01 |    OK  |   5.647e-01 |   1.000e+00 |   YES  | |       16 |  3.986929e+00 |   6.158e-02 |   2.993e-01 |    OK  |   1.353e+00 |   1.000e+00 |   YES  | |       17 |  3.976342e+00 |   4.966e-02 |   2.213e-01 |    OK  |   7.668e-01 |   1.000e+00 |   YES  | |       18 |  3.966646e+00 |   5.458e-02 |   2.529e-01 |    OK  |   1.988e+00 |   1.000e+00 |   YES  | |       19 |  3.959586e+00 |   1.046e-01 |   4.169e-01 |    OK  |   1.858e+00 |   1.000e+00 |   YES  |  |====================================================================================================| |   ITER   |   FUN VALUE   |  NORM GRAD  |  NORM STEP  |  CURV  |    GAMMA    |    ALPHA    | ACCEPT | |====================================================================================================| |       20 |  3.953759e+00 |   8.248e-02 |   2.892e-01 |    OK  |   1.040e+00 |   1.000e+00 |   YES  | |       21 |  3.945475e+00 |   3.119e-02 |   1.698e-01 |    OK  |   1.095e+00 |   1.000e+00 |   YES  | |       22 |  3.941567e+00 |   2.350e-02 |   1.293e-01 |    OK  |   1.117e+00 |   1.000e+00 |   YES  | |       23 |  3.939468e+00 |   1.296e-02 |   1.805e-01 |    OK  |   2.287e+00 |   1.000e+00 |   YES  | |       24 |  3.938662e+00 |   8.591e-03 |   5.955e-02 |    OK  |   1.553e+00 |   1.000e+00 |   YES  | |       25 |  3.938239e+00 |   6.421e-03 |   5.334e-02 |    OK  |   1.102e+00 |   1.000e+00 |   YES  | |       26 |  3.938013e+00 |   5.449e-03 |   6.773e-02 |    OK  |   2.085e+00 |   1.000e+00 |   YES  | |       27 |  3.937896e+00 |   6.226e-03 |   3.368e-02 |    OK  |   7.541e-01 |   1.000e+00 |   YES  | |       28 |  3.937820e+00 |   2.497e-03 |   2.397e-02 |    OK  |   7.940e-01 |   1.000e+00 |   YES  | |       29 |  3.937791e+00 |   2.004e-03 |   1.339e-02 |    OK  |   1.863e+00 |   1.000e+00 |   YES  | |       30 |  3.937784e+00 |   2.448e-03 |   1.265e-02 |    OK  |   9.667e-01 |   1.000e+00 |   YES  | |       31 |  3.937778e+00 |   6.973e-04 |   2.906e-03 |    OK  |   4.672e-01 |   1.000e+00 |   YES  | |       32 |  3.937778e+00 |   3.038e-04 |   9.502e-04 |    OK  |   1.060e+00 |   1.000e+00 |   YES  | |       33 |  3.937777e+00 |   2.327e-04 |   1.069e-03 |    OK  |   1.597e+00 |   1.000e+00 |   YES  | |       34 |  3.937777e+00 |   1.959e-04 |   1.537e-03 |    OK  |   4.026e+00 |   1.000e+00 |   YES  | |       35 |  3.937777e+00 |   1.162e-04 |   1.464e-03 |    OK  |   3.418e+00 |   1.000e+00 |   YES  | |       36 |  3.937777e+00 |   8.353e-05 |   3.660e-04 |    OK  |   7.304e-01 |   5.000e-01 |   YES  | |       37 |  3.937777e+00 |   1.412e-05 |   1.412e-04 |    OK  |   7.842e-01 |   1.000e+00 |   YES  | |       38 |  3.937777e+00 |   1.277e-05 |   3.808e-05 |    OK  |   1.021e+00 |   1.000e+00 |   YES  | |       39 |  3.937777e+00 |   8.614e-06 |   3.698e-05 |    OK  |   2.561e+00 |   1.000e+00 |   YES  |  |====================================================================================================| |   ITER   |   FUN VALUE   |  NORM GRAD  |  NORM STEP  |  CURV  |    GAMMA    |    ALPHA    | ACCEPT | |====================================================================================================| |       40 |  3.937777e+00 |   3.159e-06 |   5.299e-05 |    OK  |   4.331e+00 |   1.000e+00 |   YES  | |       41 |  3.937777e+00 |   2.657e-06 |   1.080e-05 |    OK  |   7.038e-01 |   5.000e-01 |   YES  | |       42 |  3.937777e+00 |   7.054e-07 |   7.036e-06 |    OK  |   9.519e-01 |   1.000e+00 |   YES  |           Infinity norm of the final gradient = 7.054e-07               Two norm of the final step     = 7.036e-06, TolX   = 1.000e-06 Relative infinity norm of the final gradient = 7.054e-07, TolFun = 1.000e-06 EXIT: Local minimum found. 

Trazar las operaciones seleccionadas.

figure; plot(nca.FeatureWeights,'ro'); grid on; xlabel('Feature index'); ylabel('Feature weight'); 

Predecir los valores de respuesta utilizando el modelo y trazar los valores de respuesta ajustados (previstos) y los valores de respuesta reales.nca

fitted = predict(nca,X); figure; plot(y,'r.'); hold on; plot(fitted,'b-'); xlabel('index'); ylabel('Fitted values'); 

intenta ajustar todos los puntos de los datos, incluidos los valores atípicos.fsrnca Como resultado, asigna pesos distintos de cero a muchas características además de los predictores 4, 7 y 13.

Utilice la función de pérdida robusta incorporada

Repite el mismo proceso de ajuste del parámetro de regularización, esta vez usando el built-in -función de pérdida insensible:

-la función de pérdida insensible es más robusta que los valores atípicos que el error cuadrado medio.

lambdavals  = linspace(0,3,50)*std(y)/length(y); cvp         = cvpartition(length(y),'kfold',5); numtestsets = cvp.NumTestSets; lossvals    = zeros(length(lambdavals),numtestsets);      for i = 1:length(lambdavals)         for k = 1:numtestsets              Xtrain = X(cvp.training(k),:);             ytrain = y(cvp.training(k),:);             Xtest  = X(cvp.test(k),:);             ytest  = y(cvp.test(k),:);              nca = fsrnca(Xtrain,ytrain,'FitMethod','exact',...                 'Solver','sgd','Verbose',0,'Lambda',lambdavals(i),...                 'LossFunction','epsiloninsensitive','Epsilon',0.8);              lossvals(i,k) = loss(nca,Xtest,ytest,'LossFunction','mse');         end     end 

el valor que se usará depende de los datos y el mejor valor se puede determinar mediante la validación cruzada también. Pero elegir el valor está fuera del ámbito de este ejemplo. La elección de en este ejemplo es principalmente para ilustrar la robustez del método.

Trace la pérdida media correspondiente a cada valor lambda.

meanloss = mean(lossvals,2); figure; plot(lambdavals,meanloss,'ro-'); xlabel('Lambda'); ylabel('Loss (MSE)'); grid on; 

Busque el valor lambda que produce la pérdida promedio mínima.

[~,idx] = min(mean(lossvals,2)); bestlambda = lambdavals(idx) 
 bestlambda =      0.0187  

Ajuste el modelo de análisis de componentes de vecindad utilizando -función de pérdida insensible y el mejor valor lambda.

nca = fsrnca(X,y,'FitMethod','exact','Solver','sgd',...      'Lambda',bestlambda,'LossFunction','epsiloninsensitive','Epsilon',0.8); 

Trazar las operaciones seleccionadas.

figure; plot(nca.FeatureWeights,'ro'); grid on; xlabel('Feature index'); ylabel('Feature weight'); 

Trazar valores ajustados.

fitted = predict(nca,X); figure; plot(y,'r.'); hold on; plot(fitted,'b-'); xlabel('index'); ylabel('Fitted values'); 

pérdida insensible parece más robusto a los valores atípicos. Identificó menos características que MSE como relevantes. El ajuste muestra que todavía se ve afectado por algunos de los valores atípicos.

Utilice la función de pérdida robusta personalizada

Defina una función de pérdida robusta personalizada que sea robusta para los valores atípicos que se utilizarán en la selección de características para la regresión:

.

customlossFcn = @(yi,yj) 1 - exp(-abs(bsxfun(@minus,yi,yj'))); 

Ajuste el parámetro de regularización utilizando la función de pérdida robusta definida a medida.

lambdavals  = linspace(0,3,50)*std(y)/length(y); cvp         = cvpartition(length(y),'kfold',5); numtestsets = cvp.NumTestSets; lossvals    = zeros(length(lambdavals),numtestsets);      for i = 1:length(lambdavals)         for k = 1:numtestsets              Xtrain = X(cvp.training(k),:);             ytrain = y(cvp.training(k),:);             Xtest  = X(cvp.test(k),:);             ytest  = y(cvp.test(k),:);              nca = fsrnca(Xtrain,ytrain,'FitMethod','exact',...                 'Solver','lbfgs','Verbose',0,'Lambda',lambdavals(i),...                 'LossFunction',customlossFcn);              lossvals(i,k) = loss(nca,Xtest,ytest,'LossFunction','mse');         end     end 

Trace la pérdida media correspondiente a cada valor lambda.

meanloss = mean(lossvals,2); figure; plot(lambdavals,meanloss,'ro-'); xlabel('Lambda'); ylabel('Loss (MSE)'); grid on; 

Encuentra la valor que produce la pérdida promedio mínima.

[~,idx] = min(mean(lossvals,2)); bestlambda = lambdavals(idx) 
 bestlambda =      0.0165  

Realice la selección de características utilizando la función de pérdida robusta personalizada y la mejor Valor.

nca = fsrnca(X,y,'FitMethod','exact','Solver','lbfgs',...      'Verbose',1,'Lambda',bestlambda,'LossFunction',customlossFcn); 
  o Solver = LBFGS, HessianHistorySize = 15, LineSearchMethod = weakwolfe  |====================================================================================================| |   ITER   |   FUN VALUE   |  NORM GRAD  |  NORM STEP  |  CURV  |    GAMMA    |    ALPHA    | ACCEPT | |====================================================================================================| |        0 |  8.610073e-01 |   4.921e-02 |   0.000e+00 |        |   1.219e+01 |   0.000e+00 |   YES  | |        1 |  6.582278e-01 |   2.328e-02 |   1.820e+00 |    OK  |   2.177e+01 |   1.000e+00 |   YES  | |        2 |  5.706490e-01 |   2.241e-02 |   2.360e+00 |    OK  |   2.541e+01 |   1.000e+00 |   YES  | |        3 |  5.677090e-01 |   2.666e-02 |   7.583e-01 |    OK  |   1.092e+01 |   1.000e+00 |   YES  | |        4 |  5.620806e-01 |   5.524e-03 |   3.335e-01 |    OK  |   9.973e+00 |   1.000e+00 |   YES  | |        5 |  5.616054e-01 |   1.428e-03 |   1.025e-01 |    OK  |   1.736e+01 |   1.000e+00 |   YES  | |        6 |  5.614779e-01 |   4.446e-04 |   8.350e-02 |    OK  |   2.507e+01 |   1.000e+00 |   YES  | |        7 |  5.614653e-01 |   4.118e-04 |   2.466e-02 |    OK  |   2.105e+01 |   1.000e+00 |   YES  | |        8 |  5.614620e-01 |   1.307e-04 |   1.373e-02 |    OK  |   2.002e+01 |   1.000e+00 |   YES  | |        9 |  5.614615e-01 |   9.318e-05 |   4.128e-03 |    OK  |   3.683e+01 |   1.000e+00 |   YES  | |       10 |  5.614611e-01 |   4.579e-05 |   8.785e-03 |    OK  |   6.170e+01 |   1.000e+00 |   YES  | |       11 |  5.614610e-01 |   1.232e-05 |   1.582e-03 |    OK  |   2.000e+01 |   5.000e-01 |   YES  | |       12 |  5.614610e-01 |   3.174e-06 |   4.742e-04 |    OK  |   2.510e+01 |   1.000e+00 |   YES  | |       13 |  5.614610e-01 |   7.896e-07 |   1.683e-04 |    OK  |   2.959e+01 |   1.000e+00 |   YES  |           Infinity norm of the final gradient = 7.896e-07               Two norm of the final step     = 1.683e-04, TolX   = 1.000e-06 Relative infinity norm of the final gradient = 7.896e-07, TolFun = 1.000e-06 EXIT: Local minimum found. 

Trazar las operaciones seleccionadas.

figure; plot(nca.FeatureWeights,'ro'); grid on; xlabel('Feature index'); ylabel('Feature weight'); 

Trazar valores ajustados.

fitted = predict(nca,X); figure; plot(y,'r.'); hold on; plot(fitted,'b-'); xlabel('index'); ylabel('Fitted values'); 

En este caso, la pérdida no se ve afectada por los valores atípicos y los resultados se basan en la mayoría de las observaciones. detecta los predictores 4, 7 y 13 como características relevantes y no selecciona ninguna otra de las características.fsrnca

¿Por qué la elección de la función de pérdida afecta a los resultados?

En primer lugar, calcule las funciones de pérdida para una serie de valores para la diferencia entre dos observaciones.

deltay   = linspace(-10,10,1000)'; % Compute custom loss function values customlossvals = customlossFcn(deltay,0); % Compute epsilon insensitive loss function and values epsinsensitive = @(yi,yj,E) max(0,abs(bsxfun(@minus,yi,yj'))-E); epsinsenvals = epsinsensitive(deltay,0,0.5); % Compute mse loss function and values mse = @(yi,yj) (yi-yj').^2; msevals = mse(deltay,0); 

Ahora, trazar las funciones de pérdida para ver su diferencia y por qué afectan a los resultados en la forma en que lo hacen.

figure; xlabel('(yi - yj)') ylabel('loss(yi,yj)') plot(deltay,customlossvals,'g-',deltay,epsinsenvals,'b-',deltay,msevals,'r-') legend('customloss','epsiloninsensitive','mse') ylim([0 20]) 

A medida que la diferencia entre dos valores de respuesta aumenta, MSE aumenta cuadráticamente, lo que hace que sea muy sensible a los valores atípicos. Como fsrnca intenta minimizar esta pérdida, termina identificando más características como relevantes. La pérdida de Epsilon insensible es más resistente a los valores atípicos que el MSE, pero eventualmente comienza a aumentar linealmente a medida que aumenta la diferencia entre dos observaciones. A medida que aumenta la diferencia entre dos observaciones, la robusta función de pérdida se acerca a 1 y permanece en ese valor aunque la diferencia entre las observaciones siga aumentando. De tres, es el más robusto a los valores atípicos.