Cải thiện phân loại với nhiều biến phân loại


37

Tôi đang làm việc trên một tập dữ liệu với hơn 200.000 mẫu và khoảng 50 tính năng cho mỗi mẫu: 10 biến liên tục và ~ 40 biến khác là các biến phân loại (quốc gia, ngôn ngữ, lĩnh vực khoa học, v.v.). Đối với các biến phân loại này, bạn có ví dụ 150 quốc gia khác nhau, 50 ngôn ngữ, 50 lĩnh vực khoa học, v.v ...

Cho đến nay cách tiếp cận của tôi là:

  1. Đối với mỗi biến phân loại có nhiều giá trị có thể, chỉ lấy một biến có hơn 10000 mẫu lấy giá trị này. Điều này giảm xuống 5-10 loại thay vì 150.

  2. Xây dựng biến giả cho mỗi loại phân loại (nếu 10 quốc gia sau đó cho mỗi mẫu thêm một vectơ nhị phân có kích thước 10).

  3. Cung cấp một trình phân loại rừng ngẫu nhiên (xác thực chéo các tham số, v.v.) với dữ liệu này.

Hiện tại với phương pháp này, tôi chỉ quản lý để có được độ chính xác 65% và tôi cảm thấy có thể làm được nhiều hơn thế. Đặc biệt là tôi không hài lòng với 1) vì tôi cảm thấy mình không nên tự ý loại bỏ "các giá trị ít liên quan nhất" theo số lượng mẫu mà họ có, bởi vì các giá trị ít đại diện này có thể phân biệt đối xử hơn. Mặt khác, RAM của tôi không đủ khả năng thêm 500 cột * 200000 hàng vào dữ liệu bằng cách giữ tất cả các giá trị có thể.

Bạn có gợi ý nào để đối phó với các biến phân loại này không?


2
Nếu bạn vẫn quan tâm, bạn có thể muốn kiểm tra câu trả lời của tôi về giảm kích thướccâu trả lời của tôi về phân loại phân cấp .
Alexanderr Blekh

1
Khi bạn nói "xây dựng biến giả cho từng loại phân loại" , có vẻ như bạn đang sử dụng Python chứ không phải R? R ngẫu nhiên có thể xử lý tự nhiên các phân loại, cũng như giảm bộ nhớ. Hãy thử R.
smci

Câu trả lời:


20

1) Các khu rừng ngẫu nhiên sẽ có thể xử lý các giá trị phân loại nguyên bản để tìm kiếm một triển khai khác để bạn không phải mã hóa tất cả các tính năng đó và sử dụng hết bộ nhớ của mình.

2) Vấn đề với các tính năng phân loại cardinality cao là nó rất dễ phù hợp với chúng. Bạn có thể có đủ dữ liệu rằng đây không phải là vấn đề nhưng hãy coi chừng.

3) Tôi đề nghị xem xét lựa chọn tính năng dựa trên rừng ngẫu nhiên bằng cách sử dụng phương pháp Brieman đề xuất hoặc tương phản nhân tạo . Phương pháp tương phản nhân tạo (ACE) rất thú vị bởi vì nó so sánh tầm quan trọng của tính năng với tầm quan trọng của phiên bản được xáo trộn của chính nó để chống lại một số vấn đề về tim mạch cao. Có một bài báo mới "Rừng ngẫu nhiên có hướng dẫn mô-đun" có thể thú vị nếu bạn có nhiều tính năng hơn vì nó sử dụng phương pháp chọn tính năng nhận biết các nhóm tính năng có tương quan cao.

4) Một tùy chọn khác được sử dụng đôi khi là điều chỉnh thuật toán để nó sử dụng các trường hợp bỏ túi để thực hiện lựa chọn tính năng cuối cùng sau khi lắp các phần tách trên vỏ trong túi đôi khi giúp chống lại quá mức.

Có một triển khai ace gần như hoàn chỉnh ở đây và tôi có một triển khai rf nhanh hơn / nhanh hơn bộ nhớ xử lý các biến phân loại nguyên gốc ở đây ... tùy chọn -evaloob hỗ trợ tùy chọn 4 Tôi đang làm việc để thêm hỗ trợ cho ACE và một vài rf khác phương pháp lựa chọn tính năng dựa trên nhưng nó chưa được thực hiện.


4
Tất cả những gợi ý này đều thú vị, tôi đồng ý rằng rừng ngẫu nhiên sẽ xử lý các biến phân loại nguyên bản, nhưng scikit-learn không ... Tôi nghĩ đó là một trong những lỗ hổng chính của scikit. Tôi sẽ thử mã của bạn trên dữ liệu của tôi để xem điều gì xảy ra và tôi sẽ thấy về các đề xuất khác của bạn!
Bertrand R

