17分钟带你避开所有机器学习新手常犯的错误!
机器学习初学者常犯的所有错误以及如何避免这些错误,涵盖从数据准备到模型评估的所有内容,主要有以下5个领域
Data-Related Issues(与数据相关的问题)
Model Training Pitfalls(模型训练中的常见陷阱)
Implementation Problems(实现过程中的问题)
Evaluation Mistakes(评估中的错误)
Common Beginner Traps(初学者常犯的错误)
如何发现并修复这些错误,有一种系统的方法来避免这些陷阱
通过从别人的错误中学习来建立更好的模型,而不是让自己犯错误
- Data-Related Issues
- Not cleaning your data properly
dirty data
你可能会认为几个缺失值或异常值不会造成太大影响,但它们就像白蚁一样,正在悄无声息地破坏你模型的基础
那些重复的条目正在悄然偏颇你的结果
那些格式混杂、包含特殊字符和拼写不一致的文本字段,则将你的特征提取变成了一场赌博
现实世界中的数据是混乱的,不同的拼写、不可能的值、不同的日期格式或不同的货币
跳过适当的清理就像在流沙上建房子,虽然一开始更快,但你将花两倍的时间来调试神秘的模型行为
记住,垃圾进垃圾出,无论多么复杂的建模都无法挽救糟糕的数据质量 - Forgetting to normalize/standardize
忘记对特征进行标准化或归一化处理,是许多初学者在建模时容易忽略的关键步骤
当特征处于不同量级时(例如,基于房屋面积预测房价与基于卧室数量预测房价),模型无法有效从数据中学习
想象一下梯度下降算法在处理这些不均匀量级时的情景,这就像同时调整显微镜和望远镜一样困难
算法难以找到合适的步长,导致训练速度缓慢且效果不佳
解决方法很简单,但非常重要,将特征标准化为零均值和单位方差,或将其缩放至0到1之间
这将使所有特征处于平等的竞争环境,让模型能够专注于发现数据中的真实模式 - Data leakage
数据泄露是指测试集或验证集中的信息意外渗入训练过程
这是最危险的错误之一,因为它会导致训练结果出现虚假乐观的结论,而在实际生产环境中这些结论往往会失效
一个常见的例子是,在分割数据集之前对整个数据集进行预处理,如果你使用整个数据集的统计信息进行标准化,你就让测试数据影响了你的训练过程,你的模型得以一窥它本不该看到的内容
正确的方法虽然简单但严格,首先分割数据集,然后分别对训练集、验证集和测试集进行预处理,你的验证集和测试集在特定的评估阶段之前应完全未被触碰 - Class imbalance issues
类不平衡是指数据集中不同类别样本数量存在巨大差异
以欺诈检测为例,你可能拥有数百万笔正常交易记录,但仅有数十笔欺诈交易记录
如果你忽略这种不平衡,你的模型可能会通过每次都预测正常来实现99%的准确率,但在实际应用中这毫无用处,而且在训练过程中,你的模型几乎无法从少数类别的示例中学习
解决方案?使用诸如对少数类别进行过采样、对多数类别进行欠采样,或使用合成数据生成技术(如Smoke)等方法,并且始终使用考虑类不平衡的适当指标,如精确率召回率曲线,而不仅仅是准确率,关于这一点,我们稍后再详细讨论 - Not handling missing values correctly
数据集中的缺失值可能会严重影响模型性能
初学者常犯两种错误:要么删除包含缺失值的行,从而丢失潜在的有价值数据,要么盲目用均值或零填充缺失值
每个缺失值都需要根据其缺失原因进行适当处理,有时缺失是随机的,有时则具有特定含义,例如客户故意跳过调查问题,解决方法可能是使用均值、中位数或更复杂的方法(如k近邻算法或回归)进行插值
请记住,缺失值本身可能包含信息,例如,缺失的收入字段可能表明失业,这是信号,而非噪声,因此,如果你认为缺失性是有意义的,可以将其编码为新特征,例如一个名为“缺失字段”的布尔特征,该特征本身可能通过错误的指标预测目标变量
- Model Training
- Using wrong metrics
选择错误的指标是机器学习中的经典陷阱
仅凭准确率可能具有误导性,回顾之前的类不平衡示例,在一个99%数据属于单一类的数据集上,99%的准确率并不代表好模型,准确率不适用于不平衡数据集
你需要使用精确率、召回率或F1分数,对于排序问题,可使用MAP或NDCG等指标,对于回归问题,RMC或MAE可能比R平方更合适
合适的指标不仅取决于问题类型,还取决于问题在现实世界中的影响,始终牢记项目目标
在医学诊断中,你可能更关心避免假阴性而非假阳性,例如,在预测癌症的诊断工具中,漏诊潜在癌症比将良性肿瘤误判为癌症(随后可通过二次检测快速排除)更严重
选择与实际目标一致的指标 - Overfitting/underfitting
过拟合发生在模型记忆训练数据而非学习通用模式时,它在训练数据上表现出色,但在新数据上却失败,就像一个学生死记硬背考试答案却不理解概念一样
欠拟合则相反,模型过于简单,无法捕捉重要模式,即使在训练数据上表现也差,就像试图用直线拟合曲线数据一样
平衡点在于模型复杂度与训练时间,这是机器学习的核心
我在其他视频中讨论过偏置-方差权衡的重要性,不妨看看那些视频,使用交叉验证、正则化及早停等技术来找到最佳平衡点
你的训练曲线与验证曲线如何?若两者出现分歧,很可能因学习率设置不当导致过拟合 - Wrong learning rate
学习率是控制模型在训练过程中调整权重程度的关键超参数
过高会导致模型超过最优值,可能导致过低,训练速度缓慢,可能陷入局部最优
注意警示信号,如果损失函数剧烈波动,学习率过高,如果几乎没有改善,学习率过低
从常见默认值如0.01或0.001开始,并考虑在训练过程中动态调整学习率的策略。 - Poor hyperparameter choices
超参数选择不当会严重影响模型的性能
常见错误包括使用任意批量大小、随机选择网络架构,或从无关问题中复制参数
这些选择需要系统性调优,可采用网格搜索、随机搜索、概率优化等技术寻找最优值,记录实验过程,对一个数据集有效的方案可能在另一个数据集上失效
然而,需注意过度进行网格搜索,尤其在数据集规模不大时,这可能导致模型对验证集过拟合,并在真实数据上表现不佳
与其穷尽所有超参数组合,不如采用更具策略性的方法,可先设置粗略的网格,使用间隔较大的初始值,随后对有潜力的区域进行更精细的调整,或考虑随机搜索,其往往能比网格搜索更高效地找到优质解 - Not using cross-validation
不使用交叉验证是评估模型性能的关键
仅在单一数据集上进行训练和测试,就像仅凭一顿饭来评判一位厨师的水平,你可能会碰运气,也可能运气不佳
相反,应使用K折交叉验证在不同数据集分割上测试模型,这能展示模型在不同数据子集中的表现,为你提供更贴近实际应用的性能估算
注意分层和分类问题,确保每个折叠保持与完整数据集相同的类分布,确保折叠是随机选择的
- Implementation
- Train/test set contamination
快速区分污染与数据泄露,数据泄露是指测试或验证信息通过间接方式(如特征缩放、使用全部数据的统计信息或利用未来时间戳信息提取特征)微妙地影响训练过程
训练集与测试集污染则是更直接的滥用行为,例如明确使用测试数据进行超参数调优、使用测试样本进行模型选择或直接在测试数据上进行训练,这通常是对训练集与测试集分离原则的更明显违反
训练测试集污染比数据泄露更严重,因为它会破坏整个评估设置,修复起来也更困难,因为你现在需要一个全新的测试集,因为原来的测试集已不再有效
常见的例子包括使用测试数据进行超参数调优,或在包含测试集的完整数据集上进行特征选择
最终得到的乐观结果无法反映实际性能,始终确保测试集完全独立,将其视为只能使用一次的最终考试 - Wrong loss function
使用错误的损失函数会干扰模型的学习过程
损失函数需要与问题类型相匹配,例如使用均方误差(MSE)进行分类或二元交叉熵(binary cross entropy)进行回归,否则会干扰模型的学习过程
分类任务通常需要交叉熵损失函数,而回归任务通常需要MSE或Ma损失函数
对于特定问题,如排序或目标检测,您需要使用专门的损失函数来捕捉正确的目标
与选择正确的指标类似,选择正确的损失函数取决于问题的目标,始终牢记您的实际目标 - Incorrect feature encoding
特征编码错误是处理类别变量时的一大关键问题
常见错误包括对名义类别使用标签编码、创建虚假的普通关系,或完全忘记对类别变量进行编码
以颜色特征为例,其取值为红色、蓝色和绿色,标签编码会将这些值转换为红色等于0、蓝色等于1、绿色等于2,问题在于,模型现在认为绿色大于蓝色,它假设蓝色位于红色和绿色之间,这些数值关系完全是人为的,颜色本身没有自然的排序关系
文本变量需要正确的编码方式,无论是one-hot编码、标签编码还是嵌入编码
序数特征应保留其自然顺序,并始终处理可能出现在测试数据中的未知类别
与往常一样,在准备数据时,请始终将现实世界目标和直觉放在心上,而不是盲目操作,这往往比使用更强大的算法更为重要。 - Not shuffling data
不打乱数据可能会严重偏倚模型训练
如果您的数据集按时间序列或按类别排序,模型会学习这些人为模式而非真实关系
在批量训练过程中,未打乱的数据意味着每个批次可能包含相似示例,例如本例中代理人明显是按县分组的。这会导致梯度更新不稳定和学习效果差
在创建批次前,请务必随机打乱训练数据 - Memory management issues
内存管理常让许多机器学习新手措手不及,一次性加载过多数据、保留不必要的变量在内存中,或在训练运行之间未清除GPU内存,都可能导致系统崩溃
对于大型数据集,应使用批处理或数据生成器
当模型权重和梯度不再需要时,应及时清除
特别是在使用GPU时,需密切监控内存使用情况
- Evaluation
- Not checking for bias
模型偏差可能以多种形式出现,例如人口统计偏差、训练数据中的选择性偏差,或类别不平衡导致的偏差
模型可能会在性别或种族上表现出歧视性行为,如果这些偏差存在于训练数据中,比如在这个例子中可以看到,模型对男性和肤色较浅的人处理得更好,可能是因为数据集中这类样本数量更多
因此,你需要在不同的子群体和场景下对模型进行测试,检查其在各种人群和边缘情况中的预测表现,并清晰记录任何发现的偏差 - Ignoring model assumptions
每种机器学习算法都有其内在假设
例如,线性回归假设变量之间存在线性关系且误差相互独立;朴素贝叶斯(Naive Bayes)则假设各个特征之间是独立的
如果这些假设被违背,模型性能就会大打折扣,因此,务必检查你的数据分布和特征之间的关系
以下是忽视模型假设的一些典型错误例子:
线性回归:用于指数增长的数据,却期望获得良好的拟合效果
朴素贝叶斯:将“New York”分成两个独立的词“New”和“York”,忽略了它们是一个整体
时间序列:使用普通的交叉验证而不是时间顺序划分,从而等于用未来预测过去
K 均值聚类(K-means):应用在螺旋形的数据上,而它本质假设簇是圆形的
K 近邻(K-NN):直接用于高维数据,却没有进行特征选择或归一化
解决方法:
要么对数据进行变换以满足模型假设
要么选择适合你数据特点的算法 - Poor validation strategy
糟糕的验证策略会破坏整个模型评估的可靠性
常见错误包括:
仅使用一次性划分的训练集和测试集,没有在划分中进行分层处理(如类别比例不均衡时),或者将验证数据泄露到了训练过程中
应根据具体问题选择合适的交叉验证方法:
时间序列任务应使用时间顺序划分
用户相关的数据应采用基于用户的划分
确保划分是随机且具有代表性的,验证过程应尽可能贴近真实世界的数据情况和分布 - Misinterpreting results
误解模型结果会导致对模型性能的错误判断
要真正理解模型的表现,不能只看整体指标,还要深入分析模型的实际行为
即使评估指标看起来很好,模型在某些特定子群体、边缘情况,或面对真实世界中与测试条件不同的数据时,可能会出现系统性失败
要检查每个预测结果,特别是错误预测,它们往往揭示出在总体统计中无法察觉的规律
你需要思考:
是否某类错误更频繁?失败是否集中出现在某些特定条件下?
比如,一个客户流失预测模型整体表现不错,但却经常无法识别即将流失的高价值客户,这种问题,只有通过细致的错误分析才能发现
再比如,一个制造缺陷检测系统,初看之下性能极佳,准确率高达99%,看似完美地支持了质控流程,但当我们分析其在不同条件下的错误模式时,发现了一个严重问题:在夏季热浪期间,模型性能急剧下降,虽然这些炎热天气仅占总运行时间的15%,但它们恰好对应着产量最高的季节, 在这些温度超过30℃的时间段内,准确率下降到了62%,结果是在最需要模型可靠性的时候,质控系统却变得不可靠了
- Common Pitfalls
- Using complex models too early
过早使用复杂模型是初学者常见的误区之一
深度学习并不是万能的解决方案——实际上,在很多情况下,它反而不是最优选择
更简单的模型,比如逻辑回归、决策树或随机森林,往往表现更好
复杂模型带来了许多缺点:
需要更多数据才能有效训练,防止过拟合
训练过程需要更多计算资源和更长时间,增加了成本和开发周期
模型难以解释和调试,当出错时,很难查明原因
部署和维护难度也更高,特别是在生产环境中
最好的方法是从简单模型开始,比如逻辑回归或线性回归,先建立一个基线模型
这样可以提供一个清晰的参考点,同时往往能揭示数据中的关键特征和问题本质
然后,如果确有需要,再逐步增加模型复杂度,并始终评估这种复杂度是否真的带来了足够的性能提升,值得为此付出更多代价
你会发现,很多时候,经过良好特征工程的简单模型,性能胜过复杂架构的模型
要记住,许多著名的 Kaggle 比赛的冠军方案,靠的并不是深度神经网络,而是精调的梯度提升模型(如 XGBoost、LightGBM)
关键通常在于特征工程和对问题的深入理解,而不是模型的复杂程度 - Not understanding the baseline
我们再来谈谈基线模型(baseline model)
基线模型是你设定的最低可接受性能标准,比如在回归任务中用平均值预测,在分类任务中用多数类作为预测结果
如果没有基线模型,你就无法判断复杂模型是否真的带来了提升
举个例子:
在做房价预测时,你的复杂神经网络模型的平均误差是 $50,000,乍看之下似乎很不错,但如果你用所有房子的平均价格来做预测,误差只有 $55,000,这说明你的复杂模型几乎没带来改进,又比如你的垃圾邮件分类器准确率达到了 98%,看起来很厉害,但如果你把所有邮件都标记为“非垃圾邮件”,也能有 97% 的准确率,这表明你的模型也只是略好于“瞎猜”
这两个例子都说明了:如果没有基线模型作为对比,你很容易被“看起来不错”的数字误导
所以,先测试简单模型,比如线性回归,如果它的表现和你的神经网络差不多,那你很可能是在过度复杂化问题
此外,良好的基线模型还有助于发现数据泄露
如果你的模型表现好得令人难以置信,那多半是出了问题
总结:从简单做起,逐步加深复杂度,并用基线作为参照,才能真正评估模型的价值。 - Ignoring domain knowledge
忽视领域知识是一个至关重要却常被初学者忽略的问题,甚至一些经验丰富的机器学习专家也会犯这个错误
仅靠技术手段和数据模式是远远不够的,理解业务背景、行业趋势和专业知识,才能构建真正有效的模型
领域专家可以:
帮助识别或构造重要特征
发现数据中的质量问题
验证模型预测是否在现实世界中有意义
如果没有领域知识,你可能会:
优化了错误的指标
忽略问题中的关键约束
或做出看似合理但实际上有误的结论
举两个例子:
在医疗诊断中,一个模型通过学习“那些每小时都被测量生命体征的病人更可能病情严重”而获得高准确率
但领域专家会立刻指出这是一种误导性模式——每小时检查是病情严重的结果,而不是病情的原因或预测因素
在零售销售预测中,模型可能学到“每周三销售额都会下降”
但一位零售行业专家会解释说:这其实是因为每周三进行库存更新,导致销售数据记录出现延迟,并不是真正的销量下降
这些模式在统计上看似合理,但在现实中却毫无意义。这正说明了领域知识在构建有价值模型中的重要性 - Poor documentation
文档缺失是一个常见错误,往往会在日后反复“反噬”你
你需要记录以下内容:
数据来源
预处理步骤
模型参数
实验结果等
当几个月后模型出现异常行为时,良好的文档能帮助你迅速找出原因
同时,良好的文档还能:
提高与他人的协作效率
让你更容易将项目交接给别人继续维护
请务必清晰记录模型设计的决策过程和性能指标,包括特征工程的步骤以及所有数据清洗的规则
将来的你,或者你的团队成员,一定会为你当初的认真记录而感激 - Not version controlling
缺乏版本控制和缺乏文档一样,是机器学习项目中的一大问题
如果没有版本控制,你将无法:
追踪哪些代码更改带来了性能提升
复现实验结果
或有效地与团队协作
你需要对所有内容进行版本管理,包括:
代码
数据
预处理脚本
配置文件
甚至模型的中间检查点(checkpoints)
像 Git 搭配 DVC(Data Version Control)或 MLflow 等工具
可以帮助你同时管理代码和机器学习过程中的各种“工件”(artifacts)
良好的版本控制,是可重复、可协作和可维护机器学习项目的基础
原始资料地址:
17分钟带你避开所有机器学习新手常犯的错误!
All Machine Learning Beginner Mistakes explained in 17 Min
如有侵权联系删除 仅供学习交流使用