查看原文
其他

Angel分布式机器学习平台—LR算法示例

一尘 跳动的数据 2023-09-29

最近把自己丢了,从外界事物找到了,又似乎没有找到,事情本身不会产生影响,怎么想,向何处,还是要看清事物的本质,需要自己去摸索,比如为什么不快乐,快乐的算法是什么,为什么烦躁,烦躁是否本虚无缥缈.....

以上为啰嗦,写了也不看,以下为“废柴”,捡了也点不着火.......瞎掰



逻辑回归模型(logistic regression model)是一种分类模型。它是最常见和常用的一种分类方法,在传统的广告推荐中被大量使用,朴实但有效。



1. 算法介绍


逻辑回归模型(logistic regression model)是一种分类模型。样本x属于类别y的概率P(y|x)服从logistic分布: 



综合两种情况,有:



逻辑回归模型使用log损失函数,带L2惩罚项的目标函数如下所示:



其中:为L2正则项。



2. Logistic Regression on Angel


angel提供了用mini-batch gradient descent优化方法求解的Logistic Regression算法,算法逻辑如下



逻辑回归算法的模型仅由单个输入层组成,该输入层可为“dense”或“sparse”,该层的输出即为模型的输出结果,即分类结果。


logistic regression训练过程, Angel实现了用梯度下降方法优化,迭代训练得到LR模型,每次迭代worker和PS上的逻辑如下:     

  • worker:每次迭代从PS上拉取矩阵对应的权重向量到本地,计算出对应的梯度更新值,push到PS对应的梯度向量上。注意,此处的会根据worker端每个样本对应的特征索引拉取对应的模型权重,这样做可减小通信成本同时节约内存以提高计算效率

  • PS:PS汇总所有worker推送的梯度更新值,取平均,通过优化器计算新的模型权重并进行相应更新


LR预测结果:

  • 格式:rowID,pred,prob,label

  • 说明:rowID表示样本所在的行ID,从0开始计数;pred:样本的预测结果值;prob:样本相对该预测结果的概率;label:预测样本被分到的类别,当预测结果pred大于0时,label为1,小于0为-1



3. 运行


样本格式:


LR on Angel支持“dense”、“libsvm”、“dummy”三种数据格式。其中“dense”即为一般的数据表格式,每列表示相应的特征,各特征之间用空格或逗号隔开,此处不再详述。下面重点说下“dummy”和“libsvm”格式:


  • dummy格式

每行文本表示一个样本,每个样本的格式为"y index1 index2 index3 ..."。其中:index特征的ID;训练数据的y为样本的类别,可以取1、-1两个值;预测数据的y为样本的ID值。比如,属于正类的样本[2.0, 3.1, 0.0, 0.0, -1, 2.2]的文本表示为“1 0 1 4 5”,其中“1”为类别,“0 1 4 5”表示特征向量的第0、1、4、5个维度的值不为0。同理,属于负类的样本[2.0, 0.0, 0.1, 0.0, 0.0, 0.0]被表示为“-1 0 2”。


训练样本样例数据如下:

-1 2 10 13 18 38 41 54 63 66 72 74 75 79 82-1 4 6 13 18 38 39 50 62 66 72 73 75 77 82-1 2 5 16 21 35 40 52 63 66 72 73 75 79 82-1 4 5 16 20 34 39 52 62 70 72 73 75 79 82-1 1 5 17 18 38 39 51 60 70 71 73 75 79 94-1 2 5 17 28 38 39 50 60 66 71 73 75 79 82-1 3 5 15 25 34 44 48 63 70 71 73 75 77 100+1 4 6 16 21 35 39 50 62 66 72 73 75 80 82+1 1 5 13 28 38 41 51 63 66 71 74 75 81 82+1 3 5 15 18 38 39 50 62 66 72 74 75 79 82+1 2 5 17 19 36 39 50 62 70 72 73 75 81 82+1 1 10 14 18 38 39 51 62 67 72 73 75 79 89



  • libsvm格式

