Python机器学习入门:从零开始搞AI,顺便拯救一下我的求职简历

杰出艺术家
2025-12-14 20:19
阅读 645

上周五晚上十点半,我正躺在工位椅子上刷 LeetCode(别问,问就是被面试官拷打怕了),突然钉钉“叮”一声,产品经理小王发来消息:“兄弟,我们下周要上线一个‘智能推荐’模块,能不能先跑个模型看看效果?数据我都给你整理好了,就等你出手了。”

我当时差点把 Vim 里的 :q! 打成 :wq 直接退出人生。入职才两个月,天天写 CRUD 接口,连公司数据库的主从结构都没摸清楚,现在就要我搞 AI?但转念一想——这不正是我偷偷学机器学习的好借口吗?毕竟,简历上要是能写“主导智能推荐系统落地”,跳槽时 HR 眼睛都得亮三分。


背景:被逼上梁山的“AI初学者”

其实我一直对机器学习有点兴趣,但之前总觉得那是 PhD 大佬们玩的,咱这种只会 print("Hello World") 的码农还是老老实实写业务代码吧。直到上个月参加了一场内部技术分享,隔壁组的老张(传说中用一行 Sklearn 代码预测了双11库存爆仓的人)随口说:“现在 ML 入门门槛低得很,Python + Scikit-learn,三天就能跑通 pipeline。”

我一听,心动了。再翻翻招聘网站,“熟悉机器学习基础”、“有推荐系统经验优先”——好家伙,这哪是加分项,简直是硬性要求!于是趁着这次 PM 的“紧急需求”,我决定:卷不动业务逻辑,那就卷 AI 吧!


开搞:从“加载数据”开始踩坑

我拿到的数据是个 CSV 文件,包含用户 ID、商品 ID、点击次数、停留时长等字段。目标很明确:预测用户是否会购买某个商品(二分类问题)。

第一反应:打开终端,vim train.py,准备大干一场。结果刚写两行就卡住了——数据长啥样?有没有空值?特征之间啥关系?总不能直接扔进模型瞎跑吧?

import pandas as pd

df = pd.read_csv("user_behavior.csv")
print(df.head())
print(df.info())

输出一看,好家伙,停留时长 列里混着 "30s""1.5min" 这种字符串,还有 20% 的缺失值。当时真的想把 PM 叫过来问问:“你管这叫‘整理好了’?”

不过佛系如我,深吸一口气,默默加了几行清洗代码:

def parse_duration(s):
    if pd.isna(s):
        return 0
    if "min" in s:
        return float(s.replace("min", "")) * 60
    elif "s" in s:
        return float(s.replace("s", ""))
    else:
        return float(s)

df["duration_sec"] = df["停留时长"].apply(parse_duration)
df.fillna(0, inplace=True)

吐槽时间:为什么业务数据永远这么脏?运维说日志格式统一,测试说数据合规,结果到手全是“惊喜盲盒”。建议以后所有 PM 入职先考《数据清洗 101》。


模型选择:别一上来就上 Transformer

作为一个刚入门的小白,我差点被网上各种 “BERT + GNN + RL” 的教程吓退。但冷静下来一想:我们连 GPU 都没申请下来(IT 说预算紧张,只能用 CPU 跑),还搞什么大模型?

于是回归初心,翻开《Hands-On Machine Learning》第一章(对,就是那本红皮书),决定从最经典的几个模型开始试:

模型 优点 缺点 适合场景
Logistic Regression 快、可解释、基线必备 线性假设强 特征工程做得好时效果不错
Random Forest 自动处理非线性、抗过拟合 黑盒、调参略烦 中小数据集首选
XGBoost 精度高、支持缺失值 参数多、训练慢 Kaggle 常胜将军

我先拿 Logistic Regression 跑了个 baseline,AUC 才 0.68,堪比抛硬币。换 Random Forest,AUC 直接飙到 0.82!开心了三秒,结果发现线上推理耗时 200ms——PM 要求接口响应 < 50ms,完蛋。

最后祭出 XGBoost,调了下 max_depth=6, learning_rate=0.1, n_estimators=100,AUC 0.84,推理时间压到 35ms。完美!(虽然训练花了 8 分钟,但反正不是实时训练,忍了)


特征工程:玄学中的科学

真正让我体会到“机器学习 80% 是特征工程”的,是那个 用户ID 字段。

一开始我直接 One-Hot 编码,结果特征维度爆炸到 10 万+,内存直接 OOM。后来灵机一动:用历史点击率作为用户 embedding

