2012-01-28 17 views
15

So che la convalida incrociata viene utilizzata per selezionare i parametri validi. Dopo averli trovati, ho bisogno di ri-formare tutti i dati senza l'opzione -v.Riqualificazione dopo Cross Validation con libsvm

Ma il problema che devo affrontare è che dopo l'allenamento con l'opzione -v, ottengo l'accuratezza della convalida incrociata (ad es. 85%). Non esiste un modello e non riesco a vedere i valori di C e gamma. In tal caso, come posso riqualificare?

Btw applicando una convalida incrociata di 10 volte. esempio

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% 

Hai bisogno di un certo aiuto su di esso ..

per ottenere il miglior C e gamma, io uso questo codice che è disponibile nel LIBSVM FAQ

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 

Un'altra domanda: quella precisione incrociata dopo aver usato l'opzione -v simile a quella che otteniamo quando ci alleniamo senza opzione -v e usiamo quel modello per prevedere? sono le due accurate simili?

Un'altra domanda: la convalida incrociata migliora sostanzialmente l'accuratezza del modello evitando il sovradattamento. Quindi, deve avere un modello in atto prima che possa migliorare. Ho ragione? Oltre a questo, se ho un modello diverso, la precisione della cross-validation sarà diversa? Ho ragione?

Un'altra domanda: Nella precisione della convalida incrociata, qual è il valore di C e gamma, quindi?

Il grafico è qualcosa di simile enter image description here

Poi i valori di C sono 2 e gamma = ,0078,125 mila. Ma quando rieducifico il modello con i nuovi parametri. Il valore non è lo stesso del 99,63%. Potrebbe esserci qualche ragione? Grazie in anticipo ...

risposta

29

L'opzione -v qui è veramente destinata a essere usato come un modo per evitare il problema sovradattamento (invece di utilizzare l'intero dati per la formazione, eseguire un allenamento convalida incrociata N-fold su N-1 piega e prova sulla piega rimanente, uno alla volta, quindi riporta l'accuratezza media). Pertanto restituisce solo l'accuratezza della convalida incrociata (supponendo che si abbia un problema di classificazione, altrimenti l'errore quadratico medio per la regressione) come un numero scalare invece di un modello SVM effettivo.

Se si desidera eseguire la selezione del modello, è necessario implementare una ricerca griglia utilizzando convalida incrociata (simile allo script python grid.py aiutante), per trovare i migliori valori di C e gamma.

Questo non dovrebbe essere difficile da implementare: creare una griglia di valori utilizzando meshgrid, iterare complessiva tutte le coppie (C,gamma) formazione di un modello di SVM con dire 5 volte la convalida incrociata, e scegliendo i valori con il miglior curriculum precisione. ..

Esempio:

%# 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); 
%# ... 

contour_plot

+0

Ho modificato la domanda ... – lakesh

+0

codice fantastico, grazie ... Un altro qn: il punto in cui il valore di precisione è la posizione migliore c e gamma. Ho ragione? – lakesh

+2

@lakesh: corretto, ricorda solo che il grafico è disegnato con una scala log2 (quindi i valori migliori qui sono 'C = 2^9' e gamma =' 2^-11') – Amro

1

Se si utilizza il intero set di dati per determinare i parametri, poi treno su quel set di dati, che si sta per OVERFIT i dati.Idealmente, dividere il set di dati, eseguire la ricerca dei parametri su una porzione (con CV), quindi utilizzare l'altra parte per allenarsi e testare con CV. Otterrete risultati migliori se utilizzate l'intero set di dati per entrambi? Certo, ma è probabile che il tuo modello non si generalizzi bene. Se si desidera determinare le prestazioni effettive del modello, è necessario eseguire la selezione dei parametri separatamente.

+0

nell'ultima istruzione, cosa intendi per selezione dei parametri ? vuoi dire determinare i parametri su una certa parte. – lakesh

+1

Mi scuso per non essere chiaro. Parameter Selection è l'atto di determinare quali parametri funzionano meglio per il set di dati (in realtà ciò che funziona meglio per l'intero dominio del set di dati e i dati futuri che si desidera essere in grado di classificare.) La mia ultima affermazione è stata pensata per riassumere ciò che ho detto sopra - fare separatamente la selezione dei parametri significa utilizzare una parte separata del set di dati per calcolare i parametri migliori, quindi utilizzare quei parametri quando ci si allena sulla porzione inutilizzata. – karenu

+0

Un qn: Shld divido l'intero set di dati nel 10% per eseguire la ricerca della griglia e addestrare il modello con tali parametri al 70% e testarlo sul restante 20%? pensi che sia una buona idea? – lakesh