资讯动态

Scikit-learn模型评估实战:从数据划分到超参数调优

发布时间:2026/10/9 10:38:51 来源:尧图企业网站定制
在机器学习项目整个流程里模型评估经常被当成最后一步来对待训练完看眼准确率高就收工低就继续调调完再看。很多用Scikit-learn的初学者都是这样过来的我也不例外。真正踩过几次坑之后才明白评估不是一个“跑一下出个分数”的动作而是一个贯穿数据准备、特征工程、模型选择和超参调优全过程的判断框架。你选了哪种指标、怎么切数据都会直接影响对模型的判断。哪怕你完整学完吴恩达的机器学习课或者在网上看过大量入门教程一旦开始亲手调一个真实的Scikit-learn项目很快就会发现模型评估才是真正拉开水平的地方。这篇内容我打算以Scikit-learn为主线把机器学习模型评估里的核心环节——数据划分、交叉验证、分类/回归指标、模型选择与超参调优、常见问题排查——完整梳理一遍。适合刚开始接触机器学习、想弄清“模型到底好不好”的新手也适合已经在用Scikit-learn、但发现测试集和交叉验证结果对不上或者被准确率误导过的同学。看完你至少能建立起一套可复用的评估流程而不是每次靠猜测。1. 模型评估的本质先搞懂你衡量的到底是什么1.1 评估的本质是泛化能力不是记忆能力机器学习模型的任务是从训练数据里学到规律再把这些规律用在新数据上。这个过程很像学生备考平时作业做得再好最终要看的是考场上那些没见过的题能不能答对。训练集就是练习册测试集就是考场试卷。如果一个人练习册拿满分一到考场就歇菜说明他不是学会了知识而是把题目和答案背下来了。机器学习里的过拟合就是这种“背诵”行为——模型把训练样本里那些不该记的细节和噪声也记住了测试集表现自然变差。所以模型评估的本质是评估模型在未见数据上的表现也就是泛化能力。Scikit-learn提供的各类评估函数本质上都在帮你量化“未见数据表现”这件事。你要把这个底层目的放在心里否则很容易在评估指标的细节里迷失方向。我见过有人花大量时间比较0.95和0.96的准确率差异却连测试集和验证集的区别都还没搞清楚这是典型的把评估当成了“交作业”而不是“诊断”。1.2 偏差与方差评估结果背后的两种“病因”评估不只是给一个分数还要帮你看懂模型得的是什么病。这里绕不开偏差和方差这两个概念。可以用打靶来理解高偏差就是你每次都打偏落点集中在靶心外侧对应欠拟合高方差就是你每次打得忽左忽右、分散得很对应过拟合。实际训练中高偏差的典型表现是训练集分数和验证集分数都不高高方差的典型表现是训练集分数很高、验证集分数明显偏低。这两类情况的应对方式完全不同。举个例子在Scikit-learn里训练一个决策树把max_depth从1慢慢加到几十。训练集准确率一路上升从不足80%到接近100%而测试集分数往往是先上升、到某个深度后反而下降。这条曲线的形状其实就是偏差-方差曲线。你不需要每次都把它画出来但必须理解看到训练集分数高、测试集分数低说明方差偏大优先考虑正则化、降低模型复杂度或者增加数据两边都低说明偏差偏大优先考虑换更强的模型、加特征或者调整特征工程。评估的价值就是帮你做这类诊断决策。2. 数据划分评估的第一道关卡2.1 train_test_split的参数你真的用对了吗绝大多数评估流程都从划分数据开始。Scikit-learn最基础的划分工具是train_test_split但它的几个参数对评估结果影响很大。from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy )test_size0.2表示拿20%的样本做测试集剩下的80%做训练集这是比较常见的比例。数据量很大时test_size稍微小一点也能接受因为测试集只要足够代表整体分布就行数据量很小时建议用交叉验证代替单次划分。random_state42是一个随机种子设了它之后每次执行代码得到的划分结果都完全一样实验可以复现。我自己的习惯是固定一个种子但会在不同种子上多跑几次观察评估结果是否稳定不能因为一个种子的结果好就认定模型一定好那是典型的“幸存者偏差”。stratifyy是给分类任务用的分层参数。它会让训练集和测试集里的类别比例尽量和原始数据保持一致。如果数据里有90%负类和10%正类不设置stratify随机划分很可能导致测试集里只有一两个正类甚至没有正类模型评估就会失真。对于回归问题目标变量是连续值不能用stratify需要靠其他方式保证划分合理性。2.2 分层采样为什么是分类任务的默认选择分层采样是分类任务里特别容易被忽略但特别重要的机制。比如二分类数据正负比是9:1样本总量只有1000个。普通随机划分测试集为20%时理论上测试集中应该有约20个正类但实际随机性很大有时正类只剩几个甚至一个都没有。如果测试集里没有足够的正类模型对正类的召回率就无从谈起了。StratifiedKFold和train_test_split里的stratify参数都做了同样的事按类别比例分层抽样。Scikit-learn在分类模型里使用交叉验证时如果cv参数直接传整数内部会默认采用StratifiedKFold而不是普通KFold这算是一个“隐藏默认值”不少老手也是后面才注意到的。你应该善用这个机制但也要意识到它只能保证比例一致并不等于测试集完全代表真实分布样本量小的时候仍然需要谨慎。2.3 时间序列和分组数据划分方式不能照搬train_test_split默认会shuffle数据也就是打乱顺序后再划分。这对大多数表格任务是合理的但对时间序列数据是个坑。假如你有一批按时间排序的销售数据要预测未来一天的销量如果打乱划分相当于用未来的数据去预测过去评估结果会严重偏乐观上线后才会发现模型根本扛不住真实时序。Scikit-learn提供了TimeSeriesSplit专门处理这类问题。它按时间顺序划分训练集和验证集训练集永远是较早的数据验证集永远是较晚的数据。在实际项目里我还会额外留出一段最晚期的数据作为最终测试集因为时序模型真正的考验是“未来”。还有一种情况是分组数据。比如医疗数据里同一个病人有多条记录或者用户行为数据里同一个用户有多条日志。如果直接用train_test_split随机划分同一个人的部分数据可能出现在训练集另一部分出现在测试集模型等于提前“见过这个人”评估结果其实是作弊。这时候要使用GroupKFold或GroupShuffleSplit按组为单位划分保证同一个人的数据要么全在训练集要么全在验证集。这类数据泄漏在竞赛和真实业务里都很常见也是最难排查的问题之一。3. 交叉验证让评估结果稳定而不是靠运气3.1 K折交叉验证的原理和Scikit-learn实现单次训练测试划分的结果受随机因素影响很大训练集和测试集怎么切直接决定分数高低。为了更稳定通常采用K折交叉验证把训练数据分成K份依次拿一份做验证、剩下K-1份做训练重复K次最后把K个验证分数取平均。这相当于做了K次独立的模拟考试结果比单次划分可靠得多。在Scikit-learn里最简单的方式是cross_val_scorefrom sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier scores cross_val_score(model, X, y, cv5, scoringaccuracy) print(scores, scores.mean(), scores.std())这里传入的是完整数据集X和ycross_val_score会自动完成划分和评估不再需要提前切train_test_split。cv5表示做5折交叉验证。前文说过当cv为整数且模型是分类器时Scikit-learn默认用StratifiedKFold当模型是回归器时默认用普通KFold。很多人忽略这一点其实它已经帮你做了分层采样。那K值怎么选K越大每一折训练数据越多模型学习得更充分评估偏差越小但同时每一折验证集也越小验证分数波动会变大计算成本也会成倍上升。5或10是实践中最常用的值。如果你的数据量只有一两百条可以考虑更大的K甚至用留一法。3.2 cross_validate比cross_val_score多给你什么cross_val_score只能评估一个指标很多时候不够用。比如你既想看准确率又想同时看F1和AUC如果分别跑两次不仅慢而且两次的划分还不一定一样。Scikit-learn提供了cross_validate可以一次返回多个指标还能拿到训练时间等信息。from sklearn.model_selection import cross_validate scores cross_validate( model, X, y, cv5, scoring{accuracy: accuracy, f1: f1, roc_auc: roc_auc} ) print(scores[test_accuracy]) print(scores[test_f1])返回结果是一个字典键名是test_accuracy、test_f1这类直接对应你在scoring里指定的名称。多指标同时观察能避免你只盯着一个指标做出偏颇的判断。比如准确率不错但F1很低说明类别不平衡问题依然严重AUC很高但精确率很低说明模型排名能力不错但阈值选择不对。这些信息在cross_val_score里很难一次拿到。3.3 KFold、StratifiedKFold、GroupKFold和RepeatedKFold怎么选交叉验证策略不止一个选错策略等于评估从源头就跑偏。我把常用几种整理成了对照表交叉验证器主要用途说明KFold普通回归/无分层需求的分类将所有样本平均分成K份轮流验证StratifiedKFold分类任务每一折保持原始类别比例比KFold更稳GroupKFold同一组样本不能分开的场景按组划分防止同组数据同时出现在训练和验证RepeatedKFold样本量小、结果波动大的场景重复多次K折用多次的平均值降低方差LeaveOneOut样本量极小的场景每个样本单独做一次验证计算量大我平时用的最多的是StratifiedKFold只要任务是分类都会优先考虑。如果你自定义了交叉验证器同时希望它分出来的折能保持类别比例也可以在构建StratifiedKFold之前确认好样本顺序。RepeatedKFold则适合样本量不太大、单次K折分数起伏明显的情况它会把整个K折过程重复若干次所有折的验证分数合并统计结果更稳定。在Scikit-learn里这类重复交叉验证器是RepeatedKFold和RepeatedStratifiedKFold两个类。3.4 留一法LOOCV什么时候值得用留一法LeaveOneOut是最极端的K折K等于样本数每个样本单独作为验证集一次其他所有样本用来训练。这意味着如果样本有100条就要训练100次模型。它的好处是几乎用到了所有数据评估结果偏差很小坏处是方差可能偏大而且计算成本极高因为每次训练集高度相似模型训练重复度大。如果样本量只有几十条、模型训练也很快LOOCV是可以考虑的选项。但大多数中等规模以上的数据集我更推荐RepeatedStratifiedKFold它的计算效率更高而且多次重复能同时照顾偏差和方差。4. 分类模型评估指标准确率之外还有一整片海洋4.1 混淆矩阵所有分类指标的老家很多人一上来就用accuracy_score这个指标在类别平衡时还能用在类别不平衡或业务场景复杂时很容易骗人。要看透分类指标建议先从混淆矩阵开始。以二分类垃圾邮件过滤为例真实情况是“这个邮件确实是垃圾”或“这不是垃圾”模型预测也会给出“判断为垃圾”或“判断为正常”于是产生四种组合实际垃圾邮件实际正常邮件预测为垃圾TP真阳性FP假阳性预测为正常FN假阴性TN真阴性准确率就是(TPTN)/总样本数表示整体预测正确的比例。精确率precision是TP/(TPFP)衡量的是“模型说这是垃圾邮件时到底说对了几成”。召回率recall是TP/(TPFN)衡量的是“真正的垃圾邮件里模型抓回了几成”。F1则把精确率和召回率压缩成一个数值是两者的调和平均。调和平均对较小值更敏感所以只有当精确率和召回率都不错时F1才会高这符合大多数业务的实际需求。Scikit-learn中可以直接用classification_report一次性输出这些都指标。4.2 精确率和召回率的取舍看业务到底怕什么精确率和召回率通常没法同时达到很高你需要根据业务场景做取舍。垃圾邮件场景里把一封重要用户邮件误判为垃圾邮件代价可能是用户错过重要合同所以企业往往更看重精确率宁可漏掉一部分垃圾邮件也不冤枉正常邮件。反过来癌症早筛场景里漏检一个真正患者带来的后果非常严重模型宁可多做进一步检查也要尽量把患者找出来此时召回率优先。实际用Scikit-learn时除了F1你还可以用fbeta_score来调整侧重。beta1就是标准F1beta1时更看重召回率beta1时更看重精确率。我在做工业项目时习惯把accuracy、precision、recall、f1全部打印出来看而不是只挑一个。因为不同业务阶段、不同风险偏好下最终取舍可能完全不一样。4.3 类别不平衡用PR曲线而不是准确率当数据里正类占比很低时准确率就变成了一个陷阱。假设1%的样本是垃圾邮件模型把所有邮件都预测为正常邮件准确率也能高达99%但模型实际上一个垃圾邮件都没抓到。这种情况下真正应该看的是Precision-Recall曲线PR曲线。Scikit-learn里可以用precision_recall_curve得到不同阈值下精确率和召回率的对应关系用average_precision_score把这条曲线压缩成单个数值方便不同模型之间对比。PR曲线对类别不平衡非常敏感正类占比越低基线越低模型在PR曲线上表现越能反映真实能力。这里有一个特别容易犯的认知错误PR曲线的基线和0.5没有关系而是等于正类比例。正类只有1%时无脑把所有样本判为正类precision就是0.01。所以看到AP为0.2时先对比基线0.01才知道模型其实已经提升了不少。4.4 ROC曲线与AUC衡量排序能力ROC曲线和AUC是又一对经典评估工具。ROC曲线以假阳性率FPR为横轴真正率TPR为纵轴AUC是曲线下方的面积。宏观理解AUC表示模型把随机的正样本排在随机的负样本前面的概率它只关心排序不依赖具体阈值所以常用来做模型选择。Scikit-learn里用roc_curve和roc_auc_score就能完成计算。AUC1是完美排序AUC0.5等于随机猜。类别不平衡时AUC依然能给出相对稳定的判断但当正类比例极低时AUC也可能显得偏乐观因为假阳性的大量积累要在曲线末端才体现出来。所以我的建议是通用场景下可以同时报告ROC-AUC和PR-AUC如果做的是异常检测、欺诈识别这类极度不平衡的任务PR-AUC参考价值更高。4.5 多分类宏平均和微平均多分类问题的评估要更复杂一些因为每个类别都有自己的精确率、召回率和F1。Scikit-learn的classification_report会输出每一类的指标以及macro avg和weighted avg两行汇总。宏平均是对所有类别的指标做简单算术平均平等对待每个类别稀有类别表现不好就会被明显拉低weighted avg则按每个类别的样本量加权样本多的类别占主导。如果你的业务比较关心少数类应该优先看macro avg和少数类自己的指标。比如工业生产里99%是正常产品1%是瑕疵产品模型的宏平均F1会因为这个弱势类别而变得很难看而这恰恰反映了业务痛点。只要在报告里能清楚看到每个类别的明细你才能定位问题。5. 回归模型评估指标误差要放在同一把尺子下看5.1 MSE、RMSE、MAE与R²各代表什么回归问题和分类完全不同不能用准确率来评估。最常用的是均方误差MSE、均方根误差RMSE、平均绝对误差MAE和决定系数R²。MSE把所有误差取平方再平均相当于对大的误差加了更重的惩罚。RMSE是MSE的平方根单位和你预测的目标变量一致方便直接解释。MAE则是误差绝对值的平均它对每个样本的惩罚是线性的不容易被极端值牵着走。R²是决定系数表示模型解释了目标变量多少方差1代表完美0代表模型效果等同于直接预测均值负数表示比直接预测均值还要差。实际使用中我建议把这些指标一起打印出来from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error import numpy as np y_pred model.predict(X_test) print(R2:, r2_score(y_test, y_pred)) print(RMSE:, np.sqrt(mean_squared_error(y_test, y_pred))) print(MAE:, mean_absolute_error(y_test, y_pred))如果RMSE和MAE差距大说明误差分布里存在不少离群点大的误差把RMSE拉高了。这时候你要么去找数据里的异常值要么换用对噪声更稳健的评估方式。5.2 残差图比指标更完整的诊断工具指标把所有样本的误差压成了一个数好处是方便对比坏处是压扁之后误差的结构信息全丢了。比如模型在预测值小的时候误差很小在预测值大的时候误差明显增大这种异方差性用RMSE看不出来但残差图一眼就能发现。残差就是y_test - y_pred。画残差图时横轴是预测值纵轴是残差。理想情况下残差应该随机散布在0附近没有明显规律。如果残差随着预测值增大呈现出漏斗形扩散说明大预测值的误差波动更大可能需要给目标变量做对数变换或加权损失。如果残差呈现明显的曲线形状说明模型漏掉了某些非线性关系考虑加特征或换模型。我的习惯是每次回归实验做完先看残差图再去看指标因为指标告诉我“模型差多少”残差图告诉我“差在哪”。5.3 噪声数据下的回归评估不要被离群点绑架网上很多人把噪声数据和离群点混在一起谈但实际上它们需要区别对待。噪声是测量误差、环境干扰带来的随机波动离群点可能是真实但极端的情况。在评估回归模型时如果数据里存在大量离群点MSE会被少数几个异常值主导RMSE高得离谱但实际上模型在大多数正常样本上表现并不差。应对方式有两种。第一评估时改用MAE或者median_absolute_error它们对离群点的敏感度远低于MSE。第二训练时改用HuberRegressor这类鲁棒回归模型它会在误差较小时使用类似MSE的更新在误差较大时切换为线性损失相当于自动给极端样本降权。我的经验是先看数据分布如果离群点占比很低优先用鲁棒评估指标如果离群点占比不低且包含重要业务信息那就不能简单剔除而要专门建模处理。6. 模型选择与超参数调优评估的最终落脚点6.1 GridSearchCV在网格里找到最优超参数模型评估最终要服务于决策。最常见的决策就是选择模型超参数。GridSearchCV的做法是把候选超参数组合成网格对每一组都做交叉验证选出平均分数最高的一组。from sklearn.model_selection import GridSearchCV from sklearn.svm import SVC param_grid {C: [0.1, 1, 10], gamma: [0.01, 0.1, 1]} gs GridSearchCV(SVC(), param_grid, cv5, scoringaccuracy) gs.fit(X_train, y_train) print(gs.best_params_, gs.best_score_) print(gs.score(X_test, y_test))这里有一个超级常见的坑gs.best_score_是训练集上交叉验证得到的分数它不等于测试集成绩。很多人混淆这两者把best_score_当成模型最终效果甚至直接拿它写报告结果上线后被打脸。正确的做法是用网格搜索选出的最优参数重新评估测试集并且确保整个调参过程完全不碰测试集。测试集应该像“考卷”一样被锁起来所有网格搜索、比较模型、看学习曲线的操作都应该在训练集的交叉验证上进行。GridSearchCV内部的CV机制本质上是在训练集里再切出验证集来寻参避免直接把超参数拟合到测试集上。6.2 RandomizedSearchCV高维空间里更高效的搜索方式网格搜索的问题是组合爆炸。超参数一多比如随机森林的n_estimators、max_depth、min_samples_split、max_features每个参数给几个候选值组合后的网格可能达到几千组每组都要跑一次交叉验证计算量根本无法接受。RandomizedSearchCV的思路是固定一个预算n_iter每次从参数的候选分布中随机抽取一组组合只跑n_iter次交叉验证。虽然它不保证覆盖所有网格但实际效果往往比同预算的网格搜索更好因为很多超参数对模型性能的影响并不均衡网格搜索会把大量预算浪费在无关紧要的维度上。新版本Scikit-learn还提供了HalvingGridSearchCV和HalvingRandomSearchCV先在小样本上快速淘汰一半较差组合再用更多数据评估剩下的候选效率更高逻辑也很直觉。6.3 嵌套交叉验证防止调参过程污染评估结果假设你先在训练集上用GridSearchCV选出一组最优参数然后用cross_val_score在这个训练集上再次做5折交叉验证得到的分数是否有说服力答案是要打折扣的因为你在选参数时已经看过整个训练集的交叉验证结果这会让后续的评估偏差往乐观方向走这种偏差在样本量越小、超参数组合越多时越明显。嵌套交叉验证是应对这个问题的严谨方案。外层循环负责评估模型在新数据上的泛化表现内层循环负责调参。也就是说外层每折划分后都只针对外层的训练部分再做一次内部的交叉验证来选择超参数选好后用外层的验证部分评分。计算量很大但结果是可信的学术级评估。如果只是做业务项目不一定每次都要嵌套但在写论文、评估方法论对比这类场景一定要用嵌套交叉验证否则评审很容易指出评估漏洞。6.4 学习曲线和验证曲线判断下一步改哪里模型评估不应该停留在“分数多少”还应该告诉你“下一步该干什么”。learning_curve是判断是否要加数据的关键工具。它把训练集大小设为横轴训练分数和验证分数设为纵轴。看到训练分数一直很高、验证分数较低且两者之间存在明显差距说明模型处于过拟合状态增加数据往往能有效缩小差距。看到两条曲线都偏低并且靠得很近说明模型更可能是欠拟合增加数据帮助不大应该考虑换更强模型、增加特征或减少正则化。validation_curve则是变化某个超参数观察训练和验证分数的变化路径。比如决策树max_depth从1增加到20你能在图上清楚看到验证分数什么时候见顶这个点就是过拟合开始的位置。这类图形是我每次实验里一定会看的因为我需要知道模型是“容量不够”还是“数据不够”还是“特征不够”评估的目的就是让你少走弯路。7. 常见问题与排查技巧实录7.1 为什么交叉验证分数总是不稳定不少人遇到过这种状况同一份数据连续跑两次交叉验证分数忽高忽低甚至差好几个百分点。最常见的原因是随机种子没固定。不设random_state每次划分、每次模型内部采样都不同结果自然飘。先把random_state和各类交叉验证器的状态固定下来实验才有可能复现。固定种子后分数还是波动大就要考虑数据本身了。样本量太小、类别比例很不均匀、数据分布包含多个差异明显的子群体都会让单次交叉验证的分数像坐过山车。我建议改用RepeatedStratifiedKFold把K折交叉验证重复执行多轮用所有轮次的平均值和标准差来报告结果。只要标准差不太大这个平均分比单次K折分数要可靠得多。7.2 测试集上的表现远差于交叉验证结果怎么办这是最经典也最痛的问题。通常有三个原因数据泄漏、分布漂移、调参污染。数据泄漏往往发生在数据预处理阶段。如果先对全量数据做了标准化、PCA或者特征选择然后再划分训练集和测试集那么测试集的信息已经在预处理过程中被模型间接看到。正确做法是把预处理放进Pipeline里让标准化在每个交叉验证折内部单独执行from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression pipe Pipeline([ (scaler, StandardScaler()), (clf, LogisticRegression()) ]) cross_val_score(pipe, X, y, cv5)这样每一折都是在训练部分fit标准化器再用它transform验证部分杜绝泄漏。这个坑我反复踩过尤其是特征选择配合交叉验证时最容易出错。分布漂移是另一个原因。训练数据来自过去几个月测试数据来自最近一两周的线上流量用户行为本身变了模型效果自然下滑。这类问题需要在业务层面持续监测数据分布不能指望一个模型永远有效。调参污染则是把测试集反复拿来比较模型、选择参数最后模型对测试集也“背下来了”线下分数虚高线上回归。解决办法只有一个把测试集锁死只在验证集上做选择。7.3 类别极度不平衡、噪声数据多时的评估建议在异常检测、欺诈识别这类场景里类别不平衡和噪声数据往往同时出现。我的建议是评估时优先用StratifiedKFold指标用PR-AUC、macro F1同时单列少数类的精确率和召回率。准确率的参考价值在这种场景里几乎为零。如果噪声特别多先做探索性分析画出目标变量的分布和箱线图确认极端值的比例。离群点占比在1%以下可以考虑用HuberRegressor或直接改用MAE作为评估指标占比超过5%就要认真考虑这些极端值是不是业务里真实存在的风险信号。另外特别提醒SMOTE这类过采样方法只能作用于训练集如果对整个数据集做SMOTE再划分会造成严重的泄漏评估结果完全失真。7.4 预测概率校准评估的最后一公里如果模型不只是给出分类结果还要输出概率比如点击率预估、信用评分那么指标之上还需要做概率校准检查。Scikit-learn里有calibration_curve可以画出模型预测概率和真实频率之间的关系。如果预测概率0.8的样本里真实正例比例只有0.6说明概率严重失真直接拿去做风控阈值会很危险。解决方法是使用CalibratedClassifierCV做校准它会用独立的验证集把模型输出概率映射到更接近真实频率的范围。这件事在单看AUC或F1时是察觉不到的但对实际业务落地影响巨大。我的习惯是凡是做概率输出的项目正式评估报告里一定会附一张校准曲线图。关于模型评估我自己的体会是它不是一个函数调用而是一种思考方式。每次实验之前先把评估方案定下来——用哪种数据划分策略、什么指标、是否重复交叉验证——再开始训练。否则你会发现自己在不断调参数、看分数却始终说不清模型到底好在哪、差在哪。另一个小经验是养成把评估指标和划分策略写进代码配置的习惯每次实验固定下来团队讨论时大家聊的是同一个“分数”而不是各自跑了不同验证集、不同种子得出完全不同的结论最后陷入无休止的口水战。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