我使用R包adabag对一个(大型)数据集(140个观测值和3845个预测变量)拟合提升树。
我使用相同的参数和相同的数据集执行了两次该方法,每次返回的准确率值不同(我定义了一个简单的函数,用于给定数据集计算准确率)。这是我犯了错误,还是每次拟合时返回不同的准确率值是正常的?这个问题是否因为数据集很大而引起的?
返回给定预测值和真实测试集值的准确率的函数。
err<-function(pred_d, test_d){ abs.acc<-sum(pred_d==test_d) rel.acc<-abs.acc/length(test_d) v<-c(abs.acc,rel.acc) return(v)}
新编辑(2017年1月9日):关于上述背景的重要后续问题。
据我所知,我的代码中没有使用任何“伪随机对象”(如生成随机数等),因为我主要是使用rpart包拟合树,使用adabag包对大型数据集拟合提升树。你能解释一下,当我执行代码时,“伪随机性”是如何进入的吗?
编辑1:使用R包rpart时也出现了类似现象。
编辑2:在iris数据集上使用rpart拟合树时没有出现类似现象。
回答:
如果你没有设置种子(使用set.seed()
),你没有理由期望得到相同的结果。
如果你在做统计分析而不是信息安全,设置什么样的种子并不重要。你可以用几个不同的种子运行模型,以检查其敏感性。你只需要在涉及伪随机性的任何操作之前设置种子。大多数人会在代码开始时设置种子。
这在统计学中无处不在;它影响所有语言中所有概率模型和过程。
请注意,在信息安全的情况下,重要的是要有一个(伪)随机种子,这个种子不能轻易通过蛮力攻击被猜出,因为(简而言之)知道安全程序内部使用的种子值为其被黑开了方便之门。在科学和统计学中,情况恰恰相反——你和你分享代码/研究的任何人都应该知道种子,以确保可重复性。
https://en.wikipedia.org/wiki/Random_seed
http://www.grasshopper3d.com/forum/topics/what-are-random-seed-values