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