{"value":"在[Data-centric AI之特征工程第一讲](https://aws.amazon.com/cn/blogs/china/feature-engineering-of-the-final-version-of-data-centric-ai-lecture-1/)中,我们介绍了特征相关的概念以及连续特征和 category 特征的特点,归纳了“好的特征”应有的特质。在此基础上,介绍了特征预处理的三个子步骤即字符串特征转换为数值特征,异常值处理和缺失值处理。今天我们接着介绍特征预处理的三个子步骤。\n\n\n#### **特征预处理之样本类别不均衡处理**\n\n\n样本类别不均衡指的是分类任务训练集中的标注 /label 取值的分布不是均衡的,比如对于二分类任务,一共有1万条样本的训练集中,label 为1的样本有1000条,label 为0的样本有9000条,正负样本比例是1:9,这个时候我们就说这个训练集是样本类别不均衡的。严格意义上说,样本类别不均衡处理属于样本工程的范畴,但是由于它经常和其他的特征预处理子步骤放在一起讨论,所以我也把它放在了特征工程中来介绍。样本类别不均衡可能会把模型带偏,因为让它看了更多的大类别的样本。在实际的 ML 项目中,一般见到的分类任务数据集都是样本类别不均衡的,而是否对样本类别不均衡做处理,会发现在模型效果上可能差别比较大。\n\n样本类别不均衡处理的流程:\n\n- 如果本身小类别的样本绝对数量足够大(比如有1万条),只是相对比其他类别的样本少(比如大类别是100万条样本),可以先暂时跳过这个步骤;\n- 如果不同类别的训练样本数目稍有差别,通常影响不大,比如二分类负样本与正样本比例不大于4:1,可以先训练看效果,用适合二分类类别不均衡的评价指标 AUC-PR 来评估;\n- 对于正负样本极不平衡的场景,可能考虑是否可以换一个不同的角度来看问题,比如将它看作异常检测问题,并使用异常检测来建模。\n\n对于样本类别不均衡情况下的训练集和验证集的切分,如果是按照时间窗口来切分的话,要尽量保证验证集和训练集有足量的小类别样本;如果是随机切分的话,要分层来随机切分,也就是按照小类别和大类别分别随机切分然后组成训练集和验证集。\n\n处理样本类别不均衡的方法如下:\n\n![20220828151023.png](https://dev-media.amazoncloud.cn/ad1e4a6b617341deaf128160a9b35dff_20220828151023.png)\n\n对于二分类类别不均衡的情况下,在预测得到了概率以后,尽量不要设定某个阈值来判定是否是正例,能排序的话尽量通过排序来解决(比如返回 top-K 结果或者截断某分位数以上的结果)。\n\n\n#### **特征预处理之连续特征离散化**\n\n\n经过连续特征离散化处理之后的特征对于异常数据具有较强的鲁棒性,模型会更稳定。离散化相当于引入了非线性,提升模型的表达能力,增强拟合能力。离散化之后方便进行特征交叉(两个连续特征之间不方便做特征交叉),通过使得模型要拟合的值大幅度降低,也降低了模型的复杂度。但是连续特征离散化也有不足的地方,比如离散化可能会丢失特征的一些信息,可能使模型性能恶化,以及离散化可能带入一些噪音。\n\n连续特征离散化的基本假设是根据业务知识和目标任务,认为连续特征不同区间的取值对目标的贡献是不一样的,而同一个区间的取值对目标的贡献差不多。即使是同样的连续性变量在不同的业务场景是否需要离散化都不一样:比如“面积”这样的连续性特征,在预测房子单价的时候可能不需要离散化,但是如果是预测房子是否热卖的时候,可能就需要做离散化。\n\n对于什么时候需要进行离散化,通常如果你之后选用的模型只接受离散特征(比如多项分布朴素贝叶斯模型),或者你想选用那些倾向于使用离散特征的线性模型(比如逻辑回归或者线性回归模型),则进行离散化;否则,可以暂时先不考虑离散化。\n\n离散化也叫分箱,分为有监督分箱和无监督分箱:\n\n![MHS4E0MROT0N49OWH.png](https://dev-media.amazoncloud.cn/2a6387d5539f41b285f4b3dd0af4cf59_%7D%5BM%24HS%294%29E0MR%25OT0N49OWH.png)\n\n对于无监督分箱,需要先确定分箱的数量和边界。分箱大小不能太小也不能太大,分箱大小必须足够小,使得箱内的属性取值变化对样本标记/目标变量的影响基本在一个不大范围;分箱大小必须足够大,使每个箱内都有足够的样本,如果箱内样本太少,则随机性太大,不具有统计意义上的说服力。然后根据业务领域的经验来指定,准则是结合业务并要求不同的分箱对目标变量的作用不同,或根据模型来选择,也就是说根据具体任务来训练分箱之后的数据集,通过超参数搜索来确定最优的分箱数量和分箱边界。从上面也可以看到,无监督分箱会带入更多的不确定性,因此尽量优先选择有监督分箱。\n\n\n特征预处理之数值型 category 特征编码\n\n\n数值型 category 特征有两个来源,字符串 category 特征转来的数值型 category 特征或者拿到的原始特征就是数值型 category 特征。之所以需要对数值型 category 变量编码是为了后续更方便和更好的处理特征以及模型拟合,也就是说从计算复杂度方面(特征维度)考虑或者从隐含语义方面(特征 embedding)考虑。\n\n数值型 Category 特征常用的编码方式如下:\n\n- One-hot 向量,适用于 category 特征的基数不大的情况。对于一个有 m 个离散值的特征,经过 one-hot 独热编码处理后,会变为 m 个二元特征,这 m 个二元特征互斥,每次只有一个激活。它的优点是,经过 one-hot 后更容易做特征交叉(深度学习和 embedding 火之前,很多公司用 One-hot + LR 模型做 CRT 预估排序模型)。它的缺点是当 category 特征基数很大的时候,很容易导致维度灾难(不利于后续的模型进行训练 )。\n- Target encoding,适用于把 category 特征转换为连续特征。它是一种有监督特征编码方法,它用统计方法把每个 category 特征的枚举值根据目标变量来编码(严格意义上看的话,这种方法有信息泄露的)。对于 C 分类问题,单个 category 特征会编码为 C−1个连续特征。其出发点是用 C-1个条件概率 P(Y=yi|X=xi)来代替 category 特征 X 的值xi。对于回归问题,单个 category 特征编码后是单个连续特征,其思路是统计 category 特征 X 的值 xi 对应的 Y 的均值。target encoding 所有的统计计算都是基于训练集来的,所以一旦新数据集的分布发生一点变化,就会产生类似于过拟合所产生的不良的训练效果,所以就有了 target encoding 的变体比如 mean encoding(mean encoding 的原理和 target encoding 基本是一样的,只不过比 target encoding 多了一个交叉计算的步骤,目的是为了降低过拟合的影响)。\n- Hash trick,适用于 category 特征的基数比较大的情况,把特征值做 hash 然后对 hash 桶取模,最终把单维度 category 特征变成了多维度向量,维度就是 hash 桶的数量。该向量的维度远远小于原 category 特征的特征空间,因此从这个角度来看是降维(比如使用 tensorflow 的feature_column.categorical_column_with_hash_bucket() 把离散特征变成 hash column)\n- Embedded encoding,适用于 category 特征基数大,使用深度学习且训练集很大的情况。Embedded encoding 可以克服 one-hot 编码导致的维度灾难问题,但是训练 embedding 向量比较复杂而且需要大量的训练样本,它主要用在深度学习中,它是不可解释的。 当然其实传统机器学习模型也有可以做 embedding 的比如 FM,MF 等(对于 FM,每个连续特征就一个 embedding 向量,而每个 category 特征的每个唯一值都有一个 embedding 向量)。Embedding 相当于把单维度 category 特征变成了多维度连续特征;另一个重要的方面是 embedding 可以发现潜在的语义。使用 embedding encoding 时,可以方便的把序列特征这样的强特征建模进来。Embedding encoding 区别于其他编码方式,它需要模型来学习,而其他编码方式没有学习过程是直接计算出来的。神经网络中的 Embedding 向量表现形式如下:\n\n![20220828152459.png](https://dev-media.amazoncloud.cn/85c74399639a492c96bf96c1605f1ee8_20220828152459.png)\n\n根据之后想要选择的模型,category 特征的基数大小,数据集大小来综合决定选择哪种特征编码方式。每种特征编码方式都有局限性,如果可以的话,可以先选择适合直接处理 category 特征的模型比如 LightGBM 和 CatBoost:\n\n- 基于树的模型不关心 category 特征是否有序,并且尽量不要用 one-hot 向量。SKLearn 和 XGBoost 的实现是不区分数值 category 特征和连续型特征的,统一都作为连续性特征来处理。因此 category 数字特征最好不要直接丢给 SKLearn 或 XGBoost 的基于 tree 的模型,要提前对 category 特征进行编码转换为连续特征或者使用别的模型比如 LightGBM 或者 CatBoost。对于 XGBoost,category 特征的基数是10到100之间的话,也可以考虑用 one-hot 编码;即使这样,如果有很多基数小的 category 特征的话,one-hot 编码所有这样的 category 特征同样不合适。如果在有 category 特征的情况下,非要使用 XGBoost,可以考虑对 category 特征做 target encoding 编码为连续特征后在联合其他连续特征送入 XGBoost 来建模。SparkML 的 tree-based 的模型和 LightGBM 以及 CatBoost,它们能区分 category 特征和连续特征。因此对于这些模型,category 特征可以不做编码。\n- 对于深度学习模型的话,不考虑 category 特征是否有序,常见的处理方法是把 category 特征先做 mapping 比如字典映射或者 hash 映射然后在做 embedding。如果 category 特征的基数不大的话,也可以考虑只是做 one-hot 编码。不是所有的 category 特征都一定要做 embedding,一般是针对纯 id 类的 category 特征并且是有内涵的实体(比如 usrid,itemid,channelid 等等)做 embedding(当然这个也和模型有关,对于 DeepFM 模型,每个连续特征以及每个 category 特征的每个特征值都会做 embedding。对于 wide and deep 模型,usrid/itemid 这样的有内涵实体的 id 类特征做 embedding 并作为 deep 部分的一部分输入,而其他的 category 特征则考虑做 one-hot 并作为 wide 部分的输入,这里可以选择哪些 category 特征做 embedding 并送入 deep 部分)。对没有内涵实体的 id 类特征(比如常驻地或者学历等级也用 id 来表示了)或者不是 id 类的 category 特征(比如性别或者职位级别),可能做 embedding 的意义不大(这里并不说这样的 category 特征就一定不做 embedding)。如果有些 category 特征不做 embedding,并且要送入神经网络的话,需要选择下面某种方法:转为 one-hot(适用于离散特征的基数很小比如小于10并且总的离散特征的数量不多);或者转为连续特征(比如使用前面介绍的 target encoding 方法)\n\n前面讨论的都是单值 category 特征的编码方法,现实中还经常会有所谓的多值 category 特征,如下所示。\n\n![D4NKYR8ACQI`C52N9SP.png](https://dev-media.amazoncloud.cn/da9b104bdaf94bb7ba23ca82eb46f998_D4N%5DKYR%298AC%5BQI%60C52N9S%7BP.png)\n\n多值 category 特征的编码方式如下:\n\n![20220828153547.png](https://dev-media.amazoncloud.cn/6d78ea4a6ee147f89cf112c5db43ae0e_20220828153547.png)\n\n\n#### **总结**\n\n\n本文介绍了特征预处理的三个子步骤即样本类别不均衡处理,连续特征离散化和数值型 category 特征编码。数值型 category 特征编码是重点和难点,样本类别不均衡则是实际项目中绕不开的重要话题。接下来的第三讲我会继续讲特征预处理以及特征工程的其他步骤。再次感谢大家的阅读。\n\n\n#### **本篇作者**\n\n\n![image.png](https://dev-media.amazoncloud.cn/11b46cef1a5047b6bd06dc5833a1f90f_image.png)\n\n\n#### **梁宇辉**\n\n\n亚马逊云科技机器学习产品技术专家,负责基于亚马逊云科技的机器学习方案的咨询与设计,\n专注于机器学习的推广与应用,深度参与了很多真实客户的机器学习项目的构建以及优化。对于深度学习模型分布式训练,推荐系统和计算广告等领域具有丰富经验。","render":"<p>在<a href=\"https://aws.amazon.com/cn/blogs/china/feature-engineering-of-the-final-version-of-data-centric-ai-lecture-1/\" target=\"_blank\">Data-centric AI之特征工程第一讲</a>中,我们介绍了特征相关的概念以及连续特征和 category 特征的特点,归纳了“好的特征”应有的特质。在此基础上,介绍了特征预处理的三个子步骤即字符串特征转换为数值特征,异常值处理和缺失值处理。今天我们接着介绍特征预处理的三个子步骤。</p>\n<h4><a id=\"_3\"></a><strong>特征预处理之样本类别不均衡处理</strong></h4>\n<p>样本类别不均衡指的是分类任务训练集中的标注 /label 取值的分布不是均衡的,比如对于二分类任务,一共有1万条样本的训练集中,label 为1的样本有1000条,label 为0的样本有9000条,正负样本比例是1:9,这个时候我们就说这个训练集是样本类别不均衡的。严格意义上说,样本类别不均衡处理属于样本工程的范畴,但是由于它经常和其他的特征预处理子步骤放在一起讨论,所以我也把它放在了特征工程中来介绍。样本类别不均衡可能会把模型带偏,因为让它看了更多的大类别的样本。在实际的 ML 项目中,一般见到的分类任务数据集都是样本类别不均衡的,而是否对样本类别不均衡做处理,会发现在模型效果上可能差别比较大。</p>\n<p>样本类别不均衡处理的流程:</p>\n<ul>\n<li>如果本身小类别的样本绝对数量足够大(比如有1万条),只是相对比其他类别的样本少(比如大类别是100万条样本),可以先暂时跳过这个步骤;</li>\n<li>如果不同类别的训练样本数目稍有差别,通常影响不大,比如二分类负样本与正样本比例不大于4:1,可以先训练看效果,用适合二分类类别不均衡的评价指标 AUC-PR 来评估;</li>\n<li>对于正负样本极不平衡的场景,可能考虑是否可以换一个不同的角度来看问题,比如将它看作异常检测问题,并使用异常检测来建模。</li>\n</ul>\n<p>对于样本类别不均衡情况下的训练集和验证集的切分,如果是按照时间窗口来切分的话,要尽量保证验证集和训练集有足量的小类别样本;如果是随机切分的话,要分层来随机切分,也就是按照小类别和大类别分别随机切分然后组成训练集和验证集。</p>\n<p>处理样本类别不均衡的方法如下:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/ad1e4a6b617341deaf128160a9b35dff_20220828151023.png\" alt=\"20220828151023.png\" /></p>\n<p>对于二分类类别不均衡的情况下,在预测得到了概率以后,尽量不要设定某个阈值来判定是否是正例,能排序的话尽量通过排序来解决(比如返回 top-K 结果或者截断某分位数以上的结果)。</p>\n<h4><a id=\"_23\"></a><strong>特征预处理之连续特征离散化</strong></h4>\n<p>经过连续特征离散化处理之后的特征对于异常数据具有较强的鲁棒性,模型会更稳定。离散化相当于引入了非线性,提升模型的表达能力,增强拟合能力。离散化之后方便进行特征交叉(两个连续特征之间不方便做特征交叉),通过使得模型要拟合的值大幅度降低,也降低了模型的复杂度。但是连续特征离散化也有不足的地方,比如离散化可能会丢失特征的一些信息,可能使模型性能恶化,以及离散化可能带入一些噪音。</p>\n<p>连续特征离散化的基本假设是根据业务知识和目标任务,认为连续特征不同区间的取值对目标的贡献是不一样的,而同一个区间的取值对目标的贡献差不多。即使是同样的连续性变量在不同的业务场景是否需要离散化都不一样:比如“面积”这样的连续性特征,在预测房子单价的时候可能不需要离散化,但是如果是预测房子是否热卖的时候,可能就需要做离散化。</p>\n<p>对于什么时候需要进行离散化,通常如果你之后选用的模型只接受离散特征(比如多项分布朴素贝叶斯模型),或者你想选用那些倾向于使用离散特征的线性模型(比如逻辑回归或者线性回归模型),则进行离散化;否则,可以暂时先不考虑离散化。</p>\n<p>离散化也叫分箱,分为有监督分箱和无监督分箱:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/2a6387d5539f41b285f4b3dd0af4cf59_%7D%5BM%24HS%294%29E0MR%25OT0N49OWH.png\" alt=\"MHS4E0MROT0N49OWH.png\" /></p>\n<p>对于无监督分箱,需要先确定分箱的数量和边界。分箱大小不能太小也不能太大,分箱大小必须足够小,使得箱内的属性取值变化对样本标记/目标变量的影响基本在一个不大范围;分箱大小必须足够大,使每个箱内都有足够的样本,如果箱内样本太少,则随机性太大,不具有统计意义上的说服力。然后根据业务领域的经验来指定,准则是结合业务并要求不同的分箱对目标变量的作用不同,或根据模型来选择,也就是说根据具体任务来训练分箱之后的数据集,通过超参数搜索来确定最优的分箱数量和分箱边界。从上面也可以看到,无监督分箱会带入更多的不确定性,因此尽量优先选择有监督分箱。</p>\n<p>特征预处理之数值型 category 特征编码</p>\n<p>数值型 category 特征有两个来源,字符串 category 特征转来的数值型 category 特征或者拿到的原始特征就是数值型 category 特征。之所以需要对数值型 category 变量编码是为了后续更方便和更好的处理特征以及模型拟合,也就是说从计算复杂度方面(特征维度)考虑或者从隐含语义方面(特征 embedding)考虑。</p>\n<p>数值型 Category 特征常用的编码方式如下:</p>\n<ul>\n<li>One-hot 向量,适用于 category 特征的基数不大的情况。对于一个有 m 个离散值的特征,经过 one-hot 独热编码处理后,会变为 m 个二元特征,这 m 个二元特征互斥,每次只有一个激活。它的优点是,经过 one-hot 后更容易做特征交叉(深度学习和 embedding 火之前,很多公司用 One-hot + LR 模型做 CRT 预估排序模型)。它的缺点是当 category 特征基数很大的时候,很容易导致维度灾难(不利于后续的模型进行训练 )。</li>\n<li>Target encoding,适用于把 category 特征转换为连续特征。它是一种有监督特征编码方法,它用统计方法把每个 category 特征的枚举值根据目标变量来编码(严格意义上看的话,这种方法有信息泄露的)。对于 C 分类问题,单个 category 特征会编码为 C−1个连续特征。其出发点是用 C-1个条件概率 P(Y=yi|X=xi)来代替 category 特征 X 的值xi。对于回归问题,单个 category 特征编码后是单个连续特征,其思路是统计 category 特征 X 的值 xi 对应的 Y 的均值。target encoding 所有的统计计算都是基于训练集来的,所以一旦新数据集的分布发生一点变化,就会产生类似于过拟合所产生的不良的训练效果,所以就有了 target encoding 的变体比如 mean encoding(mean encoding 的原理和 target encoding 基本是一样的,只不过比 target encoding 多了一个交叉计算的步骤,目的是为了降低过拟合的影响)。</li>\n<li>Hash trick,适用于 category 特征的基数比较大的情况,把特征值做 hash 然后对 hash 桶取模,最终把单维度 category 特征变成了多维度向量,维度就是 hash 桶的数量。该向量的维度远远小于原 category 特征的特征空间,因此从这个角度来看是降维(比如使用 tensorflow 的feature_column.categorical_column_with_hash_bucket() 把离散特征变成 hash column)</li>\n<li>Embedded encoding,适用于 category 特征基数大,使用深度学习且训练集很大的情况。Embedded encoding 可以克服 one-hot 编码导致的维度灾难问题,但是训练 embedding 向量比较复杂而且需要大量的训练样本,它主要用在深度学习中,它是不可解释的。 当然其实传统机器学习模型也有可以做 embedding 的比如 FM,MF 等(对于 FM,每个连续特征就一个 embedding 向量,而每个 category 特征的每个唯一值都有一个 embedding 向量)。Embedding 相当于把单维度 category 特征变成了多维度连续特征;另一个重要的方面是 embedding 可以发现潜在的语义。使用 embedding encoding 时,可以方便的把序列特征这样的强特征建模进来。Embedding encoding 区别于其他编码方式,它需要模型来学习,而其他编码方式没有学习过程是直接计算出来的。神经网络中的 Embedding 向量表现形式如下:</li>\n</ul>\n<p><img src=\"https://dev-media.amazoncloud.cn/85c74399639a492c96bf96c1605f1ee8_20220828152459.png\" alt=\"20220828152459.png\" /></p>\n<p>根据之后想要选择的模型,category 特征的基数大小,数据集大小来综合决定选择哪种特征编码方式。每种特征编码方式都有局限性,如果可以的话,可以先选择适合直接处理 category 特征的模型比如 LightGBM 和 CatBoost:</p>\n<ul>\n<li>基于树的模型不关心 category 特征是否有序,并且尽量不要用 one-hot 向量。SKLearn 和 XGBoost 的实现是不区分数值 category 特征和连续型特征的,统一都作为连续性特征来处理。因此 category 数字特征最好不要直接丢给 SKLearn 或 XGBoost 的基于 tree 的模型,要提前对 category 特征进行编码转换为连续特征或者使用别的模型比如 LightGBM 或者 CatBoost。对于 XGBoost,category 特征的基数是10到100之间的话,也可以考虑用 one-hot 编码;即使这样,如果有很多基数小的 category 特征的话,one-hot 编码所有这样的 category 特征同样不合适。如果在有 category 特征的情况下,非要使用 XGBoost,可以考虑对 category 特征做 target encoding 编码为连续特征后在联合其他连续特征送入 XGBoost 来建模。SparkML 的 tree-based 的模型和 LightGBM 以及 CatBoost,它们能区分 category 特征和连续特征。因此对于这些模型,category 特征可以不做编码。</li>\n<li>对于深度学习模型的话,不考虑 category 特征是否有序,常见的处理方法是把 category 特征先做 mapping 比如字典映射或者 hash 映射然后在做 embedding。如果 category 特征的基数不大的话,也可以考虑只是做 one-hot 编码。不是所有的 category 特征都一定要做 embedding,一般是针对纯 id 类的 category 特征并且是有内涵的实体(比如 usrid,itemid,channelid 等等)做 embedding(当然这个也和模型有关,对于 DeepFM 模型,每个连续特征以及每个 category 特征的每个特征值都会做 embedding。对于 wide and deep 模型,usrid/itemid 这样的有内涵实体的 id 类特征做 embedding 并作为 deep 部分的一部分输入,而其他的 category 特征则考虑做 one-hot 并作为 wide 部分的输入,这里可以选择哪些 category 特征做 embedding 并送入 deep 部分)。对没有内涵实体的 id 类特征(比如常驻地或者学历等级也用 id 来表示了)或者不是 id 类的 category 特征(比如性别或者职位级别),可能做 embedding 的意义不大(这里并不说这样的 category 特征就一定不做 embedding)。如果有些 category 特征不做 embedding,并且要送入神经网络的话,需要选择下面某种方法:转为 one-hot(适用于离散特征的基数很小比如小于10并且总的离散特征的数量不多);或者转为连续特征(比如使用前面介绍的 target encoding 方法)</li>\n</ul>\n<p>前面讨论的都是单值 category 特征的编码方法,现实中还经常会有所谓的多值 category 特征,如下所示。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/da9b104bdaf94bb7ba23ca82eb46f998_D4N%5DKYR%298AC%5BQI%60C52N9S%7BP.png\" alt=\"D4NKYR8ACQI`C52N9SP.png\" /></p>\n<p>多值 category 特征的编码方式如下:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/6d78ea4a6ee147f89cf112c5db43ae0e_20220828153547.png\" alt=\"20220828153547.png\" /></p>\n<h4><a id=\"_67\"></a><strong>总结</strong></h4>\n<p>本文介绍了特征预处理的三个子步骤即样本类别不均衡处理,连续特征离散化和数值型 category 特征编码。数值型 category 特征编码是重点和难点,样本类别不均衡则是实际项目中绕不开的重要话题。接下来的第三讲我会继续讲特征预处理以及特征工程的其他步骤。再次感谢大家的阅读。</p>\n<h4><a id=\"_73\"></a><strong>本篇作者</strong></h4>\n<p><img src=\"https://dev-media.amazoncloud.cn/11b46cef1a5047b6bd06dc5833a1f90f_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"_79\"></a><strong>梁宇辉</strong></h4>\n<p>亚马逊云科技机器学习产品技术专家,负责基于亚马逊云科技的机器学习方案的咨询与设计,<br />\n专注于机器学习的推广与应用,深度参与了很多真实客户的机器学习项目的构建以及优化。对于深度学习模型分布式训练,推荐系统和计算广告等领域具有丰富经验。</p>\n"}