Python: Xử lý các lớp mất cân bằng trong python Machine Learning


9

Tôi có một bộ dữ liệu mà tôi đang cố gắng dự đoán các biến mục tiêu.

Col1    Col2    Col3    Col4    Col5    
  1      2       23      11     1
  2      22      12      14     1
  22     11      43      38     3
  14     22      25      19     3
  12     42      11      14     1
  22     11      43      38     2
  1      2       23      11     4
  2      22      12      14     2
  22     11      43      38     3

Tôi đã cung cấp một dữ liệu mẫu, nhưng tôi có hàng ngàn hồ sơ được phân phối theo cách tương tự. Ở đây, Col1, Col2, Col3, Col4 là các tính năng của tôi và Col5 là biến mục tiêu. Do đó dự đoán nên là 1,2,3 hoặc 4 vì đây là các giá trị của tôi cho biến mục tiêu. Tôi đã thử sử dụng các thuật toán như rừng ngẫu nhiên, cây quyết định, vv để dự đoán.

Ở đây nếu bạn thấy, các giá trị 1,2 và 3 xảy ra nhiều lần hơn so với 4. Do đó, trong khi dự đoán, mô hình của tôi thiên về 1 2 và 3 trong khi tôi chỉ nhận được số lượng dự đoán ít hơn cho 4 (Chỉ có 1 dự đoán cho chính sách4 trong số hàng ngàn hồ sơ khi tôi thấy ma trận nhầm lẫn).

Để làm cho mô hình của tôi tổng quát hóa, tôi đã loại bỏ phần trăm dữ liệu bằng nhau thuộc về giá trị 1,2 và 3 một cách ngẫu nhiên. Tôi được nhóm theo từng giá trị trong Col5 và sau đó xóa phần trăm nhất định, để tôi giảm số lượng hồ sơ. Bây giờ tôi có thể thấy sự gia tăng nhất định về tỷ lệ chính xác và mức tăng dự đoán hợp lý cho giá trị 4 trong ma trận nhầm lẫn.

Đây có phải là cách tiếp cận phù hợp để xử lý (loại bỏ dữ liệu ngẫu nhiên khỏi các nhóm mà mô hình bị sai lệch)?

Tôi đã thử các thuật toán python dựng sẵn như Adaboost, các kỹ thuật GradientBoost bằng sklearn. Tôi đọc các thuật toán này là để xử lý lớp mất cân bằng. Nhưng tôi không thể thành công trong việc cải thiện độ chính xác của mình, thay vào đó bằng cách xóa ngẫu nhiên dữ liệu, nơi tôi có thể thấy một số cải tiến.

Đây có phải là giảm kỹ thuật lấy mẫu và đây có phải là phương pháp phù hợp để lấy mẫu dưới?

Có bất kỳ gói được xác định trước nào trong sklearn hoặc bất kỳ logic nào tôi có thể thực hiện trong python để thực hiện việc này không, nếu loại bỏ ngẫu nhiên của tôi là sai?

Ngoài ra, tôi đã học về kỹ thuật SMOTE, liên quan đến quá khổ. Tôi có nên thử cái này cho giá trị 4 không? Và chúng ta có thể làm điều này bằng cách sử dụng bất kỳ gói dựng sẵn nào trong python không? Sẽ thật tuyệt nếu ai đó giúp tôi trong tình huống này.

Câu trả lời:


5

Bài viết này đề nghị sử dụng xếp hạng (tôi đã viết nó). Thay vì sử dụng trực tiếp, ví dụ, SVM, bạn sẽ sử dụng RankSVM. Vì xếp hạng so sánh quan sát với quan sát, đào tạo là nhất thiết phải cân bằng. Tuy nhiên, có hai "buts": đào tạo chậm hơn rất nhiều, và cuối cùng, những gì các mô hình này làm là xếp hạng các quan sát của bạn từ khả năng chúng thuộc về một lớp đến khả năng chúng thuộc về một lớp khác như thế nào bạn cần áp dụng một ngưỡng sau đó.

