参数服务器PS(Parameter Server)致力于解决大规模的离线及在线训练任务,SMART(Scalable Multiple Additive Regression Tree)是GBDT(Gradient Boosting Decision Tree)基于PS实现的迭代算法。PS-SMART支持百亿样本及几十万特征的训练任务,可以在上千节点中运行。同时,PS-SMART支持多种数据格式及直方图近似等优化技术。
使用限制
PS-SMART多分类组件的输入数据需要满足以下要求:
PS-SMART多分类组件的目标列仅支持数值类型。如果MaxCompute表数据是STRING类型,则需要进行类型转换。例如,分类目标是Good/Medium/Bad字符串,需要转换为0/1/2。
如果数据是KV格式,则特征ID必须为正整数,特征值必须为实数。如果特征ID为字符串类型,则需要使用序列化组件进行序列化。如果特征值为类别型字符串,需要进行特征离散化等特征工程处理。
虽然PS-SMART多分类组件支持数十万特征任务,但是消耗资源大且运行速度慢,可以使用GBDT类算法进行训练。GBDT类算法适合直接使用连续特征进行训练,除需要对类别特征进行One-Hot编码(筛除低频特征)外,不建议对其他连续型数值特征进行离散化。
PS-SMART算法会引入随机性。例如,data_sample_ratio及fea_sample_ratio表示的数据和特征采样、算法使用的直方图近似优化及局部Sketch归并为全局Sketch的顺序随机性。虽然多个Worker分布式执行时,树结构不同,但是从理论上可以保证模型效果相近。如果您在训练过程中,使用相同数据和参数,多次得到的结果不一致,属于正常现象。
如果需要加速训练,可以增大计算核心数。因为PS-SMART算法需要所有服务器获得资源后,才能开始训练,所以集群忙碌时,申请较多资源会增加等待时间。
注意事项
使用PS-SMART多分类组件时,需要注意以下事宜:
虽然PS-SMART多分类组件支持数十万特征任务,但是消耗资源大且运行速度慢,可以使用GBDT类算法进行训练。GBDT类算法适合直接使用连续特征进行训练,除需要对类别特征进行One-Hot编码(筛除低频特征)外,不建议对其他连续型数值特征进行离散化。
PS-SMART算法会引入随机性。例如,data_sample_ratio及fea_sample_ratio表示的数据和特征采样、算法使用的直方图近似优化及局部Sketch归并为全局Sketch的顺序随机性。虽然多个Worker分布式执行时,树结构不同,但是从理论上可以保证模型效果相近。如果您在训练过程中,使用相同数据和参数,多次得到的结果不一致,属于正常现象。
如果需要加速训练,可以增大计算核心数。因为PS-SMART算法需要所有服务器获得资源后,才能开始训练,所以集群忙碌时,申请较多资源会增加等待时间。
配置组件
方式一:可视化方式
在Designer工作流页面添加PS-SMART多分类组件,并在界面右侧配置相关参数:
参数类型  | 参数  | 描述  | 
字段设置  | 是否稀疏格式  | 稀疏格式的KV之间使用空格分隔,key与value之间使用英文冒号(:)分隔。例如1:0.3 3:0.9。  | 
选择特征列  | 输入表中,用于训练的特征列。如果输入数据是Dense格式,则只能选择数值(BIGINT或DOUBLE)类型。如果输入数据是Sparse KV格式,且key和value是数值类型,则只能选择STRING类型。  | |
选择标签列  | 输入表的标签列,支持STRING及数值类型。如果是内部存储,则仅支持数值类型。例如二分类中的0和1。  | |
选择权重列  | 列可以对每行样本进行加权,支持数值类型。  | |
参数设置  | 类别数  | 多分类的类别数量。如果类别数为n,则标签列的取值为{0,1,2,...,n-1}。  | 
评估指标类型  | 支持multiclass negative log likelihood和multiclass classification error类型。  | |
树数量  | 需要配置为树数量,正整数,树数量和训练时间成正比。  | |
树最大深度  | 默认值为5,即最多32个叶子节点。  | |
数据采样比例  | 构建每棵树时,采样部分数据进行学习,构建弱学习器,从而加快训练。  | |
特征采样比例  | 构建每棵树时,采样部分特征进行学习,构建弱学习器,从而加快训练。  | |
L1惩罚项系数  | 控制叶子节点大小。该参数值越大,叶子节点规模分布越均匀。如果过拟合,则增大该参数值。  | |
L2惩罚项系数  | 控制叶子节点大小。该参数值越大,叶子节点规模分布越均匀。如果过拟合,则增大该参数值。  | |
学习速率  | 取值范围为(0,1)。  | |
近似Sketch精度  | 构造Sketch的切割分位点阈值。该参数值越小,获得的桶越多。一般使用默认值0.03,无需手动配置。  | |
最小分裂损失变化  | 分裂节点所需要的最小损失变化。该参数值越大,分裂越保守。  | |
特征数量  | 特征数量或最大特征ID。如果需要估计使用资源,则必须手动配置该参数。  | |
全局偏置项  | 所有样本的初始预测值。  | |
随机数产生器种子  | 随机数种子,整型。  | |
特征重要性类型  | 取值: 
  | |