1
Hãy thử thực hiện R. Chạy nó là một lót. Đọc dữ liệu cực kỳ dễ dàng và có một triển khai paralell mới rất nhanh và hiệu quả về bộ nhớ: mặt khác, r-bloggers.com/. Mặt khác. Các lớp học của bạn mất cân bằng? trong triển khai r, bạn có thể phát triển mỗi cây từ một mẫu bootstrap cân bằng sampize = c (x, x). Điều này đã tạo ra phân loại nhị phân tốt hơn cho tôi. Bạn có thể chơi xung quanh với các kích thước và điều chỉnh phân loại rất dễ dàng bằng cách sử dụng đầu ra ma trận nhầm lẫn OOB.
JEquihua

2
Việc triển khai RandomForest của R cho phép các yếu tố có tối đa 32 cấp độ. scikit-learn ít hạn chế hơn, cung cấp cho bạn trước tiên tạo các biến giả (xem pandas.get_dummieshàm). Việc triển khai rừng ngẫu nhiên của H2O đã thực hiện rất tốt đối với tôi (xem 0xdata.com/docs/master/model/rf ).
Alex Woolford

1
có một triển khai rừng ngẫu nhiên mới hơn và nhanh hơn, gói được gọi là kiểm lâm. Công cụ tuyệt vời thực sự. Đơn đặt hàng có cường độ nhanh hơn và không có giới hạn 32 cấp.
marbel

6

Thay vì làm mờ các danh mục của bạn, tại sao bạn không sử dụng một biến số duy nhất cho mỗi danh mục? Trong bối cảnh của các khu rừng ngẫu nhiên, tôi thường tự hỏi về hậu quả của việc đó (vì tôi đồng ý rằng việc đưa ra quy tắc trong dữ liệu phân loại mà nếu thường không có ý nghĩa), nhưng thực tế (ít nhất là trong thực tế với việc triển khai các chương trình RF mà tôi đã sử dụng), tôi thường quan sát thấy rằng nó không tạo ra sự khác biệt về kết quả (mặc dù tôi không chắc tại sao).


1
Điều này tốt cho các tính năng phân loại với n <= 3 vì bạn có thể tạo tất cả các phân chia giống như bạn muốn bằng cách xem xét tính năng tự nhiên là phân loại. Đối với n lớn hơn, có thể đạt được các bộ chia tương đương với phân chia phân loại nhưng thuật toán có thể hoặc không thể tìm thấy chúng một cách hiệu quả ... tuy nhiên nếu bạn chia tính năng thành n tính năng số, bạn cũng sẽ giảm hiệu quả thuật toán có thể tìm thấy sự phân chia. Ai đó cần thêm hỗ trợ biến phân loại vào triển khai scikit-learn vì nó rất tuyệt.
Ryan Bressler

Tôi đồng ý với bạn khi bạn nói rằng nghe có vẻ đáng nghi khi giới thiệu quy tắc trong dữ liệu phân loại ... Tôi không phải làm như vậy, nhưng ít nhất tôi có thể thử và xem điều gì sẽ xảy ra!
Bertrand R

4
Tôi đã có một cuộc thảo luận dài về câu hỏi này trong danh sách gửi thư của sklearn (bạn có thể đọc các phần của nó ở đây: mail-archive.com/scikit-learn-general@lists.sourceforge.net/ít ). Ý kiến ​​của một trong những người thực hiện là với những cây đủ sâu, các tính năng phân loại được mã hóa theo quy tắc có thể hoạt động tốt một cách hợp lý (ngoài hiệu quả tính toán hơn). Dù sao, nếu bạn thử nó, tôi rất muốn nghe về kết quả / kết luận của bạn, vì đây là vấn đề tôi tiếp tục gặp phải.
cjauvin

1
Vì vậy, tôi đã cố gắng giữ một biến số duy nhất cho các biến phân loại và nó thực sự hoạt động tốt một cách đáng ngạc nhiên, và tốt hơn nhiều so với việc thêm một số lượng lớn các mục nhị phân ... Tôi cũng đã cố gắng sắp xếp các giá trị theo wrt trung bình của chúng vào mục tiêu . Và nó cũng hoạt động tốt
Bertrand R

Tôi thực sự không ngạc nhiên về điều đó .. nó phù hợp với những gì tôi đã quan sát thấy trong một vài cài đặt khác nhau, mặc dù đánh giá theo số lượng upvote, đây là một ý tưởng khá phản trực giác.
cjauvin

5

Tôi nghĩ bạn nên xem xét một / nhiều kỹ thuật giảm biến . Nó được loại bỏ các dự đoán không quá ảnh hưởng.

Tôi đã đọc rất nhiều về xử lý trước dữ liệu và đó là một giải pháp tuyệt vời để giảm n ° các biến của bạn.

