2014-04-02 15 views
9

Tôi nhận được lỗi sauC5.0 cây quyết định - Mã C50 gọi là thoát với giá trị 1

C50 mã được gọi là thoát với giá trị 1

tôi đang làm điều này trên các dữ liệu có sẵn titanic từ Kaggle

# Importing datasets 
train <- read.csv("train.csv", sep=",") 

# this is the structure 
    str(train) 

Output: -

'data.frame': 891 obs. of 12 variables: 
$ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ... 
$ Survived : int 0 1 1 1 0 0 0 0 1 1 ... 
$ Pclass  : int 3 1 3 1 3 3 1 3 3 2 ... 
$ Name  : Factor w/ 891 levels "Abbing, Mr. Anthony",..: 109 191 358 277 16 559 520 629 417 581 ... 
$ Sex  : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ... 
$ Age  : num 22 38 26 35 35 NA 54 2 27 14 ... 
$ SibSp  : int 1 1 0 1 0 0 0 3 0 1 ... 
$ Parch  : int 0 0 0 0 0 0 0 1 2 0 ... 
$ Ticket  : Factor w/ 681 levels "110152","110413",..: 524 597 670 50 473 276 86 396 345 133 ... 
$ Fare  : num 7.25 71.28 7.92 53.1 8.05 ... 
$ Cabin  : Factor w/ 148 levels "","A10","A14",..: 1 83 1 57 1 1 131 1 1 1 ... 
$ Embarked : Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ... 

Sau đó, tôi cố gắng sử dụng C5.0 dtree

# Trying with C5.0 decision tree 
library(C50) 

#C5.0 models require a factor outcome otherwise error 
train$Survived <- factor(train$Survived) 

new_model <- C5.0(train[-2],train$Survived) 

Vì vậy, chạy theo dòng trên mang lại cho tôi lỗi này

c50 code called exit with value 1 

Tôi không thể tìm ra những gì đang xảy ra sai? Tôi đã sử dụng mã tương tự trên tập dữ liệu khác nhau và nó hoạt động tốt. Bất kỳ ý tưởng nào về cách tôi có thể gỡ lỗi mã của mình?

-Cảm ơn

Trả lời

10

Đối với bất cứ ai quan tâm, dữ liệu có thể được tìm thấy ở đây: http://www.kaggle.com/c/titanic-gettingStarted/data. Tôi nghĩ rằng bạn cần phải được đăng ký để tải về nó.

Về vấn đề của bạn, trước hết tôi nghĩ rằng bạn có nghĩa là để viết

new_model <- C5.0(train[,-2],train$Survived) 

Tiếp theo, chú ý đến cấu trúc của CabinEmbarked Cột. Hai yếu tố này có một ký tự trống dưới dạng tên cấp (kiểm tra với levels(train$Embarked)). Đây là điểm mà C50 rơi xuống. Nếu bạn sửa đổi dữ liệu của mình sao cho

levels(train$Cabin)[1] = "missing" 
levels(train$Embarked)[1] = "missing" 

thuật toán của bạn bây giờ sẽ chạy mà không có lỗi.

+0

Cảm ơn Marco. Nó đã làm việc!! Các giá trị bị thiếu trong cabin và cột bắt đầu đã gây ra vấn đề. Một điều khác tôi quan sát là tàu [-2] và tàu [, - 2] có cùng một đầu ra ... Có sự khác biệt nào khác giữa hai tàu không? – zephyr

+0

Bạn nói đúng, có vẻ như nó hoạt động với data.frames. Tôi luôn luôn sử dụng tàu [, - 2], vì ma trận đào tạo [-2] sẽ biến đổi kết quả thành một véc tơ và chỉ cần loại bỏ một phần tử. Điều này là do ma trận khái niệm giống như vectơ và bạn có thể truy cập mọi phần tử của chúng mà không chỉ định hàng/cột – Marco

+0