user_ctr = df.groupby("user_id")["is_click"].mean().reset_index()
user_ctr.columns = ["user_id", "user_click_rate"]
df = df.merge(user_ctr, on="user_id", how="left")

同理,商品也做了 item_ctr。再加上交叉特征 user_click_rate * item_ctr,AUC 又涨了 0.02。那一刻我仿佛看到了 Andrew Ng 在对我微笑。

佛系心得:别迷信自动特征生成。有时候一个业务理解深刻的简单特征,比 AutoML 跑三天还管用。


代码人生:可读性比炫技更重要

作为 Vim 党 + 代码洁癖患者,我写模型代码时坚持几个原则:

  1. 变量命名拒绝 x, y, zX_train 改成 feature_matrix_trainy 改成 target_labels
  2. 函数拆分清晰load_data(), preprocess_features(), train_model() 各司其职
  3. 注释写清楚业务含义:比如 # 用户7天内点击同类商品次数(反映兴趣集中度)
def build_user_item_features(raw_df: pd.DataFrame) -> pd.DataFrame:
    """
    构建用户-商品交叉特征,用于捕捉个性化偏好
    Returns:
        DataFrame with added features: user_click_rate, item_ctr, interaction_score
    """
    # ... 实现细节

组长 review 代码时居然夸我:“你这代码,三个月后自己还能看懂。” —— 对程序员来说,这是最高褒奖了吧?


综合评估:别只看 AUC

上线前,测试同学问:“你怎么证明模型比规则引擎好?” 我差点脱口而出:“因为 AUC 高啊!” 但马上意识到:AUC 高 ≠ 业务效果好

于是我们加了三个指标:

  • Precision@K:Top K 推荐里有多少是真的买了?
  • 覆盖率:模型是否只推热门商品,冷门商品完全没机会?
  • AB 测试转化率:真实用户点击后购买的比例

结果发现:虽然 AUC 高,但初期推荐太集中在头部商品,新商品曝光几乎为零。赶紧加了个 多样性惩罚项(简单粗暴地在排序时加入随机扰动),虽然 AUC 降了 0.01,但新商品点击率翻倍,PM 直呼“这波稳了”。


求职视角:学 AI 不是为了当算法工程师

写这篇文章时,我已经用这个项目更新了简历。但说实话,我并不打算转岗算法工程师。原因很简单:数学不够硬,论文读不懂,调参靠直觉。

但我发现,懂一点机器学习的后端/全栈,特别吃香。你能和算法团队高效沟通,能快速验证 idea,能在业务系统里无缝嵌入智能能力——这才是“综合型人才”的价值。

而且,面试时聊起这个项目,面试官眼睛都亮了:“你们怎么解决冷启动的?”“特征怎么同步到线上?”——这些问题,纯算法岗可能答不好,但咱工程+ML 的 combo,刚好卡在 sweet spot。


最后:躺平但不摆烂

现在这个推荐模块已经灰度上线两周,转化率提升 12%,虽然离 PM 最初吹的“提升 50%”差得远,但至少没背锅。IT 也终于批了 GPU 资源,说下个版本试试 LightGBM。

而我呢?依然每天早上九点半打卡,Vim 里敲着业务代码,下午三点准时泡枸杞茶。只不过现在,我的待办清单里多了几行:

  • 学习特征存储(Feature Store)
  • 了解模型监控(Model Drift Detection)
  • 把这个 pipeline 封装成内部工具包

代码人生,不一定要卷成大神。但保持一点点好奇心,说不定哪天,你也能用三行 Sklearn,拯救自己的求职简历。


附:新手避坑指南(血泪总结)

  • ❌ 别一上来就搞深度学习,Scikit-learn 足够应付 80% 的业务场景
  • ✅ 数据清洗花的时间,永远比你想象的多三倍
  • ❌ 别信“自动调参神器”,理解参数含义才能 debug
  • ✅ 把模型当产品做:可解释、可监控、可回滚
  • 💡 最重要的不是模型多 fancy,而是解决实际问题

注:本文所有代码均可在本地 CPU 跑通,无需 CUDA,无需 Docker(除非你想自虐)。
环境:Python 3.9 + pandas 1.5 + scikit-learn 1.2 + xgboost 1.7


共勉:在这个人均“精通AI”的时代,做个清醒的、能跑通 pipeline 的普通程序员,就已经赢了。

评论 0

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