Tôi đang gặp rất nhiều khó khăn khi hiểu cách class_weight
tham 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 C
tham số cũng như class_weight
tham số. Để dịch tỷ lệ n: m của các mẫu đào tạo âm: dương của class_weight
tô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 None
và 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_weight
ngoạ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_weight
từ điển là sai. Thật thú vị, class_weight
giá 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 C
và 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_weight
từ đ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ì
auto
giá trị củaclass_weight
là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õ?