ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

机器学习实战冲刺:从数据预处理到CNN模型全流程拆解

机器学习实战冲刺:从数据预处理到CNN模型全流程拆解 三期班结课那天有个学员跟我说他最大的收获不是终于搞懂了GBDT的树是怎么分裂的而是第一次意识到跑一个项目之前先花二十分钟看数据长什么样比直接甩一个模型上去有用得多。这句话我特别有共鸣。带了三期机器学习实战冲刺班我见过太多人拿着吴恩达的笔记、李宏毅的PPT、周志华的西瓜书啃得头头是道一开电脑连Python环境都起不来或者跑通一个公开的波士顿房价demo就觉得自己会机器学习了换个数据集立刻傻眼。这个班叫实战冲刺定位很清楚不是零基础科普课也不是纯理论刷题班而是给那些已经知道线性回归、逻辑回归、决策树这些名词但没真正完整跑过端到端项目的人用三四天时间把从数据到模型再到评估这条链路彻底走一遍。三期学员里有准备期末考试的学生有想转行做数据分析的职场人也有要在实验室搭服务器跑实验的研究生。这篇文章我把三期教学过程中的设计思路、踩过的坑、课堂上反复强调的要点以及最后冲刺复习的资料取舍都整理一遍希望能给正在学机器学习、准备实战的人一些参考。1. 三期教学设计为什么把跑通项目放在啃完理论前面1.1 从期末能考过到新数据集能上手的差距每期开课第一天我都会做个摸底问三个问题第一梯度下降的公式能不能默写第二能不能十分钟内用pandas读入一个CSV文件并做缺失值处理第三给你一个没见过的二分类数据集你打算先做什么。结果很有意思大部分人说得出梯度下降的更新公式但面对一个脏乱差的实际数据集时第一反应是我该用什么模型而不是我得先看看这是个什么问题。这就是理论和实战之间最大的鸿沟。期末考试可以考机器学习三大假设是什么你可以背得滚瓜烂熟——独立同分布、特征独立性、数据充分性但到了真实项目里数据根本不是独立同分布的特征之间高度相关样本量少得可怜。你如果还抱着套用经典模型的思路走必翻车。所以三期班的第一个模块我特意设计成问题定义与数据体检逼着学员先回答这个任务是回归还是分类评估指标选什么数据里有没有泄漏类别是否平衡。这些问题课堂上不会写进PPT但决定了整个项目的成败。1.2 项目驱动的课程主线与时间分配三期班一共四天半时间安排非常有针对性。第一天上午做环境准备和Python基础复习下午直接进入第一个项目——波士顿房价预测的完整流程第二天讲分类问题用逻辑回归和一个真实信贷数据集做二分类同时把混淆矩阵、ROC、AUC这些评估指标讲透第三天集中攻树模型和集成学习从决策树到Adaboost再到GBDT配合一个电商用户流失预测案例第四天上午跨进深度学习讲CNN的卷积、池化、步长、核、填充这些概念用PyTorch实现一个手写数字识别下午做人脸识别项目的简化版本。最后半天用来答疑、复盘和期末复习串讲。这个节奏看起来很赶但实际效果比慢慢磨理论好很多。原因很简单成人学习的注意力周期有限如果连续讲两个小时梯度推导后排肯定昏倒一片。但如果先跑通一个baseline再回头讲为什么线性回归的损失函数要选均方误差梯度为什么是那个方向学员的理解深度完全不一样。很多概念不是听会的是做会的。1.3 第一天就建立的习惯数据预处理与baseline先行三期班我反复强调一个原则不管拿到什么任务先做一个最笨的baseline再谈优化。很多新手一上来就想用XGBoost、LightGBM、深度学习模型结果是调参调了三天连数据本身的问题都没发现。标准化操作应该是读数据、看shape、看dtypes、描述性统计、缺失值可视化、分布图、相关性矩阵然后跑一个最简单的模型线性回归或逻辑回归作为baseline记录指标再逐步迭代。这个习惯为什么不自然因为人都有贪快心理总觉得自己直接上复杂模型就能一步到位。我在带三期班时就刻意设置了一个环节给学员一份故意埋了坑的数据比如含有重复行、异常值、类别特征没有编码、目标变量有泄漏等要求他们先做数据预处理再建模。结果80%的组在第一版代码里都没发现泄漏只有少数人画了相关性矩阵才看出来未来信息混进了特征里。这些坑只有亲手踩过后面才记得住。2. Python环境与实验室服务器开课前最容易翻车的地方2.1 conda环境管理与依赖锁定每期班开课前我最头疼的不是课程内容而是环境。Python机器学习的依赖链太长numpy、pandas、scikit-learn、matplotlib、jupyter、torch不同版本之间还有兼容性问题。Windows用户尤其容易遇到安装程序无法与下载服务器联系这类下载失败的问题或者conda换源没配好包装到一半卡死。我现在带的所有学员统一要求用conda创建独立环境而不是一股脑往base环境里装。具体是这样操作的conda create -n ml3 python3.10 -y conda activate ml3 pip install numpy pandas scikit-learn matplotlib jupyter pip install torch --index-url https://download.pytorch.org/whl/cu118这里有个小细节用conda管理环境但包尽量用pip装。因为PyPI上的包通常更新更快安装也更稳定conda的solve依赖有时候慢得让人崩溃。另外任何项目都要生成requirements.txt或environment.yml否则换一台电脑就复现不了。腾讯云、阿里云这些国内镜像源也要提前配好不然下个torch能下半小时。2.2 实验室服务器搭建与多人协作配置三期学员里有研究生学校实验室会配GPU服务器。他们的痛点不是不知道怎么跑代码而是多人共用一台机器时环境乱成一锅粥。我在课程里加了一个专门的模块如何在学校实验室搭建机器学习服务器并做好多人隔离。这里我最推荐的方式是给每个学员分配独立conda环境而不是共享一套环境。同时用JupyterLab的多用户模式jupyterhub或VS Code的Remote-SSH插件每个人在自己家目录下操作互不干扰。GPU资源用nvidia-smi查看占用写代码之前先确认显存够不够别自己OOM了还把别人的任务挤掉。一个比较容易被忽略的问题权限。很多实验室服务器是学生自己拿一台旧机器临时搭的root密码大家都知装东西随心所欲。结果某天有人pip install一个包时把系统自带的Python环境搞坏了全组都跑不了。所以强烈建议服务器上装系统级Python时不要乱动所有人的工作环境都锁定在各自的conda或虚拟环境里系统环境保持干净。2.3 跑深度学习前的GPU环境检查清单到第三天晚上开始上PyTorchGPU环境的问题就集中爆发了。最常见的坑有三个一是CUDA版本和PyTorch版本不匹配二是驱动版本太老导致torch.cuda.is_available()返回False三是显存不够但又没开混合精度。我给了学员一张检查清单建议每次新建项目都对照看一遍nvidia-smi查看驱动版本确认至少支持CUDA 11.x。nvcc --version查看CUDA toolkit版本和PyTorch编译时的CUDA版本要兼容。python -c import torch; print(torch.__version__, torch.cuda.is_available())验证。数据加载器设num_workers0和pin_memoryTrue充分利用GPU。显存不足优先启用自动混合精度别急着换更大的卡。一个很典型的场景学员在Windows笔记本上跑通了CNN到了实验室的Linux服务器上却报错CUDA error: no kernel image is available for execution on the device。原因就是PyTorch装的是CPU版本或者CUDA架构不匹配。我让他们全部改用官方指令按CUDA版本重新装一遍torch问题立刻消失。3. 算法模块怎么学才能考得好也用好回归、分类、树模型与集成3.1 线性回归与逻辑回归损失函数、梯度与正规方程机器学习入门绕不开线性回归。但很多人的理解停留在会用sklearn.linear_model.LinearRegression调用这个层面一旦被问到梯度下降和正规方程有什么区别就卡壳。我在冲刺班里不会让学员徒手推导所有公式但有两个点必须动手算清楚。第一损失函数是模型训练的地图。线性回归用均方误差是因为它在高斯噪声假设下是极大似然估计的自然结果逻辑回归用交叉熵而不是均方误差则是因为逻辑回归的输出是概率用均方误差会造成梯度消失。这些结论不需要从零推导但你要知道为什么这样以后遇到分布偏移、样本不均衡时才知道什么时候该换损失函数。第二优化器选型。小批量随机梯度下降是实战中的主流学习率大了会震荡小了半天不收敛。我鼓励学员画一条学习率-损失曲线在训练过程中把损失记录下来用matplotlib画出来亲眼看一下什么叫做收敛、什么叫发散。这个方法特别直观比背三遍学习率一般取0.01管用得多。课程里有个学员死活调不好逻辑回归画完loss曲线才发现他学习率设了1.0每一步都在跨大步loss不降反升50步就变成了nan。3.2 分类器评估校准集、混淆矩阵、ROC与AUC分类任务是实战中最多的场景。很多初学者在分类评估上只盯着准确率(accuracy)这个问题特别严重。比如一个欺诈检测数据集正样本只占1%你全预测成负样本准确率也有99%但这个模型没有任何使用价值。所以在讲二分类时我会花一整节课讲混淆矩阵、精确率、召回率、F1、ROC和AUC并让学员用代码实现这些指标的计算而不是只调用sklearn.metrics。这里特别提一下校准集的概念。实战里我们通常把数据集分成训练集、验证集、测试集有时还会再分一个校准集。校准集的作用是调整模型的概率输出让预测概率真实反映事件发生的频率。比如一个信贷模型预测某用户违约概率是70%那么100个类似的用户里应该有70个确实违约这个模型才叫校准良好。许多算法尤其是朴素贝叶斯和SVM输出分数不等于概率需要经过Platt缩放或Isotonic回归来校准。这个问题搜机器学习校准集能看到大量讨论但在实际项目中动手做过的学员很少我建议所有做分类的朋友都试一下CalibratedClassifierCV。3.3 从单棵树到GBDT和Adaboost集成学习到底集成了什么决策树本身很简单但一旦进入集成学习很多人就开始犯迷糊Bagging和Boosting到底什么区别Adaboost和GBDT有什么联系我在三期班里的讲法是用任务分工来类比。Bagging如随机森林是多个树并行独立训练各干各的最后投票或平均。这样做的好处是降低方差适合高方差、容易过拟合的模型。Boosting如Adaboost、GBDT则是串行的后面每棵树都在纠正前面树的错误。Adaboost通过调整样本权重让前面的弱分类器重点学错分样本GBDT则让每棵树学的是前面所有树的负梯度残差。很多期末复习资料会把Adaboost和GBDT混在一起讲但在实际选型中它们的差别还是很大。Adaboost对噪声敏感因为异常样本被持续加权后会主导训练GBDT用负梯度拟合残差灵活性更高配合正则化、subsample、early stopping之后非常强。这也是为什么XGBoost、LightGBM、CatBoost这些GBDT的工程化版本在各类机器学习竞赛里大杀四方。我在代码课里让学员分别用随机森林、Adaboost和GBDT跑同一个电商用户流失预测数据集然后比较AUC和训练时间。结论通常是GBDT的效果略好随机森林稳定性不错Adaboost在这个场景下没有明显优势。大家亲自跑一遍比任何理论分析都有说服力。3.4 树模型与独立同分布假设一个常被忽略的讨论有一个很有趣的问题是学员在复习机器学习三大假设时提出来的树模型假设独立同分布吗这个问题让我特别开心因为很少有人会在大作业里认真想这个。严格来说大多数机器学习算法的推导都基于样本独立同分布假设树模型也不例外。训练时我们默认每个样本是从同一个分布里独立采样的。但树模型本身并不显式假设特征之间相互独立(朴素贝叶斯才做这种强假设)所以在特征存在相关性时树模型依然能用而不会像朴素贝叶斯那样因为特征重叠而重复计算概率。但在时间序列数据上样本的独立性确实被破坏了因为相邻时刻的数据有自相关性。这时候直接用随机森林做预测容易出现泄漏也就是用未来数据预测过去。正确做法是用时间序列交叉验证而不是随机打乱后切分。这个问题在学校实验室做机器学习项目时尤其常见——很多科研数据是传感器时序数据处理不好整个实验设计都有问题。4. 从数据到模型波士顿房价与头歌实训背后的完整流程4.1 数据预处理是项目的生命线三期班有一句口头禅数据预处理占一个项目70%的时间但课本上最多占7页。这不是夸张。真实数据里什么情况都有缺失值、异常值、重复样本、量纲不一致、类别变量没编码、偏态分布、时间字段没法解析、目标值有泄漏……每一个问题都足以让模型结果完全失真。pandas是这一切操作的核心工具。我要求学员必须熟练使用以下操作read_csv、info()、describe()、isnull().sum()、fillna()、drop_duplicates()、pd.get_dummies()或者sklearn.preprocessing.OneHotEncoder、StandardScaler/MinMaxScaler。听起来很简单但真正做到不假思索也不必查文档的人很少。举一个课堂上反复出现的例子处理缺失值时有人直接dropna()把几千行丢了一半模型效果崩了。正确思路是先看缺失率。如果某列缺失率超过80%直接删列如果缺失率不高可以选择填充均值/中位数/众数或用模型预测填充甚至把是否存在缺失本身当作一个特征。这些决策没有标准答案取决于业务场景和数据分布这也是为什么我说预处理是项目生命线不是随便填个数字就完事。4.2 波士顿房价数据集一个适合做baseline的经典案例机器学习:波士顿房价数据集是搜索热词也是无数人接触回归任务的第一个数据集。网上调侃这个数据集被用烂了但它在教学场景下的价值依然很大特征数量适中(13个)、样本量适中(506条)、任务清晰(回归预测房价)非常适合作为端到端流程的载体。我用它带学员走完整流程加载数据、数据探查、特征相关性矩阵分析、标准化、划分训练测试集、训练线性回归、评估RMSE和R²。这里有个关键细节划分数据之前一定要把训练集和测试集分开再预处理。很多人先对整个数据集做标准化再切训练测试集这就造成了一种轻微的数据泄漏。测试集的标准差应该完全由训练集计算得到再应用于测试集。用sklearn.pipeline.Pipeline的StandardScaler配合交叉验证可以很好地避免这个错误。波士顿房价的评价指标我一般让学员同时看RMSE和R²。RMSE告诉你平均误差多少美元R²告诉你模型能解释多大比例的方差。只看R²会被离群值忽悠只看RMSE又不能直观判断模型效果好坏。这两个指标配合起来看才是完整的评估视角。4.3 头歌/在线实训平台的正确打开方式在三期学员的搜索记录里头歌平台高频出现——头歌机器学习数据预处理pandas头歌机器学习聚类头歌机器学习线性回归头歌机器学习集成学习-adaboost等等。头歌这类在线实训平台对教学的价值在于它把学习任务拆解成了一个个关卡每一关要求你补全代码、跑通结果、通过测试这种即时反馈机制非常适合新手建立信心。但我也发现一个问题很多同学把头歌平台的实训当成了刷题代码是网上搜答案抄的跑通了就过了什么都不留下。这样做的结果是期末考完就忘光。正确的打开方式应该是每一关做两遍。第一遍自己写写不出来就看提示理解每一步的输入输出第二遍合上参考答案从头到尾再实现一次并记录这个任务的业务背景、算法原理、代码难点。我在冲刺班里就把头歌的几个典型关卡作为课后作业要求学员把每次训练的截图和代码发到群里互相监督。头歌上有些关卡确实是为了做而做比如重复的pip install环节但数据处理和算法实现的核心关卡是值得认真对待的。如果能把头歌机器学习数据预处理pandas那一章的十几个实操关卡都独立做出来你的pandas功底基本就过关了。5. 跨进深度学习的第一步CNN的卷积、池化、步长、核与填充5.1 从全连接到卷积为什么图像任务不用全连接硬刚到了第四天学员已经完成了两三个经典机器学习项目普遍感觉传统的机器学习也不难嘛然后就被深度学习当头一棒。我选用的第一个深度学习案例是手写数字识别MNIST配合一个简化版的人脸识别项目。任务本身不难但概念密度很大。要理解CNN先得看全连接网络为什么不行。假设图像是28×28摊平后是784维一个隐藏层512个神经元参数量就是784×512约40万个参数。如果换成256×256的彩色图像输入维度是256×256×3接近20万维第一层全连接就要1亿多参数。这还没算训练数据量的问题图片稍微大一点全连接网络在参数量上就直接爆炸了。卷积神经网络的思路是让神经元只关注图像的一个局部区域并且在不同位置上共享同一组权重。这就是卷积核存在的意义——它就像一张滑动的小窗户在整张图上扫过提取局部特征。一个卷积核检测边缘另一个卷积核检测纹理多个卷积核堆叠起来网络就越学越抽象从线条到形状再到语义这也是CNN能霸占图像任务十几年的根本原因。5.2 卷积核、步长、填充与池化的联动关系关于CNN搜索热词里总是把卷积、池化、步长、核、填充这五个词并列因为它们确实是一套联动的关系。我用最简洁的公式和例子来讲清楚。卷积输出尺寸的计算公式是output_size (input_size - kernel_size 2 * padding) / stride 1举个例子输入是32×32的灰度图像卷积核大小3×3步长1填充1那么输出尺寸是(32 - 3 2×1) / 1 1 32也就是说特征图尺寸不变。这就是SAME padding的常见用法。步长(stride)卷积核每次移动多少个像素。步长大于1特征图尺寸会缩小相当于下采样步长1则尽量保留空间信息。填充(padding)在输入边缘补零。作用有两个一是防止边缘像素参与卷积次数太少导致的信息丢失二是配合卷积核大小控制输出尺寸。经典公式里3×3卷积核配合padding1和stride1时可以保持尺寸不变。池化(pooling)常见的最大池化或平均池化作用是对特征图做下采样缩小尺寸、增大感受野、降低计算量同时带来一定的平移不变性。池化本身没有可学习参数它就是一个压缩操作。这三个参数加一起就构成了CNN的基础组件。我在课上会花二十分钟在黑板上画一个简单的4×4矩阵演示用2×2卷积核、步长1、无填充时输出是3×3然后把计算过程一步步写出来。有学员说这是他们第一次真正理解卷积不是一个抽象的数学符号而是一个机械的、可以手算的过程。5.3 PyTorch实现一个简单CNN的完整代码解读代码层面上我要求学员能独立写出下面这个结构的CNN并解释每一层的参数变化import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self, num_classes10): super().__init__() self.features nn.Sequential( nn.Conv2d(1, 32, kernel_size3, stride1, padding1), # 1*28*28 - 32*28*28 nn.ReLU(), nn.MaxPool2d(kernel_size2, stride2), # 32*28*28 - 32*14*14 nn.Conv2d(32, 64, kernel_size3, stride1, padding1), # 32*14*14 - 64*14*14 nn.ReLU(), nn.MaxPool2d(kernel_size2, stride2), # 64*14*14 - 64*7*7 ) self.classifier nn.Sequential( nn.Flatten(), nn.Linear(64 * 7 * 7, 128), nn.ReLU(), nn.Dropout(0.5), nn.Linear(128, num_classes) ) def forward(self, x): return self.classifier(self.features(x))这个网络很简单但它包含CNN的所有核心要素卷积、激活、池化、展平、全连接分类。每一层的输入输出尺寸变化都在注释里写清楚了。学员必须能回答为什么全连接层的输入是64×7×7因为经过两次池化后28×28的图变成了7×7通道数为64。最后跑深度学习的训练循环也是必考题设置损失函数交叉熵、优化器Adam学习率1e-3、循环epoch、前向传播、反向传播、每隔一定step打印loss。这个模板后面的各种项目都能复用必须练到肌肉记忆。6. 期末与就业双线作战机器学习复习资源与踩坑记录6.1 复习资料怎么选吴恩达、李宏毅、周志华、PRML的定位学员里很多人在准备期末搜索热词里吴恩达机器学习李宏毅机器学习机器学习prml电子版机器学习周志华pdf都是高频词。我经常被问到这些资料我到底该看哪个这里统一说下我的判断。吴恩达的机器学习课程(Coursera版)最适合入门讲解极其温和线性代数、梯度下降这些前置知识都会铺垫。缺点是偏老很多内容是2012年之前的深度学习部分只有很浅的一层实战代码还是Octave/MATLAB。用作期末复习第一遍非常合适。李宏毅的机器学习课程台湾大学的网红课程每年更新紧跟前沿PPT风格生动特别适合建立直觉。对期末复习的覆盖也很全从基础到Transformer都有普通话授课语速友好是很多人期末前冲刺的首选。周志华的《机器学习》(西瓜书)国内经典教材理论体系非常完整。但说实话这本书对新手并不友好推导密集术语偏学术。期末要是想拿高分这本是绕不开的主力参考书尤其是前几章关于偏差-方差分解、线性模型、决策树、SVM的内容。PRML(Pattern Recognition and Machine Learning)这本书是贝叶斯视角的经典数学要求高。如果你不是做机器学习方向的研究生期末真心不建议从头啃效率太低。我更推荐把它当工具书查——比如碰到高斯过程、图模型时翻到对应章节看公式。国科大和很多高校的模式识别与机器学习课程把它列为参考书但老师讲的重点通常集中在前面几章。我给三期班的复习建议是以吴恩达或李宏毅快速建立框架用周志华查漏补缺巩固理论PRML只做特定章节的精读千万别A-Z通读。6.2 三期末冲刺最容易踩的坑期末冲刺阶段大家普遍会犯几个错误这里展开说背模型不背适用条件。真题经常是给一个场景问你选什么模型。很多同学只记了决策树适合非线性但没记树模型对缺失值不敏感、不需要标准化这些适用条件。考试考的不是你认识几个模型而是你能不能做正确的算法选型。把数据泄漏当作小问题。前面说过的全局标准化、用未来信息预测这些问题在做大作业时尤为致命。期末试题如果给你一个时间序列数据一定要检查切分方式是不是时间顺序切分。忽略随机种子。这在写大作业/项目报告时特别常见。你的模型每次跑的结果都不一样不是因为你模型写错了而是因为训练测试划分是随机的、初始化是随机的。在项目代码开头设置np.random.seed(42)、random.seed(42)、torch.manual_seed(42)不然报告里的数字第二天就不一样自己都没法复现。不做消融实验。很多项目报告只写我用了GBDTAUC0.87评委根本不知道这个结果好不好。正确做法是跑一个baseline再叠加特征工程、调参、集成对比每一步的提升。这个过程也最能暴露过拟合训练集AUC 0.99、测试集AUC 0.70说明模型在背答案。6.3 给下一期学员的建议把实验记录当作项目资产最后说一个我在带班过程中反复强调、但很多人到结课才开始重视的事实验记录。很多学员跑实验时是一把梭敲一个模型看一个loss没记录了过一天换了个思路之前的参数、结果、报错全忘了。我建议每个人在本地建一个experiments目录每个实验一个文件夹里面放三样东西脚本、日志、README。README里写清楚这个实验用的数据集、特征处理方式、模型、超参数、评估指标、和baseline的对比结论。不需要写长篇大论几句话加一张截图就够。这样过一个月再回来看还能知道当时的思路走到哪一步、为什么没有继续。实战项目的价值很大程度上就在这份可追溯的实验记录里它比模型本身更能体现你对机器学习的掌握程度。三期班里有位学员后来做毕业设计把四天里跑过的所有实验记录整理成了一个小仓库直接当作毕业论文的技术预研章节导师评价很高。这就是把中间产物变成项目资产的典型例子。我在实际带班中还有一个体会很多人学机器学习学得痛苦不是因为他们笨而是因为他们一直在输入而缺少输出。看视频、翻书、抄代码都是输入但只有当你丢开资料自己从零开始处理一份新数据、训练一个模型、写一份总结时你才真正开始会机器学习。冲刺班能做的就是逼你在几天内完成这个从输入到输出的转换剩下的路还得靠自己在项目里一步步走。
返回列表