Устойчивый выбор функции Используя NCA для регрессии

Выполните выбор функции, который устойчив к выбросам с помощью пользовательской устойчивой функции потерь в NCA.

Сгенерируйте данные с выбросами

Сгенерируйте выборочные данные для регрессии, где ответ зависит от трех из предикторов, а именно, предикторы 4, 7, и 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);

Добавьте выбросы в данные.

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

Отобразите данные на графике.

figure;
plot(y);

Используйте неустойчивую функцию потерь

Производительность алгоритма выбора функции высоко зависит от значения параметра регуляризации. Это - хорошая практика, чтобы настроить параметр регуляризации для оптимального значения, чтобы использовать в выборе функции. Настройте параметр регуляризации с помощью пятикратной перекрестной проверки. Используйте среднеквадратическую ошибку (mse):

Во-первых, разделите данные в пять сгибов. В каждом сгибе, использование программного обеспечения, 4/5-е из данных для обучения и 1/5-е из данных для валидации (тестирование).

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

Вычислите значения lambda, чтобы протестировать на и создать массив, чтобы сохранить значения потерь.

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

Выполните NCA и вычислите потерю для каждого значения и каждого сгиба.

    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

Постройте среднюю потерю, соответствующую каждому значению lambda.

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

Найдите значение, которое производит минимальную среднюю потерю.

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

    0.0231

Выполните выбор функции с помощью оптимального значения и 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.

Постройте выбранные функции.

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

Предскажите значения ответа с помощью модели nca и постройте подходящие (предсказанные) значения ответа и фактические значения ответа.

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

fsrnca пытается приспособить каждую точку в данных включая выбросы. В результате это присваивает ненулевые веса многим функциям помимо предикторов 4, 7, и 13.

Используйте встроенную устойчивую функцию потерь

Повторите тот же процесс настройки параметра регуляризации, на этот раз с помощью встроенного - нечувствительная функция потерь:

- нечувствительная функция потерь более устойчива к выбросам, чем среднеквадратическая ошибка.

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

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

Постройте среднюю потерю, соответствующую каждому значению lambda.

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

Найдите значение lambda, которое производит минимальную среднюю потерю.

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

    0.0187

Подходящая аналитическая модель компонента окружения, использующая - нечувствительная функция потерь и лучшее значение lambda.

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

Постройте выбранные функции.

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

Постройте адаптированные значения.

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

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

Используйте пользовательскую устойчивую функцию потерь

Задайте пользовательскую устойчивую функцию потерь, которая устойчива к выбросам, чтобы использовать в выборе функции для регрессии:

.

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

Настройте параметр регуляризации с помощью пользовательски заданной устойчивой функции потерь.

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

Постройте среднюю потерю, соответствующую каждому значению lambda.

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

Найдите значение, которое производит минимальную среднюю потерю.

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

    0.0165

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

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.

Постройте выбранные функции.

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

Постройте адаптированные значения.

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

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

Почему выбор функции потерь влияет на результаты?

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

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

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

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

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