Python机器学习入门:从零开始学习AI
上周五晚上十点半,我还在公司对着 Spark 任务的 DAG 图发呆——又是 OOM,又是 shuffle spill。突然钉钉“叮”一声,产品经理发来消息:“咱们能不能搞个智能推荐?就那种 AI 的!” 我差点一口老血喷在 VSCode 上。
但说真的,这也不是第一次了。自从去年双11我们团队用 Spark 实时计算用户行为画像后,老板和 PM 对“AI”俩字就跟打了鸡血似的。其实吧,真正做大数据开发的都知道,很多所谓“AI项目”,底层还是数据清洗 + 特征工程 + 模型调参的三板斧。只不过现在包装得好听点罢了。
坐标杭州,阿里网易扎堆的地方,跳槽面试也总绕不开“你做过机器学习吗?” 这不,上个月面了个字节的岗,上来就让我手撕逻辑回归 + 解释 ROC 曲线,还好之前啃过《Hands-On Machine Learning》,不然当场社死。也是那次之后,我下定决心:得系统学一遍 Python 机器学习,不能光靠糊弄了。
为啥选 Python?不是还有 Scala、Java 吗?
别笑,真有人问过我:“你们天天写 Spark(Scala/PySpark),为啥 ML 不直接用 Scala?”
简单回答:生态碾压。
- Scikit-learn:开箱即用,文档比我妈还贴心
- Pandas + NumPy:数据处理快如闪电,比 Spark DataFrame 本地调试爽多了
- Jupyter Notebook:边写边跑,可视化一气呵成,适合快速验证想法
- TensorFlow / PyTorch:深度学习领域基本被 Python 垄断
而 Scala 的 MLlib?说实话,API 抽象得有点“学术”,调试起来像在 debug 分布式系统本身。除非你是要做大规模在线推理+训练一体化平台(比如阿里的 PAI),否则小步快跑验证业务价值,Python 是唯一选择。
举个真实例子:我们组去年想做一个用户流失预警模型。用 PySpark 写特征工程没问题,但试了三天 MLlib 的 GBTClassifier,调参像盲人摸象。最后我偷偷用 pandas 把样本抽到本地,scikit-learn 跑了个 XGBoost,AUC 直接拉到 0.87,老板看了直呼“高科技”。
从“Hello World”到能跑的模型:我的踩坑实录
第一步:环境配置 —— 别再用 conda 了!
我知道很多人推荐 Anaconda,但作为一个 VSCode 忠粉,我早就把 python -m venv + pip 玩明白了。加上一堆插件(Python Docstring Generator、Indent-Rainbow、Rainbow CSV),写代码丝滑到飞起。
# 创建干净环境
python -m venv ml-env
source ml-env/bin/activate
# 安装核心库
pip install pandas numpy scikit-learn matplotlib seaborn jupyter xgboost lightgbm
小技巧:VSCode 里按
Ctrl+Shift+P→ “Python: Select Interpreter”,直接切到你的虚拟环境,不用每次手动 source。
第二步:数据在哪?别拿 MNIST 糊弄人!
教程动不动就 from sklearn.datasets import load_iris,现实哪有这么干净的数据?我们实际业务中,数据通常来自:
- Hive 表(通过 Spark SQL 导出 CSV)
- Kafka 流(用 Spark Structured Streaming 落盘)
- 用户行为日志(埋点上报,JSON 格式)
所以我拿了一个简化版的 电商用户复购预测数据集(脱敏后约 1 万条):
- 特征:最近30天访问频次、加购次数、下单金额、设备类型、是否新客等
- 标签:未来7天是否会再次下单(0/1)
import pandas as pd
df = pd.read_csv("user_repurchase.csv")
print(df.shape) # (10240, 8)
df.head()
结果发现:device_type 是字符串,order_amount 有负数(退款?),还有 5% 的缺失值……
这才是真实世界!
第三步:算法选型 —— 别一上来就上神经网络!
很多人一听说“AI”,脑子里就是大模型、Transformer。但在大多数业务场景(尤其是冷启动阶段),树模型才是性价比之王。
我对比了三种主流算法在该数据集上的表现(5折交叉验证):
| 算法 | AUC | 训练时间(s) | 可解释性 | 调参难度 |
|---|---|---|---|---|
| Logistic Regression | 0.76 | 0.3 | ★★★★☆ | 低 |
| Random Forest | 0.82 | 2.1 | ★★★☆☆ | 中 |
| XGBoost | 0.87 | 1.5 | ★★★★☆ | 高 |
注:测试环境为 MacBook Pro M1, 16GB RAM
结论很清晰:XGBoost 在精度和速度之间取得了最佳平衡,而且 feature importance 能直接给业务方解释“为什么这个用户可能流失”。
代码长这样(带注释,别嫌啰嗦):
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
from xgboost import XGBClassifier
# 处理类别变量(简单用 LabelEncoder)
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['device_type'] = le.fit_transform(df['device_type'].astype(str))
# 划分特征和标签
X = df.drop(columns=['user_id', 'will_repurchase'])
y = df['will_repurchase']
# 划分训练/测试集
X_train, X_test, y_learn, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# 初始化 XGBoost(先用默认参数跑通)
model = XGBClassifier(
random_state=42,
eval_metric='auc' # 注意:XGBoost 默认用 logloss,这里改成 AUC 更符合业务目标
)
# 训练
model.fit(X_train, y_train)
# 预测 & 评估
y_pred_proba = model.predict_proba(X_test)[:, 1]
auc = roc_auc_score(y_test, y_pred_proba)
print(f"Test AUC: {auc:.4f}") # 输出:Test AUC: 0.8692
跑完那一刻,我差点想截图发朋友圈——终于有个模型能上线了!
面试题挑战:面试官最爱问的三个问题
既然提到面试,分享几个高频题,都是我亲身被拷打过的:
“XGBoost 和 LightGBM 有什么区别?”
答:XGBoost 精度高但慢,LightGBM 用直方图加速 + leaf-wise 生长,速度更快,适合大数据。但我们业务样本量 < 10w,XGBoost 更稳。
“AUC 高但线上效果差,可能是什么原因?”
答:数据泄露(比如用了未来信息)、线上线下特征分布不一致、或者业务指标和 AUC 不对齐(比如我们更关心召回率而非 AUC)。
“怎么处理类别不平衡?”
答:先看业务容忍度。如果正样本少但重要(如欺诈),我会用
scale_pos_weight(XGBoost 参数)或 SMOTE,但慎用过采样,容易过拟合。
区块链?别闹了,跟 ML 有啥关系!
说到关键词“区块链”,我必须吐槽一句:某些 HR 招聘 JD 里硬塞“熟悉区块链、AI、大数据”,纯属凑 buzzword。
现实中,我司项目从来没把区块链和机器学习搭在一起过。除非你在做去中心化身份(DID)或 Web3 数据确权,否则这两者就像“火锅配冰淇淋”——强行混搭只会翻车。
不过话说回来,如果你真想卷,可以研究下“联邦学习 + 区块链”,用于跨机构数据协作(比如医院之间联合建模又不泄露隐私)。但这属于 PhD 级别课题了,咱们搬砖程序员还是先搞定 XGBoost 吧。
总结:别怕,AI 没那么玄乎
回看这一个月的学习,最大的感悟是:机器学习不是魔法,而是工程。
- 数据质量 > 模型复杂度
- 业务理解 > 算法炫技
- 快速迭代 > 一步到位
我现在已经把这套流程封装成了模板:数据接入 → EDA → 特征工程 → 模型训练 → 评估 → 导出 ONNX → 接入线上服务。下周就要和后端联调了,祈祷别在 deadline 前炸。
如果你也是和我一样的大数据开发,天天和 Spark 打交道,不妨抽个周末,用 Python 跑通一个真实 ML 项目。不一定马上用上,但面试时你能说“我做过端到端的模型落地”,HR 眼睛都会亮。
毕竟,在杭州这片卷王之地,多一项技能,就少一分焦虑。
作者:某大厂大数据开发,三年 Spark 老兵,现沉迷于用 Python 造轮子。GitHub 主页全是 Jupyter Notebook,欢迎 Star(并没有链接,别找了)

评论 0