ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Angel 数据格式详解:libsvm 与 dummy 输入规范、分隔符配置与标签转换指南

Angel 数据格式详解:libsvm 与 dummy 输入规范、分隔符配置与标签转换指南 人工智能机器学习分布式训练图计算后端【免费下载链接】angelA Flexible and Powerful Parameter Server for large-scale machine learning项目地址https://gitcode.com/gh_mirrors/an/angel点击查看免费下载导读本文是 AngelA Flexible and Powerful Parameter Server for large-scale machine learning官方数据格式指南的中文深度解读。它面向所有需要在 Angel 上运行逻辑回归、Softmax、SVM、FM 等算法训练或预测的开发者完整讲解 libsvm 与 dummy 两种文本输入格式的字段语义、索引约定、真实样例并深入剖析ml.data.splitor分隔符配置与ml.data.label.trans.class/ml.data.label.trans.threshold标签转换机制的底层源码实现。读完本文你既能按标准格式准备训练/预测数据也能在标签空间不满足算法要求时快速定位并配置正确的转换方案。一、Angel 输入数据格式总览Angel 的 mllib 模块通过参数ml.data.type指定输入数据格式源码 MLConf.scala 中定义了该参数默认值为libsvmval ML_DATA_INPUT_FORMAT ml.data.type val DEFAULT_ML_DATA_INPUT_FORMAT libsvm从 DataParser.scala 的工厂方法可以看出Angel 实际支持三种文本格式ml.data.type取值解析器类格式说明libsvm默认LibSVMDataParser每行label index1:value1 index2:value2 ...稀疏特征带值dummyDummyDataParser每行label index1 index2 ...只列特征值为 1 的索引denseDenseDataParser每行label value1 value2 ...稠密特征向量其中 libsvm 与 dummy 是本文即 Angel 官方数据格式文档的核心内容dense 格式的补充说明可参考 model_config_details_en.md。所有格式都允许通过ml.data.has.label默认true控制首列是否解析为标签。无论哪种格式每一行最终都会被解析成一个带标签的样本对象即 LabeledData.java 中的三元组特征向量x、标签y以及可选的附加信息attached在预测任务中用于记录样本 ID。二、libsvm 格式稀疏特征-值对2.1 格式规范libsvm 是一种文本格式每行表示一个带标签的特征向量字段之间以空格分隔格式如下label index1:value1 index2:value2 index3:value3 ...各字段语义与官方文档 data_format_en.md 一致label首列类型Int训练数据样本的类别标签。二分类为{0, 1}多分类为从 0 开始的类别索引{0, 1, ..., n}预测数据样本的索引样本 ID。index:value后续列特征的索引-取值对索引类型为Int取值类型为Double特征索引从1开始计数与标准 libsvm 风格一致。2.2 官方示例与仓库真实数据官方文档给出的示例# libsvm example 1 1:0.5 3:3.1 7:1.0 0 2:0.1 3:2.3 5:2.0 1 4:0.2 7:1.1 9:0.0 ....仓库自带的 a9a 训练集 是真实可用的 libsvm 样例共 32561 行特征维度 123前几行为-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可见 a9a 数据集的标签为-1/1这正是下文第三节要讲的二分类标签约定特征索引从 1 开始。2.3 源码级解析流程LibSVMDataParser的解析逻辑在 DataParser.scala 中实现关键点切分与标签处理先用分隔符把整行切分成数组再交给基类processLabel处理首列详见第四节拆解特征对对每个index:value字段再次按:切分val kv value.trim.split(:) keys(indx2) kv(0).toLong - 1 // 索引减 1 vals(indx2) kv(1).toDouble // 取值转 Double注意这里kv(0).toLong - 1虽然输入文件中索引从 1 开始但 Angel 内部存储时统一转换为 0 基索引这与 dummy 格式索引从 0 开始在内部表示上保持一致构建稀疏向量根据矩阵行类型RowType由ml.model.type指定选择int/long键与float/double值的组合通过VFactory.sparse*Vector(featRange, keys, vals)生成稀疏向量封装样本最终产出new LabeledData(x, y, attached)。三、dummy 格式稀疏 0/1 索引3.1 格式规范dummy 同样是一种文本格式每行表示一个带标签的特征向量字段以空格分隔格式如下label index1 index2 index3各字段语义label首列类型Int训练数据样本标签二分类{0, 1}多分类{0, 1, ..., n}预测数据样本索引。index后续列类型Int/Long特征索引从0开始计数表示特征值为 1 的索引未出现的特征值为 0即隐含的稀疏二元特征表示。官方示例# dummy type example 0 3 7 999 666 1 0 2 88 77 ...仓库对应的真实数据为 a9a_123d_train.dummy前几行-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可以直观对比同一份 a9a 数据在两种格式下的等价表达dummy 行-1 2 10 13 ...与 libsvm 行-1 3:1 11:1 14:1 ...描述的其实是同一条样本因为 libsvm 索引从 1 开始、dummy 索引从 0 开始两者恰好相差 1。3.2 源码级解析流程DummyDataParser的解析逻辑在 DataParser.scala 中实现要点首列处理同样调用processLabel完成标签解析与可选的转换索引读取后续每个字段直接按Long/Int解析为特征索引不再出现index:value中的冒号隐式赋 1源码中keys.map(_ 1.0)或1.0f表明所有列出的索引取值恒为 1其余维度为 0向量构建与 libsvm 解析器一样依据RowType构建稀疏向量索引范围受ml.feature.index.range即featRange约束。提示dummy 格式适合特征取值只有 0/1 的场景如 CTR 预估中的离散特征可以显著压缩文本体积需要携带非 1 特征值时请改用 libsvm 格式。四、自定义分隔符ml.data.splitor默认情况下两种格式都以空格一个或多个连续空白分隔字段。若输入数据使用的是其他分隔符例如逗号,官方文档给出的配置方式为ml.data.splitor,该参数在 MLConf.scala 中的定义与默认值如下val ML_DATA_SPLITOR ml.data.splitor val DEFAULT_ML_DATA_SPLITOR \\s注意两点实现细节默认值是一个正则表达式\\s而不是普通字符。因此该配置项接受完整正则例如指定,表示按单个逗号切分若想按多个连续空白以外的复杂模式切分也直接填写对应正则切分发生在所有解析之前在DataParser基类的processLabel中value.trim.split(splitter)会先用该分隔符切出首列标签与其余特征列libsvm 解析器随后还会在特征字段内部按:二次切分分隔符参数不会影响特征对内部的冒号。提交任务时以-D形式传入即可例如-Dml.data.splitor,五、标签约定与标签转换5.1 为什么需要转换Angel 对标签空间有明确的算法级要求这一点在原文档末尾专门强调多分类问题如 Softmax 回归标签要求从 0 开始的类别索引二分类问题标签要求为1 和 -1。这一点在源码注释中也得到印证——DataParser.scala 中明确写着// y should be 1 or -1 when classification.json_conf_en.md 同样说明对于二分类任务Angel 要求每个标签为 (1, -1)。因此当你的数据标签是{0, 1}例如 sklearn 系工具产出的标准二分类标签或其他偏移形式时就需要借助标签转换参数在解析阶段就地完成映射而不是修改原始数据文件。5.2 转换参数原文档给出的两个核心参数ml.data.label.trans.class指定标签转换类。默认为NoTrans不转换可选项包括ZeroOneTrans转换为{0, 1}PosNegTrans转换为{1, -1}AddOneTrans所有标签 1SubOneTrans所有标签 -1。ml.data.label.trans.thresholdZeroOneTrans与PosNegTrans需要配合一个阈值使用——当标签大于阈值时转换为 1默认阈值为 0。对应的参数定义与默认值见 MLConf.scalaval ML_DATA_LABEL_TRANS ml.data.label.trans.class val DEFAULT_ML_DATA_LABEL_TRANS NoTrans val ML_DATA_LABEL_TRANS_THRESHOLD ml.data.label.trans.threshold val DEFAULT_ML_DATA_LABEL_TRANS_THRESHOLD 05.3 五种转换类的源码行为所有转换类实现于 TransLabel.scala均继承自TransLabeltrait 并实现trans(label: Double): Double转换类转换规则源码实现典型使用场景NoTranslabel原样返回标签已满足算法要求PosNegTrans(threshold)label threshold ? 1.0 : -1.0将{0,1}或任意实数标签映射为{1,-1}ZeroOneTrans(threshold)label threshold ? 1.0 : 0.0将任意实数标签映射为{0,1}AddOneTranslabel 1.00 基多分类标签整体上移一位SubOneTranslabel - 1.01 基多分类标签整体下移一位归零源码中TransLabel.get根据配置的类名大小写不敏感匹配构造对应实例并把ml.data.label.trans.threshold的取值注入PosNegTrans/ZeroOneTrans。需要强调的是阈值比较是严格大于等于阈值时不会转换为 1默认阈值 0 意味着正数标签 → 10 与负数标签 → 0或 -1取决于转换类。5.4 何时该用哪种转换数据标签为{0, 1}算法要求{1, -1}如二分类 LR、SVM使用PosNegTrans数据标签为任意实数如回归预测中希望做二值化使用ZeroOneTrans或PosNegTrans并配合阈值多分类标签从 1 开始如{1, 2, 3}而算法要求 0 基Softmax使用SubOneTrans标签已满足算法约定保持NoTrans即可无需额外开销。实际提交示例来自 softmax_on_angel_en.mdSoftmax 训练任务中把 libsvm 数据的 1 基标签归零../../bin/angel-submit \ -Dml.epoch.num20 \ -Dangel.app.submit.classcom.tencent.angel.ml.core.graphsubmit.GraphRunner \ -Dml.model.class.namecom.tencent.angel.ml.classification.SoftmaxRegression \ -Dangel.train.data.path$traindata \ -Dangel.save.model.path$modelout \ -Dml.feature.index.range$featureNum \ -Dml.data.validate.ratio0.1 \ -Dml.data.label.trans.classSubOneTrans \ -Dml.data.typelibsvm \ -Dml.learn.rate0.1 \ -Daction.typetrain \ -Dml.num.class$classNum六、在配置体系中的完整用法6.1 命令行参数方式除了上文的ml.data.splitor、ml.data.label.trans.class还有几个与数据格式强相关的参数完整参数表见 model_config_details_en.md参数默认值说明ml.data.typelibsvm输入格式libsvm、dense、dummyml.data.splitor\s输入分隔符正则ml.data.has.labeltrue首列是否为标签ml.data.label.trans.classNoTrans标签转换类ml.data.label.trans.threshold0标签转换阈值ml.feature.index.range-1特征维度哈希空间大小建议显式设置其中ml.feature.index.range需要特别注意它指定特征索引的上界最大特征 ID 1dummy 与 libsvm 解析器构造稀疏向量时都会以它作为向量长度默认-1表示特征维度可映射到(0, Long.max)。6.2 JSON 配置方式对于 Angel 2.0 的深度学习类算法DeepFM、PNN、NFM、Deep and Wide 等数据相关参数也可以在 JSON 配置的data块中声明与命令行的对应关系如下详见 json_conf.mddata: { format: dummy, indexrange: 148, numfield: 13, validateratio: 0.1, sampleratio: 0.2, useshuffle: true, translabel: NoTrans, posnegratio: 0.01 }对应关系format→ml.data.typeindexrange→ml.feature.index.rangetranslabel→ml.data.label.trans.class等。除indexrange外均有默认值均为可选配置。6.3 数据准备的实操建议结合仓库中真实数据data/目录详见 data/README.md可以总结出如下最佳实践优先用真实样例对齐格式参照 a9a_123d_train.libsvm 与 a9a_123d_train.dummy 检查自己的数据列结构与索引起点显式设置ml.feature.index.range避免默认-1带来的超大哈希空间与内存浪费取值 最大特征 ID 1训练与预测使用同一套格式约定预测时首列是样本 ID写入LabeledData.attached源码见 DataParser.scala且预测任务不会做标签转换按算法约定处理标签先确认算法是二分类需1/-1还是多分类需 0 基再决定是否需要PosNegTrans/ZeroOneTrans/SubOneTrans统一分隔符数据若由,等分隔记得同步设置ml.data.splitor避免整行被当成单个字段解析。七、总结Angel 的数据输入体系围绕一行一个样本的文本约定展开libsvm 用index:value表达任意稀疏特征值索引从 1 开始dummy 用裸索引表达 0/1 稀疏特征索引从 0 开始两者在解析器内部统一转换为 0 基稀疏向量见 DataParser.scala。配合ml.data.splitor自定义分隔符与ml.data.label.trans.class/ml.data.label.trans.threshold的标签空间适配实现见 TransLabel.scala几乎任何按列组织的文本数据集都可以无缝接入 Angel 的训练与预测流水线。掌握本文的格式规范与参数语义是确保 Angel 任务数据正确、训练收敛的前提。赞分享人工智能机器学习分布式训练图计算后端【免费下载链接】angelA Flexible and Powerful Parameter Server for large-scale machine learning项目地址https://gitcode.com/gh_mirrors/an/angel点击查看免费下载相关推荐Angel 数据格式详解libsvm / dummy / dense 输入格式与标签转换配置实战Angel 数据格式详解libsvm / dummy / dense 输入格式与标签转换配置实战 本篇技术指南聚焦腾讯开源参数服务器 AngelParame人工智能机器学习分布式训练图计算后端Hermes WebUI终极故障排除指南快速解决99%使用问题的完整方案Hermes WebUI终极故障排除指南快速解决99%使用问题的完整方案 Hermes WebUI是一款功能强大的AI助手Web界面让用户能够通过浏览器或手人工智能AI 应用AI Agent交互助手MCP 服务前端Angel数据格式终极指南轻松掌握LibSVM、Dense与Dummy格式Angel数据格式终极指南轻松掌握LibSVM、Dense与Dummy格式 Angel作为一款灵活强大的参数服务器在处理大规模机器学习任务时支持多种数据格人工智能机器学习分布式训练图计算后端上一篇免费畅玩Switch游戏的终极指南Ryujinx模拟器完整上手教程下一篇终极crypto-js加密指南从入门到精通的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表