Rừng ngẫu nhiên: làm thế nào để xử lý các cấp yếu tố mới trong bộ thử nghiệm?


13

Tôi đang cố gắng đưa ra dự đoán bằng mô hình rừng ngẫu nhiên trong R.

Tuy nhiên tôi gặp lỗi vì một số yếu tố có các giá trị khác nhau trong tập kiểm tra so với tập huấn luyện. Ví dụ: một yếu tố Cat_2có các giá trị 34, 68, 76, v.v., trong tập kiểm tra không xuất hiện trong tập huấn luyện. Thật không may, tôi không có quyền kiểm soát đối với Bộ kiểm tra ... Tôi phải sử dụng nó như hiện tại.

Cách giải quyết duy nhất của tôi là chuyển đổi các yếu tố có vấn đề trở lại giá trị số, sử dụng as.numeric(). Nó hoạt động nhưng tôi không hài lòng lắm, vì các giá trị này là các mã không có ý nghĩa số ...

Bạn có nghĩ rằng sẽ có một giải pháp khác, để loại bỏ các giá trị mới khỏi bộ thử nghiệm không? Nhưng không loại bỏ tất cả các giá trị yếu tố khác (giả sử các giá trị 1, 2, 14, 32, v.v.) có trong cả đào tạo và kiểm tra và chứa thông tin có khả năng hữu ích cho các dự đoán.


1
Tôi thấy biết lý do tại sao các giá trị trong bài kiểm tra sẽ phải nằm trong tập huấn luyện. Ý tưởng của phân loại là sử dụng dữ liệu đào tạo để có được ý tưởng về mật độ có điều kiện của lớp. Bạn không thể thấy mọi giá trị có thể từ mật độ. Tôi một biến được sử dụng trong cây chia tách, sau đó phân tách xác định nhánh nào sẽ theo sau cho bất kỳ giá trị không nhìn thấy nào cũng như các giá trị đã được nhìn thấy.
Michael R. Chernick

Bạn tạo một điểm hợp lệ, nhưng ở mức độ thực tế bằng cách sử dụng công cụ cụ thể được hỏi về (gói RF trong R) thì điều này không được phép. Câu trả lời của tôi liên quan đến việc buộc tội là một cách xung quanh nó, mặc dù chắc chắn không phải là giải pháp tốt nhất. Ít nhất là làm cho mã không bị sập, vì vậy ít nhất là hoạt động, cho các giá trị nhỏ của công việc.
Bogdanovist

Tương tự như câu hỏi của tôi ở đây: stats.stackexchange.com/questions/18004/ săn . Tôi nghĩ rằng tôi có thể sử dụng GBM thay vì RF vì nó có vẻ giải quyết các cấp yếu tố mới tốt hơn. Ngoài ra, bạn đã xem xét việc thực hiện RF trong bữa tiệc chưa? Tôi chưa bao giờ thích RandomForest vì những vấn đề này (và không có khả năng xử lý liền mạch với các giá trị còn thiếu).
B_Miner

Câu trả lời:


2

Nếu bộ kiểm tra có nhiều điểm với các giá trị nhân tố mới thì tôi không chắc cách tiếp cận tốt nhất là gì. Nếu đó chỉ là một vài điểm bạn có thể thoát khỏi thứ gì đó mờ nhạt như coi mức độ yếu tố sai lầm là thiếu dữ liệu và đưa chúng vào bất kỳ cách tiếp cận nào bạn thấy phù hợp. Việc triển khai R có một vài cách để buộc tội dữ liệu bị thiếu, bạn chỉ cần đặt các mức yếu tố này thành NA để cho biết chúng bị thiếu.


8

KingBonoit , đoạn trích này có thể hữu ích để hài hòa các cấp độ:

for(attr in colnames(training))
{
  if (is.factor(training[[attr]]))
  {
    new.levels <- setdiff(levels(training[[attr]]), levels(testing[[attr]]))
    if ( length(new.levels) == 0 )
    { print(paste(attr, '- no new levels')) }
    else
    {
      print(c(paste(attr, length(new.levels), 'of new levels, e.g.'), head(new.levels, 2)))
      levels(testing[[attr]]) <- union(levels(testing[[attr]]), levels(training[[attr]]))
    }
  }
}

Nó cũng in các thuộc tính được thay đổi. Tôi đã không tìm thấy một cách tốt để viết nó thanh lịch hơn (với ldply hoặc một cái gì đó). Bất kỳ lời khuyên được đánh giá cao.


4

Đây là một số mã tôi đã viết mà phản hồi @ King ở trên. Nó đã sửa lỗi:

# loops through factors and standardizes the levels
for (f in 1:length(names(trainingDataSet))) {
    if (levels(testDataSet[,f]) > levels(trainingDataSet[,f])) {    
            levels(testDataSet[,f]) = levels(trainingDataSet[,f])       
    } else {
            levels(trainingDataSetSMOTEpred[,f]) = levels(testDataSet[,f])      
    }
}

xin chào @ifarb, tôi đang cố gắng hiểu giải pháp của bạn: đào tạo gìDataSetSMOTEpred và nó được định nghĩa trong mã ở đâu?
Kasia Kulma

3

Tập kiểm tra và huấn luyện nên được kết hợp thành một tập và sau đó thay đổi cấp độ của tập huấn luyện. Mã của tôi là:

totalData <- rbind(trainData, testData)
for (f in 1:length(names(totalData))) {
  levels(trainData[, f]) <- levels(totalData[, f])
}

Điều này hoạt động trong mọi trường hợp số lượng cấp độ trong bài kiểm tra nhiều hơn hoặc ít hơn đào tạo.


2

Tôi có một cách giải quyết tệ hại khi tôi sử dụng RandomForest trong R. Nó có thể không phải là âm thanh về mặt lý thuyết, nhưng nó khiến mọi thứ hoạt động.

levels(testSet$Cat_2) = levels(trainingSet$Cat_2)

Hoặc đường vòng khác. Về cơ bản, nó chỉ cho R biết rằng đó là một giá trị hợp lệ chỉ có 0 trường hợp; vì vậy hãy ngừng làm phiền tôi về lỗi này

Tôi không đủ thông minh để mã hóa nó để nó tự động thực hiện hành động cho tất cả các tính năng phân loại. Gửi cho tôi mã nếu bạn biết cách ...


Nhưng điều này không hoạt động nếu số lượng cấp độ trong bài kiểm tra nhiều hơn đào tạo. Nó chỉ hoạt động nếu mức độ yếu tố dữ liệu thử nghiệm là <= mức độ yếu tố dữ liệu đào tạo.
KarthikS

1

Tôi chắc chắn rằng bạn đã nghĩ đến điều này rồi nếu đây là trường hợp, nhưng nếu bộ kiểm tra có giá trị thực và bạn đang sử dụng bộ kiểm tra cho mục đích xác thực chéo, thì hãy chia lại khung dữ liệu thành các khung dữ liệu huấn luyện và kiểm tra trong đó hai yếu tố được cân bằng trên các yếu tố này sẽ tránh được vấn đề của bạn. Phương pháp này được biết đến phổ biến là xác nhận chéo phân tầng .

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.