被领导逼着搞AI?我的Python机器学习上手实录
上周五晚上十一点,我还在公司死磕一个数据清洗脚本,突然钉钉“叮”一声——我们组的产品经理发来一条消息:“小张啊,能不能用AI帮我们预测下用户流失?下周就要跟老板汇报了。”
我当时差点把手中的瑞幸打翻在机械键盘上。
入职这家新公司刚两个月,从写CRUD接口无缝切换到“搞AI”,说实话有点懵。但咱是那种喜欢命令行、爱折腾底层原理的人,VSCode里插件装了一堆(比如最近狂推的Trae),心里其实也痒痒想试试机器学习到底是怎么玩的。于是硬着头皮接下了这个任务。
为啥不用通义千问直接出方案?
可能有人会说:现在不是有通义千问、Trae这些AI编程助手吗?直接问不就完了?
确实,我试了。
上周三我用Trae(那个号称“比Copilot更懂中文开发者”的新玩意)问:“帮我写个用户流失预测模型,用Python。”它唰一下吐出一段逻辑回归代码,还贴心地加了注释。但问题来了——数据格式不对、特征没处理、连评估指标都只写了accuracy(谁不知道不平衡数据集看accuracy就是耍流氓啊!)。
Trae和通义千问这类工具,能帮你搭骨架,但填不了肉。尤其当你面对真实业务场景——比如我们这堆用户行为日志,90%是活跃用户,10%才是要预测的流失人群——光靠AI生成代码根本跑不通。
所以,我还是老老实实翻起了《Python机器学习手册》(作者Andreas Müller那本,封面是蓝色的,人称“蓝宝书”)。这本书我放在床头快一个月了,之前一直吃灰,这次终于派上用场。
从零开始:别被“机器学习”吓住
很多人一听“机器学习”就觉得高大上,其实入门没那么玄。核心就三步:
- 拿数据
- 喂模型
- 看效果
我们公司的数据仓库里有张user_behavior_log表,记录了用户每天的登录、点击、停留时长等。目标很简单:预测未来7天内是否会流失(定义为连续7天未登录)。
第一步:数据准备 —— 比写模型难十倍
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 假设你已经从数据库导出了CSV
df = pd.read_csv('user_features.csv')
# 标签:is_churn(1=流失,0=未流失)
X = df.drop('is_churn', axis=1)
y = df['is_churn']
# 划分训练集和测试集(注意:时间序列不能随机切!但我们先简化处理)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y # stratify保证正负样本比例一致
)
# 特征标准化(很多算法对量纲敏感)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
这里踩了个坑:一开始没做stratify,结果测试集里流失用户只有3个,模型一跑,accuracy 98%——看起来很美,实际完全没学会识别流失用户。产品经理看了直摇头:“这模型是不是以为我们用户都不会跑?”
模型选型:别一上来就上深度学习
新手最容易犯的错误,就是觉得“不用Transformer就是落伍”。但现实是:简单问题用简单模型。
我们试了三种基础模型:
| 模型 | 训练速度 | AUC | 是否适合上线 |
|---|---|---|---|
| 逻辑回归 | ⚡ 极快 | 0.82 | ✅ 是 |
| 随机森林 | 🐢 中等 | 0.86 | ✅ 是 |
| XGBoost | 🐌 较慢 | 0.87 | ⚠️ 需压测 |
注:AUC比accuracy更能反映不平衡数据下的性能
最后选了随机森林——解释性好(能输出特征重要性),速度快,还不用调太多参。XGBoost虽然略高0.01,但部署复杂,运维同事一听要装libxgboost就皱眉:“又要配C++依赖?”
关键代码:别再手写交叉验证了!
早期我傻乎乎地自己写for循环做5折交叉验证,直到某天同事路过我工位,瞥了一眼屏幕说:“兄弟,sklearn有现成的cross_val_score啊……”
现在我都是这么干:
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.metrics import roc_auc_score
rf = RandomForestClassifier(n_estimators=100, random_state=42)
# 5折交叉验证,用AUC作为评分标准
cv_scores = cross_val_score(rf, X_train_scaled, y_train, cv=5, scoring='roc_auc')
print(f"CV AUC: {cv_scores.mean():.3f} ± {cv_scores.std()*2:.3f}")
# 最终训练
rf.fit(X_train_scaled, y_train)
y_pred_proba = rf.predict_proba(X_test_scaled)[:, 1]
test_auc = roc_auc_score(y_test, y_pred_proba)
print(f"Test AUC: {test_auc:.3f}")
跑出来Test AUC 0.865,产品经理眼睛一亮:“可以啊!这周能上线吗?”
部署上线:从Jupyter到生产环境的鸿沟
别笑,真的有很多人以为训练完.ipynb就结束了。但在公司里,模型不上线等于没做。
我们用FastAPI封装了一个微服务:
# app.py
from fastapi import FastAPI
import joblib
import numpy as np
app = FastAPI()
# 加载训练好的模型和scaler
model = joblib.load('rf_model.pkl')
scaler = joblib.load('scaler.pkl')
@app.post("/predict_churn")
def predict(features: list):
try:
features_scaled = scaler.transform([features])
prob = model.predict_proba(features_scaled)[0][1]
return {"churn_probability": float(prob)}
except Exception as e:
return {"error": str(e)}
然后Docker打包,丢给运维。结果周一早上收到告警:内存爆了。查了半天发现,joblib保存的RandomForest模型有200MB——因为n_estimators设成了500!
赶紧调回100,模型降到50MB,QPS也能扛住。教训:线上资源有限,别炫技。
Trae和通义千问到底有没有用?
有用,但得会用。
- Trae:帮我快速生成FastAPI模板、Dockerfile、甚至pytest用例。特别是命令行操作提示,比如“怎么用pip freeze导出依赖”,它比Google快。
- 通义千问:解释概念很稳。比如我问“为什么AUC比accuracy更适合不平衡数据”,它用ROC曲线讲得明明白白,比某些水课视频强多了。
但它们不能替代你的思考。就像你让Trae写特征工程代码,它可能会漏掉缺失值处理;让通义千问推荐模型,它大概率会说“试试BERT”——可你只是预测用户会不会流失啊!
给新人的建议:别死磕理论,先跑通流程
如果你和我一样,刚接触机器学习,别一上来就啃《统计学习方法》或者调参炼丹。先做这三件事:
- 找个公开数据集跑通完整流程(比如Kaggle的Telco Customer Churn)
- 用真实业务数据复现一遍(哪怕只是Excel导出)
- 把结果可视化给非技术同事看(一张特征重要性图胜过千言万语)
我上周就把随机森林的feature importance画出来贴在会议室白板上,产品经理指着“last_login_days_ago”说:“原来用户超过3天不登录就危险了?那我们是不是该在这时候发push?”——这才是AI落地的价值。
写在最后:AI不是魔法,是工具
说实话,搞完这个项目,我对“AI改变世界”这种话更 skeptical 了。真正的价值不在算法多牛,而在你能不能把数据、业务、工程串起来。
现在我的VSCode里除了Trae,还开着Jupyter、Postman、Docker Dashboard,终端里跑着uvicorn。有时候半夜debug模型偏差,也会骂一句“这破数据质量也敢叫大数据?”
但每当看到预测准确率提升0.01,或者业务方说“这个洞察很有用”,又觉得——值了。
对了,那本《Python机器学习手册》,我已经翻烂了前五章。下周打算啃集成学习部分。要是你们也有踩坑经历,欢迎评论区交流,别让我一个人在深夜对着sklearn文档流泪。

评论 0