2015-04-20 2 views
3

У меня есть странная проблема для циклов с данными ctree. Если я напишу этот код в цикле, тогда R замораживает.R ctree странная ошибка

data = read.csv("train.csv") #data description https://www.kaggle.com/c/titanic-gettingStarted/data 

treet = ctree(Survived ~ ., data = data) 
print(plot(treet)) 

Иногда я получаю сообщение об ошибке: «Более 52 уровней в предсказывая фактор, укороченные на распечатке» и мое дерево показывает в очень странным образом. Иногда работает нормально. Действительно, действительно странно!

Мой код Loop:

functionPlot <- function(traine, i) { 
    print(i) # print only once, then RStudio freezes 
    tempd <- ctree(Survived ~ ., data = traine) 
    print(plot(tempd)) 
} 

for(i in 1:2) { 
    smp_size <- floor(0.70 * nrow(data)) 
    train_ind <- sample(seq_len(nrow(data)), size = smp_size) 
    set.seed(100 + i) 
    train <- data[train_ind, ] 
    test <- data[-train_ind, ] 
# 
    functionPlot(train,i) 
} 

ответ

3

ctree() функция ожидает, что (а) соответствующие классы (числовой, фактор и т.д.) используются для каждой переменной, и что (б) только полезные предикторы используются в модельная формула.

Что касается (b), то вы поставили переменные, которые на самом деле являются просто символами (например, Name), а не факторами. Это необходимо либо предварительно обработать соответствующим образом, либо исключить из анализа.

Даже если вы этого не сделаете, вы не получите лучших результатов, потому что некоторые переменные (например, Survived и Pclass) кодируются численно, но действительно являются категориальными переменными, которые должны быть факторами. Если вы посмотрите на сценарии от https://www.kaggle.com/c/titanic/forums/t/13390/introducing-kaggle-scripts, вы также увидите, как можно выполнить подготовку данных. Здесь, я использую

titanic <- read.csv("train.csv") 
titanic$Survived <- factor(titanic$Survived, 
    levels = 0:1, labels = c("no", "yes")) 
titanic$Pclass <- factor(titanic$Pclass) 
titanic$Name <- as.character(titanic$Name) 

Как для (б), я затем перейти к ctree() называть только с переменными, которые были достаточно предварительно обработанным для содержательного анализа. (И я использую новую рекомендованную реализацию из пакета partykit.)

library("partykit") 
ct <- ctree(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked, 
    data = titanic) 
plot(ct) 
print(ct) 

Это дает следующие графический вывод:

ctree for titanic data

А следующий вывод на печать:

Model formula: 
Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked 

Fitted party: 
[1] root 
| [2] Sex in female 
| | [3] Pclass in 1, 2: yes (n = 170, err = 5.3%) 
| | [4] Pclass in 3 
| | | [5] Fare <= 23.25: yes (n = 117, err = 41.0%) 
| | | [6] Fare > 23.25: no (n = 27, err = 11.1%) 
| [7] Sex in male 
| | [8] Pclass in 1 
| | | [9] Age <= 52: no (n = 88, err = 43.2%) 
| | | [10] Age > 52: no (n = 34, err = 20.6%) 
| | [11] Pclass in 2, 3 
| | | [12] Age <= 9 
| | | | [13] Pclass in 3: no (n = 71, err = 18.3%) 
| | | | [14] Pclass in 2: yes (n = 13, err = 30.8%) 
| | | [15] Age > 9: no (n = 371, err = 11.3%) 

Number of inner nodes: 7 
Number of terminal nodes: 8 
+0

Спасибо за ваше время и ваши объяснения. Он работает сейчас! – 2xP

Смежные вопросы