Linear Regression

线性回归模型(linear regression model)利用最小二乘函数对一个或多个自变量与一个因变量之间的关系进行建模,是一种常见的预测模型。

1. 算法介绍

线性回归模型(linear regression model)是一种回归模型。给一个随机样本 Linear Regression - 图1,i=1,\ldots,n), 一个线性回归模型假设回归子Linear Regression - 图2和回归量Linear Regression - 图3 之间的关系是除了X的影响以外,还有其他的变量存在。我们加入一个误差项Linear Regression - 图4(也是一个随机变量)来捕获除了 Linear Regression - 图5之外任何对Linear Regression - 图6的影响,一个多变量线性回归模型表示为以下的形式:

model

线性回归模型使用最小二乘法计算损失,其目标是最小化残差平方和,目标函数如下所示:

model^{2})

其中:Linear Regression - 图9,({\displaystyle{i}=1,2,\ldots,n))为一组样本数据。

2. 分布式实现 on Angel

Angel MLLib提供了用Mini-Batch Gradient Descent优化方法求解的Linear Regression算法,其算法逻辑如下其中Linear Regression - 图10)

Linear Regression - 图11

其说明如下:

  • Learning Rate在迭代过程中衰减:

Linear Regression - 图12

其中, α为衰减系数, T为迭代次数

3. 运行 & 性能

输入格式

  • ml.feature.index.range:特征向量的维度, 即特征index的范围:例如如果index范围为[0, 100000000], 则可以将该参数配置为100000000;这个参数也可以配置为-1,表示index 范围为[Integer.MIN_VALUE, Integer.MAX_VALUE] 或者[Long.MIN_VALUE, Long.MAX_VALUE]
  • ml.model.size: 模型大小, 对于一些稀疏模型, 存在一些无效维度, 即所有样本要这一维度上的取值匀为0. ml.model.size = ml.feature.index.range - number of invalidate indices
  • ml.data.type:支持”dense”、”libsvm”、”dummy”三种数据格式,具体参考:Angel数据格式

参数

  • 算法参数

    • ml.epoch.num:迭代次数
    • ml.num.update.per.epoch: 每个epoch更新的个数
    • ml.data.validate.ratio:每次validation的样本比率,设为0时不做validation
    • ml.learn.rate:初始学习速率
    • ml.learn.decay:学习速率衰减系数
    • ml.reg.l1:L1惩罚项系数
    • ml.reg.l2:L2惩罚项系数
  • 输入输出参数

    • ml.feature.index.range:特征向量的维度
    • ml.data.type: 支持”dense”、”libsvm”两种数据格式
    • angel.train.data.path:训练数据的输入路径
    • angel.predict.data.path:预测数据的输入路径
    • angel.save.model.path:训练完成后,模型的保存路径
    • angel.predict.out.path:预测结果存储路径
    • angel.log.path:log文件保存路径
  • 资源参数

    • angel.workergroup.number:Worker个数
    • angel.worker.memory.mb:Worker申请内存大小
    • angel.worker.task.number:每个Worker上的task的个数,默认为1
    • angel.ps.number:PS个数
    • angel.ps.memory.mb:PS申请内存大小
  • 提交命令

    *向Yarn集群提交LinearRegression算法训练任务:

    1. ./bin/angel-submit \
    2. --action.type=train \
    3. --angel.app.submit.class=com.tencent.angel.ml.core.graphsubmit.GraphRunner \
    4. --ml.model.class.name=com.tencent.angel.ml.regression.LinearRegression \
    5. --angel.train.data.path=$input_path \
    6. --angel.save.model.path=$model_path \
    7. --angel.log.path=$log_path \
    8. --ml.data.is.classification=false \
    9. --ml.model.is.classification=false \
    10. --ml.epoch.num=10 \
    11. --ml.feature.index.range=$featureNum+1 \
    12. --ml.data.validate.ratio=0.1 \
    13. --ml.learn.rate=0.1 \
    14. --ml.learn.decay=1 \
    15. --ml.reg.l2=0.001 \
    16. --ml.num.update.per.epoch=10 \
    17. --ml.worker.thread.num=4 \
    18. --ml.data.type=libsvm \
    19. --ml.model.type=T_FLOAT_DENSE \
    20. --angel.workergroup.number=2 \
    21. --angel.worker.memory.mb=5000 \
    22. --angel.worker.task.number=1 \
    23. --angel.ps.number=2 \
    24. --angel.ps.memory.mb=5000 \
    25. --angel.job.name=linearReg_network \
    26. --angel.output.path.deleteonexist=true

    *向Yarn集群提交LinearRegression算法增量训练任务:

    1. ./bin/angel-submit \
    2. --action.type=inctrain \
    3. --angel.app.submit.class=com.tencent.angel.ml.core.graphsubmit.GraphRunner \
    4. --ml.model.class.name=com.tencent.angel.ml.regression.LinearRegression \
    5. --angel.train.data.path=$input_path \
    6. --angel.load.model.path=$model_path \
    7. --angel.save.model.path=$model_path \
    8. --angel.log.path=$log_path \
    9. --ml.model.is.classification=false \
    10. --ml.data.is.classification=false \
    11. --ml.epoch.num=10 \
    12. --ml.feature.index.range=$featureNum+1 \
    13. --ml.data.validate.ratio=0.1 \
    14. --ml.learn.rate=0.1 \
    15. --ml.learn.decay=1 \
    16. --ml.reg.l2=0.001 \
    17. --ml.num.update.per.epoch=10 \
    18. --ml.worker.thread.num=4 \
    19. --ml.data.type=libsvm \
    20. --ml.model.type=T_FLOAT_DENSE \
    21. --angel.workergroup.number=2 \
    22. --angel.worker.memory.mb=5000 \
    23. --angel.worker.task.number=1 \
    24. --angel.ps.number=2 \
    25. --angel.ps.memory.mb=5000 \
    26. --angel.job.name=linearReg_network \
    27. --angel.output.path.deleteonexist=true

    *向Yarn集群提交LinearRegression算法预测任务:

    1. ./bin/angel-submit \
    2. --action.type=predict \
    3. --angel.app.submit.class=com.tencent.angel.ml.core.graphsubmit.GraphRunner \
    4. --ml.model.class.name=com.tencent.angel.ml.regression.LinearRegression \
    5. --angel.predict.data.path=$input_path \
    6. --angel.save.model.path=$model_path \
    7. --angel.predict.out.path $predict_path \
    8. --angel.log.path=$log_path \
    9. --ml.feature.index.range=$featureNum+1 \
    10. --ml.data.type=libsvm \
    11. --ml.model.type=T_FLOAT_DENSE \
    12. --ml.worker.thread.num=4 \
    13. --angel.workergroup.number=2 \
    14. --angel.worker.memory.mb=5000 \
    15. --angel.worker.task.number=1 \
    16. --angel.ps.number=2 \
    17. --angel.ps.memory.mb=5000 \
    18. --angel.job.name=linearReg_network_predict \
    19. --angel.output.path.deleteonexist=true

性能

  • 数据:E2006-tfidf,1.5×10^5 特征,1.6×10^4 样本
  • 资源:
    • Angel:executor:2个,5G内存,1个task;ps:2个,5G内存
  • 迭代100次时间:
    • Angel:25 min