1

我有一个 csv 文件(298 行和 24 列),我想创建一个决策树来预测“薪水”列。我已经下载了树包并通过库函数添加。

但是当我尝试创建决策树时:

model<-tree(salary~.,data)

我收到如下错误:

 *Error in tree(salary ~ ., data) : 
  factor predictors must have at most 32 levels* 

那有什么问题?数据如下:

      Name bat hit homeruns runs
1   Alan Ashby 315  81        7   24
2  Alvin Davis 479 130       18   66
3 Andre Dawson 496 141       20   65
...
team position putout assists errors
1 Hou.        C    632      43     10
2 Sea.       1B    880      82     14
3 Mon.       RF    200      11      3
salary league87 team87
1    475        N   Hou.
2    480        A   Sea.
3    500        N   Chi.

它的 str(data) 的值:

'data.frame':263 obs。24 个变量:$ 名称:因子 w/ 263 个级别“Al Newman”,“Alan Ashby”,..:2 7 8 10 6 1 13 11 9 3 ...

$ bat : int 315 479 496 321 594 185 298 323 401 574 ...

$命中:int 81 130 141 87 169 37 73 81 92 159 ...

$本垒打:int 7 18 20 10 4 1 0 6 17 21 ...

$运行:int 24 66 65 39 74 23 24 26 49 107 ...

$runs.batted:int 38 72 78 42 51 8 24 32 66 75 ...

$走:int 39 76 37 30 35 21 7 8 65 59 ...

$years.in.major.leagues : int 14 3 11 2 11 2 3 2 13 10 ...

$ bats.during.career : int 3449 1624 5628 396 4408 214 509 341 5206 4631 ...

$ hits.during.career : int 835 457 1575 101 1133 42 108 86 1332 1300 ...

$ homeruns.during.career : int 69 63 225 12 19 1 0 6 253 90 ...

$ runs.during.career : int 321 224 828 48 501 30 41 32 784 702 ...

$ runs.batted.during.career: int 414 266 838 46 336 9 37 34 890 504 ...

$ walks.during.career : int 375 263 354 33 194 24 12 8 866 488 ...

$联赛:因子w / 2个级别“A”,“N”:2 1 2 2 1 2 1 2 1 1 ...

$除法:因子w / 2个级别“E”,“W”:2 2 1 1 2 1 2 2 1 1 ...

$ team : 因子 w/ 24 个级别 "Atl.","Bal.",..: 9 21 14 14 16 14 10 1 7 8 ...

$ 位置:因子 w/ 23 个级别 "1B","1O","23",..: 10 1 20 1 22 4 22 22 13 22 ...

$输出:int 632 880 200 805 282 76 121 143 0 238 ...

$助攻:int 43 82 11 40 421 127 283 290 0 445 ...

$错误:int 10 14 3 4 25 7 9 19 0 22 ...

$ 工资 : num 475 480 500 91.5 750 ...

$ League87 : 因子 w/ 2 个级别 "A","N": 2 1 2 2 1 1 1 2 1 1 ...

$ team87 : 因子 w/ 24 个级别 "Atl.","Bal.",..: 9 21 5 14 16 13 10 1 7 8 ...

4

2 回答 2

5

问题几乎可以肯定是您在模型中包含了 name 变量,因为它的因子级别太多。我也会从方法论的角度删除它,但这可能不是讨论的地方。尝试:

train <- data
train$Name <- NULL
model<-tree(salary~.,train)
于 2013-08-13T20:41:28.227 回答
2

看起来你salary是一个因子向量,而你正在尝试执行回归,所以它应该是一个数字向量。只需将您转换salary为数字,它应该可以正常工作。有关更多详细信息,请阅读库的帮助:

http://cran.r-project.org/web/packages/tree/tree.pdf

用法

树(公式,数据,权重,子集,na.action = na.pass,控制 = tree.control(nobs,...),方法 =“recursive.partition”,拆分 = c(“偏差”,“gini” ), 模型 = FALSE, x = FALSE, y = TRUE, wts = TRUE, ...)

论据

公式公式表达式。左侧(响应)应该是拟合回归树时的数值向量或生成分类树时的因子。右边应该是一系列用+分隔的数字或因子变量;不应该有交互条款。两个都 。和 - 是允许的:回归树可以有偏移项。(...)

根据salary变量中存储的确切内容,转换可能会更棘手或更棘手,但这通常应该有效:

salary = as.numeric(levels(salary))[salary]

编辑

正如评论中所指出的,实际误差对应于data变量,因此如果是数值数据,也可以将其转换为数值来解决问题,如果必须是一个因素,您将需要另一个模型或减少级数。您也可以手动将这些因子转换为数字格式(例如,通过定义与级别一样多的二进制特征),但这会导致输入空间呈指数增长。

编辑2

看来您必须首先决定要建模的内容。您试图预测薪水,但基于什么?您的数据似乎包含玩家的记录,那么他们的名字肯定是用于此预测的错误数据类型(特别是 - 它可能导致 32 级错误)。您应该从data变量中删除不应用于构建预测的所有列。我不知道这里的确切目标是什么(因为问题中没有关于它的信息),所以我只能猜测您正在尝试根据他/她的统计数据来预测该人的薪水,因此您应该从输入数据:球员的姓名、球员的球队和显然的薪水(因为使用 X 预测 X 不是一个好主意;))。

于 2013-08-13T17:11:50.000 回答