机器学习入门先学什么?先别急着碰神经网络(附 LightGBM 实战参数和踩坑记录)

🔑 关键词:机器学习入门,LightGBM,XGBoost,表格数据,深度学习对比

📖 摘要:从一次私活翻车说起:为什么表格数据上先学 LightGBM 比先学神经网络划算得多。附完整入门步骤、具体参数、以及我自己实打实踩过的 3 个坑。

2022 年 3 月我从一家做 SaaS 的公司辞职,计划三个月转行做机器学习。第一周我就装了 PyTorch,跟着教程把 MNIST 跑到 99.2%,当时真觉得自己摸到门了。然后接了个朋友的私活——预测他们电商客户下个月会不会复购。数据是 Excel 导出的,12847 行、37 列,有一列是用户备注文本,其余是金额、频次、最近一次购买间隔这类东西。我用 PyTorch 搭了个 4 层 MLP,AUC 卡在 0.71 上不去。接下来两周我干的事:学习率从 1e-2 试到 1e-5,Adam 换 SGD 又换回 AdamW,加了 Dropout 0.3、BatchNorm、weight_decay 1e-4,最高做到 0.73。最后我师兄让我把代码全删了,用 LightGBM 重跑,他连参数都没怎么动,AUC 0.86,本地 M2 MacBook Air 上跑了 11 秒。那天晚上我挺难受的,不是输给一个库难受,是难受我前面那两周到底在干嘛。

图片

后来我才知道这不是我一个人的问题。2022 年 NeurIPS 上有篇论文,Grinsztajn 那帮人拿了 45 个表格数据集系统对比了树模型和神经网络,结论很直接:在中小规模表格数据上,基于树的模型整体还是压着神经网络打。道理其实不复杂——表格数据每列的量纲、语义都不一样,“年龄 35”和“订单金额 3500”之间没有任何几何关系,神经网络那套默认特征空间是光滑函数的假设在这儿不太成立。而树模型天生就是在切分特征空间,对缺失值、类别特征、长尾分布的容忍度高得多。你不需要 StandardScaler,不需要把城市名 one-hot 成几百维,LightGBM 能直接吃 category 类型。我后来算过一笔账:同一个项目,用神经网络那套做特征工程加调参大概花了 60 多个小时,换 LightGBM 从读数据到出结果不到 3 小时。

图片

我现在带新人的顺序是这样的,你可以直接抄:

图片

  1. 先用 DummyClassifier(strategy='most_frequent') 跑一个傻子基线。我那个复购数据,全猜“不复购”准确率就有 91.7%,但 AUC 是 0.50。这一步是让你知道“看起来很高的准确率”有多不值钱。
  2. train_test_split(test_size=0.2, random_state=42, stratify=y),先把测试集锁起来,别动它。
  3. 逻辑回归打底:LogisticRegression(max_iter=1000, C=1.0),类别不平衡就加 class_weight='balanced'。这一步通常能给你一个 0.75 左右的可解释基线。
  4. 上 LightGBM:LGBMClassifier(n_estimators=2000, learning_rate=0.03, num_leaves=31, min_child_samples=20, subsample=0.8, colsample_bytree=0.8, reg_alpha=0.1, reg_lambda=0.1),配 early_stopping_rounds=100 和 5 折 StratifiedKFold。这一步大概率就到 0.85+ 了。
  5. 最后用 Optuna 跑 50 次 trial,只调 num_leaves、learning_rate、min_child_samples 这三个。我试过一口气调 12 个参数,CV 涨了 0.003,测试集反而掉了 0.008。

图片

到底什么时候该换神经网络,我按维度给你列一下,免得走弯路:数据行数小于 10 万、列数小于 200 的表格数据,树模型通常更好,训练是秒级的,神经网络容易过拟合而且调参成本极高;数据是图像、文本、语音、长序列的,那神经网络是唯一选择,这个没得商量;缺失值方面,LightGBM 原生处理,神经网络的填充策略本身就是一个要调的超参;高基数类别特征,CatBoost 直接吃字符串,神经网络得先做 embedding;可解释性上 SHAP 对树模型几分钟出图,神经网络得靠 attention 可视化,跟业务方解释的时候说服力有限;GPU 依赖上树模型 CPU 就够,我 8 核的 M2 跑 3 万行数据 12 秒,神经网络基本得排队等卡。

图片

说几个我实打实踩过的坑。第一个是数据泄漏:我曾经先把整份数据 StandardScaler 完再切分,CV 分数 0.94,测试集 0.79,排查了整整一天才发现是 scaler 已经看到了测试集的均值和方差。第二个是时间序列的坑,我做复购预测时用随机切分,AUC 0.88,上线之后掉到 0.62,因为随机切分等于让模型“看到未来”,后来改成按时间切,用 2021 年 1—9 月训练、10—12 月验证,AUC 0.79,这才是真实水平。第三个是随机种子,LightGBM 的 feature_fraction 和 bagging_fraction 会让结果抖动,我一般跑 5 个种子取平均,不然你以为调参涨的那 0.005 很可能只是噪声。

图片

写这些不是想说深度学习没用。图像、文本、推荐里的 embedding、序列建模,神经网络还是唯一解,这点没什么好争的。我想说的是另一件事:入门阶段最贵的成本不是学不会某个模型,而是把时间花在了错误的模型上。我见过太多人(包括一年前的我)一上来就啃反向传播的链式求导,数学推得挺漂亮,结果面对一份 3 万行的 Excel 不知道从哪儿下手。先跑通、先看到分数随参数怎么变、先建立起“什么数据配什么模型”的直觉,数学可以慢慢补;反过来先啃三个月数学再回来跑代码,很多人是撑不到那一天的。

🏷️ 标签: