2016-08-05 3 views
0

Я пытаюсь использовать пример набора данных Titanic Machine Learning для Kaggle, и я столкнулся со следующей проблемой. Сообщение об ошибке гласит:Уровни факторов остаются неизменными даже после удаления одного уровня

Error in predict.randomForest(modelFit, newtest) : 
Type of predictors in new data do not match that of the training data. 

Это весь мой код:

#Load the libraries: 
library(ggplot2) 
library(randomForest) 

#Load the data: 
set.seed(1) 
train <- read.csv("train.csv") 
test <- read.csv("test.csv") 
gendermodel <- read.csv("gendermodel.csv") 
genderclassmodel <- read.csv("genderclassmodel.csv") 

#Preprocess the data and feature extraction: 
features <- c("Pclass", "Age", "Sex", "Parch", "SibSp", "Fare", "Embarked")     

newtrain <- train[,features] 
newtest <- test[,features] 

newtrain$Embarked[newtrain$Embarked==""] <- "S" 
newtrain$Fare[newtrain$Fare == 0] <- median(newtrain$Fare, na.rm=TRUE) 
newtrain$Age[is.na(newtrain$Age)] <- -1 

newtest$Embarked[newtest$Embarked==""] <- "S" 
newtest$Fare[newtest$Fare == 0] <- median(newtest$Fare, na.rm=TRUE) 
newtest$Fare <- ifelse(is.na(newtest$Fare), mean(newtest$Fare, na.rm = TRUE), newtest$Fare) 
newtest$Age[is.na(newtest$Age)] <- -1 

#Model building 

modelFit <- randomForest(newtrain, as.factor(train$Survived), ntree = 100, importance = TRUE) 
predictedOutput <- data.frame(PassengerID = test$PassengerId) 
predictedOutput$Survived <- predict(modelFit, newtest) 
write.csv(predictedOutput, file = "TitanicPrediction.csv", row.names=FALSE) 

MDA <- importance(modelFit, type=1) 
featureImportance <- data.frame(Feature = row.names(MDA), Importance = MDA[,1]) 

#Plots 
g <- ggplot(featureImportance, aes(x=Feature, y=Importance)) + geom_bar(stat="identity") + xlab("Feature") + ylab("Importance") + ggtitle("Feature importance") 
ggsave("FeatureImportance.png", p) 

Я понимаю, что означает, что сообщение об ошибке, и поэтому, когда я str(newtrain) и str(newtest), я получаю следующее даже после назначения newtrain$Embarked[newtrain$Embarked==""] <- "S" ,

str(newtrain) 
'data.frame': 891 obs. of 7 variables: 
$ Pclass : int 3 1 3 1 3 3 1 3 3 2 ... 
$ Age  : num 22 38 26 35 35 -1 54 2 27 14 ... 
$ Sex  : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ... 
$ Parch : int 0 0 0 0 0 0 0 1 2 0 ... 
$ SibSp : int 1 1 0 1 0 0 0 3 0 1 ... 
$ Fare : num 7.25 71.28 7.92 53.1 8.05 ... 
$ Embarked: Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ... 
> length(which(train$Embarked == "")) 
[1] 2 
> length(which(newtrain$Embarked == "")) 
[1] 0 

Когда я проверяю для длин обоих поездов и newtrain наборов данных, содержащих недостающие значения, я получаю правильный вывод, как указано выше. Я не уверен, где я ошибаюсь. Любая помощь высоко ценится! Благодаря!

+0

Если проблема заключается в уровнях факторов, вы пробовали «капельки»? – aosmith

ответ

0

После вашей линии,

newtrain$Embarked[newtrain$Embarked==""] <- "S" 

сделать:

newtrain$Embarked <- factor(newtrain$Embarked) 

Это сбросит уровни фактора из модифицированного newtrain$Embarked.

Кроме того, в последней строке вашего опубликованного кода p должен быть g.

Удачи с Kaggle!

+0

Это сработало! Спасибо огромное! : D – Gingerbread

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