Angel分布式机器学习平台—LR算法示例
最近把自己丢了,从外界事物找到了,又似乎没有找到,事情本身不会产生影响,怎么想,向何处,还是要看清事物的本质,需要自己去摸索,比如为什么不快乐,快乐的算法是什么,为什么烦躁,烦躁是否本虚无缥缈.....
以上为啰嗦,写了也不看,以下为“废柴”,捡了也点不着火.......瞎掰
逻辑回归模型(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
参数说明
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.3077143
1,-0.4149464
2,0.15905222
3,0.47095177
4,0.48516318
5,0.1029818
6,-0.35135424
7,0.29210117
8,0.47274232
9,-0.12589505
10,-0.17662741
11,-0.026236832
12,-0.0027008634
13,-0.2910886
14,-0.09957797
15,-0.066793635
16,-0.08072004
17,-0.06923011
18,-0.19361725
19,-0.05749909
20,-0.20633766
21,-0.24973151
22,0.48868328
23,0.042904988
24,0.020065345
25,-0.21311939
26,-0.3799582
27,-0.0012097803
28,0.09784011
29,-0.096884854
30,-0.14614359
31,0.48185125
32,-0.15232736
33,-0.04199056
34,-1.2379774
35,-0.24972984
36,-0.057501443
37,0.0629562
38,0.8748043
39,1.1264023
40,-0.49938425
41,-0.74547505
42,-0.28110746
43,-0.13904169
44,-0.14610577
45,0.07728987
46,0.48899466
47,0.06702974
48,-0.69127965
49,0.2902383
50,0.7446998
51,0.5474431
52,-0.50353974
53,-0.37135124
54,0.018284043
55,-0.5747624
56,-0.14096206
57,-0.07656245
58,0.39693177
59,-0.007428713
60,1.1961002
61,-0.93246406
62,-0.0056267236
63,-0.053143077
64,-0.31580734
65,-0.49655086
66,-0.029220894
67,-0.068281196
68,-0.1641851
69,-0.15537062
70,-0.19036499
71,-0.6396131
72,0.032170318
73,-1.1433893
74,0.535968
75,-0.8539607
76,0.24653596
77,-1.1199836
78,-0.17230007
79,-0.07883548
80,0.31718653
81,0.44651115
82,0.2025038
83,0.020896498
84,0.05121417
85,-0.05542679
86,0.020427722
87,0.047374956
88,-0.014221619
89,-0.05227399
90,0.02026367
91,-0.03285627
92,-0.053368606
93,-0.08137218
94,0.012272317
95,0.005070671
96,-0.0050842646
97,0.07704811
98,0.058896497
99,-0.018873218
100,0.003989504
101,-0.053314976
102,-0.3033929
103,-0.005062878
104,0.015126988
105,0.01282182
106,-0.05156444
107,-0.0032575948
108,-0.01301128
109,0.024194945
110,-0.01949654
111,-0.0732494
112,-0.0127130775
113,-0.021436924
114,-0.028987654
115,-0.0044268165
116,-0.0076604476
117,0.009386828
118,-0.050590254
119,-0.011004716
120,-0.016635574
121,-0.0048164227
122,-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