RandomForest của R không thể xử lý hơn 32 cấp độ. Cách giải quyết là gì?


22

Gói RandomForest của R không thể xử lý hệ số với hơn 32 cấp độ. Khi được đưa ra hơn 32 cấp độ, nó sẽ phát ra một thông báo lỗi:

Không thể xử lý các dự đoán phân loại với hơn 32 loại.

Nhưng dữ liệu tôi có một số yếu tố. Một số trong số họ có hơn 1000 cấp độ và một số trong số họ có hơn 100 cấp độ. Nó thậm chí còn có 'trạng thái' của các quốc gia thống nhất là 52.

Vì vậy, đây là câu hỏi của tôi.

  1. Tại sao có giới hạn như vậy? RandomForest từ chối chạy ngay cả đối với trường hợp đơn giản.

    > d <- data.frame(x=factor(1:50), y=1:50)
    > randomForest(y ~ x, data=d)
      Error in randomForest.default(m, y, ...) : 
      Can not handle categorical predictors with more than 32 categories.
    

    Nếu nó chỉ đơn giản là do giới hạn bộ nhớ, làm thế nào scikit có thể tìm hiểu RandomForeestRegressor với hơn 32 cấp độ?

  2. Cách tốt nhất để xử lý vấn đề này là gì? Giả sử rằng tôi có các biến độc lập X1, X2, ..., X50 và Y là biến phụ thuộc. Và giả sử rằng X1, X2 và X3 có hơn 32 cấp độ. Tôi nên làm gì?

    Điều tôi nghĩ là đang chạy thuật toán phân cụm cho từng X1, X2 và X3 trong đó khoảng cách được xác định là khác nhau trong Y. Tôi sẽ chạy ba cụm vì có ba biến có vấn đề. Và trong mỗi cụm, tôi ước tôi có thể tìm thấy các cấp độ tương tự. Và tôi sẽ hợp nhất chúng.

    Làm thế nào để âm thanh này?


Tìm kiếm trên web với tên gói và thông báo lỗi cung cấp một số câu trả lời.
Roland

5
@Roland Thật ra nó dẫn tôi đến đây
isomorphismes

1
bạn có thể thử khoa học dữ liệu vì một số bộ óc thống kê có kinh nghiệm lập trình cho dữ liệu với nhiều chiều.
aeroNotAuto

2
CẬP NHẬT: Kể từ phiên bản 4.6-9, randomForestcó thể xử lý các dự đoán phân loại với tối đa 53 cấp độ. Tin tức
Ben

Làm thế nào để rừng ngẫu nhiên của R xác định số lượng cấp độ? Tôi đoán cấp có nghĩa là thể loại.
ajp

Câu trả lời:


25

Nó thực sự là một ràng buộc khá hợp lý bởi vì sự phân chia trên một yếu tố với mức thực sự là một lựa chọn của một trong kết hợp có thể. Vì vậy, ngay cả với như 25, không gian của các kết hợp là rất lớn đến mức suy luận như vậy có ý nghĩa nhỏ.N2N-2N

Hầu hết các triển khai khác chỉ đơn giản coi yếu tố là một thứ tự (tức là số nguyên từ 1 đến ), và đây là một lựa chọn làm thế nào bạn có thể giải quyết vấn đề này. Trên thực tế RF thường đủ khôn ngoan để cắt điều này thành các nhóm tùy ý với một số phân tách.N

Tùy chọn khác là thay đổi đại diện - có thể kết quả của bạn không phụ thuộc trực tiếp vào thực thể nhà nước, nhưng, ví dụ, diện tích, dân số, số cây thông trên đầu người hoặc (các) thuộc tính khác mà bạn có thể cắm vào hệ thống thông tin của mình.

Cũng có thể là mỗi tiểu bang là một thực thể cô lập và không tương quan đến mức nó đòi hỏi một mô hình riêng cho chính nó.

Phân cụm dựa trên một quyết định có lẽ là một ý tưởng tồi bởi vì cách này bạn đang chuyển thông tin từ quyết định thành các thuộc tính, thường kết thúc bằng việc thừa.


4
Nó có thể dễ dàng di chuyển xung quanh, mặc dù trong một cách hơi tẻ nhạt. Ví dụ: nếu bạn có từ 33 đến 1024 cấp, hãy tạo hai yếu tố cho mỗi cấp độ <= 32.
KalEl

15

Lý do chính là cách RandomForest được thực hiện. Việc thực hiện từ R tuân theo rất nhiều từ thông số kỹ thuật ban đầu của Breiman. Điều quan trọng ở đây cần lưu ý là đối với các biến nhân tố / phân loại, tiêu chí phân chia là nhị phân với một số giá trị nhãn ở bên trái và các giá trị nhãn còn lại ở bên phải.

01[0;2M-1]

Tại sao các triển khai từ Weka và Python hoạt động?

Việc triển khai weka không sử dụng cây GIỎI theo mặc định. Nó sử dụng các cây C45 không có vấn đề tính toán này, vì đối với các đầu vào phân loại, nó phân chia thành nhiều nút, một cho mỗi giá trị cấp.

Việc thực hiện rừng ngẫu nhiên python không thể sử dụng các biến phân loại / yếu tố. Bạn phải mã hóa các biến đó thành các biến giả hoặc biến số.

M