执行调优  | 核心数  | 默认为系统自动分配。  | 
每个核的内存大小  | 单个核心使用的内存,单位为MB。通常无需手动配置,系统自动分配。  | 
方式二:PAI命令方式
使用PAI命令配置PS-SMART多分类组件参数。您可以使用SQL脚本组件进行PAI命令调用,详情请参见场景4:在SQL脚本组件中执行PAI命令。
--训练
PAI -name ps_smart
    -project algo_public
    -DinputTableName="smart_multiclass_input"
    -DmodelName="xlab_m_pai_ps_smart_bi_545859_v0"
    -DoutputTableName="pai_temp_24515_545859_2"
    -DoutputImportanceTableName="pai_temp_24515_545859_3"
    -DlabelColName="label"
    -DfeatureColNames="features"
    -DenableSparse="true"
    -Dobjective="multi:softprob"
    -Dmetric="mlogloss"
    -DfeatureImportanceType="gain"
    -DtreeCount="5"
    -DmaxDepth="5"
    -Dshrinkage="0.3"
    -Dl2="1.0"
    -Dl1="0"
    -Dlifecycle="3"
    -DsketchEps="0.03"
    -DsampleRatio="1.0"
    -DfeatureRatio="1.0"
    -DbaseScore="0.5"
    -DminSplitLoss="0"
--预测
PAI -name prediction
    -project algo_public
    -DinputTableName="smart_multiclass_input";
    -DmodelName="xlab_m_pai_ps_smart_bi_545859_v0"
    -DoutputTableName="pai_temp_24515_545860_1"
    -DfeatureColNames="features"
    -DappendColNames="label,features"
    -DenableSparse="true"
    -DkvDelimiter=":"
    -Dlifecycle="28"模块  | 参数  | 是否必选  | 默认值  | 描述  | 
数据参数  | featureColNames  | 是  | 无  | 输入表中,用于训练的特征列。如果输入表是Dense格式,则只能选择数值(BIGINT或DOUBLE)类型。如果输入表是Sparse KV格式,且KV格式中key和value是数值类型,则只能选择STRING类型。  | 
labelColName  | 是  | 无  | 输入表的标签列,支持STRING及数值类型。如果是内部存储,则仅支持数值类型。例如多分类的{0,1,2,…,n-1},其中n表示类别数量。  | |
weightCol  | 否  | 无  | 列可以对每行样本进行加权,支持数值类型。  | |
enableSparse  | 否  | false  | 是否为稀疏格式,取值范围为{true,false}。稀疏格式的KV之间使用空格分隔,key与value之间使用英文冒号(:)分隔。例如1:0.3 3:0.9。  | |
inputTableName  | 是  | 无  | 输入表的名称。  | |
modelName  | 是  | 无  | 输出的模型名称。  | |
outputImportanceTableName  | 否  | 无  | 输出特征重要性的表名。  | |
inputTablePartitions  | 否  | 无  | 格式为ds=1/pt=1。  | |
outputTableName  | 否  | 无  | 输出至MaxCompute的表,二进制格式,不支持读取,只能通过SMART的预测组件获取。  | |
lifecycle  | 否  | 3  | 输出表的生命周期。  | |
算法参数  | classNum  | 是  | 无  | 多分类的类别数量。如果类别数量为n,则标签列取值为{0,1,2,...,n-1}。  | 
objective  | 是  | 无  | 目标函数类型。如果进行多分类训练,则选择multi:softprob。  | |
metric  | 否  | 无  | 训练集的评估指标类型,输出在Logview文件Coordinator区域的stdout。支持以下类型: 
  | |
treeCount  | 否  | 1  | 树数量,与训练时间成正比。  | |
maxDepth  | 否  | 5  | 树的最大深度,取值范围为1~20。  | |
sampleRatio  | 否  | 1.0  | 数据采样比例,取值范围为(0,1]。如果取值为1.0,则表示不采样。  | |
featureRatio  | 否  | 1.0  | 特征采样比例,取值范围为(0,1]。如果取值为1.0,则表示不采样。  | |
l1  | 否  | 0  | L1惩罚项系数。该参数值越大,叶子节点分布越均匀。如果过拟合,则增大该参数值。  | |
l2  | 否  | 1.0  | L2惩罚项系数。该参数值越大,叶子节点分布越均匀。如果过拟合,则增大该参数值。  | |
shrinkage  | 否  | 0.3  | 取值范围为(0,1)。  | |
sketchEps  | 否  | 0.03  | 构造Sketch的切割分位点阈值,桶数为O(1.0/sketchEps)。该参数值越小,获得的桶越多。一般使用默认值,无需手动配置。取值范围为(0,1)。  | |
minSplitLoss  | 否  | 0  | 分裂节点所需要的最小损失变化。该参数值越大,分裂越保守。  | |
featureNum  | 否  | 无  | 特征数量或最大特征ID。如果需要估计使用资源,则必须手动配置该参数。  | |
baseScore  | 否  | 0.5  | 所有样本的初始预测值。  | |
randSeed  | 否  | 无  | 随机数种子,整型。  | |
featureImportanceType  | 否  | gain  | 计算特征重要性的类型,包括: 
  | |
调优参数  | coreNum  | 否  | 系统自动分配  | 核心数量,该参数值越大,算法运行越快。  | 
memSizePerCore  | 否  | 系统自动分配  | 每个核心使用的内存,单位为MB。  | 
PS-SMART模型部署说明
如果您需要将PS-SMART组件生成的模型部署为在线服务,您需要在该组件的下游接入通用模型导出组件,并按照PS系列组件的使用方式配置组件参数,详情请参见通用模型导出。
组件运行成功后,您可以前往PAI EAS模型在线服务页面,部署模型服务,详情请参见服务部署:控制台。