我正在尝试在R中实现一个简单的梯度增强算法用于回归。这是我到目前为止所提出的,但错误不是像我预期的那样平稳。有什么建议吗?
data("OrchardSprays")
niter <- 10
learn <- 0.05
y <- OrchardSprays$decrease
yhat <- rep(0,nrow(OrchardSprays))
weight <- rep(1,nrow(OrchardSprays))
loss <- function(y,yhat) (y - yhat)^2
for (i in seq(niter))
{
model <- lm(decrease~.,weights=weight,data=OrchardSprays)
yhat <- yhat + weight * (predict(model) - yhat) / i
error <- mean(loss(y,yhat))
weight <- weight + learn * (loss(y,yhat) - error) / error
cat(i,"error:",error,"\n")
}
输出:
1 error: 319.5881
2 error: 318.6175
3 error: 317.9368
4 error: 317.6112
5 error: 317.6369
6 error: 317.9772
7 error: 318.5833
8 error: 319.4047
9 error: 320.3939
10 error: 321.5086
答案 0 :(得分:5)
不确定这是否有帮助,但如果降低起始重量并增加迭代次数,错误将更接近于零。但是,它仍然没有稳定(错误开始在迭代103处重新开始)。我还添加了以下语句:weight <- ifelse(weight < 0.0, 0.0, weight)
以补偿missing or negative weights not allowed
函数生成的lm
错误。
data("OrchardSprays")
niter <- 105
learn <- 0.05
y <- OrchardSprays$decrease
yhat <- rep(0.0,nrow(OrchardSprays))
weight <- rep(0.2,nrow(OrchardSprays))
loss <- function(y,yhat) (y - yhat)^2
error <- mean(loss(y,yhat))
cat("initial error:",error,"\n")
for (i in seq(niter))
{
model <- lm(decrease~.,weights=weight,data=OrchardSprays)
yhat <- yhat + weight * (predict(model) - yhat) / i
error <- mean(loss(y,yhat))
weight <- weight + learn * (loss(y,yhat) - error) / error
weight <- ifelse(weight < 0.0, 0.0, weight)
cat(i,"error:",error,"\n")
}
输出中:
initial error: 3308.922
1 error: 2232.762
2 error: 1707.971
3 error: 1360.834
4 error: 1110.503
5 error: 921.2804
6 error: 776.4314
7 error: 663.5947
8 error: 574.2603
9 error: 502.2455
10 error: 443.2639
11 error: 394.2983
12 error: 353.1736
13 error: 318.2869
14 error: 288.4326
15 error: 262.6827
16 error: 240.3086
17 error: 220.7289
18 error: 203.4741
19 error: 188.1632
20 error: 174.4876
21 error: 162.1971
22 error: 151.0889
23 error: 140.9982
24 error: 131.7907
25 error: 123.3567
26 error: 115.6054
27 error: 108.4606
28 error: 101.8571
29 error: 95.73825
30 error: 90.05343
31 error: 84.75755
32 error: 79.81715
33 error: 75.19618
34 error: 70.86006
35 error: 66.77859
36 error: 62.92584
37 error: 59.28014
38 error: 55.8239
39 error: 52.54784
40 error: 49.44272
41 error: 46.49915
42 error: 43.71022
43 error: 41.07119
44 error: 38.57908
45 error: 36.23237
46 error: 34.03907
47 error: 32.00558
48 error: 30.12923
49 error: 28.39891
50 error: 26.80582
51 error: 25.33449
52 error: 23.97077
53 error: 22.70327
54 error: 21.52714
55 error: 20.43589
56 error: 19.42552
57 error: 18.48629
58 error: 17.60916
59 error: 16.78986
60 error: 16.02315
61 error: 15.30303
62 error: 14.62663
63 error: 13.99066
64 error: 13.39205
65 error: 12.82941
66 error: 12.30349
67 error: 11.811
68 error: 11.34883
69 error: 10.91418
70 error: 10.50448
71 error: 10.11723
72 error: 9.751116
73 error: 9.405197
74 error: 9.076175
75 error: 8.761231
76 error: 8.458107
77 error: 8.165144
78 error: 7.884295
79 error: 7.615498
80 error: 7.356618
81 error: 7.106186
82 error: 6.86324
83 error: 6.627176
84 error: 6.39777
85 error: 6.17544
86 error: 5.961616
87 error: 5.756781
88 error: 5.561157
89 error: 5.375131
90 error: 5.19945
91 error: 5.034539
92 error: 4.880956
93 error: 4.739453
94 error: 4.610629
95 error: 4.495216
96 error: 4.393571
97 error: 4.306144
98 error: 4.233587
99 error: 4.176799
100 error: 4.136802
101 error: 4.114575
102 error: 4.111308
103 error: 4.1278
104 error: 4.164539
105 error: 4.221389
答案 1 :(得分:3)
我承认多年来没有写过体重优化器,所以我可能会偏离基础。我首先在每次迭代时记录yhat
向量。看看这些值是振荡还是消失为零(因为我不确定你是通过除以i
来帮助还是伤害)。
同样,请查看lm()每次迭代的R ^ 2值。如果它们非常接近1,您可能只是遇到了当前规定的灵敏度极限lm()。
如果您能提供算法的来源,那么我们可以根据您正在实施的方程式检查代码,这将会很有帮助。
更新:快速浏览维基百科会产生以下结果:“有几个开源R软件包可用:gbm,[6] mboost,gbev。”我强烈建议您研究这些软件包,包括它们的源代码,看看它们是否能满足您的需求。
答案 2 :(得分:2)
您是否尝试过在每一步中随机抽样数据,因此您只向当前学习者展示一半示例?我想如果你每次使用完整的样本,你会得到一种令人讨厌的过度拟合。此外,我不确定提升线性模型(方差较小)有很大帮助。