2012-01-20 17 views
5

Después de obtener mi etiqueta de prueba y etiqueta de tren, implementé SVM en libsvm y obtuve una precisión de 97.4359%. (C = 1 y g = 0,00375)Precisión de LibSVM disminuye

model = svmtrain(TrainLabel, TrainVec, '-c 1 -g 0.00375'); 
[predict_label, accuracy, dec_values] = svmpredict(TestLabel, TestVec, model); 

después de encontrar la mejor c y g,

bestcv = 0; 
for log2c = -1:3, 
    for log2g = -4:1, 
    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('%g %g %g (best c=%g, g=%g, rate=%g)\n', log2c, log2g, cv, bestc, bestg, bestcv); 
    end 
end 

c = 8 y g = 0,125

I implementar el modelo de nuevo:

model = svmtrain(TrainLabel, TrainVec, '-c 8 -g 0.125'); 
[predict_label, accuracy, dec_values] = svmpredict(TestLabel, TestVec, model); 

puedo obtener una precisión de 82.0513%

¿Cómo es posible que la precisión disminuya? ¿no debería aumentar? ¿O estoy cometiendo un error?

+0

No estoy familiarizado con la API de Matlab LibSVM, pero ¿está seguro de 'cv = svmtrain (TrainLabel, TrainVec, cmd);' le dará la exactitud? –

+0

esto fue lo que dieron en LIBSVM FAQ: http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html en ¿Cómo podría usar la interfaz MATLAB para la selección de parámetros? – lakesh

Respuesta

4

Las precisiones que obtenía durante la optimización de parámetros están sesgadas hacia arriba porque estaba prediciendo los mismos datos que estaba entrenando. Esto a menudo está bien para el ajuste de parámetros.

Sin embargo, si desea que esas precisiones sean estimaciones precisas del verdadero error de generalización en su conjunto de prueba final, entonces tiene que agregar una envoltura adicional de validación cruzada u otro esquema de remuestreo.

Aquí es un papel muy claro que esboza el tema general (pero en un contexto similar de selección de características): http://www.pnas.org/content/99/10/6562.abstract

EDITAR:

Yo suelo añadir validación cruzada como:

n  = 95 % total number of observations 
nfold = 10 % desired number of folds 

% Set up CV folds 
inds = repmat(1:nfold, 1, mod(nfold, n)) 
inds = inds(randperm(n)) 

% Loop over folds 
for i = 1:nfold 
    datapart = data(inds ~= i, :) 

    % do some stuff 

    % save results 
end 

% combine results 
+0

¿cómo se agrega una envoltura adicional de validación cruzada? – lakesh

+0

@lakesh Véase la edición. ¡Buena suerte! –

+0

solo para aclarar: ¿no lo hace LIBSVM? todo lo que necesitas escribir es "-v n" donde n es el número de veces. – lakesh

1

Para realizar la validación cruzada, se supone que debes dividir los datos de tu entrenamiento. Aquí prueba los datos de entrenamiento para encontrar el mejor conjunto de parámetros. Esa no es una buena medida. Se debe utilizar la siguiente pseudo código:

for param = set of parameter to test 
    [trainTrain,trainVal] = randomly split (trainSet); %%% you can repeat that several times and take the mean accuracy 
    model = svmtrain(trainTrain, param); 
    acc = svmpredict(trainVal, model); 
    if accuracy is the best 
    bestPAram = param 
    end 
end 
+0

¿Qué pasa con mi código? itera para encontrar el mejor c y gamma ... – lakesh

+0

esto fue lo que dieron en LIBSVM FAQ: csie.ntu.edu.tw/~cjlin/libsvm/faq.html en ¿Cómo podría usar la interfaz MATLAB para la selección de parámetros? – lakesh

+0

Ya estoy haciendo la validación cruzada en mi código ... – lakesh