国内B2C电商脱敏数据集实战:从字段探查到特征工程与模型验证 简介这份数据集来自国内某B2C电子商务网站已做隐私脱敏处理面向数据分析、数据挖掘与机器学习方向的学习者和研究者可用于用户画像、商品推荐、订单分析、行为路径挖掘等实战场景。包内共30个文件涵盖xml、csv、sql、xls、pdf与dmp等多种格式分别对应结构化数据表、数据库建表脚本、Oracle数据文件及字段说明文档压缩包约187.75MB。数据规模较为完整15万顾客信息、1.1万件商品资料、28万条顾客行为日志、4万条订单及24万件商品交易记录另含收藏、点击、充值、退货、订单处理日志与消费汇总等衍生数据。目前已有514人学习下载。借助这套数据读者可完整复现电商核心业务链路练习SQL查询、用户分层、关联规则与推荐算法并对照schema文档快速理解表间关系适合作为课程设计、毕业项目或算法练手的真实数据底座。1. 从一份脱敏 B2C 数据集说起它到底能跑出什么拿到「国内某 B2C 电子商务网站的数据集不含隐私」这个标题很多人第一反应是去找下载链接但真正决定这份数据能不能用的是它脱敏到了什么粒度。我见过太多团队兴冲冲导入一份电商数据集结果发现用户 ID 被哈希成一串不可关联的乱码订单表里连时间戳都被抹平到月份最后连复购率都算不出来。这份数据集的价值不在于「大」而在于它保留了行为链路浏览、加购、下单、支付、退款这几个环节如果还能通过脱敏后的会话 ID 串起来那它就能支撑推荐召回、漏斗归因、RFM 分层、流失预警这一整条分析链路。适合谁用做推荐系统冷启动的算法同学、做用户增长的数据分析师、以及想验证一套特征工程管线的后端工程师。不含隐私意味着手机号、地址、身份证这类字段已经被移除或泛化你拿到的应该是订单号、商品类目、行为时间、金额区间、地域到城市级别这样的组合。先别急着建模把字段语义和脱敏规则摸清楚比调参重要十倍。2. 先搞清楚这份数据集里有什么字段语义与脱敏边界2.1 典型字段清单与业务含义一份可用的国内 B2C 电商脱敏数据集通常围绕「用户-商品-行为-订单」四张主表展开。用户表保留脱敏 ID、注册时间段、会员等级、城市层级商品表保留类目树、品牌可能泛化、价格带、上架时间行为表是核心记录曝光、点击、加购、收藏、下单事件及对应时间戳订单表则包含订单状态、支付金额区间、退款标记。下面这张表是我在多个类似数据集上归纳出的字段对照实际拿到手时以你的数据字典为准但语义映射逻辑是通用的。字段名示例业务含义脱敏方式分析可用性user_hash用户唯一标识SHA256 加盐可关联不可逆item_id商品标识保留原始编码可直接关联cat_l1/l2/l3三级类目保留可做类目分析event_type行为类型枚举值保留核心字段event_time行为时间戳精确到秒或分钟可做时序order_status订单状态枚举保留可做漏斗pay_amount_band支付金额区间分桶泛化不可算精确 GMVcity_level城市等级到城市或等级可做地域分层看到 pay_amount_band 这种分桶字段就要警觉你能算订单量分布但算不了精确客单价。这不是数据缺陷是脱敏的必然代价。做增长分析时用区间中位数替代做推荐排序时金额只作为粗特征。2.2 脱敏规则对分析口径的三个硬约束第一个约束是时间泛化。如果 event_time 被抹到天级别你就做不了实时 session 切分只能按天聚合。第二个约束是 ID 映射。user_hash 如果是全局统一加盐跨表关联没问题如果每张表独立加盐那用户行为链路直接断裂这份数据只能做单表统计。第三个约束是数值分桶。金额、年龄、频次一旦分桶回归类模型的特征表达能力就受限得改用类别编码或目标编码。我一般拿到数据先跑一段探查脚本确认这三件事再决定后续管线怎么搭。import pandas as pd # 读取行为表与订单表先做脱敏边界探查 behavior pd.read_csv(behavior.csv) orders pd.read_csv(orders.csv) # 1. 检查时间粒度相邻时间戳最小差值 behavior[event_time] pd.to_datetime(behavior[event_time]) min_delta behavior.sort_values(event_time)[event_time].diff().min() print(最小时间间隔:, min_delta) # 若为 1 天说明已天级泛化 # 2. 检查跨表 ID 可关联性 common_users set(behavior[user_hash]) set(orders[user_hash]) print(可关联用户占比:, len(common_users) / behavior[user_hash].nunique()) # 3. 检查金额字段是否分桶 print(orders[pay_amount_band].value_counts().head())这段脚本的逻辑很直白最小时间间隔告诉你时序分析的天花板可关联用户占比告诉你能否做跨表漏斗金额分桶分布告诉你特征工程该用哪种编码。参数上唯一要注意的是 pd.to_datetime 的格式国内数据集常见「2023-01-01 12:00:00」和「20230101120000」两种格式不对会静默转成 NaT务必加 errorsraise 先验证。3. 把原始表变成可建模宽表会话切分与特征聚合3.1 会话切分30 分钟规则还适用吗电商行为流的经典处理是 30 分钟不活跃即切分新会话但这个阈值来自网页时代。移动端场景下用户可能上午加购、晚上下单硬切会把同一意图拆散。我的做法是分两套口径一套用 30 分钟做实时推荐的特征源一套用 24 小时做离线归因的会话窗口。数据集如果只到天级别那就退化为按天聚合别硬套会话概念。切分完要统计每个会话的行为序列长度、首末行为类型、是否转化这些是后续漏斗和序列模型的基础。# 基于 30 分钟阈值切分会话假设时间戳精确到分钟 behavior behavior.sort_values([user_hash, event_time]) behavior[gap] behavior.groupby(user_hash)[event_time].diff().dt.total_seconds() behavior[new_session] (behavior[gap] 1800) | (behavior[gap].isna()) behavior[session_id] behavior.groupby(user_hash)[new_session].cumsum() # 会话级聚合 session_feat behavior.groupby([user_hash, session_id]).agg( start_time(event_time, min), end_time(event_time, max), event_count(event_type, count), has_order(event_type, lambda x: (x order).any()) ).reset_index()gap 字段算出相邻行为秒差超过 1800 秒或为首条行为就标记新会话cumsum 生成会话编号。has_order 是会话是否转化的标签直接可用于转化率建模。注意 groupby 后 cumsum 的顺序依赖排序前面 sort_values 不能省否则会话编号会错乱这是血泪教训。3.2 用户侧与商品侧特征聚合会话特征只是中间层真正喂给模型的是用户粒度和商品粒度的宽表。用户侧我通常聚合近 7 天、30 天的点击次数、加购率、下单率、退款率、偏好类目 TOP3商品侧聚合曝光点击率、加购转化率、价格带分布。这里有个坑脱敏后的金额是区间算价格带分布时要先把区间映射成有序类别再取众数或中位数不能直接当数值求平均。# 用户 30 天行为聚合 user_feat behavior.groupby(user_hash).agg( click_cnt(event_type, lambda x: (x click).sum()), cart_cnt(event_type, lambda x: (x cart).sum()), order_cnt(event_type, lambda x: (x order).sum()), active_days(event_time, lambda x: x.dt.date.nunique()) ).reset_index() user_feat[cart_rate] user_feat[cart_cnt] / user_feat[click_cnt].clip(lower1) user_feat[order_rate] user_feat[order_cnt] / user_feat[click_cnt].clip(lower1)clip(lower1) 防止除零这是特征工程里最常见的翻车点。active_days 用 dt.date.nunique() 算活跃天数比直接 count 更能反映粘性。这些特征拼上订单表的退款标记就能跑一个基础的流失预警模型。参数上窗口期选 7 还是 30 取决于业务复购周期快消品用 7 天耐用品用 30 天甚至 90 天没有万能值。4. 避坑与排查脱敏电商数据集最常见的五个翻车点4.1 现象跨表关联后用户量骤降九成原因不同表的 user_hash 加盐值不同或者行为表只保留了登录用户、订单表包含游客订单。解决先做 ID 交集探查若交集过低放弃跨表链路改为单表分析或让数据提供方重新导出统一加盐版本。别硬着头皮 JOIN出来的结果全是错的。4.2 现象时间序列出现大量重复时间戳原因脱敏时把秒级时间抹成分钟级同一用户同一分钟多条行为被压平。解决聚合前先按 (user_hash, event_time, event_type) 去重或改用计数特征而非序列特征。如果要做序列模型这份数据的时间精度可能不够得换数据源。4.3 现象金额区间字段直接当数值算客单价离谱原因pay_amount_band 是字符串区间如「100-200」被 pandas 读成 object 后误转数值变成 NaN 或错误均值。解决建立区间到中位数的映射字典显式转换并在代码里加断言校验转换后无空值。4.4 现象类目树层级对不上L3 类目挂到错误的 L1 下原因脱敏过程中类目编码被重新映射但映射表未同步提供。解决用商品表自带的 cat_l1/l2/l3 三列做一致性校验统计每个 L1 下 L3 的唯一值数量异常多的说明映射错乱需要向数据方索要类目映射字典。4.5 现象模型 AUC 很高但上线效果差原因特征里混入了未来信息比如用全量数据的统计量做编码或者会话切分时把下单后的行为也算进了特征窗口。解决严格按时间切分训练集和验证集所有聚合特征只允许使用预测时间点之前的数据做一次时间穿越审计。5. 从离线特征到线上验证一份数据集的进阶用法5.1 用时间窗口回放验证特征稳定性数据集跑通离线模型只是第一步真正决定它值不值得投入的是特征在时间上的稳定性。我习惯做时间窗口回放把数据按周切分用第 1 周训练、第 2 周验证滚动前进观察 AUC 和特征分布的漂移。如果某周 AUC 骤降多半是促销活动导致行为模式突变这时候要么加活动标记特征要么把该周剔除。下面这段代码演示滚动验证的基本框架。import numpy as np from sklearn.metrics import roc_auc_score from sklearn.ensemble import GradientBoostingClassifier weeks sorted(behavior[event_time].dt.isocalendar().week.unique()) aucs [] for i in range(len(weeks) - 1): train_week, valid_week weeks[i], weeks[i 1] train user_feat[user_feat[week] train_week] valid user_feat[user_feat[week] valid_week] model GradientBoostingClassifier(n_estimators100, max_depth3) model.fit(train[feat_cols], train[label]) pred model.predict_proba(valid[feat_cols])[:, 1] aucs.append(roc_auc_score(valid[label], pred)) print(滚动 AUC:, np.round(aucs, 4), 波动:, np.std(aucs))n_estimators 和 max_depth 是保守起点电商行为特征噪声大树太深容易过拟合。滚动 AUC 的标准差比单次 AUC 更有参考价值标准差超过 0.05 就说明特征不稳定得回去查数据口径。5.2 脱敏数据做推荐召回的正确姿势不含隐私的数据集做推荐最大的限制是拿不到用户实时上下文只能靠历史行为序列。我的经验是把召回拆成两路一路基于物品协同用行为表的共现矩阵算 item-item 相似度一路基于内容用类目和价格带做规则召回。两路合并后再用排序模型精排。物品协同对脱敏数据特别友好因为它只需要 item_id 和 user_hash 的共现不依赖任何隐私字段。召回策略依赖字段冷启动表现实现复杂度Item-CFuser_hash, item_id一般低类目热门cat_l1/l2好极低价格带匹配pay_amount_band中低序列模型event_time, event_type差高冷启动阶段优先上类目热门和价格带匹配等行为数据积累够了再叠 Item-CF。序列模型对时间精度要求高脱敏到天级别的数据集基本跑不出效果别浪费精力。5.3 一个具体技巧用退款标记做负采样校正电商数据里正样本下单稀疏负样本曝光未点击海量直接训练会导致模型偏乐观。我一般用退款订单作为「强负样本」加入训练因为退款行为说明这次转化是失败的。具体做法是把退款订单的标签设为 0 而非 1同时给它更高的样本权重。这个技巧在脱敏数据上尤其有用因为金额和用户画像被泛化后退款标记是少数几个还保留真实业务含义的字段。权重设 2 到 3 倍即可太高会让模型过度保守。这套流程我踩过最大的坑是忘了对齐退款时间把退款前的行为也当成了负样本特征结果模型学到了「退款用户之前也点击过」这种废话。后来养成习惯所有标签相关的时间字段先做一次时序图核对确认没有穿越才继续。数据脱敏不可怕可怕的是你以为它没脱敏。希望帮到你。本文还有配套的精品资源点击获取