Tôi đang gặp rất nhiều khó khăn khi hiểu cách class_weighttham số trong hồi quy logistic của scikit-learning hoạt động.
Tình huống
Tôi muốn sử dụng hồi quy logistic để thực hiện phân loại nhị phân trên một tập dữ liệu rất không cân bằng. Các lớp được dán nhãn 0 (tiêu cực) và 1 (dương tính) và dữ liệu quan sát được theo tỷ lệ khoảng 19: 1 với phần lớn các mẫu có kết quả âm tính.
Lần thử đầu tiên: Chuẩn bị thủ công dữ liệu đào tạo
Tôi chia dữ liệu tôi có thành các bộ rời rạc để đào tạo và thử nghiệm (khoảng 80/20). Sau đó, tôi lấy mẫu ngẫu nhiên dữ liệu đào tạo bằng tay để lấy dữ liệu đào tạo theo các tỷ lệ khác nhau so với 19: 1; từ 2: 1 -> 16: 1.
Sau đó, tôi đã đào tạo hồi quy logistic trên các tập con dữ liệu đào tạo khác nhau này và vẽ biểu đồ thu hồi (= TP / (TP + FN)) như một hàm của các tỷ lệ đào tạo khác nhau. Tất nhiên, việc thu hồi được tính toán trên các mẫu TEST rời rạc có tỷ lệ quan sát được là 19: 1. Lưu ý, mặc dù tôi đã huấn luyện các mô hình khác nhau trên các dữ liệu huấn luyện khác nhau, nhưng tôi đã tính toán thu hồi cho tất cả chúng trên cùng một dữ liệu thử nghiệm (rời rạc).
Kết quả đúng như mong đợi: tỷ lệ thu hồi là khoảng 60% ở tỷ lệ đào tạo 2: 1 và giảm khá nhanh vào thời điểm nó chuyển sang tỷ lệ 16: 1. Có một số tỷ lệ 2: 1 -> 6: 1 trong đó tỷ lệ thu hồi trên 5%.
Lần thử thứ hai: Tìm kiếm theo lưới
Tiếp theo, tôi muốn kiểm tra các thông số chính quy khác nhau và vì vậy tôi đã sử dụng GridSearchCV và tạo một lưới gồm một số giá trị của Ctham số cũng như class_weighttham số. Để dịch tỷ lệ n: m của các mẫu đào tạo âm: dương của class_weighttôi sang ngôn ngữ từ điển của tôi, tôi nghĩ rằng tôi chỉ cần chỉ định một số từ điển như sau:
{ 0:0.67, 1:0.33 } #expected 2:1
{ 0:0.75, 1:0.25 } #expected 3:1
{ 0:0.8, 1:0.2 } #expected 4:1
và tôi cũng bao gồm Nonevà auto.
Lần này kết quả hoàn toàn bất ngờ. Tất cả các lần thu hồi của tôi đều rất nhỏ (<0,05) cho mọi giá trị class_weightngoại trừ auto. Vì vậy, tôi chỉ có thể cho rằng hiểu biết của tôi về cách đặt class_weighttừ điển là sai. Thật thú vị, class_weightgiá trị của 'tự động' trong tìm kiếm lưới là khoảng 59% cho tất cả các giá trị của Cvà tôi đoán nó cân bằng thành 1: 1?
Những câu hỏi của tôi
Làm thế nào để bạn sử dụng đúng cách
class_weightđể đạt được sự cân bằng khác nhau trong dữ liệu đào tạo từ những gì bạn thực sự cung cấp? Cụ thể, tôi chuyển qua từ điển nàoclass_weightđể sử dụng tỷ lệ n: m của các mẫu đào tạo âm: dương?Nếu bạn chuyển nhiều
class_weighttừ điển khác nhau cho GridSearchCV, trong quá trình xác thực chéo, nó có cân bằng lại dữ liệu trong màn hình đào tạo theo từ điển nhưng sử dụng tỷ lệ mẫu thực cho trước để tính toán chức năng tính điểm của tôi trong màn hình thử nghiệm không? Điều này rất quan trọng vì bất kỳ số liệu nào chỉ hữu ích với tôi nếu nó đến từ dữ liệu theo tỷ lệ quan sát được.Gì
autogiá trị củaclass_weightlàm như xa như tỷ lệ? Tôi đọc tài liệu và tôi giả định rằng "cân bằng dữ liệu tỷ lệ nghịch với tần suất của chúng" chỉ có nghĩa là nó làm cho nó là 1: 1. Điều này có chính xác? Nếu không, ai đó có thể làm rõ?