引言
机器学习的知识体系可以用一个"艹 "型结构来概括:横线代表机器学习工程步骤,两条竖线分别对应数据处理 和模型选择两大核心模块。
本文将围绕工程步骤展开,梳理从原始数据到最终模型落地的完整流程,并对模型评估中的关键指标进行详解。
机器学习工程步骤
#mermaid-svg-SVNfyNmhbLaAJ3sl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SVNfyNmhbLaAJ3sl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SVNfyNmhbLaAJ3sl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SVNfyNmhbLaAJ3sl .error-icon{fill:#552222;}#mermaid-svg-SVNfyNmhbLaAJ3sl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SVNfyNmhbLaAJ3sl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SVNfyNmhbLaAJ3sl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SVNfyNmhbLaAJ3sl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SVNfyNmhbLaAJ3sl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SVNfyNmhbLaAJ3sl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SVNfyNmhbLaAJ3sl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SVNfyNmhbLaAJ3sl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SVNfyNmhbLaAJ3sl .marker.cross{stroke:#333333;}#mermaid-svg-SVNfyNmhbLaAJ3sl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SVNfyNmhbLaAJ3sl p{margin:0;}#mermaid-svg-SVNfyNmhbLaAJ3sl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SVNfyNmhbLaAJ3sl .cluster-label text{fill:#333;}#mermaid-svg-SVNfyNmhbLaAJ3sl .cluster-label span{color:#333;}#mermaid-svg-SVNfyNmhbLaAJ3sl .cluster-label span p{background-color:transparent;}#mermaid-svg-SVNfyNmhbLaAJ3sl .label text,#mermaid-svg-SVNfyNmhbLaAJ3sl span{fill:#333;color:#333;}#mermaid-svg-SVNfyNmhbLaAJ3sl .node rect,#mermaid-svg-SVNfyNmhbLaAJ3sl .node circle,#mermaid-svg-SVNfyNmhbLaAJ3sl .node ellipse,#mermaid-svg-SVNfyNmhbLaAJ3sl .node polygon,#mermaid-svg-SVNfyNmhbLaAJ3sl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SVNfyNmhbLaAJ3sl .rough-node .label text,#mermaid-svg-SVNfyNmhbLaAJ3sl .node .label text,#mermaid-svg-SVNfyNmhbLaAJ3sl .image-shape .label,#mermaid-svg-SVNfyNmhbLaAJ3sl .icon-shape .label{text-anchor:middle;}#mermaid-svg-SVNfyNmhbLaAJ3sl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SVNfyNmhbLaAJ3sl .rough-node .label,#mermaid-svg-SVNfyNmhbLaAJ3sl .node .label,#mermaid-svg-SVNfyNmhbLaAJ3sl .image-shape .label,#mermaid-svg-SVNfyNmhbLaAJ3sl .icon-shape .label{text-align:center;}#mermaid-svg-SVNfyNmhbLaAJ3sl .node.clickable{cursor:pointer;}#mermaid-svg-SVNfyNmhbLaAJ3sl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SVNfyNmhbLaAJ3sl .arrowheadPath{fill:#333333;}#mermaid-svg-SVNfyNmhbLaAJ3sl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SVNfyNmhbLaAJ3sl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SVNfyNmhbLaAJ3sl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SVNfyNmhbLaAJ3sl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SVNfyNmhbLaAJ3sl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SVNfyNmhbLaAJ3sl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SVNfyNmhbLaAJ3sl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SVNfyNmhbLaAJ3sl .cluster text{fill:#333;}#mermaid-svg-SVNfyNmhbLaAJ3sl .cluster span{color:#333;}#mermaid-svg-SVNfyNmhbLaAJ3sl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SVNfyNmhbLaAJ3sl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SVNfyNmhbLaAJ3sl rect.text{fill:none;stroke-width:0;}#mermaid-svg-SVNfyNmhbLaAJ3sl .icon-shape,#mermaid-svg-SVNfyNmhbLaAJ3sl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SVNfyNmhbLaAJ3sl .icon-shape p,#mermaid-svg-SVNfyNmhbLaAJ3sl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SVNfyNmhbLaAJ3sl .icon-shape .label rect,#mermaid-svg-SVNfyNmhbLaAJ3sl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SVNfyNmhbLaAJ3sl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SVNfyNmhbLaAJ3sl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SVNfyNmhbLaAJ3sl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 数据处理
模型选择
训练模型
模型预测
模型评估
保存模型
注:模型预测环节内容相对独立,主要是决定是否输出预测方差,本文暂不展开。
一、数据处理
数据是机器学习的基石,其质量直接决定模型的上限。
数据类型
- 业务数据:公司内部系统产生的结构化数据(如交易记录、用户信息)
- 日志数据:系统运行、用户行为等半结构化/非结构化日志
- 第三方数据:外部采购或合作获取的补充数据
数据来源
| 来源方式 | 说明 |
|---|---|
| 成品数据集 | 已标注好的公开数据集(如UCI、Kaggle) |
| 半成品/未标注数据 | 需要人工或自动标注的原始数据 |
| 协调获取 | 跨部门、跨组织协调共享的数据 |
| 第三方开源 | 开源社区提供的数据资源 |
| 爬虫 | 从网页抓取的公开数据 |
| 数据市场 | 商业化数据交易平台 |
| 大模型生成(蒸馏) | 利用大模型生成标注数据,即"蒸馏"技术 |
📌 关于数据处理的详细方法(清洗、特征工程、数据增强等),内容较为庞杂,将在下一篇博客中专门展开。
二、模型选择
模型选择是机器学习中的核心决策环节,需要根据任务类型(分类、回归、聚类)、数据规模、可解释性要求等因素综合考量。
📌 各类模型的原理、适用场景及选型策略,因内容较多,将在后续专题文章中详细讲解。
三、训练模型
训练阶段是将选定的模型在准备好的数据上进行学习的过程,涉及损失函数优化、参数更新等核心机制。此环节高度依赖具体的模型和框架实现,本文不展开讨论。
四、模型评估
模型评估是验证模型效果的关键步骤。评估体系围绕三个核心主题展开:
- 偏差与方差
- 欠拟合与过拟合
- 学习曲线与验证曲线
4.1 偏差与方差
- 偏差(Bias) :模型预测值的期望与真实标签之间的差距。高偏差 → 欠拟合。
- 方差(Variance) :模型在不同训练集上预测结果的波动程度。高方差 → 过拟合。
#mermaid-svg-3vyDfHY8XjIuxKQe{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3vyDfHY8XjIuxKQe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3vyDfHY8XjIuxKQe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3vyDfHY8XjIuxKQe .error-icon{fill:#552222;}#mermaid-svg-3vyDfHY8XjIuxKQe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3vyDfHY8XjIuxKQe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3vyDfHY8XjIuxKQe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3vyDfHY8XjIuxKQe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3vyDfHY8XjIuxKQe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3vyDfHY8XjIuxKQe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3vyDfHY8XjIuxKQe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3vyDfHY8XjIuxKQe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3vyDfHY8XjIuxKQe .marker.cross{stroke:#333333;}#mermaid-svg-3vyDfHY8XjIuxKQe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3vyDfHY8XjIuxKQe p{margin:0;}#mermaid-svg-3vyDfHY8XjIuxKQe .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3vyDfHY8XjIuxKQe .cluster-label text{fill:#333;}#mermaid-svg-3vyDfHY8XjIuxKQe .cluster-label span{color:#333;}#mermaid-svg-3vyDfHY8XjIuxKQe .cluster-label span p{background-color:transparent;}#mermaid-svg-3vyDfHY8XjIuxKQe .label text,#mermaid-svg-3vyDfHY8XjIuxKQe span{fill:#333;color:#333;}#mermaid-svg-3vyDfHY8XjIuxKQe .node rect,#mermaid-svg-3vyDfHY8XjIuxKQe .node circle,#mermaid-svg-3vyDfHY8XjIuxKQe .node ellipse,#mermaid-svg-3vyDfHY8XjIuxKQe .node polygon,#mermaid-svg-3vyDfHY8XjIuxKQe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3vyDfHY8XjIuxKQe .rough-node .label text,#mermaid-svg-3vyDfHY8XjIuxKQe .node .label text,#mermaid-svg-3vyDfHY8XjIuxKQe .image-shape .label,#mermaid-svg-3vyDfHY8XjIuxKQe .icon-shape .label{text-anchor:middle;}#mermaid-svg-3vyDfHY8XjIuxKQe .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3vyDfHY8XjIuxKQe .rough-node .label,#mermaid-svg-3vyDfHY8XjIuxKQe .node .label,#mermaid-svg-3vyDfHY8XjIuxKQe .image-shape .label,#mermaid-svg-3vyDfHY8XjIuxKQe .icon-shape .label{text-align:center;}#mermaid-svg-3vyDfHY8XjIuxKQe .node.clickable{cursor:pointer;}#mermaid-svg-3vyDfHY8XjIuxKQe .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3vyDfHY8XjIuxKQe .arrowheadPath{fill:#333333;}#mermaid-svg-3vyDfHY8XjIuxKQe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3vyDfHY8XjIuxKQe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3vyDfHY8XjIuxKQe .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3vyDfHY8XjIuxKQe .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3vyDfHY8XjIuxKQe .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3vyDfHY8XjIuxKQe .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3vyDfHY8XjIuxKQe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3vyDfHY8XjIuxKQe .cluster text{fill:#333;}#mermaid-svg-3vyDfHY8XjIuxKQe .cluster span{color:#333;}#mermaid-svg-3vyDfHY8XjIuxKQe div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3vyDfHY8XjIuxKQe .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3vyDfHY8XjIuxKQe rect.text{fill:none;stroke-width:0;}#mermaid-svg-3vyDfHY8XjIuxKQe .icon-shape,#mermaid-svg-3vyDfHY8XjIuxKQe .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3vyDfHY8XjIuxKQe .icon-shape p,#mermaid-svg-3vyDfHY8XjIuxKQe .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3vyDfHY8XjIuxKQe .icon-shape .label rect,#mermaid-svg-3vyDfHY8XjIuxKQe .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3vyDfHY8XjIuxKQe .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3vyDfHY8XjIuxKQe .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3vyDfHY8XjIuxKQe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 高偏差
欠拟合
高方差
过拟合
4.2 欠拟合与过拟合
| 现象 | 训练集表现 | 验证集表现 | 说明 |
|---|---|---|---|
| 欠拟合 | ❌ 差 | ❌ 差 | 模型未能捕捉数据规律 |
| 过拟合 | ✅ 好 | ❌ 差 | 模型过度记忆训练数据,泛化能力弱 |
过拟合的常见处理策略
- 早停(Early Stopping):验证集Loss不再下降时提前终止训练
- Dropout(神经网络专用):随机丢弃部分神经元,防止协同适应
- Walk-Forward交叉验证:时间序列场景下的时序交叉验证
- 减少模型复杂度:降低层数、神经元数或特征维度
- 数据增强:扩充训练样本的多样性
4.3 学习曲线与验证曲线
学习曲线:
- 横轴:训练样本数量
- 纵轴:模型误差或得分
- 包含两条曲线:训练集得分 + 验证集得分
- 用途:判断模型是欠拟合还是过拟合,辅助决策是否需要增加数据
验证曲线:
- 横轴:某个超参数的取值
- 纵轴:模型误差或得分
- 包含两条曲线:训练集得分 + 验证集得分
- 用途:寻找最佳超参数值,平衡偏差与方差
4.4 常见评估指标速览
以下为机器学习中常用的评估指标清单,按任务类型分类:
回归类:r2, explained_variance, neg_mean_absolute_error,
neg_mean_squared_error, neg_root_mean_squared_error,
neg_mean_absolute_percentage_error, neg_median_absolute_error,
neg_mean_poisson_deviance, neg_mean_gamma_deviance,
neg_mean_squared_log_error, neg_root_mean_squared_log_error,
d2_absolute_error_score, d2_brier_score, d2_log_loss_score
分类/二分类类:accuracy, precision, recall, f1, f1_micro, f1_macro, f1_weighted,
precision_micro, precision_macro, precision_weighted,
recall_micro, recall_macro, recall_weighted,
roc_auc, roc_auc_ovr, roc_auc_ovo,
roc_auc_ovr_weighted, roc_auc_ovo_weighted,
average_precision, matthews_corrcoef,
balanced_accuracy, top_k_accuracy,
positive_likelihood_ratio, negative_likelihood_ratio,
neg_brier_score, neg_log_loss
聚类/非监督类:adjusted_rand_score, adjusted_mutual_info_score,
normalized_mutual_info_score, mutual_info_score,
rand_score, completeness_score, homogeneity_score,
v_measure_score, fowlkes_mallows_score
多标签类:jaccard, jaccard_micro, jaccard_macro, jaccard_weighted, jaccard_samples,
precision_samples, recall_samples, f1_samples
4.5 回归评估指标详解
MAE(平均绝对误差)
MAE=1m∑i=1m∣yi−y^i∣ \text{MAE} = \frac{1}{m} \sum_{i=1}^{m} |y_i - \hat{y}_i| MAE=m1i=1∑m∣yi−y^i∣
💡 去掉系数 1m\frac{1}{m}m1 即为 L1 范数。
特点:对异常值不敏感,反映预测值与真实值的平均绝对偏差。
MSE(均方误差)
MSE=1m∑i=1m(yi−y^i)2 \text{MSE} = \frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y}_i)^2 MSE=m1i=1∑m(yi−y^i)2
💡 去掉系数 1m\frac{1}{m}m1 后开根号即为 L2 范数(即 RMSE)。
特点:对异常值敏感(误差被平方放大),常用于优化目标函数。
MAPE(平均绝对百分比误差)
MAPE=1n∑i=1n∣yi−y^iyi∣×100% \text{MAPE} = \frac{1}{n} \sum_{i=1}^{n} \left| \frac{y_i - \hat{y}_i}{y_i} \right| \times 100\% MAPE=n1i=1∑n yiyi−y^i ×100%
特点 :以百分比形式反映误差,直观易懂。但分母 yiy_iyi 接近 0 时会不稳定。
R2R^2R2(决定系数)
衡量模型能够解释真实数据中多大比例的波动。
R2=1−SSESST R^2 = 1 - \frac{SSE}{SST} R2=1−SSTSSE
其中:
- SSE=∑i=1n(yi−y^i)2\displaystyle SSE = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2SSE=i=1∑n(yi−y^i)2:残差平方和
- SST=∑i=1n(yi−yˉ)2\displaystyle SST = \sum_{i=1}^{n} (y_i - \bar{y})^2SST=i=1∑n(yi−yˉ)2:总平方和(Total Sum of Squares)
- yˉ\bar{y}yˉ 为真实标签的均值
✅ R2R^2R2 取值范围为 (−∞,1](-\infty, 1](−∞,1],越接近 1 表示模型拟合效果越好。
4.6 分类评估指标详解
二分类混淆矩阵
| 真实\预测 | 预测为正(Positive) | 预测为负(Negative) |
|---|---|---|
| 真实为正 | TP(真阳)✅ | FN(假阴)❌ |
| 真实为负 | FP(假阳)❌ | TN(真阴)✅ |
记忆口诀:
- 真/假 = 预测是否正确(True/False)
- 阳/阴 = 预测的类别(Positive/Negative)
✅ 真阳(TP)和真阴(TN)是预测正确的两种情况。
核心指标
召回率(Recall)--- 真实为正的样本中被正确识别的比例:
Recall=TPTP+FN \text{Recall} = \frac{TP}{TP + FN} Recall=TP+FNTP
精确率(Precision)--- 预测为正的样本中实际为正的比例:
Precision=TPTP+FP \text{Precision} = \frac{TP}{TP + FP} Precision=TP+FPTP
F1 值 --- 精确率与召回率的调和平均数,综合衡量模型性能:
F1=2⋅Precision⋅RecallPrecision+Recall F1 = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}} F1=2⋅Precision+RecallPrecision⋅Recall
多分类评估
📌 多分类场景下的宏平均(macro)、微平均(micro)、加权平均(weighted)等策略,将在后续专门文章中详解。
ROC 与 AUC
ROC 曲线(Receiver Operating Characteristic):
- X 轴:FPR(假正率),值越小越好
- Y 轴:TPR(真正率),值越大越好
FPR=FPTN+FP \text{FPR} = \frac{FP}{TN + FP} FPR=TN+FPFP
💡 TPR(真正率)与召回率(Recall)在数值上是等价的,两者定义一致。
曲线越靠近左上角,模型性能越好。
AUC(Area Under the Curve)为 ROC 曲线下方的面积:
- AUC = 0.5:模型相当于随机猜测
- AUC 越接近 1:模型区分正负类的能力越强
4.7 聚类评估指标详解
轮廓指数(Silhouette Coefficient)
单个样本的轮廓值:
s(i)=b(i)−a(i)max{a(i),b(i)} s(i) = \frac{b(i) - a(i)}{\max\{a(i), b(i)\}} s(i)=max{a(i),b(i)}b(i)−a(i)
- a(i)a(i)a(i):样本到同簇其他样本的平均距离(簇内紧凑度)
- b(i)b(i)b(i):样本到最近其他簇的平均距离(簇间分离度)
取值范围 :−1,1-1, 1−1,1,值越大表示聚类效果越好。
⚠️ 缺点:计算量大,需遍历每个样本计算距离。
DB 指数(Davies-Bouldin Index)
DB=1k∑i=1kmaxj≠i(Si+SjMij) \text{DB} = \frac{1}{k} \sum_{i=1}^{k} \max_{j \neq i} \left( \frac{S_i + S_j}{M_{ij}} \right) DB=k1i=1∑kj=imax(MijSi+Sj)
- SiS_iSi:簇 iii 内样本到聚类中心的平均距离
- MijM_{ij}Mij:簇 iii 与簇 jjj 中心之间的距离
DB 指数越小,聚类效果越好(簇内紧密、簇间分离)。
CH 指数(Calinski-Harabasz Index)
CH=(n−k)⋅SST(k−1)⋅SSE \text{CH} = \frac{(n - k) \cdot \text{SST}}{(k - 1) \cdot \text{SSE}} CH=(k−1)⋅SSE(n−k)⋅SST
- nnn:样本总数
- kkk:簇个数
- SST\text{SST}SST:总平方和(簇间离散度)
- SSE\text{SSE}SSE:簇内残差平方和
CH 指数越大,聚类效果越好。
五、保存模型
训练完成后的模型需要持久化保存,以便后续部署和推理。
常用方案:joblib
joblib 是 Python 生态中保存 scikit-learn 模型最常用的工具,对大数组/numpy 对象有优化:
python
import joblib
# 保存模型
joblib.dump(model, 'model.pkl')
# 加载模型
model = joblib.load('model.pkl')
其他备选方案
| 方案 | 适用场景 |
|---|---|
pickle |
Python 通用序列化,兼容性好 |
onnx |
跨框架/跨平台部署 |
mlflow |
实验跟踪 + 模型版本管理 |
tensorflow/keras |
深度学习模型原生保存格式(.h5/.keras) |
总结
本文梳理了机器学习项目的完整工程流程,并重点聚焦于模型评估环节的核心概念与指标公式。理解和掌握这些指标,能够帮助我们更科学地判断模型优劣,定位问题所在,从而做出针对性的优化。
更多内容敬请期待后续文章:
- 📝 数据处理详解(清洗、特征工程、数据增强)
- 📝 模型选择策略与选型指南
- 📝 多分类与多标签评估深入剖析
如果觉得本文对你有帮助,欢迎点赞、收藏、评论交流!