ARTICLE DETAIL

资讯详情

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

大数据数据挖掘完整流程:从数据质量到模型上线的避坑指南

大数据数据挖掘完整流程:从数据质量到模型上线的避坑指南 干了这么多年数据挖掘项目我最大的感受是绝大多数项目最后不是死于模型精度不够而是死于数据侧的问题。特征没对齐、样本有时间穿越、业务方和算法对指标口径理解不一致——这些坑一旦踩进去调参调得再好都救不回来。这篇文章就以我在网约车、电商场景里做过的数据挖掘项目为例把大数据环境下数据挖掘的完整流程重新拆一遍。不止讲步骤名称更讲每步为什么这么做、不这么做会出什么乱子。适合刚入门的数据分析师、数据挖掘工程师也适合那些“模型跑通了但上线就掉链子”的项目负责人参考。1. 流程认知对齐大数据环境下的挖掘早就不是“跑个模型”那么简单1.1 经典流程在大数据场景下的真实变形教科书上讲的CRISP-DM方法论——业务理解、数据理解、数据准备、建模、评估、部署——这套东西到今天依然有效但落地时的重心已经完全变了。传统BI项目里数据量停留在GB级一张表拉进内存跑个pandas也能凑合而到大数据场景数据动不动就是TB甚至PB级分布在几十上百台机器上问题一下就不一样了。我先用一张表把这个差异摊开讲环节传统数据挖掘大数据环境下的数据挖掘数据量级GB级单机内存可处理TB/PB级必须分布式存储与计算数据来源相对单一结构化为主埋点、日志、业务库、外部接口多源异构数据质量人工抽查可解决必须自动化巡检靠规则脚本全量校验特征工程单机能跑完迭代快依赖离线数仓加工周期长需特征平台管理建模方式单机scikit-learn随便调Spark MLlib、分布式XGBoost成为常态上线关注点模型文件部署离线在线一致性、实时特征获取、监控与回滚这表一列出来问题就清楚了大数据数据挖掘真正吃掉项目周期的大头从来不是建模那一步而是数据准备和特征加工。很多团队把90%精力放在调参、换模型上结果上线效果一塌糊涂回头一查是训练数据和线上数据口径不一致。这是我见过的高频事故没有之一。1.2 数据比模型更早出场顺序错了一定返工传统流程给人一种错觉先理解业务然后就可以建模了。大数据环境下这个顺序必须加长。我在做网约车供需预测项目时第一步不是选XGBoost还是LightGBM而是先把“天气数据怎么接入”“司机定位日志延迟多久到数仓”“订单表主键能不能去重”这些事理清楚。原因是大数据的“大”不只是量大更是来源复杂、链路长、实时性强。一个字段从产生到能用于训练中间要经过APP埋点、日志采集、消息队列、数仓清洗、特征宽表拼接任何一环出了偏差模型学到的就是错误信号。所以我的建议是**先画数据地图再谈模型选型。**数据地图上要标清楚每张表的数据来源、更新频率、主键字段、质量负责人。项目动工前让团队花几天把这张图画出来后面能省几周的返工时间。2. 业务理解与目标拆解这一步偷懒后面全盘被动2.1 业务诉求怎么变成可验证的目标函数业务方说的需求往往是这样的“我们要预测用户流失”“我们要提升订单转化率”。这种话没法直接建模必须把话翻译成一个机器学习问题。翻译得好不好直接决定项目能不能落地。判定标准就一条能不能写清楚正负样本的定义和预测目标。拿用户流失预测举例。追问“什么算流失”时业务方会说“不来了就是流失”。但“不来了”太模糊必须量化。我和团队当时定的口径是一个用户连续30天没有登录且没有完成任何订单判定为流失。那么预测目标就是基于用户过去60天的行为特征预测未来30天内发生流失的概率。这里有两个关键时间窗口必须写进项目文档观察窗口特征窗口过去60天内可用的行为数据。注意只能用这60天里的数据做特征终点是样本截断日。表现窗口标签窗口截断日之后30天内是否发生目标行为流失/留存/下单等。这个翻译过程如果不过脑子后面特征工程里最常见的“时间穿越”问题就是从这儿埋下的。我后面第五节会专门讲那个坑一旦踩了训练指标能打到0.98线上直接崩成0.5。2.2 样本设计是项目质量的第一个分水岭目标定义清楚之后马上要面对样本设计。样本设计不是简单地把表拉出来就完事需要处理三个问题。第一正负样本决定了模型学什么。不同的大数据场景正负样本定义完全不同。比如流失预测是标记未来30天流失的用户为正样本其余为负样本。这里要注意的是观察窗口最后一天还在活跃的用户如果表现形式窗口期间没有任何行为即便他在观察窗口很活跃标签也是正样本。判断标准永远以表现窗口的真实行为为准。第二样本时间截断不能错。假设今天是2025年1月10日要生成1月1日的预测样本那这个样本的特征只能使用1月1日及之前的数据标签则看1月1日之后30天的表现。很多新手图省事直接拿“用户最近30天行为”做特征这个“最近”如果算到今天训练集里就混入了未来的信息等于开卷考试。检测方法很简单**分别统计各样本的特征最后可用日期和标签开始日期凡是特征日期越过标签日期的全部判为泄漏。**我一般会在样本生成脚本里加一个前置校验当天的特征表必须按分区管理样本调用时只能读取当前分区之前的数据。第三样本量不是越大越好。在用户量大的平台全量样本动辄上亿训练一次跑很久没必要。实际做法是先按用户分层采样保证正样本全量保留流失用户通常较少负样本按比例采样。采样比例记录下来后续计算模型输出概率时要还原出真实概率否则阈值会偏。2.3 没有基线任何“提升”都是自嗨我极度建议在建模前先做一个规则基线或统计基线。比如流失预测基线可以是“过去30天未活跃的用户都预测为流失”算一下这个规则在验证集上的精确率和召回率。这个数字就是模型提升的锚点。为什么强调这个因为在大数据场景下数据量大、周期长模型训练一次成本不低如果没有基线你很难判断新模型的收益到底有多少。而且业务方也吃这一套——你拿着“规则基线准确率72%模型到78%”去汇报比单说“准确率78%”有说服力得多。基线的构造不需要复杂用SQL把历史表现统计一遍就够。重点不是基线本身有多准而是**它能逼着你在项目早期就把数据口径、评估方式定下来。**否则等模型跑出来了再定义基准很容易为了凑效果临时改口径。3. 数据采集与存储选型源头设计决定后面所有环节的难度3.1 多源数据接入的常见链路大数据挖掘能用的数据按来源基本分三类业务数据库订单、用户、支付等核心业务数据存在MySQL等数据库中。采集方式常用Canal或Debezium解析binlog实时写入Kafka再由Flink或定时任务同步到数仓。用户行为日志APP点击、浏览、停留时长等埋点日志由Filebeat/Fluentd采集经过Kafka消峰落地到数仓ODS层。外部数据天气、POI、竞品数据等一般走定时任务从接口拉取落成外部数仓表。这里给个具体的链路参考网约车场景里常用的一套业务MySQL -- Canal监听binlog -- Kafka(ods_binlog_topic) | APP埋点 -- Filebeat -- Kafka(log_topic) | Flink / Spark Streaming -- HDFS/数仓ODS层 -- DWD层(清洗)这条链路的重点在于Kafka是缓冲带用来削峰和避免业务库被流量冲垮。数仓落地之后再通过离线任务做清洗。实时性要求高的场景比如实时特征可以在Flink里做状态计算不在本文展开。3.2 数仓分层为什么让你后面“活得更久”很多入门项目直接“一张大宽表走天下”在数据量小的阶段挺爽但到了TB级以上就扛不住了。标准做法是分三层ODS层原始数据落地不做加工保留全量历史保证可回溯。DWD层明细数据清洗层做去重、格式化、字段标准化生成干净的明细事实表。ADS层应用汇总层面向具体业务做聚合特征宽表比如用户日活表、订单统计表。我实际经验里最大的体会是ODS层千万不能省。不少团队为了省存储直接对原始数据做清洗覆盖结果后面发现清洗逻辑写错了想回溯原始数据都没得回溯项目直接卡死。ODS层的存储成本在总预算里其实占比很小省它不值得。文件格式方面大数据场景强烈推荐Parquet或ORC列式存储。原因是数据挖掘的查询和训练通常只取部分列列式存储只读所需列I/O能差出一个数量级。压缩算法建议用Snappy或Zstd前面ODS层可以用Zstd压得更狠DWD/ADS层用Snappy图查询性能更快。3.3 分区策略和“热点Key”问题要提前想数仓表按日期分区已经是标配只补充两个高阶经验。一是小维度的分区。用户量大的平台建议在日期之外再按省份或城市分桶。原因很简单单日数据量还是太大全表扫描一次耗时太长分桶后既能加速查询也为后面训练数据抽取提供了裁剪路径。大数据本身计算引擎不怕数据量大怕的是数据倾斜。所谓数据倾斜就是某一天某个城市的数据特别多比如节假日景区城市计算任务都堆在一个节点上其他节点闲着跑得特别慢。处理思路是给关键Key加盐打散或者在Join时按热点值单独处理。这块是单独一个大话题但至少在设计宽表时就要意识到凡是做聚合的字段先看它的值域分布有没有极端倾斜有就要分区/加盐规避。4. 数据清洗与预处理大数据场景下最容易翻车的环节4.1 幂等性陷阱重复数据处理不当指标全失真数据清洗第一步先解决重复。大数据场景的重复和传统数据库的重复不是一个量级——消息队列的“至少一次”投递机制、Flink重启后的状态恢复、手动补数脚本重复跑都会造成同一份订单被写入多次。我碰到过一个真实案例对抗风控模型的训练数据里某个用户同一笔订单出现了三次标签被人为翻了3倍模型对这个用户的预测概率直接偏高业务侧核实时发现异常顺藤摸瓜才找到这条重复。通用处理套路每张明细表都设置一个业务主键比如订单号商品ID发生时间然后按主键去重。Hive或Spark SQL可以这样写INSERT OVERWRITE TABLE dwd_order_clean SELECT order_id, user_id, city_id, product_id, amount, order_time FROM ( SELECT order_id, user_id, city_id, product_id, amount, order_time, ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY order_time DESC) AS rn FROM ods_order_raw ) t WHERE rn 1;去重的代价不低但只要做一次就能避免后续所有模型吃哑巴亏。我建议把去重逻辑沉淀成公共数据集或函数别让每个分析人员自己写否则口径迟早飘。4.2 数据质量巡检脚本每天跑一遍而不是出了事再查数据质量问题在大数据场景是常态而不是意外。传输延迟、字段解析失败、上游变更字段名任何一个节点出问题下游都会静默地“正常”产出错误数据。这也是为什么数据挖掘团队一定要建质量监控早会的原因——每天早上自动跑一遍质量巡检把异常直接推到群里比月底发现数据全错了再回滚强一万倍。巡检脚本至少覆盖以下规则主键唯一性全表做COUNT(DISTINCT主键)对比COUNT(主键)是否一致。空值率监控业务核心字段空值率是否超过阈值比如订单金额5%为告警。枚举值分布城市ID、渠道ID等字段取值分布是否突变有一天某个渠道突然为0多半是采集挂了。时间延迟ODS层最新分区时间与系统当前时间差是否超过阈值。跨表Join监控两张关键表Join后行数变化是否在合理范围波动。一个简单实用的Hive巡检SQL结构长这样-- 质量巡检: 核对当日订单明细表主键唯一性和空值率 SELECT COUNT(*) AS total_rows, COUNT(DISTINCT order_id) AS distinct_orders, SUM(CASE WHEN amount IS NULL OR amount 0 THEN 1 ELSE 0 END) AS invalid_amount, ROUND(SUM(CASE WHEN amount IS NULL OR amount 0 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS invalid_rate FROM dwd_order_clean WHERE dt ${yesterday};把这些规则配到一个任务流里每天固定时间跑输出告警。真的数据挖掘项目减少返工的第一生产力不是更好的模型而是这套巡检。4.3 异常值处理别迷信均值±3σ长尾分布下那是灾难传统统计学教材爱用均值±3σ识别异常值这招在正态分布的数据上勉强可用但大数据里的指标普遍是长尾分布——比如订单金额、用车里程、用户消费金额偏态严重。你用均值±3σ极少数头部用户会把均值拉得极高尾部稍微正常的用户全被误杀。更稳健的做法是用分位数。常见指标超出 P99 或 P99.5 的值视为极端值可做截断或单独标记。用 IQR四分位距识别离群点低于 Q1-1.5IQR 或高于 Q31.5IQR。更根本地很多模型的树模型和神经网络对异常值并不像线性模型那么敏感清洗时采用“截断不删除”的策略更稳妥把极值压缩到上限分位数保留样本数量。我自己做电商CVR预估时的处理经验是金额字段先做对数变换再把超过P99.99的值压缩到P99.99。这样既保留了极端样本的信息又不会让个别大额订单主导模型。4.4 数据语义的不一致比数据质量更隐蔽清洗阶段还有一个容易被忽视的问题同一字段在不同表里含义一致吗比如“用户ID”有的表是匿名化ID有的表是手机号加密后的ID直接Join出来全是关联不上。比如“订单状态”A表用0/1表示是否完成B表用字符串枚举表示更细分状态。这类问题在数据地图阶段就要标出来清洗阶段做统一映射。我见过最惨的教训是一次跨部门合作对方提供的“用户活跃度等级”实际是他部门内部的内部编码我们按字面理解成1/2/3等级直接用模型训练出来之后评估总是乱跳排查了三天才定位到是字段语义不一致。5. 特征工程建模效果的天花板在这里5.1 从统计数据到可上线特征的基本构造思路特征工程决定模型上限这句话在大数据时代不仅没变反而被放大了。原因很简单大数据场景同一个实体可用的历史行为太多了如果不精心设计窗口聚和衍生物喂给模型的就是一堆噪音。我常用的特征构造维度有这五类用户行为统计近7/14/30天的登录次数、下单次数、消费金额、活跃天数、最大间隔天数。时间特征注册时长、距离上次登录小时数、距离上次下单天数、偏好时段。序列特征最近30天行为的频次衰减加权值、连续活跃天数、行为序列的复杂度。文本特征用户备注、商品标题等用tf-idf或向量化做嵌入。交叉特征年龄x城市x消费档位组合通常由GBDT自动学人工构造时注意稀疏性。以流失预测为例一个核心特征就是“用户最近可获得性衰减”实现方式是对历史活跃行为按时间做指数衰减加权import pandas as pd import numpy as np def recency_weighted_activity(activity_dates, anchor_date, half_life_days15): 按时间衰减加权活跃特征 activity_dates: 用户历史活跃日期列表 anchor_date: 样本截断日 half_life_days: 半衰期15天前的行为权重为0.5 delta_days np.array([(anchor_date - d).days for d in activity_dates]) decay_weight np.power(0.5, delta_days / half_life_days) return decay_weight.sum()为什么用衰减而不是简单次数因为用户的活跃程度是有时间衰减特性的三个月前的100次下单和最近3天的100次下单对“用户会不会流失”的预测意义完全不同。简单次数特征会把这两个用户等同看待模型很难学到时间维度上的变化。5.2 特征泄漏那个0.98的AUC是怎么害死我的特征泄漏是数据挖掘最致命的问题没有之一。它最阴险的地方在于训练时指标漂亮到让你怀疑人生上线后立刻原形毕露因为你无意中把“未来”的信息灌了进去。举一个我真实遇到过的泄漏案例。做推荐点击率预估时我想加一个“用户是否已看过该商品”的特征实现时直接从用户曝光日志里取了该商品的全部曝光记录。问题是曝光日志本身就包含了“在推荐位曝光”这一动作而预测目标是“未来会不会点击”。用户已经曝光过不等于系统在预测时点一定知道这条曝光记录——尤其是训练样本里的曝光记录其实发生在“预测时点之后”。检测泄漏最笨也最可靠的方法**每个样本都记录“特征的最后可使用时间”和“标签事件的开始时间”然后单独跑一遍统计检查是否存在样本的特征使用时间晚于标签开始时间。**一旦发现立刻回溯上游特征加工逻辑修正对应的窗口截断。另外利用“用户未来行为”构造的序列特征也是泄漏重灾区。比如你想预测下一单会不会买某商品然后你用一个包含“用户买过该商品”的历史行为序列去构造特征——如果这个序列的截止日期没有严格卡在样本截断日之前模型就学到了“下一单”本身的答案。5.3 特征存储离线在线一致性是上线不掉链子的保险丝特征工程不是算出特征就完事还要考虑一件事训练时的特征上线时能不能实时算出来。这是“离线在线一致性”的核心。很多团队走的是这条路离线Hive定时任务把特征算好存成宽表训练时直接读。在线开发另外写一套Java/Python代码从实时埋点和业务库实时计算同一份特征。问题来了离线版的“近7天登录次数”算的是完整7天在线版受限于数据管道延迟可能只拿到近5天。两套口径稍有不同模型预测就偏。正确做法是维护一个特征平台离线宽表与在线特征服务共用同一套特征定义代码比如# 特征定义统一通过配置声明离线在线复用 feature_spec { user_7d_order_cnt: 近7天下单次数, user_30d_active_days: 近30天活跃天数, user_last_order_gap_days: 距上次下单天数 }训练之前还要做一次离线在线一致性校验抽取1000个用户分别用离线宽表和在线特征服务计算同一批特征差值的绝对值超过容差就告警。这个校验每次上线前跑一遍能拦截大部分线上效果衰减的问题。6. 建模与调优先选对算法路线再谈参数6.1 算法选型的底层逻辑到了建模环节先泼一盆冷水在大数据场景先跑的往往不是最先进深的模型而是最能稳定落地的模型。结构化表格数据我的默认选择是GBDT类模型XGBoost、LightGBM、CatBoost。原因包括能处理非线性特征关系、对异常值相对鲁棒、训练流程相对简单、在千万级样本上的效果通常优于深度模型。而深度学习在数据挖掘项目里的优先顺序要看场景——如果数据是文本、图像或者用户行为序列特别长深度学习优势明显如果就是一堆离散和连续特征GBDT往往更省心又更强。大数据量的处理上再补一刀几千万样本在单机XGBoost也能跑但训练时间可能以小时计调参迭代太慢。亿级样本建议用Spark MLlib的GradientBoostedTrees或者使用XGBoost的分布式版本跑在Spark/YARN上。上亿甚至几十亿样本就得上参数服务器了不过大部分业务场景没到那个级别。6.2 时间序列场景下的交叉验证别用随机K折大数据挖掘里很多任务是带时间属性的比如预测未来30天的流失率、预测明天的供需缺口。这类任务用传统的随机K折交叉验证样本被随机打乱训练集里混入了未来的样本验证集的指标会虚高。正确做法是TimeSeriesSplit按时间顺序切分# 时间序列切分示意 import numpy as np # 假设样本按日期排序 dates np.array(sorted(df[dt].unique())) offset 30 # 特征窗口天数 for i in range(10, len(dates), 10): train_dates dates[:i] val_dates dates[i:i10] # 训练集: dt train_dates[-1] # 验证集: dt in val_dates, 且特征截断日要早于验证集最早的日期 pass注意一个细节验证集的特征只能用验证集日期之前的数据算不能用验证集当天的数据。实际操作上我一般把特征宽表按“样本截断日”分区切分时直接按分区读取从机制上杜绝泄露。6.3 调参的颗粒度网格搜索在大数据量下就是秀儿网格搜索在小数据量上没问题但在大数据场景训练一次动辄几十分钟遍历几千组参数根本不现实。合理的调参节奏是先用默认参数跑一遍拿到基线。先调影响最大的参数。对GBDT来说一般是学习率learning_rate、树深度max_depth、最小叶子样本数min_child_weight、子采样比例subsample、列采样比例colsample_bytree。粗扫阶段每组参数跑一个子样本比如10%数据确认大致区间细调阶段再上全量。用早停控制迭代次数避免过拟合和无效训练时间。给一个我常用的LightGBM参数组合作为起点params { objective: binary, learning_rate: 0.05, num_leaves: 31, max_depth: 6, min_child_samples: 20, subsample: 0.8, subsample_freq: 1, colsample_bytree: 0.8, n_estimators: 2000, early_stopping_rounds: 100, reg_alpha: 0.1, reg_lambda: 0.1, }这套参数不是最优解但是个非常稳的出发点。数据量大了以后学习率再调低到0.01或0.02树的数量相应调大效果通常更好代价是训练时间变长。7. 模型评估与上线离线指标漂亮不算数监控才是护城河7.1 评估指标与你的业务动作要对齐做模型评估时最容易犯的错是把“准确率”当万能指标。类别不平衡大数据场景尤其致命流失率只有5%时预测全不流失准确率就是95%但这个模型一点用没有。业务动作决定评估指标。如果模型预测的是“谁是高流失风险用户”运营团队要给这些人发券召回那么更合适的指标是召回率预测出的真实流失用户占实际流失用户的百分比。漏掉高流失用户意味着白花召回预算。精确率或精度预测为流失的用户中真正流失的比例。预测错一批召回成本就浪费了。同时可以用PR曲线下的面积AUC-PR或设定业务成本函数后优化净收益。推荐场景则关注GAUC用户维度的AUC和TopK命中率。对于排名类任务AUC高不意味着用户第一屏就喜欢你的推荐所以要看K指标。定了指标之后阈值怎么选也必须有业务参与。通常做法是在验证集上画出精确率-召回率曲线让运营侧选一个可接受的精确率反推对应阈值。这个阈值要写进上线配置否则模型服务默认的0.5可能完全不是业务想要的点。7.2 线上A/B测试与模型监控一个都不能少模型上线前哪怕离线指标再好也要过A/B测试这一关。但A/B测试在大数据场景有几个坑值得提示流量要均匀随机分成实验组和对照组并且尽量用用户ID做哈希分层避免同一个人在实验周期内被反复切换版本。实验周期要覆盖业务波动周期。比如电商预测模型至少要跑7天最好覆盖一个完整周末否则结论漂移。A/B显著结果要算最小样本量和置信区间不能看几天数据就下结论。模型真正上线后监控才是护城河。我长期在用的监控维度至少包括四类特征分布偏移连续特征用PSI群体稳定性指标监控离散特征用分布卡方检验。PSI超过0.1就要警惕超过0.25必须告警。预测分布变化模型打分均值和分位数是否突变。如果用户流失概率预测均值从0.2涨到0.35先检查特征是不是变了再考虑重训。数据延迟与缺失在线特征计算时拿不到近期特征的比例是否上升数据管道是否发生延迟。业务指标反馈实验组的业务指标召回率、转化率是否与预期一致。给一个简单的监控脚本逻辑示例# 每日计算模型预测分布的PSI import pandas as pd import numpy as np def compute_psi(expected, actual, buckets10): 计算两个分布之间的群体稳定性指数PSI expected_pct np.histogram(expected, binsbuckets)[0] / len(expected) 1e-6 actual_pct np.histogram(actual, binsbuckets)[0] / len(actual) 1e-6 psi np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct)) return round(psi, 4) # 每日比对当日预测分布与基线分布 psi_value compute_psi(base_scores, today_scores) if psi_value 0.25: alert(模型预测分布偏移异常请检查特征管道)7.3 离线在线一致性的实战检查清单前面提到特征存储的一致性这里给出上线前我必跑的一份检查清单内容不复杂但每次都能抓到问题特征定义是否由同一份代码或配置生成两套代码是否存在差异。特征上线时抽取过去三天样本分别用离线/在线方式算了多少两者差异是否超过1%的容差。模型输入特征的顺序、类型与训练时是否完全一致特别是稀疏特征的维度对齐。线上模型版本和离线训练的模型版本是否一致模型文件是否上传到统一的模型仓库。预测请求时如果某个特征缺失线上默认值是否与训练时的填充策略一致。坦白讲这项检查比调参带来的收益大得多。很多模型上线后掉点根因就在这些细枝末节的一致性上。8. 踩坑多年后的习惯沉淀最后分享几条我个人反复验证过的原则每一条背后都有项目在买单。第一数据质量永远排在模型复杂度前面。我见过太多团队在XGBoost上死磕调参结果训练集里重复率还在5%以上。把清洗巡检做扎实比换一个再高级的模型都管用。第二样本标签和特征窗口的定义要写文档、要评审。这个东西不写下来三个月后换个人接手他会按照自己的理解重新定义一遍之前的模型结论全部没法复用。写得越明确团队协作效率越高。第三先小规模跑通闭环再准备上量。大数据项目最忌讳一上来就跑全量全量跑一遍可能两三天发现问题再重跑又是两三天。先用1%的样本把链路跑通确认特征、标签、训练代码、评估流程都没问题后再放开到全量。第四每个项目固化一张“数据-特征-模型-监控”的清单。这个项目用了哪些表、哪些特征、模型版本是什么、监控阈值是多少写在一页内。线上出事时这张清单就是救命地图。第五任何模型都要优先考虑业务可解释性。大数据场景模型复杂了没关系但就算没有做全面可解释至少要能回答“这个用户为什么被预测为流失”——凑几条贡献度最高的特征算个shap值业务方认可度会指数上升。把这五条记下来再回去看你的项目流程很多问题其实在起步阶段就能避免。这也是我把这套流程重新拆一遍的初衷数据挖掘不是玄学每一步都有章可循按步骤走结果不会差到哪里去。
返回列表