2012-01-28 16 views
15

Tôi biết rằng Xác thực chéo được sử dụng để chọn tham số tốt. Sau khi tìm thấy chúng, tôi cần phải đào tạo lại toàn bộ dữ liệu mà không có tùy chọn -v.Đào tạo lại sau khi xác nhận chéo với libsvm

Nhưng vấn đề tôi phải đối mặt là sau khi tôi đào tạo với tùy chọn -v, tôi nhận được độ chính xác xác thực chéo (ví dụ: 85%). Không có mô hình và tôi không thể thấy các giá trị của C và gamma. Trong trường hợp đó làm thế nào để tôi đào tạo lại?

Btw i áp dụng xác thực chéo 10 lần. ví dụ

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% 

Cần giúp đỡ về nó ..

Để có được C tốt nhất và gamma, tôi sử dụng mã này có sẵn trong 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 

Câu hỏi khác: Liệu rằng độ chính xác chéo sau khi sử dụng tùy chọn -v tương tự như chúng ta nhận được khi chúng ta đào tạo mà không có tùy chọn -v và sử dụng mô hình đó để dự đoán? hai độ chính xác có giống nhau không?

Một câu hỏi khác: Xác thực chéo về cơ bản cải thiện độ chính xác của mô hình bằng cách tránh ghi đè. Vì vậy, nó cần phải có một mô hình tại chỗ trước khi nó có thể cải thiện. Tôi có đúng không? Bên cạnh đó, nếu tôi có một mô hình khác, thì độ chính xác xác nhận chéo sẽ khác nhau? Tôi có đúng không?

Một câu hỏi nữa: Trong độ chính xác xác thực chéo, giá trị của C và gamma là gì?

Đồ thị là một cái gì đó như thế này enter image description here

Sau đó, các giá trị của C là 2 và gamma = 0,0078125. Nhưng khi tôi đào tạo lại mô hình với các tham số mới. Giá trị không bằng 99,63%. Có thể có lý do nào không? Cảm ơn trước ...

Trả lời

29

Các -v tùy chọn ở đây là thực sự có nghĩa là để được sử dụng như một cách để tránh các vấn đề overfitting (thay vì sử dụng toàn bộ dữ liệu cho đào tạo, thực hiện một huấn luyện chéo xác nhận N lần trên N-1 nếp gấp và thử nghiệm trên các nếp gấp còn lại, một lần tại một thời điểm, sau đó báo cáo độ chính xác trung bình). Do đó, nó chỉ trả về độ chính xác chéo (giả sử bạn có vấn đề phân loại, nếu không có sai số bình phương cho hồi quy) dưới dạng số vô hướng thay vì mô hình SVM thực tế.

Nếu bạn muốn thực hiện lựa chọn mô hình, bạn cần phải thực hiện một tìm kiếm lưới sử dụng cross-validation (tương tự như kịch bản python grid.py helper), để tìm các giá trị tốt nhất của Cgamma. Điều này không khó thực hiện: tạo một mạng lưới các giá trị sử dụng MESHGRID, lặp lại tổng thể tất cả các cặp (C,gamma) đào tạo mô hình SVM với xác thực chéo 5 lần và chọn các giá trị có độ chính xác CV tốt nhất. ..

Ví dụ:

%# 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

Tôi đã chỉnh sửa các câu hỏi ... – lakesh

+0

đang tuyệt vời, cảm ơn ... Một qn hơn: Các điểm mà giá trị chính xác là vị trí tốt nhất của c và gamma. Tôi có đúng không? – lakesh

+2

@lakesh: đúng, chỉ cần nhớ rằng đồ thị được vẽ với một quy mô log2 (vì vậy các giá trị tốt nhất ở đây là 'C = 2^9' và gamma =' 2^-11') – Amro

1

Nếu bạn sử dụng toàn bộ số liệu để xác định các thông số của bạn, sau đó huấn luyện trên tập dữ liệu đó, bạn sẽ overfit dữ liệu của bạn.Lý tưởng nhất, bạn sẽ chia tập dữ liệu, thực hiện tìm kiếm tham số trên một phần (với CV), sau đó sử dụng phần khác để đào tạo và thử nghiệm với CV. Bạn sẽ nhận được kết quả tốt hơn nếu bạn sử dụng toàn bộ tập dữ liệu cho cả hai? Tất nhiên, nhưng mô hình của bạn có khả năng không tổng quát tốt. Nếu bạn muốn xác định hiệu năng thực sự của mô hình của bạn, bạn cần phải thực hiện lựa chọn tham số riêng biệt.

+0

trong tuyên bố cuối cùng, những gì bạn có nghĩa là do lựa chọn paramter ? do u có nghĩa là xác định các thông số trên một phần nhất định. – lakesh

+1

Tôi xin lỗi vì không rõ ràng. Chọn tham số là hành động xác định tham số nào hoạt động tốt nhất cho tập dữ liệu của bạn (thực sự là những gì hoạt động tốt nhất cho toàn bộ miền của tập dữ liệu và dữ liệu trong tương lai mà bạn muốn phân loại.) Câu lệnh cuối cùng của tôi chỉ tóm tắt những gì tôi đã nói ở trên - thực hiện lựa chọn tham số riêng biệt có nghĩa là sử dụng một phần riêng biệt của tập dữ liệu để tìm ra các tham số tốt nhất, sau đó sử dụng các thông số đó khi bạn đào tạo trên phần không sử dụng. – karenu

+0

Một qn: Shld i chia toàn bộ dữ liệu thành 10% để thực hiện tìm kiếm lưới và đào tạo mô hình với các thông số đó trên 70% và kiểm tra nó trên 20% còn lại? bạn có nghĩ đây là một ý tưởng hay không? – lakesh