Nếu bạn định sử dụng tiền xử lý để khắc phục sự mất cân bằng của mình, tôi sẽ đề nghị bạn xem xét về MetaCost . Thuật toán này liên quan đến việc xây dựng một mô hình đóng gói và sau đó thay đổi các thầy tu lớp để làm cho chúng cân bằng dựa trên các trường hợp khó dự đoán. Nó rất thanh lịch. Điều thú vị về các phương pháp như SMOTE là bằng cách chế tạo các quan sát mới, bạn có thể làm cho các bộ dữ liệu nhỏ mạnh mẽ hơn.

Nhưng dù sao, mặc dù tôi đã viết một số điều về sự mất cân bằng trong lớp, tôi vẫn hoài nghi rằng đó là một vấn đề quan trọng trong thế giới thực. Tôi sẽ nghĩ rằng rất hiếm khi bạn có các linh mục mất cân bằng trong tập huấn luyện của bạn, nhưng các linh mục cân bằng trong dữ liệu thế giới thực của bạn. Phải không Điều thường xảy ra là lỗi loại I khác với lỗi loại II và tôi cá rằng hầu hết mọi người sẽ tốt hơn khi sử dụng ma trận chi phí, điều mà hầu hết các phương pháp đào tạo chấp nhận hoặc bạn có thể áp dụng nó bằng cách xử lý trước bằng MetaCost hoặc SMOTE. Tôi nghĩ nhiều lần "sửa chữa mất cân bằng" là ngắn gọn "Tôi không muốn bận tâm suy nghĩ về sự đánh đổi tương đối giữa các lỗi loại I và II."

Phụ lục:

Tôi đã thử các thuật toán python dựng sẵn như Adaboost, các kỹ thuật GradientBoost bằng sklearn. Tôi đọc các thuật toán này là để xử lý lớp mất cân bằng.

AdaBoost cho kết quả tốt hơn cho sự mất cân bằng trong lớp khi bạn khởi tạo phân phối trọng lượng với sự mất cân bằng trong tâm trí. Tôi có thể đào luận án nơi tôi đọc nó nếu bạn muốn.

Dù sao đi nữa, tất nhiên, những phương pháp đó sẽ không cho độ chính xác tốt. Bạn có mất cân bằng lớp trong cả đào tạo và dữ liệu xác nhận của bạn? Bạn nên sử dụng các số liệu như điểm F1 hoặc truyền ma trận chi phí cho hàm chính xác. Mất cân bằng lớp học "sửa chữa" là khi các linh mục của bạn khác nhau trong đào tạo và các trường hợp xác nhận của bạn.


4

Một số thuật toán của sklearn có một tham số gọi là class_ weight mà bạn có thể đặt thành "cân bằng" . Bằng cách đó, sklearn sẽ điều chỉnh trọng lượng lớp của nó tùy thuộc vào số lượng mẫu mà bạn có của mỗi lớp.

Đối với trình phân loại rừng ngẫu nhiên, hãy thử cách sau và xem liệu nó có cải thiện điểm số của bạn không:

rf = RandomForestClassifier(class_weight="balanced") # also add your other parameters!

(class_ weight = "cân bằng") không mang lại sự cải thiện đầy đủ khi tôi cố gắng sử dụng nó
SRS

2
class_weightkCk= =2NkNsample_weight=[C_k for k in y]accuracy_scoref1_score

2

Vâng, đây là một kỹ thuật tốt để giải quyết vấn đề mất cân bằng giai cấp. Tuy nhiên, các phương pháp lấy mẫu dưới mức dẫn đến việc mất thông tin trong tập dữ liệu (giả sử bạn chỉ xóa một mẫu thú vị trong số các biến còn lại, điều này có thể góp phần đào tạo mô hình tốt hơn). Đây là lý do tại sao các phương pháp lấy mẫu quá mức được ưa thích, đặc biệt trong trường hợp tập dữ liệu nhỏ hơn.

Đáp lại truy vấn của bạn về các gói Python, hộp công cụ tìm hiểu mất cân bằng được dành riêng cho cùng một tác vụ. Nó cung cấp một số phương pháp lấy mẫu dưới và lấy mẫu quá mức. Tôi khuyên bạn nên thử kỹ thuật SMOTE .


1

