2026/1/24 6:00:53
网站建设
项目流程
商城网站设计说明书,网站取消301后,网络推广营销平台系统,影视app制作教程1. Bucketizer 做什么#xff1f;
Bucketizer 会把输入列#xff08;连续值#xff09;按你配置的 splitsArray 切分成区间#xff0c;并输出区间编号#xff1a;
输出的桶索引范围#xff1a;[0, numSplitsInThisColumn - 2]#xff08;也就是区间数量-1#xff09;文…1. Bucketizer 做什么Bucketizer 会把输入列连续值按你配置的splitsArray切分成区间并输出区间编号输出的桶索引范围[0, numSplitsInThisColumn - 2]也就是区间数量-1文档描述为[0, numSplitsInThisColumn - 1]但通常 splits 的长度为 N会产生 N-1 个区间因此索引通常落在[0, N-2]你可以以实际输出为准例如 splits 为[-0.5, 0.0, 0.5]区间1[-0.5, 0.0)区间2[0.0, 0.5]最终输出 bucketIndex 为 0 或 1两段2. 输入列与输出列输入列Input Columns参数名类型默认值说明inputColsNumbernull需要分桶的连续特征列可多列输出列Output Columns参数名类型默认值说明outputColsDoublenull分桶后的离散特征桶索引列可多列输出是 Double 类型的桶索引有些场景你也会想转成 Int/Long 或进一步 one-hot。3. 核心参数Parameters详解Key默认值必填说明inputColsnull✅输入列名数组outputColsnull✅输出列名数组splitsArraynull✅每个输入列的切分点数组二维数组handleInvalidERROR_INVALID否遇到非法值NaN、越界等如何处理3.1 splitsArray分桶切分点怎么写splitsArray是Double[][]它的长度必须等于inputCols.length每个子数组对应一个输入列的切分点。要求/建议每个切分点数组要单调递增通常建议首尾用-INF/INF包住避免边界外数据出错比如[-INF, 10.0, INF]3.2 handleInvalid非法值如何处理常见策略示例中使用了SKIP_INVALIDERROR_INVALID遇到非法值直接报错默认SKIP_INVALID跳过包含非法值的记录整行被丢弃有的体系还会支持KEEP_INVALID保留并映射到特殊桶具体以 Flink ML 实现为准工程建议离线训练可以用ERROR_INVALID尽早暴露数据质量问题在线/生产更常用SKIP_INVALID或“先做清洗再分桶”避免任务被脏数据打挂4. Java 示例逐段解读你的示例做了 4 列特征同时分桶4.1 输入数据DataStreamRowinputStreamenv.fromElements(Row.of(-0.5,0.0,1.0,0.0));TableinputTabletEnv.fromDataStream(inputStream).as(f1,f2,f3,f4);只有一行数据四个连续特征f1-0.5, f20.0, f31.0, f40.04.2 配置 splitsArrayDouble[][]splitsArraynewDouble[][]{newDouble[]{-0.5,0.0,0.5},// f1两段newDouble[]{-1.0,0.0,2.0},// f2两段newDouble[]{Double.NEGATIVE_INFINITY,10.0,Double.POSITIVE_INFINITY},// f3两段newDouble[]{Double.NEGATIVE_INFINITY,1.5,Double.POSITIVE_INFINITY}// f4两段};可以把它理解为f1在 [-0.5,0) 或 [0,0.5] - bucket 0/1f2在 [-1,0) 或 [0,2] - bucket 0/1f3在 (-inf,10) 或 [10,inf) - bucket 0/1f4在 (-inf,1.5) 或 [1.5,inf) - bucket 0/14.3 创建 Bucketizer 并 transformBucketizerbucketizernewBucketizer().setInputCols(f1,f2,f3,f4).setOutputCols(o1,o2,o3,o4).setSplitsArray(splitsArray).setHandleInvalid(HasHandleInvalid.SKIP_INVALID);TableoutputTablebucketizer.transform(inputTable)[0];输出表会保留原列 新增o1~o4四个桶索引列。4.4 打印输入与输出示例把每列输入与输出读出来并打印inputValues[i](double)row.getField(bucketizer.getInputCols()[i]);outputValues[i](double)row.getField(bucketizer.getOutputCols()[i]);最终打印类似Input Values: [-0.5, 0.0, 1.0, 0.0]Output Values: [?, ?, ?, ?]取决于边界规则通常 0.0 会落在右边区间5. 实战建议分桶到底怎么设计1优先用 -INF / INF 包住区间避免线上出现“越界数据导致报错”。2分桶边界最好来自数据分布常见做法等频分桶按分位数等宽分桶按范围均分业务阈值分桶如价格档位、风控评分段3Bucketizer 通常不是最后一步分桶后的输出是“桶索引”很多模型更喜欢 one-hot 或 embeddingLR / 线性模型桶索引 → one-hot或直接当作类别特征处理树模型可以直接用数值但分桶可能帮助稳定