Đề xuất của tôi như sau:

  • đối với các biến định tính , thay thế các giá trị bị thiếu bằng danh mục "mất tích". Nó có thể đưa ra sự thiên vị nếu dữ liệu không bị mất một cách ngẫu nhiên, nhưng ít nhất bạn sẽ có tất cả các quan sát của mình nguyên vẹn và sự thiếu sót có thể tiết lộ một hành vi khác.
  • loại bỏ các yếu tố dự báo phương sai bằng 0 hoặc các yếu tố dự đoán phương sai gần bằng 0 (cẩn thận không loại bỏ các biến giả với các danh mục không cân bằng cao có thể phân tách Y của bạn một cách hiệu quả. Tạo một số biểu đồ cho các biến bạn nghĩ có thể quan trọng). Trong R, bạn có thể sử dụng 'nzv'hàm từ 'caret'gói. Điều này sẽ làm giảm đáng kể kích thước dữ liệu của bạn.
  • loại bỏ các yếu tố dự đoán tương quan . Sử dụng ma trận tương quan của Kendall vì nó phù hợp hơn để xây dựng với sự có mặt của các biến phân loại. Nhược điểm là bạn phải chuyển đổi tất cả các lọ danh nghĩa của bạn thành các loại phân loại.
  • các phương pháp lựa chọn tính năng sẽ giảm số lượng của chúng thậm chí nhiều hơn (phân cụm - bạn chọn một đại diện duy nhất của mỗi cụm, hồi quy LASSO, v.v ...). Tôi chưa có cơ hội kiểm tra chúng vì các bước khác đã giảm các biến của tôi xuống dưới 100.

Ngoài ra, tôi sẽ đề nghị sử dụng thuật toán AdaBoost thay vì RF. Cá nhân, các nghiên cứu mà tôi đã thực hiện đã cho tôi các hệ số Gini rất giống nhau cho cả hai phương pháp này. Điểm hay của AdaBoost là trong R, nó xử lý các quan sát bị thiếu. Vì vậy, bạn có thể bỏ qua bước 1 của danh sách này

Tôi hy vọng nó sẽ giúp một chút. Chúc may mắn


4

Bạn có thể muốn xem xét các mô hình hiệu ứng hỗn hợp. Chúng phổ biến trong khoa học xã hội do hiệu suất của chúng trên dữ liệu phân loại cardinality cao và tôi đã sử dụng chúng để tạo ra các mô hình dự đoán tuyệt vời vượt trội so với các phương pháp học máy phổ biến như cây tăng cường độ dốc, rừng ngẫu nhiên và hồi quy logistic thường xuyên. Việc triển khai nổi tiếng nhất là gói lme4 của R; chức năng bạn sử dụng để phân loại là glmer, thực hiện hồi quy logistic hiệu ứng hỗn hợp. Bạn có thể gặp vấn đề với việc chia tỷ lệ cho tập dữ liệu của mình, nhưng tôi đã thực hiện 80 nghìn hàng với 15 tính năng mà không gặp quá nhiều khó khăn.


2
  1. Khi bạn nói "xây dựng biến giả cho từng loại phân loại" , có vẻ như bạn đang sử dụng Python chứ không phải R? R ngẫu nhiên có thể xử lý tự nhiên các phân loại, cũng như giảm bộ nhớ. Hãy thử R.

  2. Tiếp theo, bạn không cần phải cắt tỉa / hợp nhất các mức phân loại theo cách thủ công, nghe có vẻ là một nỗi đau lớn. Và ngay cả khi bạn đã làm, bạn không được đảm bảo rằng các danh mục đông dân nhất là dự đoán nhất. Kiểm soát độ phức tạp ngẫu nhiên với kích thước nút tham số : bắt đầu với kích thước nút lớn và giảm dần nó (đây là tìm kiếm siêu tham số).

  3. Lựa chọn biến sẽ hữu ích. @lorelai đưa ra khuyến nghị tốt. Cố gắng loại bỏ các tính năng vô dụng (tầm quan trọng thấp hoặc tương quan cao). Xây dựng cây là bậc hai với số lượng các tính năng, vì vậy nếu bạn thậm chí loại bỏ một phần ba, nó sẽ trả cổ tức.


0

Bạn nên nhìn vào gói H2O.ai. Nó xử lý các biến phân loại ra khỏi hộp mà không phải thực hiện bất kỳ mã hóa nào (đảm bảo các biến là các yếu tố).

Tôi đặc biệt thích việc họ triển khai Gradient Boosted Machine (GBM) vì bạn có thể xem tầm quan trọng của biến sau khi xây dựng mô hình. GBM cũng có tính năng chống chịu quá mức.

Nếu bạn muốn khám phá các mô hình khác, họ có: GLM, Random Forest, Naive Bayes, Deep Learning, v.v.

Xem: http://docs.h2o.ai/h2o/latest-urdy/h2o-docs/data-science/gbm.html

Nó cũng dễ cài đặt (Windows, Linux, Mac) và dễ chạy với API bằng R, Python, Java và Scala.

Nó có thể sử dụng nhiều lõi để tăng tốc mọi thứ.

Trong tương lai gần, họ sẽ hỗ trợ GPU.

Nó cũng là nguồn mở và miễn phí (Có hỗ trợ Doanh nghiệp).

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.