每行文本表示一个样本,每个样本的格式为"y index1:value1 index2:value1 index3:value3 ..."。其中:index为特征的ID,value为对应的特征值;训练数据的y为样本的类别,可以取1、-1两个值;预测数据的y为样本的ID值。比如,属于正类的样本[2.0, 3.1, 0.0, 0.0, -1, 2.2]的文本表示为“1 0:2.0 1:3.1 4:-1 5:2.2”,其中“1”为类别,"0:2.0"表示第0个特征的值为2.0。同理,属于负类的样本[2.0, 0.0, 0.1, 0.0, 0.0, 0.0]被表示为“-1 0:2.0 2:0.1”。


训练样本样例数据如下:

-1 3:1 11:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1-1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1-1 3:1 6:1 17:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1-1 5:1 6:1 17:1 21:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1-1 2:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 95:1-1 3:1 6:1 18:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1-1 4:1 6:1 16:1 26:1 35:1 45:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 101:1+1 5:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1+1 2:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1+1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1+1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1+1 2:1 11:1 15:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1



参数说明            


1. ml.feature.index.range:特征索引范围
2. ml.model.size:特征维数
3. ml.data.validate.ratio:验证集采样率
4. ml.data.type:数据类型,分“libsvm”和“dummy”两种
5. ml.learn.rate:学习率
6. ml.opt.decay.class.name:学习率衰减系类
7. ml.opt.decay.on.batch: 是否对每个mini batch衰减
8. ml.opt.decay.alpha: 学习率衰减参数alpha
9. ml.opt.decay.beta: 学习率衰减参数beta
10. ml.opt.decay.intervals: 学习率衰减参数intervals
11. ml.reg.l2: l2正则项系数
12. action.type:任务类型,训练用"train",预测用"predict"
13. ml.inputlayer.optimizer:优化器类型,可选"adam","ftrl"和"momentum"

14. ml.data.label.trans.class: 是否要对标签进行转换, 默认为"NoTrans", 可选项为"ZeroOneTrans"(转为0-1), "PosNegTrans"(转为正负1), "AddOneTrans"(加1), "SubOneTrans"(减1).


15. ml.data.label.trans.threshold: "ZeroOneTrans"(转为0-1), "PosNegTrans"(转为正负1)这两种转还要以设一个阈值, 大于阈值的为1, 阈值默认为0


16. ml.data.posneg.ratio: 正负样本重采样比例, 对于正负样本相差较大的情况有用(如5倍以上)



提交命令 


你可以通过下面命令向Yarn集群提交LR算法训练任务,也可以通过spark提交任务

样例如下:

../../bin/angel-submit \    -Dml.epoch.num=10 \ -Dangel.app.submit.class=com.tencent.angel.ml.core.graphsubmit.GraphRunner \ -Dml.model.class.name=com.tencent.angel.ml.classification.LogisticRegression \ -Dml.feature.index.range=$featureNum \ -Dml.model.size=$featureNum \ -Dml.data.validate.ratio=0.1 \ -Dml.data.type=libsvm \ -Dml.learn.rate=0.1 \ -Dml.reg.l2=0.03 \ -Daction.type=train \ -Dml.inputlayer.optimizer=ftrl \ -Dangel.train.data.path=$input_path \ -Dangel.workergroup.number=20 \ -Dangel.worker.memory.mb=20000 \ -Dangel.worker.task.number=1 \ -Dangel.ps.number=20 \ -Dangel.ps.memory.mb=10000 \ -Dangel.task.data.storage.level=memory \ -Dangel.job.name=angel_l1




4. 模型结果



graph.json 内容如下:

{ "data":{ "path":"data/a9a/a9a_123d_train.dummy", "format":"dummy", "indexrange":123, "validateratio":0.1, "sampleratio":1.0 }, "model":{ "savepath":"file:////var/folders/1_/jkx2bw_j29q32x3tg97n833c5_6bm9/T//model/LR", "modeltype":"T_FLOAT_SPARSE", "modelsize":123 }, "train":{ "epoch":10, "lr":1.0 }, "layers":{ "input":{ "type":"SimpleInputLayer", "outputdim":1, "transfunc":{ "type":"Identity" }, "optimizer":{ "type":"Momentum", "momentum":0.9 } }, "simpleLossLayer":{ "type":"LossLayer", "outputdim":-1, "inputlayer":"input", "lossfunc":{ "type":"LogLoss" } } }}


input_bias 目录内容如下:


0 文件内容如下:

0,-0.07691361


