从零开始的 ML 实战:一段算法入门的心路历程

Merge前先祈祷
2025-06-24 11:24
阅读 788

引子:一次数据挖掘任务带来的思考

去年我在一家互联网金融公司担任数据工程师,主要负责风控模型相关的工作。有一次业务部门提出了一个需求:希望我们能构建一个用户还款行为预测模型,用来提前识别可能逾期的用户,从而进行干预、降低坏账率。

这个任务听上去像是典型的二分类问题,但当时的我其实对机器学习(Machine Learning, 简称 ML)还只是停留在概念层面 —— 知道有逻辑回归、随机森林,知道过拟合、交叉验证这些名词,但在实际项目中应用却几乎为零。

于是我就一头扎进了这场“自我救赎式”的机器学习入门之旅。这篇文章想跟你分享我当时是如何一步步搞懂 ML 基础,并且用上真实的数据和工具完成这次建模任务的。


一、任务背景与挑战:第一次实战踩坑

一、任务背景与挑战:第一次实战踩坑

我们的目标是预测某个用户在未来 30 天内是否会逾期还款。我们需要处理的是来自近一年内的用户信贷记录数据,包括基本的人口学信息、历史借贷数据、APP使用行为等。

原始数据大概有 120万条样本,每条样本包含68个特征字段。数据量看起来不小,但真正有用的信息其实并不多。更糟心的是:

  • 特征缺失值严重,有些字段甚至有超过 40% 的缺失;
  • 数据分布不均衡,逾期的比例只有大约 5%,容易导致模型偏向多数类;
  • 部分特征之间高度相关(比如不同时间窗口内的消费频次),存在共线性风险;
  • 时间序列信息被当作静态特征处理,忽略了动态变化趋势。

这些问题让我一度怀疑自己是不是误入了深度学习领域。当时的想法也很简单粗暴:“既然传统模型搞不定,那就试试 XGBoost 吧!” 结果跑出来的 AUC 才 0.58 —— 跟瞎猜差不多!

这下我意识到,不是换个高级模型就能解决问题,关键还是得理解数据、理解算法本身


二、我的 ML 入门路线图:从感知到理解

二、我的 ML 入门路线图:从感知到理解

为了系统地搞清楚这个问题,我重新梳理了整个 ML 工作流,并逐步补足自己的知识短板。以下是我当时整理的一张思维导图(简化版):

数据预处理 → 特征工程 → 模型选择 → 训练调优 → 评估部署

1. 数据预处理:别低估清洗的力量

一开始我对数据的理解就是“洗一下缺失值和异常值”,后来发现远远不止这些:

  • 对类别型变量做了 One-Hot 编码和 Label Encoding(后者更适合有序类别);
  • 缺失值采用 Median、Mode 或者直接新建“missing”标签的方式填充;
  • 时间戳字段提取了“星期几”、“是否节假日”、“活跃时间段”等新特征;
  • 一些数值型特征进行了 Log 变换来减少长尾效应的影响。

小插曲:曾有个字段叫 "last_login_gap",表示上次登录距今多少天。这个字段虽然有很多缺失,但我尝试用 “最近是否登录” 做成布尔变量后,模型效果反而好了不少。

感悟:数据质量比模型复杂度更重要。你永远不知道哪个字段能带来突破。


2. 特征工程:让数据说话的艺术

这是我觉得 ML 中最玄妙也是最有意思的部分。我花了将近三周时间在特征工程上,主要做了这几件事:

  • 构造组合特征,例如:
    • 用户过去30天的平均借款金额 / 总收入比例;
    • 近一周登录次数 / 注册以来总天数。
  • 分箱操作:连续变量离散化,有时能提高模型鲁棒性;
  • 利用 GroupBy + Aggregation 提取用户的历史统计特征;
  • 引入外部数据源,比如用户设备型号对应的地域分布。

举个例子:我们发现某些手机品牌型号与逾期行为相关性很高。于是引入“是否使用安卓低端机型”作为特征,结果大大提升了模型区分度。

技巧提示:可以用 feature importance 来反推哪些特征贡献最大,再反过来优化特征构建。


3. 模型选择:不只是“选 XGBoost”

刚开始我很迷恋 XGBoost,因为大家说它牛,而且参数多显得“高大上”。但实际上,在我们这个任务里:

  • 逻辑回归(Logistic Regression)虽然简单,但可解释性强,适合初筛特征;
  • 随机森林(Random Forest)泛化能力强,但训练慢;
  • LightGBM 训练速度快于 XGBoost,尤其适合大数据量场景;
  • 支持向量机(SVM)试过,但调参困难,不适合大规模数据。

