最近一段时间需要对公司投资人群多个时间点是否流失进行预测,需要针对未来20天该用户群是否流失进行预测,于是需要至少建立20个数据集,做20个模型,进行20个预测,这要我重复写20遍代码,这种重复敲代码的感觉可不好(关键是一个模型可不是十行代码能解决问题的,有N多参数),好歹我自诩为人工智能人才,怎么能被重复性的代码难倒呢?
在网上百度了一下相关文章,发现有论坛已经解决了这个问题,我自己鼓捣了一下,也把相关原理写出来供大家赏析。
首先我需要重复编写的代码如下:
qbtrain1=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,33])
qbtrain2=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,34])
qbtrain3=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,35])
qbtrain4=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,36])
qbtrain5=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,37])
qbtrain6=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,38])
qbtrain7=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,39])
qbtrain8=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,40])
qbtrain9=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,41])
qbtrain10=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,42])
qbtrain11=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,43])
qbtrain12=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,44])
qbtrain13=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,45])
qbtrain14=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,46])
qbtrain15=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,47])
qbtrain16=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,48])
qbtrain17=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,49])
qbtrain18=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,50])
qbtrain19=xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,51])
首先大家需要先看看哪些代码是不变的,哪些是变化的,刚开始我打算用paste函数来解决这个问题,但是paste之后的字符不能成为表达式,后来我使用了如下代码解决了这个问题。
for (i in 1:19){
#配置训练集
s <- sprintf("qbtrain%s <- xgb.DMatrix(data=qbls1[,2:32],label=qbls1[,32+%s])",i,i)
eval(parse(text = s))
}
首先使用了一个循环语句,然后用sprintf函数将格式化字符串输出到变量中(函数中两个s%分别用后面两个i来替换),再然后用parse函数将字符串转化为表达式,最后是用eval函数执行表达式,最终就能使用循环语句将每一个变量循环执行出来。
当变量或者表达式相同字符较多的时候,均可以使用这种方法使自己的敲代码速度大大加快哟,大家赶紧来学学吧!
参考:http://bbs.pinggu.org/thread-4755603-1-1.html