Не получить правильный лассо MSE - PullRequest
0 голосов
/ 14 сентября 2018

Я новичок в регрессиях, и я написал очень простой код в Matlab, который использует функцию Лассо, чтобы посмотреть, понимаю ли я, как вычисляется MSE Лассо.Но я получаю mse, который отличается от вывода Лассо.Я, наверное, что-то упустил, и я был бы признателен, если бы кто-нибудь здесь мог сказать мне, где я не прав.Для расчета MSE я использовал следующую формулу по этой ссылке: https://www.mathworks.com/help/stats/lasso.html enter image description here

А вот код Matlab, который я написал:

clear;
close all;
clc;

% Checking lasso MSE from this link:
% https://www.mathworks.com/help/stats/lasso.html

n = 10;
p = 3;
X = 20*rand(n,p);
min_val = -20;
max_val = 20;  
y = min_val + (max_val - min_val)*rand(n,1);

lambda_vals = [0.2, 0.8, 1, 1.5];
[beta_vectors , FitInfo] = lasso(X, y, 'Lambda', lambda_vals);

eps = 10^-10;
num_of_lambda_vals = length(lambda_vals);
for i=1:num_of_lambda_vals 
    current_calculated_mse = sum((y - FitInfo.Intercept(i) - X*beta_vectors(:,i)).^2)/(2*n) +...
        lambda_vals(i)*sum(abs(beta_vectors(:,i)));    
    current_mse = FitInfo.MSE(i);

    fprintf('current_calculated_mse = %f\n',current_calculated_mse);
    fprintf('current_mse = %f\n',current_mse);
    sqr_diff_mses = (current_calculated_mse-current_mse)^2;
    if (sqr_diff_mses > eps)
        fprintf('The calculated MSE is wrong!\n');
    end
    fprintf('\n');
end

Если вы запустите код, он напечатает, что вычисление MSE неверно.Кто-нибудь может сказать, что не так с моим кодом?

Спасибо

1 Ответ

0 голосов
/ 14 сентября 2018

Вы просто используете неправильное уравнение

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

Однако, когда вы хотите проверить свои результаты, вам нужно только знать, насколько ваше решение применяется к модели по сравнению с реальными данными.Это означает, что когда вы вычисляете ошибку (в данном случае MSE), вам просто нужно:

enter image description here

, где ваше решение, примененное к модели, равно

enter image description here

Короче говоря: Измените current_calculated_mse на

current_calculated_mse = sum((y - FitInfo.Intercept(i) - X*beta_vectors(:,i)).^2)/(n);    

Выходы:

current_calculated_mse = 116.748997
current_mse = 116.748997

current_calculated_mse = 122.421290
current_mse = 122.421290

current_calculated_mse = 125.824726
current_mse = 125.824726

current_calculated_mse = 137.641287
current_mse = 137.641287

Почему бы не использовать минимизирующее уравнение для ошибки?Это имеет смысл, если мы минимизируем это!

Да!И нет.Вы предлагаете минимизирующее уравнение для управления решением с некоторыми желаемыми свойствами, в случае с Лассо вы хотите, чтобы столько бета-значений были равны нулю.Но это не значит, что ваше решение будет хорошим.

Вы могли бы также свести к минимуму уравнение, которое говорит argmin ( beta*x-y )*0+(1-beta).Это уравнение, решенное, будет иметь beta=1 в качестве идеального минимизатора, но означает ли это, что ваше решение идеально?Нет, совсем нет!Вы просто выбрали плохую функцию, чтобы минимизировать.Вы хотите, чтобы бета-версия лучше соответствовала реальным данным (y).В вашем случае так же, как вы используете различный набор лямбд.В решениях вы можете видеть, что ваши большие лямбды тоже решают уравнение, но решения хуже соответствуют реальным данным.Вы делаете это, чтобы выбрать лучшую лямбду.

...