稍有不同的时候需要设计物理分库的数量和物理分表的数量。后面重点首先是介绍这个分库分表的设计,然后是业务SQL如何写最佳。 分库分表设计 分库分表设计首先要根据业务选择合适的拆分维度以及拆分策略。 这里重点说的分多少个库和分多少个表的选择考虑。 为什么要拆分? 技术上DRDS也支持不做分库分表拆分这种用法,不过这个中间层就显得多余了。 分表是存在于分库中,分库在分实例里,多个实例组成了全部的业务数据。 DRDS的内部案例里分表数最多到4096。 所以分多少个表此时还没有结论。先往后看。 分多少个实例合适? 参考 阿里云, 分布式数据库DRDS 最佳实践,https://help.aliyun.com/document_detail/51308.html 梦实, 分布式数据库——从线性扩展谈分布式JOIN,
文章目录 1 问题定义 2 关联方法 2.1 决策树来找分裂点 2.2 有/无 监督分箱(等比/等宽-卡方/决策树) 2.3 离散回归模型(比较好的一种) 2.4 shap值 1 问题定义 一类问题: 这个可以看成是一个有监督的寻找合理分裂点的过程,这里就抛砖引玉几种可能性 决策树来找分裂点 有监督分箱(卡方/决策树) 离散回归模型(比较好的一种) shap值 另一类问题(下次讨论): 张三是一个连锁店的老板 2 关联方法 2.1 决策树来找分裂点 盗图来看一下:非常fancy的可视化决策树dtree_viz 这个是比较传统的决策树分裂的图,可以从其中看到重要特征的分裂点: 当然还有可视化效果更好的就是 无监督分箱那就非常简单了,等比/等宽进行处理 单次打开时长 后,在每个分区计算用户活跃度的差异,来找到比较比较好的分裂点。 依图可以这么划分: 单次打开时长,[0,5.5],占所有样本的35%,在这里面都是label = 2的样本; 单次打开时长[7.1,+ ),占所有样本的8%,这里面 y label的平均值为1.64 这里最佳的分裂点其实是可以
二、决策树最佳分裂点探索1. 什么是决策树的最佳分裂点 决策树的最佳分裂点是指在构建决策树时,算法选择的那个能够最有效区分不同类别的特征值阈值。 最佳分裂点的核心原理 决策树通过最小化不纯度来找到最佳分类点。 最佳分裂点是算法为了实现纯度最大化这个目标,在经过穷举搜索和数学计算后,所选择的必然手段和最优路径。 最佳分裂点的探索流程3.1 流程图决策树使用穷举搜索结合不纯度最小化的原则来找到最佳分裂点。 验证最佳分裂点的效果print("步骤7: 验证最佳分裂点的效果")left_labels = y_subset[X_subset <= best_threshold]right_labels = y_subset
在增加二阶梯度有更高的精度; XGB的节点划分策略带有进行预排序,利用样本在损失函数上面的二阶梯度作为权值; XGB对稀疏的特征划分方式; 在处理特征的粒度上进行多线程的优化; 使用近似算法替代每个样本逐个判断最佳分裂点的 Column Subsampling:这种技术出现在RF中,这种做法不仅可以防止过拟合,还能提升一部分训练效率。 ? 4.2 Approximate Algorithm 顾名思义,近似算法就是可能效果或者原理和Exact Greedy Algorithm差不多的算法,它的原理是根据特征分布的百分位数进行采样,选择待分裂点 ,然后,该算法将连续特征映射到由这些候选点分割的桶中,汇总统计信息并根据汇总的信息找到最佳解决方案,这里选择分裂点的方式有global和local: global:在树构建的初始状态阶段选出所有候选分裂点 ,后面每层都使用相同的策略选择分裂点。
Boost 方式树是串行生成的,所以其在寻找树分裂点时候进行并行计算,加快模型训练速度。 在寻找分裂点时候论文中也提到多种方式: 1、基本枚举贪婪搜索算法。 该方式将特征按其值排序之后,枚举每个特征值作为其分裂点并计算该分裂点的增益,然后选择最大增益的分裂点 2、近似贪婪搜索算法。 该方式在寻找分裂点前会将所有的特征按其对应值进行排序后选择其百分位的点作为候选集合,在执行基本穷举贪婪搜索法。 3、加权分位数法(weighted quantile sketch)。 4、稀疏分裂点查找。可以加快模型对稀疏数据处理。 其与 GBDT 不同之一在于其对目标函数进行二阶泰勒展开,使用了二阶导数加快了模型收敛速度。 Class ColMaker 使用的是基本枚举贪婪搜索算法,通过枚举所有的特征来寻找最佳分裂点;Class SkMaker 派生自 BaseMaker,使用近似的 sketch 方法寻找最佳分裂点;Class
但是,在一个结点分裂时,可能有很多个分裂点,每个分裂点都会产生一个增益,如何才能寻找到最优的分裂点呢?接下来会讲到。 2. 寻找最佳分裂点 在分裂一个结点时,我们会有很多个候选分割点,寻找最佳分割点的大致步骤如下: 遍历每个结点的每个特征; 对每个特征,按特征值大小将特征值排序; 线性扫描,找出每个特征的最佳分裂特征值; 在所有特征中找出最好的分裂点 基于此,XGBoost提出了一系列加快寻找最佳分裂点的方案: 特征预排序+缓存:XGBoost在训练之前,预先对每个特征按照特征值大小进行排序,然后保存为block结构,后面的迭代中会重复地使用这个结构 分位点近似法:对每个特征按照特征值排序后,采用类似分位点选取的方式,仅仅选出常数个特征值作为该特征的候选分割点,在寻找该特征的最佳分割点时,从候选分割点中选出最优的一个。 这涉及到一个超参数:最小样本权重和,是指如果一个叶子节点包含的样本数量太少也会放弃分裂,防止树分的太细,这也是过拟合的一种措施。 每个叶子结点的样本权值和计算方式如下: ?
但是,在一个结点分裂时,可能有很多个分裂点,每个分裂点都会产生一个增益,如何才能寻找到最优的分裂点呢?接下来会讲到。 2. 寻找最佳分裂点 在分裂一个结点时,我们会有很多个候选分割点,寻找最佳分割点的大致步骤如下: 遍历每个结点的每个特征; 对每个特征,按特征值大小将特征值排序; 线性扫描,找出每个特征的最佳分裂特征值; 在所有特征中找出最好的分裂点 基于此,XGBoost提出了一系列加快寻找最佳分裂点的方案: 特征预排序+缓存:XGBoost在训练之前,预先对每个特征按照特征值大小进行排序,然后保存为block结构,后面的迭代中会重复地使用这个结构 分位点近似法:对每个特征按照特征值排序后,采用类似分位点选取的方式,仅仅选出常数个特征值作为该特征的候选分割点,在寻找该特征的最佳分割点时,从候选分割点中选出最优的一个。 这涉及到一个超参数:最小样本权重和,是指如果一个叶子节点包含的样本数量太少也会放弃分裂,防止树分的太细,这也是过拟合的一种措施。 每个叶子结点的样本权值和计算方式如下: ?
在增加二阶梯度有更高的精度; XGB的节点划分策略带有进行预排序,利用样本在损失函数上面的二阶梯度作为权值; XGB对稀疏的特征划分方式; 在处理特征的粒度上进行多线程的优化; 使用近似算法替代每个样本逐个判断最佳分裂点的 Column Subsampling:这种技术出现在RF中,这种做法不仅可以防止过拟合,还能提升一部分训练效率。 ? 4.2 Approximate Algorithm 顾名思义,近似算法就是可能效果或者原理和Exact Greedy Algorithm差不多的算法,它的原理是根据特征分布的百分位数进行采样,选择待分裂点 ,然后,该算法将连续特征映射到由这些候选点分割的桶中,汇总统计信息并根据汇总的信息找到最佳解决方案,这里选择分裂点的方式有global和local: global:在树构建的初始状态阶段选出所有候选分裂点 但是这有一个问题,这样做每次都要从外存上读取数据到内存,这将会是十分耗时的操作。 因此我们使用预读取(prefetching)将下一块将要读取的数据预先放进内存里面。
但是,在一个结点分裂时,可能有很多个分裂点,每个分裂点都会产生一个增益,如何才能寻找到最优的分裂点呢?接下来会讲到。 2. 寻找最佳分裂点 在分裂一个结点时,我们会有很多个候选分割点,寻找最佳分割点的大致步骤如下: 遍历每个结点的每个特征; 对每个特征,按特征值大小将特征值排序; 线性扫描,找出每个特征的最佳分裂特征值; 在所有特征中找出最好的分裂点 基于此,XGBoost提出了一系列加快寻找最佳分裂点的方案: 特征预排序+缓存:XGBoost在训练之前,预先对每个特征按照特征值大小进行排序,然后保存为block结构,后面的迭代中会重复地使用这个结构 分位点近似法:对每个特征按照特征值排序后,采用类似分位点选取的方式,仅仅选出常数个特征值作为该特征的候选分割点,在寻找该特征的最佳分割点时,从候选分割点中选出最优的一个。 这涉及到一个超参数:最小样本权重和,是指如果一个叶子节点包含的样本数量太少也会放弃分裂,防止树分的太细,这也是过拟合的一种措施。 每个叶子结点的样本权值和计算方式如下: ?
在增加二阶梯度有更高的精度; XGB的节点划分策略带有进行预排序,利用样本在损失函数上面的二阶梯度作为权值; XGB对稀疏的特征划分方式; 在处理特征的粒度上进行多线程的优化; 使用近似算法替代每个样本逐个判断最佳分裂点的 Column Subsampling:这种技术出现在RF中,这种做法不仅可以防止过拟合,还能提升一部分训练效率。 ? 4.2 Approximate Algorithm 顾名思义,近似算法就是可能效果或者原理和Exact Greedy Algorithm差不多的算法,它的原理是根据特征分布的百分位数进行采样,选择待分裂点 ,然后,该算法将连续特征映射到由这些候选点分割的桶中,汇总统计信息并根据汇总的信息找到最佳解决方案,这里选择分裂点的方式有global和local: global:在树构建的初始状态阶段选出所有候选分裂点 但是这有一个问题,这样做每次都要从外存上读取数据到内存,这将会是十分耗时的操作。 因此我们使用预读取(prefetching)将下一块将要读取的数据预先放进内存里面。
3.5 寻找分裂结点的候选集 1、暴力枚举 2、近似方法 ,近似方法通过特征的分布,按照百分比确定一组候选分裂点,通过遍历所有的候选分裂点来找到最佳分裂点。 两种策略:全局策略和局部策略。 在全局策略中,对每一个特征确定一个全局的候选分裂点集合,就不再改变;而在局部策略中,每一次分裂 都要重选一次分裂点。前者需要较大的分裂集合,后者可以小一点。 对比补充候选集策略与分裂点数目对模型的影响。 全局策略需要更细的分裂点才能和局部策略差不多 3、Weighted Quantile Sketch 陈天奇提出并从概率角度证明了一种带权重的分布式的Quantile Sketch。 “binary:logistic” –二分类的逻辑回归问题,输出为概率。
技术突破:差分隐私文本保护新方法在佛罗里达人工智能研究学会年会上,某机构的研究团队展示了一种创新性的文本数据噪声校准方法,用于保护自然语言处理模型的训练数据隐私。 核心技术原理差分隐私保护机制通过向训练数据添加噪声来实现隐私保护,但传统方法往往以全局平均距离作为噪声添加基准,导致在词汇密集区域添加过多噪声,而在稀疏区域保护不足。 相关论文已正式发表并荣获会议最佳论文奖,研究团队正在持续优化该技术方案。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAXN = 305; const int INF = 0x3f3f3f3f; int love[MAXN][MAXN]; // 记录每个妹子和每个男生的好感度 int ex_girl[MAXN]; // 每个妹子的期望值 int ex_boy[MAXN]; // 每个男生的期望值 bool vis_
而Xgboost采取的策略是先不处理那些值缺失的样本,采用那些有值的样本搞出分裂点,然后在遍历每个分裂点的时候,尝试将缺失样本划入左子树和右子树,选择使损失最优的情况。 ,它提出了一种估计分裂点的算法。 但陈天奇采用了一种近似分割的算法,这种算法首先通过加权分位数的算法选出了一些可能的分裂点,然后再遍历这些较少的分裂点来找到最佳分裂点。 具体产生可能分裂点的方式就是加权分位数,加权是用二阶导数加权的: ? 第一眼看蒙了,用二阶导加权,虽然给出了解释,但感觉还是离谱。问了老师,老师也懵逼,后来看了一篇文章给了很好的解释。 ? 因为我们每个节点,要均分的是loss,而不是样本的数量,而每个样本对loss的贡献可能是不一样的,按样本均分会导致loss分布不均匀,取到的分位点会有偏差。
对于每个特征,只考察分位点可以减少计算复杂度。 该算法会首先根据特征分布的分位数提出候选划分点,然后将连续型特征映射到由这些候选点划分的桶中,然后聚合统计信息找到所有区间的最佳分裂点。 第二个 for 循环:针对每个特征的候选集合,将样本映射到由该特征对应的候选点集构成的分桶区间中,即 ,对每个桶统计 G,H 值,最后在这些统计量上寻找最佳分裂点。 1.2 工程实现 1.2.1 块结构设计 我们知道,决策树的学习最耗时的一个步骤就是在每次寻找最佳分裂点是都需要对特征的值进行排序。 利用直方图算法我们无需遍历数据,只需要遍历 k 个 bin 即可找到最佳分裂点。 我们知道特征离散化的具有很多优点,如存储方便、运算更快、鲁棒性强、模型更加稳定等等。 2.2 工程实现 2.2.1 特征并行 传统的特征并行算法在于对数据进行垂直划分,然后使用不同机器找到不同特征的最优分裂点,基于通信整合得到最佳划分点,然后基于通信告知其他机器划分结果。
对于每个特征,只考察分位点可以减少计算复杂度。 该算法会首先根据特征分布的分位数提出候选划分点,然后将连续型特征映射到由这些候选点划分的桶中,然后聚合统计信息找到所有区间的最佳分裂点。 第二个 for 循环:针对每个特征的候选集合,将样本映射到由该特征对应的候选点集构成的分桶区间中,即 ,对每个桶统计 G,H 值,最后在这些统计量上寻找最佳分裂点。 1.2 工程实现 1.2.1 块结构设计 我们知道,决策树的学习最耗时的一个步骤就是在每次寻找最佳分裂点是都需要对特征的值进行排序。 利用直方图算法我们无需遍历数据,只需要遍历 k 个 bin 即可找到最佳分裂点。 我们知道特征离散化的具有很多优点,如存储方便、运算更快、鲁棒性强、模型更加稳定等等。 2.2 工程实现 2.2.1 特征并行 传统的特征并行算法在于对数据进行垂直划分,然后使用不同机器找到不同特征的最优分裂点,基于通信整合得到最佳划分点,然后基于通信告知其他机器划分结果。
对于每个特征,只考察分位点可以减少计算复杂度。 该算法会首先根据特征分布的分位数提出候选划分点,然后将连续型特征映射到由这些候选点划分的桶中,然后聚合统计信息找到所有区间的最佳分裂点。 第二个 for 循环:针对每个特征的候选集合,将样本映射到由该特征对应的候选点集构成的分桶区间中,即 ,对每个桶统计 G,H 值,最后在这些统计量上寻找最佳分裂点。 1.2 工程实现 1.2.1 块结构设计 我们知道,决策树的学习最耗时的一个步骤就是在每次寻找最佳分裂点是都需要对特征的值进行排序。 利用直方图算法我们无需遍历数据,只需要遍历 k 个 bin 即可找到最佳分裂点。 我们知道特征离散化的具有很多优点,如存储方便、运算更快、鲁棒性强、模型更加稳定等等。 2.2 工程实现 2.2.1 特征并行 传统的特征并行算法在于对数据进行垂直划分,然后使用不同机器找到不同特征的最优分裂点,基于通信整合得到最佳划分点,然后基于通信告知其他机器划分结果。
对于每个特征,只考察分位点可以减少计算复杂度。 该算法会首先根据特征分布的分位数提出候选划分点,然后将连续型特征映射到由这些候选点划分的桶中,然后聚合统计信息找到所有区间的最佳分裂点。 第二个 for 循环:针对每个特征的候选集合,将样本映射到由该特征对应的候选点集构成的分桶区间中,即 ,对每个桶统计 G,H 值,最后在这些统计量上寻找最佳分裂点。 1.2 工程实现 1.2.1 块结构设计 我们知道,决策树的学习最耗时的一个步骤就是在每次寻找最佳分裂点是都需要对特征的值进行排序。 利用直方图算法我们无需遍历数据,只需要遍历 k 个 bin 即可找到最佳分裂点。 我们知道特征离散化的具有很多优点,如存储方便、运算更快、鲁棒性强、模型更加稳定等等。 2.2 工程实现 2.2.1 特征并行 传统的特征并行算法在于对数据进行垂直划分,然后使用不同机器找到不同特征的最优分裂点,基于通信整合得到最佳划分点,然后基于通信告知其他机器划分结果。
对于每个特征,只考察分位点可以减少计算复杂度。 该算法会首先根据特征分布的分位数提出候选划分点,然后将连续型特征映射到由这些候选点划分的桶中,然后聚合统计信息找到所有区间的最佳分裂点。 第二个 for 循环:针对每个特征的候选集合,将样本映射到由该特征对应的候选点集构成的分桶区间中,即 ,对每个桶统计 G,H 值,最后在这些统计量上寻找最佳分裂点。 1.2 工程实现 1.2.1 块结构设计 我们知道,决策树的学习最耗时的一个步骤就是在每次寻找最佳分裂点是都需要对特征的值进行排序。 利用直方图算法我们无需遍历数据,只需要遍历 k 个 bin 即可找到最佳分裂点。 我们知道特征离散化的具有很多优点,如存储方便、运算更快、鲁棒性强、模型更加稳定等等。 2.2 工程实现 2.2.1 特征并行 传统的特征并行算法在于对数据进行垂直划分,然后使用不同机器找到不同特征的最优分裂点,基于通信整合得到最佳划分点,然后基于通信告知其他机器划分结果。
但我们还没介绍如何确定树结构,即每次特征分裂怎么寻找最佳特征,怎么寻找最佳分裂点。 其可分为两种,一种是按层随机采样,在对同一层内每个结点分裂之前,先随机选择一部分特征,然后只需要遍历这部分的特征,来确定最优的分割点。 另一种是随机选择特征,则建树前随机选择一部分特征然后分裂就只遍历这些特征。一般情况下前者效果更好。 因此XGBoost思想是对特征进行分桶,即找到l个划分点,将位于相邻分位点之间的样本分在一个桶中。在遍历该特征的时候,只需要遍历各个分位点,从而计算最优划分。 具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。训练速度快。 4.添加了对稀疏数据的处理。