我正在使用rpart
库来构建回归树,其代码如下:
skillcraft <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/00272/SkillCraft1_Dataset.csv", header = T, sep =",")
skillcraft$LeagueIndex <- factor(skillcraft$LeagueIndex)
skillcraft <- skillcraft[-1]
skillcraft$Age <- as.numeric(levels(skillcraft$Age))[skillcraft$Age]
skillcraft$TotalHours <- as.numeric(
levels(skillcraft$TotalHours))[skillcraft$TotalHours]
skillcraft$HoursPerWeek <- as.numeric(
levels(skillcraft$HoursPerWeek))[skillcraft$HoursPerWeek]
skillcraft <- skillcraft[complete.cases(skillcraft),]
library(caret)
set.seed(133)
skillcraft_sampling_vector <- createDataPartition(
skillcraft$LeagueIndex, p = 0.8, list = F)
skillcraft_train <- skillcraft[skillcraft_sampling_vector,]
skillcraft_test <- skillcraft[-skillcraft_sampling_vector,]
library(rpart)
regtree <- rpart(LeagueIndex ~., data = skillcraft_train)
regtree_predictions <- predict(regtree, skillcraft_test)
此代码的最后一行抛出错误:
Error in frame$yval2[where, 1L + nclass + 1L:nclass, drop = FALSE] :
subscript out of bounds
这似乎还不太清楚,但是我检查了两个数据帧(训练和测试)是否具有相同的结构,现在我很难找到一种调试该代码的方法。
有人可以帮忙吗?
谢谢!
答案 0 :(得分:0)
我最好的猜测是问题出在LeagueIndex
因素上。此变量是作为顺序数据(从Bronze到Professional)提供的,并转换为字符因子"1", "2", "3"
,依此类推,直到"8"
。
除了您遇到rpart
的错误外,您还根据以下因素对数据进行分区时收到警告:
在createDataPartition(skillcraft $ LeagueIndex,p = 0.8,list = F)中:
有些类没有记录(8),这些记录将被忽略
显然没有LeagueIndex
为8的记录。这似乎是在您选择此处的已完成案例之后出现的:
skillcraft <- skillcraft[complete.cases(skillcraft),]
所有LeagueIndex=8
案例都将被删除,因为这些案例在Age
,HoursPerWeek
和TotalHours
(强制为NA
)下将丢失数据通过as.numeric
进行了转换。
skillcraft[which(skillcraft$LeagueIndex == 8), c("Age", "HoursPerWeek", "TotalHours")]
Age HoursPerWeek TotalHours
3341 ? ? ?
3342 ? ? ?
3343 ? ? ?
...
假设您仍然想要一个因数,我相信如果您摆脱了未使用的因数水平,它将起作用,例如:
skillcraft$LeagueIndex <- droplevels(skillcraft$LeagueIndex)
在对数据进行分区之前。 (您可以只在此示例中对训练集进行操作,但您希望测试和训练集中的因子水平相同。)