2
Cảm ơn rất nhiều! Có phải từ câu trả lời của bạn rằng việc triển khai R để xử lý các giá trị phân loại là vượt trội so với Python (Tôi nhớ Max Kuhn đã đề cập đến việc phân nhóm các biến phân loại cho RF cung cấp kết quả tốt hơn một chút so với việc làm mờ chúng) hoặc tại Khu rừng ngẫu nhiên ít chạy nhất trong R vs. Python Tôi có cơ hội rất tốt để nhận được kết quả khác nhau (độ chính xác, v.v ...)? Từ kinh nghiệm của bạn, khi lập mô hình, có ý nghĩa gì khi thử cả hai nhóm vars (trong R) và làm mờ chúng và sau đó so sánh hai cách tiếp cận?
Sergey Bushmanov

2
Mã hóa giả hoạt động nhưng nó chỉ có thể tạo ra một loại so với tất cả. Sau khi các biến mã hóa được kiểm tra một lần tại một thời điểm. Vì vậy, không thể thực hiện hai lần. Nếu tính năng này có thể giúp ích, tôi nghĩ rằng thực tế không có sự khác biệt lớn. Tuy nhiên, có những thứ khác có thể đòi hỏi sự chú ý khi làm việc với tầm quan trọng khác nhau: một số triển khai được thiên về phân loại với nhiều cấp độ. Xem các giấy tờ của Carolin Strobl để biết chi tiết: statistik.uni-dortmund.de/useR-2008/slides/Strobl+Zeileis.pdf . Trong R có một số triển khai không có sai lệch này.
rapaio

2

Bạn có thể thử biểu diễn một cột khác nhau. Bạn có thể biểu thị cùng một dữ liệu như một khung dữ liệu thưa thớt.

Mã khả thi tối thiểu;

example <- as.data.frame(c("A", "A", "B", "F", "C", "G", "C", "D", "E", "F"))
names(example) <- "strcol"

for(level in unique(example$strcol)){
      example[paste("dummy", level, sep = "_")] <- ifelse(example$strcol == level,     1, 0)
}

Lưu ý cách mỗi giá trị trong cột ban đầu trở thành một cột giả riêng biệt.

Mã ví dụ mở rộng hơn;

set.seed(0)
combs1 = sample.int(33, size= 10000, replace=TRUE)
combs2 = sample.int(33, size= 10000, replace=TRUE)
combs3 = combs1 * combs2 + rnorm(10000,mean=0,100)
df_hard = data.frame(y=combs3, first=factor(combs1), second=factor(combs2))

for(level in unique(df_hard$first)){
    df_hard[paste("first", level, sep = "_")] <- ifelse(df_hard$first == level, 1, 0)
}

for(level in unique(df_hard$second)){
    df_hard[paste("second", level, sep = "_")] <- ifelse(df_hard$second == level, 1, 0)
}

example$first <- NULL
example$second <- NULL

rf_mod = randomForest( y ~ ., data=example )

Mặc dù đoạn mã này cho thấy bạn thực sự sẽ không còn gặp lỗi nữa, bạn sẽ nhận thấy rằng thuật toán RandomForest bây giờ cần một thời gian dài trước khi nó kết thúc. Điều này là do hạn chế của CPU, bạn cũng có thể lập bản đồ giảm tác vụ này thông qua lấy mẫu.

Để biết thêm thông tin xin vui lòng kiểm tra blogpost này:

https://blog.cloudera.com/blog/2013/02/how-to-resample-from-a-large-data-set-in-pool-with-r-on-hadoop/


Khối mã thứ hai trông có vẻ khó hiểu, Mặc dù bạn sử dụng df_hard trên toàn bộ cơ thể, ở các dòng cuối cùng, bạn đặt "đầu tiên" và "thứ hai" thành NULL và cũng sử dụng "ví dụ" làm dữ liệu cho RandomForest, điều này không có nghĩa tôi, vì không có kết nối giữa ví dụ và df_hard.
Özgür

Vincent, bạn không cảm thấy tôi sẽ gặp rắc rối lớn như vậy nếu tôi có cấp độ của đơn hàng 100+, bạn có đề nghị thêm từng cột làm đầu vào ngẫu nhiên không?
Hardik Gupta

Một cách khác là sử dụng triển khai ngẫu nhiên trong h2o; điều này có hỗ trợ tốt hơn cho các bộ dữ liệu lớn. Tôi không hiểu bit "thêm từng cột làm đầu vào ngẫu nhiên".
Vincent Warmerdam

0

Bạn có thể sử dụng gói ExtraTrees thay thế. Thuật toán rừng ngẫu nhiên cực kỳ không thử bất kỳ điểm dừng / phân tách nào, mà chỉ là một tập hợp con ngẫu nhiên giới hạn của các phần tách.


1
ExtraTrees có giới hạn, theo nghĩa đầu vào của bạn phải là một ma trận dữ liệu số phải không?
Hardik Gupta

0

Một tùy chọn khác: tùy thuộc vào số lượng cấp độ và số lượng quan sát trong dữ liệu của bạn, bạn có thể hợp nhất một số cấp độ. Ngoài việc vượt quá giới hạn, nó có thể làm giảm phương sai nếu bạn có nhiều cấp độ chỉ với một vài quan sát. Hadleyforcats: fct_lump thực hiện điều này.

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.