una tendencia regresion probabilidad momentos lineal linea intervalo hacer estadisticos distribucion confianza como codigo bondad ajuste matlab machine-learning regression glm cross-validation

tendencia - Calcular la validación cruzada para el modelo lineal generalizado en Matlab



regresion lineal matlab (1)

Estoy haciendo una regresión usando el modelo lineal generalizado. Estoy atrapado fuera de guardia usando la función crossVal . Mi implementación hasta el momento;

x = ''Some dataset, containing the input and the output'' X = x(:,1:7); Y = x(:,8); cvpart = cvpartition(Y,''holdout'',0.3); Xtrain = X(training(cvpart),:); Ytrain = Y(training(cvpart),:); Xtest = X(test(cvpart),:); Ytest = Y(test(cvpart),:); mdl = GeneralizedLinearModel.fit(Xtrain,Ytrain,''linear'',''distr'',''poisson''); Ypred = predict(mdl,Xtest); res = (Ypred - Ytest); RMSE_test = sqrt(mean(res.^2));

El siguiente código es para calcular la validación cruzada para la regresión múltiple tal como se obtiene de este enlace . Quiero algo similar para el modelo lineal generalizado.

c = cvpartition(Y,''k'',10); regf=@(Xtrain,Ytrain,Xtest)(Xtest*regress(Ytrain,Xtrain)); cvMse = crossval(''mse'',X,Y,''predfun'',regf)


Puede realizar el proceso de validación cruzada manualmente (entrenando un modelo para cada doblez, predecir el resultado, calcular el error, luego informar el promedio en todos los pliegues), o puede usar la función CROSSVAL que envuelve todo este procedimiento en una sola llamada.

Para dar un ejemplo, primero cargaré y prepararé un conjunto de datos (un subconjunto del conjunto de datos de los automóviles que se incluye con Statistics Toolbox):

% load regression dataset load carsmall X = [Acceleration Cylinders Displacement Horsepower Weight]; Y = MPG; % remove instances with missing values missIdx = isnan(Y) | any(isnan(X),2); X(missIdx,:) = []; Y(missIdx) = []; clearvars -except X Y

Opción 1

Aquí dividiremos manualmente los datos usando k-fold cross-validation usando cvpartition (no estratificado). Para cada pliegue, formamos un modelo GLM utilizando los datos de entrenamiento, luego usamos el modelo para predecir el resultado de los datos de prueba. A continuación, calculamos y almacenamos el error cuadrático medio de regresión para este doblez. Al final, informamos el RMSE promedio en todas las particiones.

% partition data into 10 folds K = 10; cv = cvpartition(numel(Y), ''kfold'',K); mse = zeros(K,1); for k=1:K % training/testing indices for this fold trainIdx = cv.training(k); testIdx = cv.test(k); % train GLM model mdl = GeneralizedLinearModel.fit(X(trainIdx,:), Y(trainIdx), ... ''linear'', ''Distribution'',''poisson''); % predict regression output Y_hat = predict(mdl, X(testIdx,:)); % compute mean squared error mse(k) = mean((Y(testIdx) - Y_hat).^2); end % average RMSE across k-folds avrg_rmse = mean(sqrt(mse))

opcion 2

Aquí podemos simplemente llamar a CROSSVAL con un identificador de función apropiado que computa la salida de regresión dado un conjunto de instancias de tren / prueba. Consulte la página de documentación para comprender los parámetros.

% prediction function given training/testing instances fcn = @(Xtr, Ytr, Xte) predict(... GeneralizedLinearModel.fit(Xtr,Ytr,''linear'',''distr'',''poisson''), ... Xte); % perform cross-validation, and return average MSE across folds mse = crossval(''mse'', X, Y, ''Predfun'',fcn, ''kfold'',10); % compute root mean squared error avrg_rmse = sqrt(mse)

Debería obtener un resultado similar en comparación con el anterior (ligeramente diferente, por supuesto, a causa de la aleatoriedad involucrada en la validación cruzada).