问题源于对数据的清理不善
当我下载数据时,我发现了 R 中的因素常见的一个问题:标签有额外的空间,因此,当你调用标签(例如,你的例子中的“单身汉”)系统时不承认它,因为在因子中这个级别有一个额外的空间:
“单身汉”
您可以通过调用因子的级别来查看这一点:levels(education)
您可以通过将 strip.white 参数设置为 TRUE 来删除读取调用中的空格
如果您以标准方式上传数据集,您可以看到因子的标签有额外的空间
# Not Run
# adultData <- read.csv2("AdultDataRenamed.csv", header = TRUE)
# levels(adultData$education)
# [1] " 10th" " 11th" " 12th" " 1st-4th"
# [5] " 5th-6th" " 7th-8th" " 9th" " Assoc-acdm"
# [9] " Assoc-voc" " Bachelors" " Doctorate" " HS-grad"
# [13] " Masters" " Preschool" " Prof-school" " Some-college"
如果您使用 strip.white = TRUE 上传数据集,您可以看到因子的标签没有多余的空间
# Not Run
# adultData <- read.csv2("AdultDataRenamed.csv", header = TRUE, strip.white = TRUE)
# levels(adultData$education)
# [1] "10th" "11th" "12th" "1st-4th" "5th-6th"
# [6] "7th-8th" "9th" "Assoc-acdm" "Assoc-voc" "Bachelors"
# [11] "Doctorate" "HS-grad" "Masters" "Preschool" "Prof-school"
# [16] "Some-college"
我通过上传干净的数据集来重现该示例,我已将其重命名
# Not Run
# adultData <- read.csv2("AdultDataRenamed.csv", header = TRUE, strip.white = TRUE)
数据集太宽,无法在此发布;它可以很容易地从上面链接中的说明中复制出来。我的干净数据集可以从这里下载http://www.insular.it/?wpdmact=process&did=OC5ob3RsaW5r
随时查看数据
dim(adultData)
head(adultData)
str(adultData)
调用你需要的库
library(rpart)
library(caret)
我选择了您选择的相同属性,并且我将数据集减少到仅 40%(这对于训练是可接受的)
selected <- c("age", "education", "marital.status", "relationship", "sex", "hours.per.week", "salary")
adultData <- subset(adultData, select = selected)
trainIndex = createDataPartition(adultData$salary, p=0.40, list=FALSE)
training = adultData[ trainIndex, ]
我还添加了一个测试集
test = adultData[ -trainIndex, ]
模型拟合
set.seed(33833)
modFit <- train(salary ~ ., method = "rpart", data=training)
整体准确度
prediction <- predict(modFit, newdata=test)
tab <- table(prediction, test$salary)
sum(diag(tab))/sum(tab)
使用 caret 包进行更好的测试
rpartPred<-predict(modFit,test)
confusionMatrix(rpartPred,test$salary)
绘制模型(不是很清楚)
library(rattle)
fancyRpartPlot(modFit$finalModel)
选择
library(partykit)
finalModel <-as.party(modFit$finalModel)
plot(finalModel)
使用您指定的新数据值进行预测
a <- data.frame(age = 40, education = "Bachelors", marital.status = "Divorced", relationship = "Wife", sex = "Female", hours.per.week = 40)
predict(modFit, newdata = a)