47-20
用lasso回归建模,相同的输入文件,运行两次构建的模型并一样。
类似问题:用glmnet包来筛选logistics回归的变量,发现同样的代码,多次运行其结果并不完全一致。也就是说,有可能这次运行筛选出来1个变量,下次运行就筛出2个。本质就是lamda.min这个取值在变化。请问各位这是为什么?是我代码有问题还是lasso本身就不是很稳定?
参考方案:
①lambda的取值通过交叉验证确定 交叉验证的集合划分是random 如果想固定取值 可以在cv.glmnet这句前加set.seed()
②每次做cv.glmnet的时候,它内部有一个随机分配测试集和验证集的过程,所以会导致你每一次的结果都不一样。所以,你要在运行cv.glmnet前,加上set.seed(任意数字),这个任意数字不改,你的结果就不会变。

代码
关于set.seed(任意数字),任意数字取值问题
①没有特定的规定,只要保证两次种子一样就可以得到相同的结果
②set.seed()用于设定随机数种子,一个特定的种子可以产生一个特定的伪随机序列,这个函数的主要目的,是让你的模拟能够可重复出现,因为很多时候我们需要取随机数,但这段代码再跑一次的时候,结果就不一样了,如果需要重复出现同样的模拟结果的话,就可以用set.seed()。在调试程序或者做展示的时候,结果的可重复性是很重要的,所以随机数种子也就很有必要。
③也可以简单地理解为括号里的数只是一个编号而已,例如set.seed(100)不应将括号里的数字理解成“一百”,而是应该理解成“编号为一零零的随机数发生”,下一次再模拟可以采用二零零(200)或者一一一(111)等不同的编号即可,编号设定基本可以随意
编程中通常说的可再现性,如果是真随机的话,每一次运行结果都肯定不一定,我们无法重现我们上一次的结果。
④在计算机科学中,再现性是指只要程序执行时的环境和初始条件相同,当程序重复执行时,不论它是从头到尾不停顿地执行,还是“停停走走”地执行,都将获得相同的结果。再现性是程序是否可以并行执行重要的准则之一。广义上,再现性:在改变了的测量条件下,对同一被测量的测量结果之间的一致性,称为测量结果的再现性。再现性又称为复现性、重现性。