为什么 GBM 对相同数据预测不同的值

机器算法验证 r 机器学习 预测模型 助推
2022-03-22 12:41:39

我是 R 新手。我正在使用 gbm 包构建预测模型。我有一个问题,我从用于构建模型的数据帧和具有相同值的单独数据帧中检索数据的不同结果。

我将我的数据随机分成两组,训练集加载到“头”:

头 <- read.csv(...)

我用 gbm 建立了一个模型:

fit1000x3 <- gbm(V1 ~ V2+V3+V4+V5+V6+V7+V8+V9+V10+V11, data=head, n.trees=1000, distribution="gaussian", interaction.depth=3, bag .fraction=0.5,train.fraction=1.0,shrinkage=0.1,keep.data=TRUE)

当我创建一个值等于 head[1,] 的数据框时:

xxx <- data.frame(V1=...)

我收到不同的值:

预测(fit1000x3,newdata=head[1,],n.trees=100)

预测(fit1000x3,newdata=xxx,n.trees=100)

这是我运行的一系列命令:

> 头 <- read.csv(...)
> fit1000x3 <- gbm(V1 ~ V2+V3+V4+V5+V6+V7+V8+V9+V10+V11, data=head, n.trees=1000, distribution="gaussian", interaction.depth=3, bag.fraction=0.5,train.fraction=1.0,shrinkage=0.1,keep.data=TRUE)
Iter TrainDeviance ValidDeviance StepSize 改进
     1 0.1707 -nan 0.1000 0.0152
     2 0.1581-南 0.1000 0.0122
     3 0.1478 -nan 0.1000 0.0100
     4 0.1395-南 0.1000 0.0079
     5 0.1326-南 0.1000 0.0067
     6 0.1267-南 0.1000 0.0056
     7 0.1211-南 0.1000 0.0052
     8 0.1168 -nan 0.1000 0.0039
     9 0.1133-南 0.1000 0.0032
    10 0.1103 -nan 0.1000 0.0027
   100 0.0773 -nan 0.1000 -0.0002
   200 0.0734 -nan 0.1000 -0.0002
   300 0.0714 -nan 0.1000 -0.0002
   400 0.0695 -nan 0.1000 -0.0002
   500 0.0681 -nan 0.1000 -0.0002
   600 0.0672 -nan 0.1000 -0.0002
   700 0.0663 -nan 0.1000 -0.0002
   800 0.0655 -nan 0.1000 -0.0002
   900 0.0648 -nan 0.1000 -0.0001
  1000 0.0643 -nan 0.1000 -0.0001

> 预测(fit1000x3,newdata=head[1,],n.trees=100)
    [1] 0.1420456
> 头部[1,]
      V1 V2 V3 V4 V5 V6 V7 V8 V9
    1 0 0.35 m01xrfn2 有效分辨率 5.1 Nu null null niceCharacter unitName
       V10 V11
    1 空下一个标签
> xxx <- data.frame(V1=0, V2=0.35, V3="m01xrfn2 有效分辨率", V4="5.1", V5="Nu", V6="null", V7="null", V8= "niceCharacter", V9="unitName", V10="null", V11="nextag")
> xxx
      V1 V2 V3 V4 V5 V6 V7 V8 V9
    1 0 0.35 m01xrfn2 有效分辨率 5.1 Nu null null niceCharacter unitName
       V10 V11
    1 空下一个标签
> 头部[1,]
      V1 V2 V3 V4 V5 V6 V7 V8 V9
    1 0 0.35 m01xrfn2 有效分辨率 5.1 Nu null null niceCharacter unitName
       V10 V11
    1 空下一个标签
> 预测(fit1000x3,newdata=xxx,n.trees=100)
    [1] 0.2068787

> str(头[1,])
    'data.frame':1 obs。11 个变量:
     $ V1 : 整数 0
     $ V2:数字 0.35
     $ V3:因子 w/113 级别“m01t_包含”,..:4
     $ V4:因子 w/ 884 级别 ".","0","01","02",..: 503
     $ V5 : 因子 w/ 11 个级别 "aN","aNu","aU",..: 4
     $ V6 : 4 个级别的因子 "null","propertyAlias",..: 1
     $ V7:因子 w/9 级别“附加”,“块”,..:6
     $ V8:因子 w/ 8 个级别“附加”,“块”,..:5
     $ V9 : 4 个级别的因子 "null","propertyAlias",..: 4
     $ V10:因子 w/ 2 个级别 "null","undef": 1
     $ V11:因子 w/ 368 级别“101 评论”,“123 足球”,..:223
> str(xxx)
    'data.frame':1 obs。11 个变量:
     $ V1 : 数字 0
     $ V2:数字 0.35
     $ V3:因子w/1级“m01xrfn2有效分辨率”:1
     $ V4:因子 w/ 1 级“5.1”:1
     $ V5:因子 w/ 1 级“Nu”:1
     $ V6:因子 w/1 级别“null”:1
     $ V7:因子 w/1 级别“null”:1
     $ V8:因子 w/1 级别“niceCharacter”:1
     $ V9:因子 w/1 级别“unitName”:1
     $ V10:因子 w/1 级别“null”:1
     $ V11:因子 w/1 级别“下一个标签”:1
1个回答

因素,一如既往。似乎模型没有使用因子的实际值,而是使用因子级别中的位置。

我能够使用数据 OrchardSprays 重现您的错误

data(OrchardSprays)

model <- gbm(decrease ~ rowpos+colpos+treatment, data=OrchardSprays, n.trees=1000, distribution="gaussian", interaction.depth=3, bag.fraction=0.5, train.fraction=1.0, shrinkage=0.1, keep.data=TRUE)

firstrow <- OrchardSprays[1,]
str(firstrow)

manualFirstrow <- data.frame(decrease=57,rowpos=1,colpos=1,treatment="D")
str(manualFirstrow)

predict(model,newdata=firstrow,n.trees=100)
predict(model,newdata=manualFirstrow,n.trees=100)
predict(model,newdata=data.frame(decrease=57,rowpos=1,colpos=1,treatment="A"),n.trees=100)

输出:

> predict(model,newdata=firstrow,n.trees=100)
[1] 50.31276
> predict(model,newdata=manualFirstrow,n.trees=100)
[1] 20.67818
> predict(model,newdata=data.frame(decrease=57,rowpos=1,colpos=1,treatment="A"),n.trees=100)
[1] 20.67818

因为 A 在 OrchardSprays$treatment 级别中的位置为 1。将级别添加到数据声明中就可以了

manualFirstrow <- data.frame(decrease=57,rowpos=1,colpos=1,treatment=factor("D",levels(OrchardSprays$treatment)))
str(manualFirstrow)

predict(model,newdata=firstrow,n.trees=100)
predict(model,newdata=manualFirstrow,n.trees=100)

输出:

> predict(model,newdata=firstrow,n.trees=100)
[1] 50.31276
> predict(model,newdata=manualFirstrow,n.trees=100)
[1] 50.31276