matlab - teoria - Reentrenamiento después de la validación cruzada con libsvm
svm para regresion (2)
La opción -v
aquí está pensada para ser usada como una forma de evitar el problema de sobreajuste (en lugar de usar toda la información para el entrenamiento, realizar un entrenamiento de validación cruzada de N-1
pliegues en pliegues N-1
y probar en el doblez restante, uno a la vez, luego informe la precisión promedio). Por lo tanto, solo devuelve la precisión de validación cruzada (suponiendo que tenga un problema de clasificación, de lo contrario, error cuadrático medio para la regresión) como un número escalar en lugar de un modelo real de SVM.
Si desea realizar la selección del modelo, debe implementar una búsqueda en cuadrícula utilizando la validación cruzada (similar al grid.py
helper python), para encontrar los mejores valores de C
y gamma
.
Esto no debería ser difícil de implementar: cree una grilla de valores usando MESHGRID, itere en general todos los pares (C,gamma)
entrenando un modelo SVM con una validación cruzada de 5 veces, y elija los valores con la mejor precisión CV. ..
Ejemplo:
%# read some training data
[labels,data] = libsvmread(''./heart_scale'');
%# grid of parameters
folds = 5;
[C,gamma] = meshgrid(-5:2:15, -15:2:3);
%# grid search, and cross-validation
cv_acc = zeros(numel(C),1);
for i=1:numel(C)
cv_acc(i) = svmtrain(labels, data, ...
sprintf(''-c %f -g %f -v %d'', 2^C(i), 2^gamma(i), folds));
end
%# pair (C,gamma) with best accuracy
[~,idx] = max(cv_acc);
%# contour plot of paramter selection
contour(C, gamma, reshape(cv_acc,size(C))), colorbar
hold on
plot(C(idx), gamma(idx), ''rx'')
text(C(idx), gamma(idx), sprintf(''Acc = %.2f %%'',cv_acc(idx)), ...
''HorizontalAlign'',''left'', ''VerticalAlign'',''top'')
hold off
xlabel(''log_2(C)''), ylabel(''log_2(/gamma)''), title(''Cross-Validation Accuracy'')
%# now you can train you model using best_C and best_gamma
best_C = 2^C(idx);
best_gamma = 2^gamma(idx);
%# ...
Sé que la validación cruzada se usa para seleccionar buenos parámetros. Después de encontrarlos, necesito volver a entrenar toda la información sin la opción -v.
Pero el problema que enfrento es que después de entrenar con la opción -v, obtengo la precisión de validación cruzada (por ejemplo, 85%). No hay modelo y no puedo ver los valores de C y gamma. En ese caso, ¿cómo me entreno?
Por cierto, estoy aplicando 10 veces la validación cruzada. p.ej
optimization finished, #iter = 138
nu = 0.612233
obj = -90.291046, rho = -0.367013
nSV = 165, nBSV = 128
Total nSV = 165
Cross Validation Accuracy = 98.1273%
Necesito ayuda sobre esto ...
Para obtener la mejor C y gamma, uso este código que está disponible en las preguntas frecuentes de LIBSVM
bestcv = 0;
for log2c = -6:10,
for log2g = -6:3,
cmd = [''-v 5 -c '', num2str(2^log2c), '' -g '', num2str(2^log2g)];
cv = svmtrain(TrainLabel,TrainVec, cmd);
if (cv >= bestcv),
bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
end
fprintf(''(best c=%g, g=%g, rate=%g)/n'',bestc, bestg, bestcv);
end
end
Otra pregunta: ¿Es esa precisión de validación cruzada después de usar la opción -v similar a la que obtenemos cuando entrenamos sin la opción -v y usamos ese modelo para predecir? son las dos precisiones similares?
Otra pregunta: la validación cruzada básicamente mejora la precisión del modelo evitando el sobreajuste. Entonces, necesita tener un modelo en su lugar antes de que pueda mejorar. Estoy en lo correcto? Además de eso, si tengo un modelo diferente, ¿la precisión de la validación cruzada será diferente? Estoy en lo correcto?
Una pregunta más: en la precisión de validación cruzada, ¿cuál es el valor de C y gamma?
El gráfico es algo como esto
Entonces los valores de C son 2 y gamma = 0.0078125. Pero cuando vuelvo a entrenar el modelo con los nuevos parámetros. El valor no es el mismo que 99.63%. ¿Podría haber alguna razón? Gracias por adelantado...
Si usa su conjunto de datos completo para determinar sus parámetros, luego entrene en ese conjunto de datos, va a sobreajustar sus datos. Lo ideal sería dividir el conjunto de datos, hacer la búsqueda de parámetros en una parte (con CV), luego usar la otra parte para entrenar y probar con CV. ¿Obtendrá mejores resultados si usa el conjunto de datos completo para ambos? Por supuesto, pero es probable que tu modelo no se generalice bien. Si quiere determinar el verdadero rendimiento de su modelo, debe hacer la selección de parámetros por separado.