Dữ liệu đa lớp xiên


10

Tôi có một bộ dữ liệu chứa ~ 100.000 mẫu của 50 lớp. Tôi đã sử dụng SVM với kernel RBF để huấn luyện và dự đoán dữ liệu mới. Vấn đề là bộ dữ liệu bị lệch về các lớp khác nhau.

Ví dụ: Lớp 1 - 30 (~ 3% mỗi loại), Lớp 31 - 45 (~ 0,6% mỗi loại), Lớp 46 - 50 (~ 0,2% mỗi loại)

Tôi thấy rằng mô hình có xu hướng rất hiếm khi dự đoán các lớp xảy ra ít thường xuyên hơn trong tập huấn luyện, mặc dù tập kiểm thử có phân phối lớp giống như tập huấn luyện.

Tôi biết rằng có một số kỹ thuật như 'lấy mẫu' trong đó lớp đa số được thu nhỏ lại thành lớp nhỏ. Tuy nhiên, điều này có áp dụng ở đây không, nơi có rất nhiều lớp khác nhau? Có phương pháp nào khác để giúp xử lý trường hợp này?

Câu trả lời:


5

Tôi sẽ đề nghị bạn sử dụng libsvm, đã có trọng số lớp có thể điều chỉnh được thực hiện trong đó. Thay vì sao chép các mẫu đào tạo, người ta sửa đổi tham số C cho các lớp khác nhau trong tối ưu hóa SVM. Ví dụ: nếu dữ liệu của bạn có 2 lớp và lớp đầu tiên chỉ có 10% dữ liệu, bạn sẽ chọn trọng số lớp lần lượt là 10 và 1 cho lớp 1 và 2. Do đó, vi phạm ký quỹ của hạng nhất sẽ tốn gấp 10 lần so với vi phạm ký quỹ đối với hạng thứ hai và độ chính xác trên mỗi hạng sẽ cân bằng hơn.


cảm ơn vì lời khuyên, bạn có biết nếu libsvm tự động làm điều này hay tôi cần phải vượt qua thủ công trong các trọng số lớp?
mike1886

Bạn phải vượt qua thủ công trong các trọng số lớp. Cách để làm điều đó khác nhau dựa trên giao diện bạn đang sử dụng (python, java, matlab, c). Nó cũng được ghi lại trong các tệp đọc tôi nếu bạn tải xuống công cụ từ csie.ntu.edu.tw/~cjlin/libsvm . Ngoài ra, kích thước dữ liệu của bạn có vẻ lớn và việc triển khai libsvm đa lớp mặc định sẽ sử dụng phân loại một đối một có thể mất quá nhiều thời gian để chạy. Bạn có thể thử đào tạo 50 phân loại nhị phân một so với tất cả các chỉ định trọng số một cách thích hợp.
magicharp

2

Tôi không xuất khẩu trong việc sử dụng SVM, nhưng thông thường (nếu bạn đang sử dụng thư viện máy học như Python scikit-learnhoặc R libsvm, thì có class_weighttham số, hoặc class.weights, tương ứng.

Hoặc nếu bạn sử dụng trình phân loại Bayes, bạn sẽ tính đến "độ lệch" này thông qua xác suất "trước (lớp)" P ( j )


1

Về cách tiếp cận, SVM với hạt nhân RBF hoạt động tốt, nhưng SVM có thể bị làm chậm bởi kích thước đối tượng lớn, trừ khi bạn đang sử dụng CV với ví dụ 1/10 dữ liệu được gán ngẫu nhiên cho mỗi lần gấp. Tuy nhiên, bạn có tự hỏi tại sao bạn lại sử dụng SVM không?

Bạn đã thử hồi quy tuyến tính đa biến, , trong đó mỗi bản ghi của được mã hóa nếu đối tượng thứ ở trong lớp và nếu không? Nếu độ chính xác phân loại cao đáng kể khi sử dụng hồi quy tuyến tính, thì dữ liệu của bạn có thể phân tách tuyến tính và các phương pháp phức tạp hơn như SVM và ANN không cần thiết. Bước 2 sẽ chỉ ra rằng người hàng xóm gần nhất k, Bayes ngây thơ, phân tích phân biệt tuyến tính (Fisher), hồi quy logistic polytomous, vv, bị phá vỡ và thất bại.Y y i j = + 1 i jY=XβYyij=+1ijyij=1

Đối với thuật ngữ, bạn có thể giải quyết vấn đề có nhiều trọng số lớp hơn trong bối cảnh "tỷ lệ thấp hơn của các đối tượng trong các lớp nhất định" hoặc "kích thước lớp gần bằng không". Skew có xu hướng được sử dụng để mô tả phân phối các giá trị của một tính năng, như trong độ nghiêng, đuôi béo, v.v.

Bạn có bao nhiêu tính năng? Bạn đã thử phân cụm không giám sát (khám phá lớp) trên 100.000 đối tượng trước khi thử phân loại có giám sát (dự đoán lớp) với SVM? Có thể 100.000 đối tượng có thể được nhóm thành ít hơn 50 lớp, trong đó thành viên lớp mới có thể được sử dụng làm lớp mục tiêu trong quá trình phân tích phân loại. Điều này có thể làm giảm bớt vấn đề có quy mô lớp gần như bằng không.


1

Tôi đã phải đối mặt với vấn đề này nhiều lần trong khi sử dụng SVM với kernel Rbf. Sử dụng kernel tuyến tính thay vì kernel Rbf đã giải quyết vấn đề của tôi, nhưng tôi đã xử lý số lớp ít hơn. Các kết quả ít bị sai lệch và chính xác hơn với hạt nhân tuyến tính. Hy vọng điều này sẽ giải quyết vấn đề của bạn.

Chỉnh sửa: Trong khi tôi viết câu trả lời ban đầu, tôi đủ ngây thơ để không xem trọng số của các lớp là một trong số chúng trả lời đúng. Ngoài ra, trong khi sử dụng kernel rbf, điều quan trọng là phải đảm bảo rằng tham số hình phạt hoặc giá trị 'C' theo mô-đun svm của sklearn là quá chung chung. Tôi thấy rằng giá trị mặc định của C = 1 là quá chung chung và tôi thường kết thúc với giá trị C = 10000. Hy vọng điều này sẽ giúp những người khác nhận được kết quả sai lệch với svm (rbf) mặc dù có phân phối tốt các lớp trong dữ liệu.


Cảm ơn vi đa trả lơi! Tôi thực sự đã thử rất nhiều thuật toán / hạt nhân khác và vẫn có cùng loại vấn đề. Vì vậy, tôi đang tìm kiếm nhiều hơn một cách tiếp cận như gạch dưới hoặc một số cách để thậm chí ra các lớp.
mike1886

Ok, bạn cũng có thể muốn thử sao chép các hàng cho các lớp chứa dữ liệu thưa thớt, mặc dù nó chỉ hữu ích nếu các tính năng của dữ liệu thưa thớt thực sự tốt.
dùng776193
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.