SVM với quy mô nhóm không đồng đều trong dữ liệu đào tạo


12

Tôi đang cố gắng xây dựng một SVM từ dữ liệu đào tạo trong đó một nhóm được đại diện nhiều hơn nhóm kia. Tuy nhiên, các nhóm sẽ được đại diện như nhau trong dữ liệu thử nghiệm cuối cùng. Do đó, tôi muốn sử dụng class.weightstham số của e1071giao diện gói R libsvmđể cân bằng ảnh hưởng của hai nhóm trong dữ liệu đào tạo.

Vì tôi không chắc chắn chính xác cách xác định các trọng số này, tôi đã thiết lập một thử nghiệm nhỏ:

  1. Tạo một số dữ liệu null (tính năng ngẫu nhiên; tỷ lệ 2: 1 giữa các nhãn nhóm)
  2. Phù hợp với một Svm với bộ class.weightstham số.
  3. Dự đoán một loạt các bộ dữ liệu null mới và xem xét tỷ lệ lớp.
  4. Nhân rộng toàn bộ quá trình nhiều lần cho các bộ huấn luyện null khác nhau.

Đây là mã R tôi đang sử dụng:

nullSVM <- function(n.var, n.obs) {
    # Simulate null training data
    vars   = matrix(rnorm(n.var*n.obs), nrow=n.obs)
    labels = rep(c('a', 'a', 'b'), length.out=n.obs)
    data   = data.frame(group=labels, vars)

    # Fit SVM
    fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))

    # Calculate the average fraction of 'a' we would predict from null test data
    mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}

library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))

Từ toàn bộ điều này, tôi đã mong đợi một đầu ra ~ 0,5, tuy nhiên, đó không phải là những gì tôi nhận được:

> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987

Thông số class.weightsđang hoạt động, loại trọng lượng I acàng thấp thì nó càng được biểu thị trong mô phỏng này (và nếu tôi bỏ qua class.weightsnó sẽ trả về gần 1) ... nhưng tôi không hiểu tại sao chỉ đơn giản sử dụng trọng số 1: 2 ( đối với dữ liệu đào tạo là 2: 1) không giúp tôi giảm xuống 50%.

Nếu tôi hiểu nhầm SVM, ai đó có thể giải thích điểm này không? (hoặc gửi một số ref?)

Nếu tôi làm sai, ai đó có thể cho tôi biết cách sử dụng class.weightstham số chính xác không?

Nó có thể là một lỗi? (Tôi nghĩ là không, vì tôi hiểu phần mềm này và libsvm cơ bản khá trưởng thành)


Tôi không có kinh nghiệm với libsvm nhưng với LiblineaR, trọng số lớp là rất quan trọng. Với cài đặt chính xác, bạn sẽ nhận được kết quả tối ưu phụ nếu các lớp của bạn không cân bằng. Tôi muốn đề xuất: Lấy một tập dữ liệu thực với các lớp không cân bằng và thử các giá trị khác nhau của class.weights (trong LiblineaR wi). LiblineaR là các đơn đặt hàng có cường độ nhanh hơn đối với hạt nhân lineal và cũng có các phương pháp bị phạt. Theo kinh nghiệm của tôi, trước tiên bạn tìm thấy một trọng lượng lớp khá và sau đó tối ưu hóa C.
marbel

Câu trả lời:


7

Tôi nghĩ rằng nó có thể phụ thuộc vào giá trị của C và số lượng mẫu bạn có. SVM cố gắng tìm phân biệt đối xử lề tối đa, vì vậy nếu bạn có dữ liệu thưa thớt thì có thể SVM có thể tìm giải pháp lề cứng mà không có bất kỳ số nhân Lagrange nào đạt đến giới hạn trên của họ (trong trường hợp đó là tỷ lệ hình phạt cho mỗi về mặt bản chất là không liên quan vì các giá trị độ chùng nhỏ hoặc bằng 0. Hãy thử tăng số lượng mẫu đào tạo và xem liệu điều đó có ảnh hưởng không (vì điều đó làm giảm khả năng giải pháp lề cứng trong các ràng buộc hộp) .

Quan trọng hơn, các giá trị tối ưu của C phụ thuộc vào dữ liệu, bạn không thể chỉ đặt chúng thành một số giá trị được xác định trước mà thay vào đó tối ưu hóa chúng bằng cách giảm thiểu lỗi bỏ qua hoặc một số khái quát hóa bị ràng buộc. Nếu bạn có các lớp không cân bằng, bạn có thể sửa tỷ lệ giá trị cho mỗi lớp và tối ưu hóa hình phạt trung bình trên tất cả các mẫu.


Điều này thật ý nghĩa. Khi tôi giảm số lượng tính năng và tăng số lượng quan sát trong mô phỏng này, giá trị đầu ra sẽ tiến gần đến 0,5. Tuy nhiên, nó không bao giờ hoàn toàn ở đó - ngay cả với 900 hàng và chỉ có 1 cột.
John Colby

Tất nhiên trên dữ liệu thực, tôi luôn sử dụng caretgói hoặc tune()hàm tích hợp để điều chỉnh tham số mô hình, vì vậy tôi đặc biệt thích ý tưởng thứ hai của bạn về cách xử lý vấn đề này trong thực tế bằng cách điều chỉnh sơ đồ lấy mẫu lại để ưu tiên lớp thiểu số. Nhiều đánh giá cao.
John Colby

rất vui vì bạn đề nghị là hữu ích. Có một bài viết về thiết lập tỷ lệ tối ưu cũng có thể hữu ích theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf Tuy nhiên, hiệu chỉnh lý thuyết tối ưu không phải lúc nào cũng tối ưu trong thực tế, vì vậy kết quả tốt nhất có thể thực sự có được bằng cách điều chỉnh hai tham số C riêng biệt mà không buộc một tỷ lệ cụ thể, nhưng tính trọng số của các mẫu theo lớp khi đánh giá tiêu chí lựa chọn mô hình rời khỏi một.
Dikran Marsupial

2
Tôi cũng nói thêm, ngày nay tôi có xu hướng sử dụng hồi quy sườn hạt nhân thay vì các SVM vì bạn không gặp phải các vấn đề phản trực giác này do sự gián đoạn trong đạo hàm của hàm mất. Rất thường xuyên nếu bạn điều chỉnh L2 SVM đúng cách, bạn sẽ có một giá trị C rất nhỏ và tất cả dữ liệu đều là SV, tại thời điểm đó bạn có mô hình KRR. Tôi càng sử dụng chúng, tôi càng thấy ít hữu ích trong thực tế, mặc dù những hiểu biết lý thuyết mà họ mang lại rất quan trọng.
Dikran Marsupial

0

trong đào tạo svm tìm các vectơ hỗ trợ để tạo ranh giới phân biệt và khi có đủ vectơ hỗ trợ cho tất cả dữ liệu của lớp để làm như vậy, sẽ không có vấn đề gì. trong độ chính xác của kết quả của bộ kiểm tra, bạn nên chú ý đến lượng dữ liệu bằng nhau cho tất cả các lớp trong thế giới thực và để có được kết quả thực, bạn nên thao tác dữ liệu cũng như xem xét nó đúng trong tình huống thực.


Câu trả lời này hiện chưa rõ ràng - tôi đã cân nhắc cho nó một bản chỉnh sửa nhưng có một số nơi tôi không chắc bạn dự định gì. Dấu câu và ngữ pháp rất quan trọng để truyền đạt ý nghĩa.
Cá bạc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.