Nó phụ thuộc vào kỹ thuật tập hợp bạn muốn sử dụng. Vấn đề cơ bản mà bạn đang làm việc với vấn đề mất cân bằng dữ liệu nhiều lớp. Theo lấy mẫu có thể được sử dụng hiệu quả trong đóng bao cũng như trong các kỹ thuật tăng cường. Thuật toán SMOTE rất hiệu quả trong việc tạo mẫu mới. Vấn đề mất cân bằng dữ liệu đã được nghiên cứu rộng rãi trong tài liệu. Tôi khuyên bạn nên đọc về một trong những thuật toán sau: SMOTE-Boost SMOTE-Bagging Rus-Boost EusBoost Đây là những kỹ thuật tăng / đóng bao được thiết kế dành riêng cho vấn đề mất cân bằng dữ liệu. Thay vì SMOTE, bạn có thể thử ADA-SMOTE hoặc Border-Line SMOTE. Tôi đã sử dụng và sửa đổi SM-Border-Line cho nhiều lớp và nó rất hiệu quả. Nếu cơ sở dữ liệu của bạn rất lớn và vấn đề dễ dàng hãy thử: viola - phân loại jones. Tôi cũng đã sử dụng với vấn đề mất cân bằng dữ liệu và nó thực sự hiệu quả


Cảm ơn đã hướng dẫn. Tôi đang xem xét các chủ đề được đề cập bởi bạn. Nhưng kỹ thuật mà tôi đã sử dụng để gạch dưới (giảm dữ liệu ngẫu nhiên) là một cách làm đúng đắn?
SRS

Bạn có thể sử dụng nó nếu cơ sở dữ liệu của bạn rất lớn. Nhưng nếu cơ sở dữ liệu của bạn nhỏ, bạn sẽ mất một số thông tin. Đọc phần Tăng tốc, trong phương pháp này, họ sử dụng ngẫu nhiên khi lấy mẫu như một phần của thuật toán tăng cường để tránh mất thông tin. Họ theo mẫu tập hợp con sẽ được sử dụng để đào tạo người học cơ sở tiếp theo nhưng không phải toàn bộ cơ sở dữ liệu
Bashar Haddad

Tập dữ liệu của tôi có gần 80k hồ sơ mà tôi đang sử dụng nó làm tập huấn luyện. Tôi đang thực hiện điều này trong python. Tôi đang tìm kiếm một số gói trong sklearn hoặc một cái gì đó khác trong python. Tôi không thể tìm thấy chúng. Đây có phải là một cái gì đó mà tôi nên có một số logic tại chỗ để thực hiện chúng?
SRS

Tôi không nghĩ rằng có bất kỳ triển khai cho các phương pháp này. Vấn đề mất cân bằng dữ liệu vẫn đang được nghiên cứu. Nếu bạn có một triển khai tốt cho Adaboost.M1 hoặc M2. Bạn có thể dễ dàng sửa đổi nó để trở thành Rus Boost
Bashar Haddad

Tôi nghĩ rằng cơ sở dữ liệu bạn có khá lớn và nếu bạn muốn bạn có thể sử dụng trình phân loại viola - jones. Đối với điều này, bạn có thể tìm thấy triển khai có sẵn
Bashar Haddad

0

Đã có một số câu trả lời tốt ở đây. Tôi chỉ nghĩ rằng tôi sẽ thêm một kỹ thuật nữa kể từ khi bạn muốn sử dụng các nhóm cây. Trong nhiều trường hợp, bạn đang tìm cách tối ưu hóa đường cong Nâng hoặc AUC cho ROC. Đối với điều này, tôi muốn giới thiệu tiêu chí khoảng cách Hellinger để chia các nhánh trong cây của bạn. Tại thời điểm viết bài này, nó không nằm trong gói tìm hiểu mất cân bằng nhưng có vẻ như có một kế hoạch .


0

Khi xử lý vấn đề mất cân bằng lớp, bạn chủ yếu nên tập trung vào số liệu lỗi và bạn nên chọn điểm F1 làm chỉ số lỗi.

Sau khi chọn số liệu chính xác, chúng tôi có thể sử dụng các Kỹ thuật khác nhau để xử lý vấn đề này.

Nếu quan tâm bạn có thể xem blog sau, nó được giải thích rất độc đáo về các kỹ thuật được sử dụng để giải quyết vấn đề mất cân bằng lớp này:

https://ledgeledgengg.wordpress.com/2019/03/04/this-is-suresh/

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.