Rất tiếc. Bây giờ bước tiếp theo là đưa ra lỗi thoát mã tương tự. Tôi đọc test.csv vào khung dữ liệu thử nghiệm. Sau đó: - new_model_predict <- predict (new_model, test) trên dữ liệu thử nghiệm. Ngoài ra, tôi đã gán các nhãn bị thiếu trong Cabin và cũng đã bắt đầu các cột dữ liệu thử nghiệm. – zephyr

4

Đây là những gì làm việc cuối cùng: -

Got ý tưởng này sau khi đọc này post

library(C50) 

test$Survived <- NA 

combinedData <- rbind(train,test) 

combinedData$Survived <- factor(combinedData$Survived) 

# fixing empty character level names 
levels(combinedData$Cabin)[1] = "missing" 
levels(combinedData$Embarked)[1] = "missing" 

new_train <- combinedData[1:891,] 
new_test <- combinedData[892:1309,] 

new_model <- C5.0(new_train[,-2],new_train$Survived) 

new_model_predict <- predict(new_model,new_test) 

submitC50 <- data.frame(PassengerId=new_test$PassengerId, Survived=new_model_predict) 
write.csv(submitC50, file="c50dtree.csv", row.names=FALSE) 

Trực giác đằng sau này là theo cách này cả hai tàu và thử nghiệm bộ dữ liệu sẽ có mức yếu tố phù hợp .

2

Chỉ trong trường hợp. Bạn có thể xem lỗi bằng cách

summary(new_model) 

Ngoài ra lỗi này xảy ra khi có một ký tự đặc biệt trong tên biến. Ví dụ, người ta sẽ nhận được lỗi này nếu có ký tự "я" (từ bảng chữ cái tiếng Nga) trong tên của một biến.

1

Tôi đã gặp lỗi tương tự, nhưng tôi đã sử dụng tập dữ liệu số mà không thiếu giá trị.

Sau một thời gian dài, tôi phát hiện ra rằng bộ dữ liệu của tôi đã có một thuộc tính tiên đoán gọi "outcome"C5.0Control sử dụng tên này, và đây là nguyên nhân gây ra lỗi:. '(

Giải pháp của tôi đã thay đổi tên cột cách khác , sẽ tạo đối tượng C5.0Control và thay đổi giá trị của thuộc tính nhãn và sau đó chuyển đối tượng này làm tham số cho phương pháp C50.

0

Tôi cũng gặp phải một số giờ với cùng một Sự cố (Mã trả về "1") khi xây dựng mô hình cũng như khi dự đoán Với gợi ý câu trả lời của Marco tôi đã viết một chức năng nhỏ để xóa e tất cả các mức hệ số bằng "" trong khung dữ liệu hoặc vectơ, xem mã bên dưới. Tuy nhiên, vì R không cho phép vượt qua bằng cách tham chiếu đến chức năng, bạn phải sử dụng kết quả của hàm (nó không thể thay đổi dataframe gốc):

removeBlankLevelsInDataFrame <- function(dataframe) { 
    for (i in 1:ncol(dataframe)) { 
    levels <- levels(dataframe[, i]) 
    if (!is.null(levels) && levels[1] == "") { 
     levels(dataframe[,i])[1] = "?" 
    } 
    } 
    dataframe 
} 

removeBlankLevelsInVector <- function(vector) { 
    levels <- levels(vector) 
    if (!is.null(levels) && levels[1] == "") { 
    levels(vector)[1] = "?" 
    } 
    vector 
} 

Call of các chức năng có thể trông như thế này:

trainX = removeBlankLevelsInDataFrame(trainX) 
trainY = removeBlankLevelsInVector(trainY) 
model = C50::C5.0.default(trainX,trainY) 

Tuy nhiên, dường như C50 có vấn đề tương tự với cột ký tự chứa ô trống, vì vậy bạn có thể mở rộng để xử lý các thuộc tính ký tự nếu bạn có.

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