2016-09-27 31 views
5

Tôi có một df dataframe, Tôi đang xây dựng một mô hình học máy (C5.0 cây quyết định) để dự đoán lớp của một cột (loan_approved):Làm thế nào để xử lý các lỗi trong chức năng dự đoán của R?

cơ cấu (không dữ liệu thực tế):

id occupation income loan_approved 
1 business 4214214 yes 
2 business 32134 yes 
3 business 43255 no 
4 sailor  5642 yes 
5 teacher 53335 no 
6 teacher 6342 no 

Process:

  • tôi ngẫu nhiên chia khung dữ liệu vào thử nghiệm và đào tạo, học trên tàu bộ dữ liệu (hàng 1,2,3,5,6 tàu một d hàng 4 như test)
  • Để chiếm mức phân loại mới trong một hoặc nhiều cột, tôi đã sử dụng chức năng thử

Chức năng:

error_free_predict = function(x){ 
    output = tryCatch({ 
    predict(C50_model, newdata = test[x,], type = "class") 
    }, error = function(e) { 
    "no" 
    }) 
    return(output) 
    } 

Áp dụng các chức năng dự đoán:

test <- mutate(test, predicted_class = error_free_predict(1:NROW(test))) 

Vấn đề:

id occupation income loan_approved predicted_class 
1 business 4214214 yes   no 
2 business 32134 yes   no 
3 business 43255 no   no 
4 sailor  5642 yes   no 
5 teacher 53335 no   no 
6 teacher 6342 no   no 

Câu hỏi:

Tôi biết điều này là bởi vì các khung dữ liệu thử nghiệm đã có một tầm cao mới mà đã không có mặt trong dữ liệu huấn luyện, nhưng không nên chức năng của tôi làm việc tất cả các trường hợp ngoại trừ điều này?

P.S: không sử dụng một cách dễ dàng vì nó quá chậm

+0

Vấn đề thực tế của bạn là gì? Có phải nó chỉ trả về 'không'? Lỗi được trả về bởi lệnh 'predict định' là gì? – cdeterman

+1

vấn đề là chức năng dự đoán đang gặp phải các yếu tố mới trong cột 'chiếm đóng' và thất bại không chỉ cho một hàng đó, mà còn xử lý toàn bộ khung dữ liệu như trường hợp bị lỗi –

+0

Có vẻ như bạn nên phân tầng cùng số lượng mỗi danh mục trong mỗi phần tách. – Aaron

Trả lời

1

Có hai phần của vấn đề này.

  1. Phần đầu tiên của sự cố xảy ra trong khi đào tạo mô hình vì các biến phân loại không được chia đều giữa đào tạo và kiểm tra nếu một phân tách ngẫu nhiên. Trong trường hợp của bạn nói rằng bạn chỉ có một kỷ lục với nghề nghiệp "thủy thủ" sau đó nó có thể là nó sẽ kết thúc trong bộ thử nghiệm khi bạn phân chia ngẫu nhiên. Mô hình được xây dựng bằng cách sử dụng tập dữ liệu tàu sẽ không bao giờ thấy tác động của nghề nghiệp "thủy thủ" và do đó nó sẽ ném lỗi. Trong trường hợp tổng quát hơn, có thể một số mức biến phân loại khác sẽ hoàn toàn thành bộ kiểm tra sau khi tách ngẫu nhiên.

Vì vậy, thay vì chia ngẫu nhiên dữ liệu giữa tàu và kiểm tra bạn có thể lấy mẫu phân tầng. Mã sử ​​dụng data.table cho 70:30 chia là:

ind <- total_data[, sample(.I, round(0.3*.N), FALSE),by="occupation"]$V1 
train <- total_data[-ind,] 
test <- total_data[ind,] 

Điều này đảm bảo bất kỳ cấp độ được chia đều cho đào tạo và kiểm tra dữ liệu. Vì vậy, bạn sẽ không nhận được cấp độ phân loại "mới" trong tập dữ liệu thử nghiệm; trong trường hợp tách ngẫu nhiên có thể ở đó.

  1. Phần thứ hai của sự cố xảy ra khi mô hình đang trong quá trình sản xuất và gặp một biến hoàn toàn mới không có trong tập huấn hoặc kiểm tra. Để giải quyết vấn đề này, người dùng có thể duy trì danh sách tất cả các cấp của tất cả các biến phân loại bằng cách sử dụng lvl_cat_var1 <- unique(cat_var1)lvl_cat_var2 <- unique(cat_var2) v.v.Sau đó, trước khi dự đoán người ta có thể kiểm tra các cấp độ mới và bộ lọc:

    new_lvl_data <- total_data[!(var1 %in% lvl_cat_var1 & var2 %in% lvl_cat_var2)] 
    pred_data <- total_data[(var1 %in% lvl_cat_var1 & var2 %in% lvl_cat_var2)] 
    

sau đó cho các dự đoán mặc định làm:

new_lvl_data$predicted_class <- "no" 

và đầy đủ dự đoán thổi cho pred_data.

+0

bạn có thể duy trì danh sách tất cả các cấp của tất cả các biến phân loại bằng cách sử dụng 'lvl_cat_var1 <- duy nhất (cat_var1) '' lvl_cat_var2 <- duy nhất (cat_var2) 'và sau đó trước khi dự đoán bạn có thể kiểm tra cấp độ mới và lọc' new_lvl_data <- total_data [! (var1% in% lvl_cat_var1 & var2% in% lvl_cat_var2)] 'và' pred_data <- total_data [(var1% trong% lvl_cat_var1 & var2% trong% lvl_cat_var2)] 'sau đó làm' new_lvl_data $ predict_class_ <- "no" 'và dự đoán thổi đầy đủ cho' pred_data' – abhiieor

+0

làm điều này làm câu trả lời của bạn và tôi sẽ sẵn sàng chấp nhận điều này! –

+0

@agenis: OP muốn bản ghi cấp độ mới được phân loại là lớp mặc định. Tôi đã chỉ chọn "không" làm ví dụ. Không có thêm ý nghĩa. – abhiieor

0

Tôi thường làm điều này bằng cách sử dụng vòng lặp nơi bất kỳ cấp nào bên ngoài tàu sẽ được mã hóa dưới dạng NA theo chức năng này. Ở đây đào tạo là dữ liệu mà bạn sử dụng để đào tạo mô hình và kiểm tra là dữ liệu sẽ được sử dụng để dự đoán.

for(i in 1:ncol(train)){ 
    if(is.factor(train[,i])){ 
    test[,i] <- factor(test[,i],levels=levels(train[,i])) 
    } 
} 

Trycatch là một cơ chế xử lý lỗi, tức là sau khi gặp lỗi. Nó sẽ không được áp dụng trừ khi bạn muốn làm điều gì đó khác biệt sau khi gặp lỗi. Nhưng bạn vẫn muốn chạy mô hình, sau đó vòng lặp này sẽ chăm sóc các cấp độ mới.

+0

Cảm ơn bạn đã trả lời nhưng bạn không nghĩ, đối với vòng lặp hoặc bất kỳ vòng lặp nào cho vấn đề đó sẽ rất chậm. Đây là một mối quan tâm bởi vì tôi đang nghĩ đến việc làm cho nó sản xuất cấp! –

+0

Đối với vòng lặp ở đây chỉ là để loại bỏ các mức yếu tố. Nó sẽ không quan trọng ở tất cả về hiệu suất. –

Các vấn đề liên quan