1. 背景赛题数据由约 62 万条训练集、20 万条测试集数据组成共包含 13 个字段。其中uuid 为样本唯一标识eid为访问行为IDudmap 为行为属性其中的 key1 到 key9 表示不同的行为属性如项目名、项目 id 等相关字段common_ts 为应用访问记录发生时间毫秒时间戳其余字段 x1 至 x8 为用户相关的属性为匿名处理字段。target 字段为预测目标即是否为新增用户。朴素的数据特征挖掘从 baseline 内获取提示(1) 数值统计特征频次均值最值 ...(2) 数据预处理拆分 udmap 为key1 - key9(3) 特征语义拆分 common_ts挖掘更多时间语义信息后续深入挖掘从思维导图入手进行试验2. 模型选择① 深度学习 or 机器学习选择 ”机器学习“② 逻辑回归 or 树模型树模型生成决策规则决策树随机森林boost 系列PS处理 “表格类” 数据赛题时通常更倾向使用机器学习模型。这类模型性能往往优于深度模型同时也是快速验证基线性能的手段可帮助大致了解赛题的基线水平。3. 进一步尝试A. 针对 common_ts 的数据处理common_ts 是 “时间戳” 格式的特征列信息挖掘数据语义①拆分针对年、月、日等更细粒度的时间梯度进行新的特征划分并将其加入特征内部②挖掘数据内涵考量时间信息是否具备更深层、更实际的时间语义如时间戳数据 是否集中于特定的星期几“季节性效应Seasonality Effect” ③连续性特征时间信息特征不同于其余普通信息其连续性不可忽视可通过滑动窗口等技术可挖掘该特征。B. 针对 udmap 的数据处理# 预处理数据拆分并转化为独热编码 def udmap_onethot(d): v [0] * 9 if d unknown: return v d eval(d) for i in range(1, 10): if key str(i) in d: v[i - 1] d[key str(i)] return v udmap_train pd.DataFrame(train_data[udmap].apply(udmap_onethot).tolist(), columns[fkey{i} for i in range(1, 10)]) train_data pd.concat([train_data, udmap_train], axis1) udmap_test pd.DataFrame(test_data[udmap].apply(udmap_onethot).tolist(), columns[fkey{i} for i in range(1, 10)]) test_data pd.concat([test_data, udmap_test], axis1)C. 针对 “数值类” 特征的数据处理可通过寻求最值、频率等方式补充特征另外值得说明的是不要忽略一些统计学特征如中位数方差等。D. 特征缩放、标准化、归一化标准化及归一化在做数据特征的比较、挖掘新特征时有时“数据尺度” 可能会带来很大影响通过上述技术可进行一定程度的修正、平衡代码举例scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_val_scaled scaler.transform(X_val) X_test_scaled scaler.transform(X_test)E. 模型构建 交叉验证采用 “决策树” 及 “随机森林” 建立模型最后使用“交叉验证”技术有效提升了 f1 -score。说明建议先用较小的 k 值去进行训练最后提分再使用较大的 “k 折交叉验证” 这样实验流程将更为流畅测试机会将更多。另外交叉验证对数据不足的情况非常有效能够更充分地利用数据往往能提升分数。F. 避免 “过拟合” 我做了哪些尝试①“过拟合” 的定义模型过于复杂泛化能力差多次实验的平均结果f1-score 验证集 集中为0.75f1-score 训练集接近0.99明显过拟合②决策树相关限制决策树训练深度调整分裂的叶片数量早停策略③特征相关设置一个阈值去除贡献度较低的那些特征条目并重新进行模型迭代训练④集成模型可通过 “voting” 或 stacking 技术训练并集成多类模型提升模型决策时的泛化能力⑤数据增广本项目训练集正负样本数极不均衡可采取过采样、欠采样、合采本进行 “样本均衡”。如有侵权或其他问题欢迎留言联系更正或删除。笔者在大约两年前参与这次学习上述总结有不准确或错误之处望读者海涵通过这门课程笔者也算首次开启了 AI 学习的大门现在仍然是初学者但希望能够不忘初心继续砥砺前进