所以我最后用了 LightGBM + 5折交叉验证 + Early Stopping,AUC 提升到了 0.75,召回率也从原来的 0.3 提升到了 0.6。

小贴士:不要盲目追求复杂模型,先从基础模型做起,再逐步升级。


4. 训练调优:参数不是随便调的

我曾经以为“调参”就是乱改 learning_rate 和 max_depth,后来才知道调参是有讲究的。

通过网格搜索(Grid Search)和贝叶斯优化(Bayesian Optimization)两种方式,我发现了几个规律:

  • 学习率(learning_rate)太大会导致模型不稳定;
  • 树的深度(max_depth)设置太高会过拟合;
  • 使用 categorical_features 参数可以让 LightGBM 更高效地处理类别特征;
  • 早停机制(Early Stopping)可以避免训练过头。

这里建议新手朋友可以先参考官方文档或成熟项目的默认配置作为起点,再根据自己的数据微调。


5. 效果评估:不能只看准确率

这是一个严重的误区。之前我一直关注 accuracy,直到某天老板提醒我:“我们是要找那些可能会逾期的人,而不是整体预测对了多少”。

于是我开始关注:

  • Recall(召回率):我们能抓出多少真正会逾期的用户?
  • Precision(精确率):我们标记为高危的用户中,有多少确实是逾期的?
  • AUC(ROC 曲线下面积):模型整体排序能力如何?

最终模型上线后,业务反馈召回率提升了近两倍,坏账率下降了约 1.2%。


三、经验总结:给 ML 新手的几点建议

三、经验总结:给 ML 新手的几点建议

如果你正在准备踏上机器学习的道路,或者已经入门但仍觉得迷茫,以下是一些我亲身踩过的坑和得出的经验:

1. 不要怕失败:第一次跑不出来很正常

我最初的模型输出全是负类,后来才发现是 class_weight 设置的问题。很多小错误都会影响最终结果。别气馁,坚持下去。

2. 多动手实践:跟着教程写一遍代码很重要

推荐从 kaggle 上的小白赛练起,或者使用 sklearn 自带的数据集(如 Iris、Digits、Titanic)进行练习。

3. 重视数据探索(EDA)

花半小时分析数据分布、缺失值、特征相关性,能省掉后续大量调模的时间。我有段时间就因为没做 EDA,结果跑了好几次才意识到某个字段全是 NaN。

4. 了解每个算法的核心思想

不要只会用 API。了解 LR 是线性模型、XGBoost 是树模型、神经网络是参数化的非线性函数,这些底层原理会让你在选型时更有底气。

5. 拓展视野:尝试自动化工具(AutoML)也不错

AutoGluon、H2O.ai、PyCaret 等自动建模工具,可以帮你节省调参时间,也能提供 baseline 效果。不过别依赖它们解决所有问题,它们更像是“辅助工具”。


四、展望未来:ML 在业务中的进化方向

随着我们业务增长,模型也开始面临新的挑战:

  • 如何支持实时预测?我们正在考虑将 LightGBM 模型转化为 ONNX 格式,并部署到服务端;
  • 如何实现持续迭代?我们搭建了基于 Airflow 的定时训练流水线;
  • 如何提升模型鲁棒性?开始尝试集成多个模型(Ensemble),以及使用 SHAP 解释模型决策;
  • 是否该用深度学习?目前还在调研阶段,但考虑到业务可控性和可解释性,暂时还没推进。

另外,现在 LLM 和 AI Agent 的火热也让我们思考:是否可以在用户画像构建、风险报告生成等环节引入大语言模型的能力?也许这就是下一个值得探索的方向。


结语:机器学习,从“入门”到“落地”的过程

回顾这段经历,我发现入门机器学习并不是一场考试,而是一段旅程。你会遇到各种问题、犯错、调整思路,然后慢慢地建立起属于自己的理解框架。

这篇文章没有讲太多理论公式,也没有炫技式的代码片段,但我相信它是真实的,是你我能产生共鸣的那种“实战派”体验。

无论你是刚接触 ML 的学生,还是转型中的开发者,只要愿意投入时间和精力,总有一天,你会发现那个曾经让你头疼的模型,竟然变成了你手中最可靠的朋友。

愿你在机器学习的路上越走越远,也希望这篇文章能帮你在入门的路上少走一点弯路。


如果你对我的工作方式感兴趣,或者想一起探讨更多关于 ML 的实战技巧,欢迎留言交流。下一期我们可以聊聊【如何用 SHAP 提升模型可解释性】,敬请期待 😊

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