AI入门基础补全:我踩过4位数的坑才懂,数据集、标注与处理到底该怎么做
目录
引言
所有AI项目的上限从来都不是模型,是数据。你就算把GPT-3的模型拿过来,喂一堆错误百出的脏数据,也训不出能用的东西。可不知道从什么时候开始,圈内都在卷大模型、卷参数量、卷SOTA精度,没人愿意讲最基础的数据工作——怎么找数据集?怎么标注才不出错?怎么处理数据能让模型涨点?很多入门朋友跟着教程跑通了MNIST,真要自己做项目,一碰到数据就懵了。
这篇文章是我整理了做项目踩过的所有数据坑,从背景到实操,从入门到进阶,全是亲测有用的经验,没有套话,没有公式堆砌,适合所有AI入门的朋友收藏,哪怕你只记住避坑的点,也能少走很多弯路。

一、先理清背景:为什么“数据基础”才是AI入门的第一关?
我刚学AI的时候,看到一句话:“人工智能,就是有多少数据,就有多少智能”。那时候我觉得太夸张了,直到做了三四个项目才发现,这句话真的是真理。
1.1 从AI的本质说,为什么数据是核心?
不管是传统机器学习还是现在的大模型,AI的核心逻辑本质上都是从数据中学习输入到输出的映射规律。你给它一万张猫和狗的图片,它就从这些图片里总结出“猫长什么样、狗长什么样”的规律;你给它十万条指令回答对,它就总结出“人类问这个问题该怎么回答”的规律。
说白了,模型只是一个学习规律的“容器”,规律对不对、准不准,完全取决于你给它喂的是什么数据。这就是行内常说的GIGO原则:Garbage In, Garbage Out——垃圾进,一定是垃圾出。
放在十年前AI还没火的时候,这个问题不突出,那时候做AI都是实验室小项目,数据都是自己标,质量能控制。最近十年AI火了,入门的人多了,大家都把注意力放在模型上,数据基础的坑就越来越多:
- 入门党觉得“反正我练手,随便找点数据就行”,结果跑出来的结果全是错的,还以为自己模型学不好;
- 做项目的小团队,为了省成本找便宜外包标注,拿到错漏百出的数据,训了几个月才发现问题,钱时间全砸进去了;
- 就算是大公司做落地项目,数据分布不对、数据泄露这种低级错误,也能把一个几百万的项目搞黄。
我见过太多入门的朋友,学了大半年,模型调的门清,真要自己做个毕设、整个小项目,卡在数据这一步卡俩月,最后要么放弃要么拿不到好结果,太可惜了。
1.2 大模型时代,数据基础反而更重要了?
很多人说现在都有大模型了,都是预训练好的,我们只要微调一下就行了,还要什么数据基础?不对,恰恰是大模型时代,数据基础更重要了。
你做垂直领域的大模型微调,比如做一个医疗咨询大模型,预训练模型是通用的,你要给它喂垂直领域的优质数据,它才能学会医疗领域的专业知识,要是你给它喂的都是错误的诊断数据,那出来的模型能给人看病吗?不得出医疗事故吗?
OpenAI当年训GPT的时候,光是清洗预训练数据就花了大半年时间,筛选掉了大量低质量、重复、错误的内容,才训出现在的GPT。国内现在做大模型的团队,最核心的竞争力之一,就是优质数据的积累,比模型结构的影响大得多。
所以不管你是刚入门学AI,还是准备做项目落地,把数据基础的逻辑搞懂,都是绕不开的第一关。
二、第一块核心:数据集,从入门找数据到自定义数据集,一步一步说清楚
什么是数据集?说白了就是AI用来学习的“教科书+练习题”,一堆带标签(或者不带标签,无监督学习)的样本放在一起,就是数据集。很多新手觉得数据集不就是一堆文件吗?有什么好说的?里面坑真的不少。
2.1 数据集的类型,先搞懂你需要什么样的数据集
不同的AI任务,需要的数据集类型完全不一样,我按常见的任务分个类,大家对着找就行:
| 任务大类 | 常见任务 | 数据集核心要求 | 代表性开源数据集 |
|---|---|---|---|
| 传统机器学习(结构化数据) | 房价预测、信贷风控、用户分类 | 特征维度清晰,标签准确 | UCI公开数据集、Kaggle比赛数据集 |
| 计算机视觉 | 图像分类 | 每个图像对应一个类别标签 | MNIST手写数字、ImageNet、CIFAR-10/100 |
| 计算机视觉 | 目标检测 | 需要标注出目标的坐标框和类别 | COCO、PASCAL VOC |
| 计算机视觉 | 图像分割 | 需要标注出每个像素的类别 | Cityscapes、ADE20K |
| 自然语言处理 | 文本分类、情感分析 | 每个文本对应一个类别标签 | IMDB影评、SST情感数据集 |
| 自然语言处理 | 命名实体识别、关系抽取 | 需要标注出文本中实体的位置和类型 | CoNLL-2003 |
| 大模型 | 预训练 | 大规模无标注干净文本 | Common Crawl、WikiText |
| 大模型 | 指令微调 | 指令-回答对格式的标注数据 | Alpaca数据集、ShareGPT |
这只是常见的分类,还有很多垂直领域的数据集,比如医疗的ChestX-ray14胸片数据集,自动驾驶的KITTI数据集,电商的用户行为数据集,这些都是对应领域专门的数据集。
我刚入门的时候踩过一个坑:找数据集不对应任务,我做目标检测,找了个分类数据集改来改去,改了一周才发现不对,浪费了好多时间,所以第一步一定要先搞清楚,你的任务需要什么类型的数据集,再去找。
2.2 数据集必须要做划分:训练/验证/测试集,为什么要分?怎么分?
这是新手最容易犯的错误,我第一次跑项目的时候,把所有数据都扔进去训练,出来准确率98%,开心得不行,结果拿了几张新图片测,准确率不到50%——过拟合了都不知道怎么回事。
为什么一定要分三个集合?我给你用最通俗的类比讲明白:
- 训练集 = 你上学时候的课本练习题,你平时就靠做练习题学知识点,模型就是靠训练学习规律;
- 验证集 = 期中期末考试的模考卷,你每次学完一轮,用验证集测一下,看看你学的怎么样,要不要调整学习方法(对应模型调参、改结构);
- 测试集 = 最终的高考,只有最后才用一次,用来评估你最终的真实水平(对应模型最终的泛化能力)。
如果你不划分,把所有数据都用来训练,相当于你把高考题都提前背下来了,考了满分,不代表你真的学会了,碰到新题照样不会做,就是这个道理。
那比例怎么分?没有固定的标准,看你总数据量:
- 数据量小(一万样本以内):一般用 7:2:1,70%训练,20%验证,10%测试;
- 数据量大(百万样本以上):可以用 90:5:5 甚至 98:1:1,因为训练需要足够多的数据,验证测试只要几千样本就能稳定评估了。
还有一个非常重要的点:分层划分,尤其是遇到不平衡数据集的时候,千万不能随机划分就完了。比如你做癌症检测,10000个样本里只有1000个是阳性,如果你随机划分,可能测试集里只有几十个阳性,甚至一个都没有,测出来的准确率根本不准。分层划分就是保证每个集合里,不同类别的比例和原数据集是一样的,这个功能Scikit-learn里都有现成的train_test_split,直接用stratify参数就能实现,非常方便,我每次都会用。
2.3 入门练手,靠谱的开源数据集去哪里找?
刚入门不需要自己做数据集,直接用开源数据集练手就行,我整理了我常用的几个平台,每个都讲下优缺点,大家按需用:
-
UCI机器学习库:https://archive.ics.uci.edu/ml/
最老牌的开源数据集平台,大部分是传统机器学习的结构化数据集,规模都不大,适合入门练手,免费不用注册,直接下载,非常友好。我刚学线性回归、逻辑回归的时候,就是用UCI的波士顿房价、红酒分类数据集练的,非常稳。 -
Kaggle:https://www.kaggle.com/datasets
全世界最大的数据科学家社区,海量数据集,从传统结构化到CV、NLP什么都有,还有很多比赛数据集,很多都是企业真实场景放出来的,质量很高,练手做项目非常合适。缺点就是国内下载有时候速度慢,可以找国内镜像或者用下载工具。 -
HuggingFace Datasets:https://huggingface.co/datasets
现在NLP和大模型入门最香的平台,几乎所有主流的开源数据集都能在这里找到,一行代码就能加载到本地,不用你自己下载解压处理格式,太省时间了。我现在做微调,都是直接在这里加载数据集,比自己下方便一百倍。 -
国内平台:阿里天池、DataFountain
国内的比赛平台,很多中文数据集,还有很多国内真实场景的数据集,比如电商数据、城市交通数据,适合做中文相关的项目,下载速度快,不用翻墙,非常友好。 -
Google Dataset Search:https://datasetsearch.research.google.com/
搜垂直领域数据集非常好用,相当于数据集的搜索引擎,你要找什么领域的数据集,直接搜就能找到对应的下载链接,我做医疗项目的时候就是用这个找到好多专业数据集。
如果是入门练手,我建议新手先从MNIST、CIFAR-10、IMDB这些小数据集开始,跑通整个流程了,再玩大的,不要一开始就下几个几十G的数据集,跑都跑不动,打击信心。
2.4 自己做项目,怎么搭建自定义数据集?
如果你要做一个垂直领域的自定义项目,没有现成的开源数据集,就得自己搭,我做过三次自定义数据集,总结了几个核心要点,全是坑:
(1)收集数据一定要对齐真实场景分布
这是我见过最多人踩的坑:你要做一个手机端的实时车牌识别,训练集全是高清停车场卡口拍的车牌,结果实际用的时候,用户手机拍的都是歪的、糊的、有反光的,模型准确率直接掉30%,这就是数据分布不对,你训练集的分布和实际落地的分布不一样,模型学不到真实场景的规律。
所以收集数据的时候,一定要尽可能按照真实使用场景来收集,宁可少一点,也要准一点。我做过一个小区的猫脸识别项目,所有数据都是我拿着手机在小区各个角落,不同光线不同角度拍的,虽然只拍了2000张,训出来的模型准确率能到92%,比我用网上下载的1万张高清猫图训的准确率还高,就是这个道理。
(2)一定要去重!一定要去重!一定要去重!
重要的事说三遍,很多人收集数据都是网上爬的,爬出来一堆重复的,你自己不看,直接扔进去训练,模型会直接过拟合,因为反复学同一个样本,把这个样本的噪声都学会了。
去重也很简单,不同数据用不同方法:
- 图像:用感知哈希算法,计算每张图的哈希值,哈希值一样或者非常接近就是重复的,直接删掉,代码网上都有现成的,几行就能跑;
- 文本:用simhash去重,同样,现成的库直接用;
- 结构化数据:直接pandas按所有列去重就行。
我爬过一次电商的商品图片,1万张图去完重剩7000多张,删掉了30%的重复数据,训出来模型涨了4个点准确率,你说重不重要?
(3)格式整理要符合框架要求
不同框架对数据集的格式有要求,比如PyTorch常用的图像分类数据集,就是按文件夹分,一个类别一个文件夹,里面放对应类别的图,直接用ImageFolder就能加载,非常方便。你不要把所有图都放在一个文件夹,然后自己写个csv存标签,虽然也能读,但是容易错,尽量用框架支持的标准格式,少给自己找麻烦。
三、第二块核心:数据标注,为什么说标注错了,项目直接凉一半?
我开头说的那个坑,就是标注的问题,一万张图三分之一标错了,调了一个月模型啥用没有,所以标注这个事,真的是怎么重视都不为过。
3.1 标注到底在做什么?不同任务的标注类型有哪些?
标注本质上就是给你的原始数据打“标准答案”,让模型学习输入到标准答案的映射,不同任务标注的要求完全不一样:
- 图像分类:最简单,给整张图打一个类别标签,比如这张是猫,这张是狗,一个图一个标签;
- 目标检测:不仅要标类别,还要用矩形框标出来目标在图里的位置,比如一张图里有三个人,就要标三个框,每个框对应“人”这个类别;
- 图像分割:比检测更细,要把目标的轮廓标出来,每个像素都要对应类别,比如做医疗影像分割,要把肿瘤的区域每个像素都标出来,这样模型才能学会分割肿瘤;
- 文本分类:给整个文本打标签,比如这个影评是正面还是负面;
- 命名实体识别:要标出来文本里哪个词是人名,哪个是地名,哪个是机构名,要标起始位置和类型;
- 大模型指令微调:要标出来用户的指令,和对应的正确回答,做成
{"instruction": "...", "output": "..."}的格式。
3.2 标注到底选哪种方式?自己标还是外包?各有什么优劣?
很多人拿到数据,不知道该怎么选标注方式,我按项目规模给你分情况说:
-
小项目(样本数<5000):自己标,最靠谱
小项目本身样本不多,你找外包还要沟通规则,还要抽验,来回折腾的时间,你自己都标完了,而且自己标质量肯定有保证,不会出错,成本也低,就是花点时间,我2000张猫脸,我自己用业余时间标了一周就完了,比找外包放心多了。 -
中大型项目(样本数>5000):外包+自己抽验
样本多了自己标不过来,就得找外包,现在有很多标注平台,比如标贝、百度标注,还有众包平台,都能做,价格也不贵,一张图几毛钱到几块钱,看标注复杂度。但是核心一定要记住:不管对方说质量多好,一定要自己抽验,抽验比例至少10%,错标率超过5%,整个批次打回去重标。我之前就是图省事,外包标完直接用,结果出了开头那个问题,三千多错标,找外包人家也不认,说你当时没验,最后只能自己重新标,花了双倍钱,太坑了。 -
现在新方法:大模型辅助标注,省一半力气
这个是我最近一年常用的方法,真的太香了,能省好多时间:- CV分割:用Meta的SAM(分割任何物体模型),先自动把目标分割出来,你只要改一下不对的地方,比你自己从头描轮廓快十倍;
- NLP标注:用GPT给你做初步标注,你只要改一下错的,比你自己从头标快好多;
- 甚至目标检测,你都可以用现成的预训练模型先自动标,再人工校验,效率提升不止一点。
只要不是太复杂的标注,用AI辅助标注至少能省一半时间,现在都这么玩,新手可以试试。
3.3 好用的标注工具推荐,全是免费亲测好用
我用过不下十个标注工具,给大家推荐几个适合新手,免费好用的:
| 数据类型 | 工具名称 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|---|
| CV(分类/检测) | LabelImg | 免费、轻量、安装简单,支持VOC格式 | 不支持分割 | 新手入门做目标检测,够用 |
| CV(分割/检测) | LabelMe | 免费开源,支持多边形分割,在线就能用 | 大文件加载慢 | 图像分割入门首选 |
| 全类型 | LabelStudio | 免费开源,支持CV、NLP、语音几乎所有类型的标注,功能强大 | 配置稍微麻烦一点 | 自定义项目,多类型标注 |
| 中文入门 | 精灵标注助手 | 不用部署,在线就能用,中文界面,对新手友好 | 免费版有容量限制 | 新手不想折腾环境,直接用 |
| NLP 实体识别 | BRAT | 专门做文本标注,轻量好用 | 界面有点老 | 文本标注够用 |
我现在做小项目一般用精灵标注助手,不用装,打开浏览器就能用,太方便了,做分割用LabelMe,足够用了。
3.4 怎么控制标注质量?四个核心要点
标注质量直接决定项目成败,我总结了四个控制质量的要点,照着做基本不会出大问题:
-
先写标注规范,越细越好,不要让标注员自由发挥
很多人找外包,只说“给我标猫和狗”,不写规则,结果标注员把图里有半个猫的也标成猫,把狸花猫标成别的,什么情况都有。所以标注之前一定要把规则写死:比如“猫完整出现在图里,占比超过10%才标猫,小于10%或者只有一半标为背景,模糊不清无法分辨的标为不确定”,越细越好,所有模糊的情况都提前说清楚,避免争议。 -
先做试标注,统一标准再大规模标
不要一开始就让人全标完,先抽100张让标注员试标,试标完你检查,把不对的地方指出来,统一大家的标准,没问题了再大规模开标,避免全标完才发现标准不对,全部重来,浪费钱浪费时间。 -
交叉校验,不一致样本统一处理
重要的项目,可以让两个标注员标同一批样本,然后对比,两个人标注结果不一样的样本,拿出来,第三个人或者你自己看,最终确定正确标签,这样能把错标率降到非常低,虽然麻烦一点,但是质量有保证。 -
模糊、不确定的样本,直接删掉,不要留在数据集里
很多人觉得“数据难得,凑一个是一个”,把模糊的根本看不清的样本也留下来,其实这种样本只会干扰模型学习,还不如删掉,1000张高质量样本,比1500张掺了500张坏样本的效果好得多,不要贪多,要贪质量。
四、第三块核心:数据处理,预处理+增强,做好了直接涨点
数据拿到手,标注完了,不能直接喂模型,要先处理,这个步骤就是预处理,然后如果数据不够,还要做数据增强,这两步做好了,模型准确率涨几个点太正常了,我给你一步一步说。
4.1 为什么要做数据预处理?原始数据都是“脏”的
原始数据你拿到手,肯定有各种各样的问题:有缺失值、有异常值、尺度不一样、格式不对,还有噪声,直接喂模型,模型根本学不到正确的规律,所以预处理是必须的,我分不同数据类型给你讲,每个步骤要做什么,坑在哪里。
4.2 结构化数据(表格数据)预处理步骤,新手照着做就行
结构化数据就是我们常说的Excel表格,一行是一个样本,一列是一个特征,做风控、房价预测、用户分类都是这种,预处理步骤很清晰:
(1)第一步:数据清洗,处理缺失值和异常值
- 缺失值:看缺失率,缺失率超过50%的特征,直接删掉,留着没用;缺失率在10%-50%之间的,填充,数值型特征用中位数填充(比平均值抗异常值),分类特征用众数填充;缺失率小于10%的,直接删掉对应样本就行。
- 异常值:就是不符合常理的值,比如年龄你填了200,收入填了一个亿,肯定是错的,怎么找?常用两种方法:3σ原则(正态分布的数据,超过均值加减3倍标准差就是异常值),箱线图法(超过上下四分位1.5倍IQR就是异常值)。找到异常值怎么处理?记住:不要一概而论删掉,如果你做的是欺诈检测、故障检测,异常值本身就是你要找的目标,不能删;如果是输入特征的错误异常值,才删掉或者填充。
我刚学的时候,不管什么异常值都删,结果做欺诈检测,把所有欺诈样本都删了,最后模型啥也学不出来,这个坑要记住。
(2)第二步:特征编码,把分类变量转成模型能读的数字
模型只能处理数字,不能处理文字,所以你表格里的文字分类变量要转成数字,两种常用方法:
- 标签编码:就是给每个类别一个数字,比如小学=1,中学=2,大学=3,适合有序分类变量,也就是类别之间有大小顺序的,用这个就对了;
- One-hot编码:就是给每个类别新建一个列,是这个类别就是1,不是就是0,比如颜色红=[1,0,0],黄=[0,1,0],蓝=[0,0,1],适合无序分类变量,类别之间没有顺序,用这个,不会给模型强加错误的顺序关系。
(3)第三步:特征缩放,为什么要做?什么时候做?
很多特征的取值范围不一样,比如一个特征是年龄,范围0-100,一个特征是年收入,范围0-100万,模型在计算的时候,会天然觉得年收入的影响更大,因为数值大,实际上年龄和年收入可能同样重要,所以要做缩放,把不同特征缩放到同一个范围,消除这个影响。
常用两种缩放方法:
- 归一化(Min-Max缩放):把所有特征缩放到[0,1]之间,适合对输出范围有要求的场景,比如神经网络输入;
- 标准化(Z-score缩放):把特征转成均值为0,标准差为1的分布,适合数据近似正态分布的场景,现在大部分深度学习都用这个。
还有一个非常重要的点:树模型(决策树、随机森林、XGBoost、LightGBM)不需要做特征缩放!因为树模型是按特征的值分裂,不关心绝对值大小,缩放不影响结果,不用多此一举,很多新手不知道,白忙活半天。
4.3 图像数据预处理步骤,核心要点要记住
图像数据的预处理和结构化不一样,核心几个步骤:
- 统一尺寸:模型输入要求固定尺寸,所以所有图都要转成一样的大小,这里有个坑:很多新手直接拉伸,把原图长宽比改变,导致变形,其实更好的方法是保持原图长宽比,多余的地方填充黑边或者灰边,我做对比试验,同样的模型,填充比直接拉伸,准确率高2个点,别小看这两个点,很多项目差一个点结果就不一样。
- 通道转换:很多png图是四通道(带透明通道),jpg是三通道RGB,模型一般都要求三通道输入,所以要转成三通道,不然会报错,很多新手刚入门在这里卡半天,不知道为什么错,就是这个原因。
- 归一化:把像素值从原来的0-255,缩放到0-1或者-1到1,这个是必须的,能加快模型收敛,不然数值太大,梯度容易爆炸,训练不起来。
- 去噪:如果你的图像是扫描的、或者手机拍的低质量图,有很多噪声,比如椒盐噪声,可以用高斯滤波、中值滤波去一下噪,模型效果会更好,要是都是高清图,就不用了。
4.4 文本数据预处理步骤,中文要特别注意这些点
文本数据预处理坑也不少,尤其是中文,我整理了核心步骤:
- 数据清洗:首先去掉无关内容,比如爬的网页要去掉html标签,去掉特殊符号、表情、广告链接,英文全部转小写,避免“Cat”和“cat”当成两个词。
- 去停用词:去掉那些对语义没有帮助的词,比如中文的“的、了、吗、啊”,英文的“a、an、the、in”,这些词出现频率很高,但是没有实际意义,去掉能减少特征维度,加快训练,现在有现成的停用词表,网上直接下,加载进去就能用。
- 分词:英文本来就是用空格分开词,所以不用分词,中文不行,中文是连在一起的,所以要分词,把一句话切成一个一个的词,常用的工具是Jieba分词,简单好用,适合入门。这里有个坑:如果是垂直领域,比如医疗、法律,有很多专业名词,Jieba会切错,比如“糖尿病酮症酸中毒”会切成“糖尿病 酮症 酸中毒”,虽然也能用,但是最好加自定义词典,把专业名词加进去,分词就对了,这个对后续模型效果影响很大。
- 编码:把词转成模型能处理的向量,传统方法用TF-IDF,现在都用预训练词向量比如Word2Vec,或者直接用BERT做编码,效果更好。
4.5 数据增强:不增加标注成本,就能扩大数据集,涨点神器
什么是数据增强?就是在不改变数据标签的前提下,对原始数据做一些变换,得到新的样本,相当于不花钱扩大了数据集,还能提升模型的泛化能力,防止过拟合,不管是CV还是NLP,现在几乎做项目都会用,我给你讲常用的方法和要注意的坑。
(1)计算机视觉常用的数据增强方法
- 基础几何变换:水平翻转、随机旋转、随机平移、随机裁剪、缩放,这些都是最常用的,简单有效,但是要注意:不要做不符合实际场景的变换,比如你做人脸识别,不要做垂直翻转,因为没有人会倒着拍照,垂直翻转出来的样本不符合真实场景,反而会干扰模型;你做数字识别,不要把1旋转180度,旋转完就变成9了,标签都变了,这种变换不能用。
- 颜色变换:随机调整亮度、对比度、饱和度、加随机噪声,模拟不同光线场景下的图像,让模型更鲁棒,比如你做户外的目标检测,这个非常有用。
- 高级增强方法:现在常用的有CutMix、MixUp、AutoAugment、RandAugment,这些方法比基础变换效果更好,PyTorch里面都有现成的库,直接调用就行,不用自己写,我用MixUp做分类,一般能涨1-2个点,效果很明显。
(2)自然语言常用的数据增强方法
- 基础方法:同义词替换(把句子里的非关键词换成同义词,不改变语义)、随机交换两个词的位置、回译(把中文翻译成英文,再翻译回中文,得到不同表达,语义不变),这些方法简单,效果也不错。
- 高级方法:现在用大模型生成式增强,给GPT说“帮我把这句话改成5种不同的表达,语义不变”,就能得到5个新样本,质量很高,比传统方法效果好很多,就是稍微费点钱,小项目够用了。
(3)数据增强的核心原则:不要改变语义和标签
不管做什么增强,核心原则就是增强之后,标签不能变,语义不能变,如果增强完标签变了,那就是错的,不如不做,这个原则一定要记住,很多新手乱增强,越增强效果越差,就是违反了这个原则。
五、我踩过的5个最痛的坑,整理出来帮你避
上面讲了各个部分的要点,最后把我这么多年踩过的最痛的五个坑整理出来,你避开了,就超过80%的入门者了:
坑1:数据泄露
数据泄露是新手最容易犯,也是影响最大的坑,什么是数据泄露?就是你把测试集的信息提前用到了训练过程里,导致你测出来的准确率虚高,一落地就拉胯。
最常见的例子:你预处理做标准化,先把所有数据合在一起做了标准化,算均值方差,然后再划分训练集测试集,这就是数据泄露!因为你算均值方差的时候用了测试集的信息,相当于把测试集的信息泄露给了训练过程,你测出来的准确率肯定比实际高,一碰到真实的新数据就拉胯。
我第一次参加Kaggle比赛就是犯了这个错,本地验证准确率95%,交上去不到80%,排名直接掉了一百多名,说出来都是泪。正确的做法是:先划分训练集、验证集、测试集,然后只用训练集算均值方差,验证集和测试集都用训练集的均值方差做标准化,绝对不能碰测试集的统计信息,记住这个,就避开了这个最大的坑。
坑2:数据分布偏移
这个我之前提过,就是训练集的分布和实际落地的分布不一样,你训练集都是高清图,实际都是糊图,模型肯定不行。怎么解决?收集数据的时候尽量对齐真实场景,要是已经出现偏移了,可以做领域自适应,或者多收集一些真实场景的数据,重新微调模型,定期更新。
坑3:数据集不平衡
就是数据集里某个类别的样本特别多,某个特别少,比如癌症检测,90%是正常,10%是癌症,模型全猜正常,准确率都有90%,看起来很好,实际根本没用,检测不到癌症。怎么解决?四个常用方法:
- 欠采样:把多的类别样本减少,和少的类别数量差不多;
- 过采样:把少的类别样本重复采样,或者做增强增加样本数;
- 类别加权:给少的类别加更大的损失权重,让模型更重视少类的样本;
- 生成样本:用GAN生成少类的新样本,增加数量。
根据你的数据量选就行,一般用类别加权最简单,效果也不错。
坑4:贪多不要质量
很多新手做数据集,追求数据越多越好,不管质量,一堆脏数据错标注,结果训出来效果还不如人家几千张高质量数据,记住:数据质量永远比数量重要,1万张高质量标注的数据,比10万张错漏百出的数据有用,不要贪多,要贪好。
坑5:不做验证,直接用测试集调参
很多人划分了数据集,然后经常用测试集测,改参数,最后测试集准确率很高,实际还是过拟合,因为你相当于把测试集当成验证集用了,测试集只能用一次,就是最后评估的时候用,平时调参都用验证集,记住这个。
六、总结
最后给大家总结一下核心要点,也给不同阶段的入门者一点建议:
AI数据基础是所有AI项目的根,模型是剑,数据是靶,靶找不对,剑再锋利也没用,不管你是刚入门学AI,还是做项目落地,把数据工作做好,就已经超过大部分人了。
- 如果你是刚入门:先从开源数据集练手,把数据集划分、预处理、训练整个流程跑通,不用急着自己做数据集,把基础逻辑搞懂再说;
- 如果你要做毕设/小项目:优先控制数据质量,标注一定要抽验,做好去重,数据对齐场景,不要贪多,一千张高质量数据足够做出一个不错的项目;
- 如果你要做落地项目:一定要做好数据分布对齐,严格避免数据泄露,定期用新数据更新模型,质量优先,不要追求大而全。
我刚入门的时候,所有人都在讲模型,没人讲数据,走了太多弯路,所以把这些经验整理出来,希望能帮到大家。
更多推荐


所有评论(0)