2012-12-23 20 views
13

Câu hỏi của tôi liên quan đến this one liên quan đến dữ liệu phân loại (các yếu tố trong thuật ngữ R) khi sử dụng gói Caret. Tôi hiểu từ bài đăng được liên kết rằng nếu bạn sử dụng "giao diện công thức", một số tính năng có thể là các yếu tố và việc đào tạo sẽ hoạt động tốt. Câu hỏi của tôi là làm thế nào tôi có thể mở rộng dữ liệu với hàm preProcess()? Nếu tôi cố gắng và làm điều đó trên một khung dữ liệu với một số cột như các yếu tố, tôi nhận được thông báo lỗi này:Cách xử lý trước các tính năng khi một số trong số đó là các yếu tố?

Error in preProcess.default(etitanic, method = c("center", "scale")) : 
    all columns of x must be numeric 

Xem ở đây một số mẫu mã:

library(earth) 
data(etitanic) 

a <- preProcess(etitanic, method=c("center", "scale")) 
b <- predict(etitanic, a) 

Cảm ơn bạn.

Trả lời

18

Nó thực sự là vấn đề tương tự như bài đăng bạn liên kết đến. preProcess chỉ hoạt động trên dữ liệu số và bạn có:

> str(etitanic) 
'data.frame': 1046 obs. of 6 variables: 
$ pclass : Factor w/ 3 levels "1st","2nd","3rd": 1 1 1 1 1 1 1 1 1 1 ... 
$ survived: int 1 1 0 0 0 1 1 0 1 0 ... 
$ sex  : Factor w/ 2 levels "female","male": 1 2 1 2 1 2 1 2 1 2 ... 
$ age  : num 29 0.917 2 30 25 ... 
$ sibsp : int 0 1 1 1 1 0 1 0 2 0 ... 
$ parch : int 0 2 2 2 2 0 0 0 0 0 ... 

Bạn không thể tập trung và quy mô pclass hoặc sex như-là để họ cần phải được chuyển đổi sang các biến giả. Bạn có thể sử dụng model.matrix hoặc caret của dummyVars để làm điều này:

> new <- model.matrix(survived ~ . - 1, data = etitanic) 
> colnames(new) 
[1] "pclass1st" "pclass2nd" "pclass3rd" "sexmale" "age"  
[6] "sibsp"  "parch" 

Các -1 được thoát khỏi những đánh chặn. Bây giờ bạn có thể chạy preProcess trên đối tượng này.

btw làm preProcess bỏ qua dữ liệu không phải là số trên danh sách "cần làm" của tôi nhưng có thể gây ra lỗi cho những người không chú ý.

Max

+1

Tôi nghĩ chúng ta chỉ cần hai biến cho lớp con. (hoặc là "pclass1st, pclass2nd" hoặc "pclass2nd, pclass3rd" hoặc "pclass3rd, pclass1st"). Giống như trong trường hợp quan hệ tình dục biến đổi, chúng tôi đã xem xét chỉ sexmale và bỏ sexfemale. Đúng nếu tôi không đủ. – Sandeep

+0

@topepo, tôi nghĩ câu trả lời dưới đây không bỏ qua danh sách việc cần làm. Tôi sẽ đề nghị thêm một số cảnh báo cho những người không chú ý. –

5

Dưới đây là một cách nhanh chóng để loại trừ các yếu tố hoặc bất cứ điều gì bạn muốn từ xem xét:

set.seed(1) 
N <- 20 
dat <- data.frame( 
    x = factor(sample(LETTERS[1:5],N,replace=TRUE)), 
    y = rnorm(N,5,12), 
    z = rnorm(N,-5,17) + runif(N,2,12) 
) 

#' Function which wraps preProcess to exclude factors from the model.matrix 
ppWrapper <- function(x, excludeClasses=c("factor"), ...) { 
    whichToExclude <- sapply(x, function(y) any(sapply(excludeClasses, function(excludeClass) is(y,excludeClass)))) 
    processedMat <- predict(preProcess(x[!whichToExclude], ...), newdata=x[!whichToExclude]) 
    x[!whichToExclude] <- processedMat 
    x 
} 

> ppWrapper(dat) 
    x   y   z 
1 C 1.6173595 -0.44054795 
2 A -0.2933705 -1.98856921 
3 C 1.2177384 0.65420288 
4 D -0.8710374 0.62409408 
5 D -0.4504202 -0.34048640 
6 D -0.6943283 0.24236671 
7 E 0.7778192 0.91606677 
8 D 0.2184563 -0.44935163 
9 C -0.3611408 0.26075970 
10 B -0.7066441 -0.23046073 
11 D -1.5154339 -0.75549761 
12 D 0.4504825 0.38552988 
13 B 1.5692675 0.04093040 
14 C 0.4127541 0.13161807 
15 D 0.5426321 1.09527418 
16 B -2.1040322 -0.04544407 
17 C 0.6928574 1.12090541 
18 B 0.3580960 1.91446230 
19 E 0.3619967 -0.89018040 
20 A -1.2230522 -2.24567237 

Bạn có thể vượt qua bất cứ điều gì bạn muốn vào ppWrapper và nó sẽ được thông qua cùng với preProcess.

+0

Câu trả lời hay! Tôi nghĩ bạn nên sử dụng ví dụ được đưa ra (thay vì một ví dụ nhân tạo có thể gây nhầm lẫn). Về cơ bản, 'thư viện (trái đất); dữ liệu (etitanic); ppWrapper (etitanic) ' –

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