meta文件内容如下:

{ "matrixId":0, "matrixName":"input_bias", "formatClassName":"com.tencent.angel.model.output.format.ColIdValueTextRowFormat", "rowType":7, "row":1, "col":1, "blockRow":1, "blockCol":100, "options":{ "feature.index.range.end":"1", "ml.matrix.output.format":"com.tencent.angel.model.output.format.ColIdValueTextRowFormat", "feature.index.range.start":"0" }, "partMetas":{ "0":{ "partId":0, "startRow":0, "endRow":1, "startCol":0, "endCol":1, "nnz":1, "saveRowNum":1, "saveColNum":0, "saveColElemNum":0, "fileName":"0", "offset":0, "length":14, "rowMetas":{ "0":{ "rowId":0, "offset":0, "elementNum":1, "saveType":0 } } } }}



input_weight 目录内容如下:


0 文件内容如下:

0,-1.30771431,-0.41494642,0.159052223,0.470951774,0.485163185,0.10298186,-0.351354247,0.292101178,0.472742329,-0.1258950510,-0.1766274111,-0.02623683212,-0.002700863413,-0.291088614,-0.0995779715,-0.06679363516,-0.0807200417,-0.0692301118,-0.1936172519,-0.0574990920,-0.2063376621,-0.2497315122,0.4886832823,0.04290498824,0.02006534525,-0.2131193926,-0.379958227,-0.001209780328,0.0978401129,-0.09688485430,-0.1461435931,0.4818512532,-0.1523273633,-0.0419905634,-1.237977435,-0.2497298436,-0.05750144337,0.062956238,0.874804339,1.126402340,-0.4993842541,-0.7454750542,-0.2811074643,-0.1390416944,-0.1461057745,0.0772898746,0.4889946647,0.0670297448,-0.6912796549,0.290238350,0.744699851,0.547443152,-0.5035397453,-0.3713512454,0.01828404355,-0.574762456,-0.1409620657,-0.0765624558,0.3969317759,-0.00742871360,1.196100261,-0.9324640662,-0.005626723663,-0.05314307764,-0.3158073465,-0.4965508666,-0.02922089467,-0.06828119668,-0.164185169,-0.1553706270,-0.1903649971,-0.639613172,0.03217031873,-1.143389374,0.53596875,-0.853960776,0.2465359677,-1.119983678,-0.1723000779,-0.0788354880,0.3171865381,0.4465111582,0.202503883,0.02089649884,0.0512141785,-0.0554267986,0.02042772287,0.04737495688,-0.01422161989,-0.0522739990,0.0202636791,-0.0328562792,-0.05336860693,-0.0813721894,0.01227231795,0.00507067196,-0.005084264697,0.0770481198,0.05889649799,-0.018873218100,0.003989504101,-0.053314976102,-0.3033929103,-0.005062878104,0.015126988105,0.01282182106,-0.05156444107,-0.0032575948108,-0.01301128109,0.024194945110,-0.01949654111,-0.0732494112,-0.0127130775113,-0.021436924114,-0.028987654115,-0.0044268165116,-0.0076604476117,0.009386828118,-0.050590254119,-0.011004716120,-0.016635574121,-0.0048164227122,-3.995193E-4


meta 文件内容如下:

{ "matrixId":1, "matrixName":"input_weight", "formatClassName":"com.tencent.angel.model.output.format.ColIdValueTextRowFormat", "rowType":10, "row":3, "col":123, "blockRow":3, "blockCol":123, "options":{ "feature.index.range.end":"123", "ml.matrix.output.format":"com.tencent.angel.model.output.format.ColIdValueTextRowFormat", "feature.index.range.start":"0" }, "partMetas":{ "0":{ "partId":0, "startRow":0, "endRow":3, "startCol":0, "endCol":123, "nnz":369, "saveRowNum":1, "saveColNum":0, "saveColElemNum":0, "fileName":"0", "offset":0, "length":1842, "rowMetas":{ "0":{ "rowId":0, "offset":0, "elementNum":123, "saveType":0 } } } }}


示例代码路径:

https://github.com/Angel-ML/angel/blob/master/angel-ps/examples/src/main/java/com/tencent/angel/example/ml/LinearRegLocalExample.java

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存