机器学习入门:从回归与分类到模型评估
机器学习要回答的核心问题是:给定一批数据,如何训练出一个在新数据上表现良好的模型?这个问题看似直白,背后却涉及数据划分策略、算法原理、模型复杂度控制和可靠性评估等一系列关键决策。本专题将沿着这条主线,依次展开六个核心主题:先建立可靠的评估基础(数据划分与交叉验证),再深入回归与分类两种预测任务的本质区别,理解算法如何通过损失函数学习参数,掌握分类边界的两条主要学习路径(概率派与几何派),认识偏差方差权衡这一模型复杂度的核心矛盾,最后系统掌握评估指标体系。
一、为什么训练模型之前,先要学会划分数据?
在机器学习中,「用全部数据训练模型,再用同一批数据测试模型」是一种根本性错误——模型可以轻易记住训练数据的噪声,在训练集上表现完美,却在真实预测时完全失效。解决这个问题的第一步,是将数据明确划分为训练集(Training Set)、**验证集(Validation Set)和测试集(Test Set)**三部分。训练集用于模型参数的拟合;验证集用于在训练过程中调优超参数(如学习率、网络层数),模型在训练时会「看到」验证集的结果但不会从中学习参数;测试集则自始至终保持独立,仅在最终评估阶段使用一次,用来模拟模型面对全新未知数据时的真实表现。

图注:数据集三划分流程图展示了将原始数据分为训练、验证、测试三部分的流向。验证集通过调参结果反馈给训练过程,测试集独立于训练流程之外,确保评估的公正性。
数据划分看似简单,但在实际项目中有几个常见陷阱。小数据集下,如果随机划分偶然导致某类样本在训练集和测试集分布不均,评估结果会严重失真;对于分类任务,每个类别在各个数据子集中的比例应与整体保持一致,否则训练出的模型会对某些类别产生偏置。
为了更可靠地评估模型泛化能力,**k折交叉验证(k-Fold Cross-Validation)**是最常用的技术。其核心思想是:将训练数据分成k个大小相等的折(fold),每次迭代选择其中1个折作为验证集,剩余k-1个折合并作为训练集,训练并评估一个模型。这样可以获得k个独立的评估分数,最终取平均值作为模型泛化能力的估计,并用分数的标准差评估其稳定性。
来看一个具体例子。假设有6个样本 [0.1, 0.2, 0.3, 0.4, 0.5, 0.6],取k=3,则数据被随机打乱后分成3组(每组2个样本)。三个模型分别在不同折的组合上训练:模型1在折1+折2上训练并在折3上测试,模型2在折2+折3上训练并在折1上测试,模型3在折1+折3上训练并在折2上测试。最终取三个评估分的均值和标准差——标准差越小,说明模型越稳定。

图注:5折交叉验证示意图展示了每次迭代中4个折(蓝色)用于训练、1个折(橙色)用于验证的交替关系,测试集全程独立于交叉验证过程之外。sklearn
StratifiedKFold是针对分类任务的改进版本。普通K折交叉验证只保证每个折的样本数量相等,但不保证类别分布一致——极端情况下,可能出现某个折完全不包含某一少数类的问题。StratifiedKFold通过分层采样,确保每个折中各类别的比例与原始数据集中相同,从而在类别不平衡时给出更可靠的评估。在sklearn中,分类任务默认推荐使用 StratifiedKFold。 sklearn
理解数据划分原则,是后续所有机器学习建模的起点。只有评估方式可靠,我们才能判断一个模型到底是真正学到了泛化规律,还是仅仅拟合了训练数据的噪声。
二、回归与分类:两种预测任务的核心区别是什么?
机器学习的两大基本任务——回归(Regression)与分类(Classification)——的核心区别在于输出的性质。回归任务预测一个连续值,例如明天的气温、房屋的售价、股票的收益率;而分类任务预测一个离散标签,例如判断邮件是否为垃圾邮件、肿瘤是良性还是恶性、图片中的是猫还是狗。
这个区别看似简单,却直接影响我们选择何种算法和何种损失函数。回归问题的输出是实数域中的连续变量,因此损失函数通常衡量预测值与真实值之间的数值距离(如均方误差);分类问题的输出是有限集合中的类别标签,损失函数则衡量预测类别与真实类别之间的不一致程度(如交叉熵)。

图注:左图展示分类问题中的决策边界——一条曲线将两类数据点分开;右图展示回归问题中的拟合直线——对连续值进行拟合预测。
回归任务的典型例子是房价预测。房价受到居住面积、房间数量、建成年代、地理位置等多种因素影响。我们用一组特征向量 $\mathbf{x}$ 描述一套房子,通过回归模型预测其价格 $\hat{y}$——这是一个典型的连续值输出问题。分类任务的典型例子是垃圾邮件检测:给定一封邮件的特征,模型输出「垃圾邮件」或「非垃圾邮件」两个离散类别之一。 arXiv:2512.04747
值得注意的是,同样的问题从不同角度既可以看作回归也可以看作分类。例如预测股价走势:若预测具体价格则是回归,若预测「上涨/下跌」则是分类。理解这个本质区别,是选择算法和评估指标的前提——后续章节中我们将看到,回归与分类在损失函数设计上有着根本性的差异,而这正是由「连续 vs 离散」这一本质区别所决定的。
三、线性回归的损失函数与参数求解:模型到底怎么学习?
3.1 线性回归的假设与MSE损失函数
线性回归的假设函数(hypothesis)是 $\hat{y} = \mathbf{w}^\top \mathbf{x} + b$,也可以写成增广形式 $\hat{y} = \boldsymbol{\theta}^\top \mathbf{x}$(将偏置 $b$ 吸收进权重向量)。模型的参数是权重 $\mathbf{w}$ 和偏置 $b$,我们通过最小化**均方误差(Mean Squared Error, MSE)**来求解最优参数:
$$L(\boldsymbol{\theta}) = \frac{1}{M} \sum_{m=1}^{M} \left( \boldsymbol{\theta}^\top \mathbf{x}_m - y_m \right)^2$$
MSE惩罚大误差的方式是平方——预测值与真实值差距越大,损失增长得越快。这种特性使它对小误差不敏感但对大误差极为敏感,有利于找到使整体误差最小的参数。同时,MSE是关于参数的可微凸函数,利于优化算法收敛到全局最优解。 arXiv:2512.04747
3.2 闭式解:最小二乘法
对MSE损失函数求导并令其为零,可以得到线性回归的解析解,也称普通最小二乘法(Ordinary Least Squares, OLS):
$$\boldsymbol{\theta}^* = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y}$$
这个公式看似简洁,但背后有两个重要限制:第一,要求 $\mathbf{X}$ 列满秩(特征线性无关且样本数不少于参数个数);第二,求逆运算的复杂度为 $O(N^3)$,当特征数或样本数达到数万规模时,求逆计算会变得极慢甚至不可行。 arXiv:2512.04747
3.3 梯度下降:迭代优化
当闭式解不可用时(如高维数据或非线性模型),**梯度下降(Gradient Descent)**是更通用的参数求解方法。其更新公式为:
$$\boldsymbol{\theta}^{(t+1)} = \boldsymbol{\theta}^{(t)} - \eta \cdot \frac{\partial L(\boldsymbol{\theta}^{(t)})}{\partial \boldsymbol{\theta}}$$
其中 $\eta$ 是学习率(learning rate),控制每一步更新的幅度。梯度指向函数值上升最快的方向,因此沿负梯度方向移动能使损失函数值下降。
梯度下降有三种主要变体:**批量梯度下降(BGD)**使用全部训练样本计算梯度,更新方向精确但每次迭代计算量大;**随机梯度下降(SGD)**每次只用一个样本计算梯度,计算快但梯度估计噪声大、更新震荡剧烈;Mini-batch梯度下降每次使用一小批(batch)样本,在计算效率和梯度稳定性之间取得平衡,是深度学习训练中的标准选择。 arXiv:2512.04747
下图展示了三种梯度下降在同一优化问题上的收敛路径差异:

图注:三条收敛路径对比图展示了批量GD(左上)光滑但收敛慢、随机GD大幅震荡、Mini-batch GD(右下)介于两者之间的收敛行为差异。arXiv:2512.04747
3.4 正则化:Ridge与Lasso
为了防止过拟合(即模型在训练数据上表现良好但在未见数据上表现差),我们可以在损失函数中加入正则化项,惩罚参数的复杂度:
$$J(\boldsymbol{\theta}) = \text{MSE} + \lambda |\boldsymbol{\theta}|_2^2 \quad \text{(Ridge,L2正则化)}$$ $$J(\boldsymbol{\theta}) = \text{MSE} + \lambda |\boldsymbol{\theta}|_1 \quad \text{(Lasso,L1正则化)}$$
**Ridge回归(L2正则化)**惩罚参数向量的欧氏范数平方,迫使参数收缩但不会归零,1970年代由Hoerl和Kennard提出,主要解决多重共线性和稳定参数估计问题。**Lasso回归(L1正则化)**惩罚参数向量的L1范数(绝对值之和),会诱导稀疏性——部分参数恰好为零,从而实现自动特征选择。 arXiv:2512.04747
L1与L2正则化在几何上有着直观的差异。L1正则化的约束区域是菱形(各参数绝对值之和为常数的边界),其等高线容易在坐标轴角点处与损失函数等高线相交,导致部分参数正好为零;L2正则化的约束区域是圆形,参数在各方向上均匀收缩,因此不会产生恰好为零的参数。

图注:L1正则化(左图)菱形等高线在角点处与损失函数相交,导致参数归零产生稀疏解;L2正则化(右图)圆形等高线在圆周上与损失函数相切,参数收缩但不为零。arXiv:2512.04747
线性回归虽然结构简单,却是理解几乎所有复杂机器学习模型的基石——神经网络的单层感知机就是线性回归的直接推广,而线性回归的损失函数设计理念(可微、凸性、惩罚大误差)深刻影响了后续分类模型的设计。
四、逻辑回归与SVM:分类边界是如何被学习出来的?
4.1 逻辑回归:概率派分类器
逻辑回归虽然名字中带有「回归」,实际上是处理二分类问题的经典算法。其核心机制分为两步:线性组合 $z = \mathbf{w}^\top \mathbf{x} + b$ 计算一个原始分数,再通过 sigmoid函数 将该分数映射到 $(0,1)$ 区间:
$$\sigma(z) = \frac{1}{1 + e^{-z}}$$
sigmoid函数的输出可以直接解释为 $P(y=1|\mathbf{x})$——给定特征 $\mathbf{x}$,模型认为该样本属于类别1的概率。决策规则为:当 $P(y=1|\mathbf{x}) \geq 0.5$ 时预测类别1,否则预测类别0。0.5这个阈值对应 $z = 0$,即 $\mathbf{w}^\top \mathbf{x} + b = 0$——这正是分类器学习得到的决策边界(Decision Boundary),一条由参数 $\mathbf{w}$ 和 $b$ 定义的超平面。 arXiv:2512.04747
逻辑回归的损失函数是交叉熵(Cross-Entropy Loss),也称对数损失:
$$L(\boldsymbol{\theta}) = -\frac{1}{M} \sum_{m=1}^{M} \left[ y_m \log \sigma(\boldsymbol{\theta}^\top \mathbf{x}_m) + (1 - y_m) \log(1 - \sigma(\boldsymbol{\theta}^\top \mathbf{x}_m)) \right]$$
交叉熵损失相比MSE在分类场景中有显著优势:當预测概率接近1但真实标签为0时,MSE的梯度趋于零(梯度饱和),而交叉熵的梯度仍然较大,优化更有效。 arXiv:2512.04747
4.2 多分类:softmax回归
当分类问题扩展到K个类别(K > 2)时,sigmoid需要升级为softmax函数:
$$P(y_k|\mathbf{x}) = \frac{\exp(\boldsymbol{\theta}k^\top \mathbf{x})}{\sum{j=1}^{K} \exp(\boldsymbol{\theta}_j^\top \mathbf{x})}$$
softmax输出各类别的概率分布,所有概率之和为1。基于此的分类策略主要有两种:**One-vs-Rest(OvR)**训练K个二分类器,每个分类器将某一类与其余所有类别区分开来;**One-vs-One(OvO)**则在每对类别之间训练一个二分类器,共需K(K-1)/2个分类器,预测时通过投票决定最终类别。SVC内部使用OvO scheme训练模型,但decision_function_shape默认参数为'ovr'(可显式设置为'ovo')。 HAL-SVM
4.3 支持向量机:几何派分类器
与逻辑回归通过概率定义决策边界不同,支持向量机(Support Vector Machine, SVM)直接以几何间隔最大化为目标学习决策边界。SVM的核心思想是:找到一个能够将不同类别最大程度分开的超平面,使得两个类别中离超平面最近的样本(称为支持向量)到超平面的距离(间隔)最大化。间隔越大,分类器对训练集中的噪声和扰动越鲁棒,泛化能力通常越强。 LIBSVM-Guide
当数据线性可分时,可以实现**硬间隔(Hard Margin)分类——所有样本都满足 $y_i(\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1$。但实际数据几乎总是存在噪声和重叠,引入软间隔(Soft Margin)和松弛变量 $\xi_i$**可以处理近似线性可分的情况:
$$\min \frac{|\mathbf{w}|^2}{2} + C \sum_{i=1}^{M} \xi_i \quad \text{s.t.} \quad y_i(\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 - \xi_i$$
参数 $C$ 控制对间隔宽松的惩罚力度——$C$ 值大意味着对误分类惩罚重,模型趋向更严格的间隔(可能过拟合);$C$ 值小则容忍更多间隔错误,但可能欠拟合。 LIBSVM-Guide
4.4 核技巧:处理线性不可分
当数据在原始特征空间中无法被超平面分开时,SVM通过**核技巧(Kernel Trick)**将数据映射到高维(甚至无穷维)空间,在那里寻找线性分割。常用的核函数包括:
- 线性核:$K(\mathbf{x}, \mathbf{y}) = \mathbf{x} \cdot \mathbf{y}$,适用于特征数远大于样本数的情况(如文本分类)
- RBF核(径向基函数):$K(\mathbf{x}, \mathbf{y}) = \exp(-\gamma |\mathbf{x} - \mathbf{y}|^2)$,最常用,能处理任意形状的决策边界
- 多项式核:$K(\mathbf{x}, \mathbf{y}) = (\gamma \mathbf{x} \cdot \mathbf{y} + r)^d$
下图展示了同数据集上四种核函数对应的SVM决策边界形态差异:

图注:四种核函数(linear/poly/rbf/sigmoid)在同一数据集上的SVM决策边界对比,直观展示了非线性核如何处理线性不可分问题。sklearn
RBF核是大多数场景的默认选择,其参数 $\gamma$ 控制基函数的作用范围——$\gamma$ 大则决策边界更复杂(高方差),$\gamma$ 小则更平滑(高偏差)。RBF核的最优参数 $C$ 和 $\gamma$ 通常通过网格搜索配合交叉验证来选择:先在粗网格(如 $C = 2^{-5}\sim2^{15}$,$\gamma = 2^{-15}\sim2^{3}$)定位最优区域,再在邻域做细网格精确搜索。 LIBSVM-Guide

图注:OvR(左)与OvO(右)在4类分类问题上的决策边界形态对比。OvR训练4个分类器,每个分类器学习一个类与其余类别的边界;OvO训练6个分类器,每对类别之间一个,预测时通过投票汇总。HAL-SVM
逻辑回归和SVM代表了两种截然不同的分类哲学:逻辑回归通过sigmoid函数输出概率,以概率阈值定义决策边界,是「概率派」;SVM直接以几何间隔最大化为目标学习超平面,是「几何派」。理解这两条学习路径,有助于在实际问题中根据数据特性选择合适的算法。
五、偏差方差权衡:为什么模型会「学过头」或「学不够」?
5.1 偏差与方差的定义
**偏差(Bias)**衡量模型预测值的平均结果与真实值之间的差距,反映了模型的系统性误差。如果一个房价预测模型无论训练数据如何变化,始终将房价低估约5万美元,这说明模型引入了系统性的错误假设——可能是因为模型过于简单(如只用房间数量一个特征),无法捕捉影响房价的真实规律。
**方差(Variance)**衡量同一模型在不同训练数据集上训练后预测结果的变化幅度,反映了模型对训练数据细节的敏感程度。如果在两个略微不同的数据集上训练同一个模型,得到截然不同的预测结果(一个预测30万美元,另一个预测60万美元),说明模型过度依赖训练数据的特定噪声。
偏差方差之间存在一个根本性的矛盾,这是机器学习中的常见现象:简单模型(如线性回归)通常偏差高、方差低——它们稳定但有系统性的预测偏离;复杂模型(如深层神经网络)通常偏差低、方差高——它们灵活但对训练数据的微小变化反应剧烈。 MLMastery
这个矛盾可以通过偏差方差分解公式形式化表达:
$$E[(y - \hat{y})^2] = \text{Bias}^2 + \text{Variance} + \text{Irreducible Error}$$
总期望误差可以分解为偏差的平方、方差和不可约误差(数据本身的噪声)三项。由于偏差和方差通常朝相反方向变动——减少一个往往导致另一个增加——我们必须在二者之间寻找最优平衡点。 MLMastery
5.2 四种状态的靶盘类比
偏差方差的概念可以用靶盘来直观理解:

图注:四象限靶盘类比直观展示了偏差和方差的组合状态。左上高偏差低方差(镖点一致但偏离靶心,代表欠拟合);右上低偏差高方差(镖点围绕靶心散布,代表过拟合);右下低偏差低方差(理想状态)。MLMastery
**欠拟合(Underfitting)**对应高偏差低方差状态:模型既不能捕捉数据中的真实规律(高偏差),也不会在不同数据集上产生剧烈变化(低方差)。原因是模型过于简单,无法表达数据中的复杂模式。解决方法包括:增加特征、提高模型复杂度、减少正则化强度。
**过拟合(Overfitting)**对应低偏差高方差状态:模型在训练数据上表现优异,但在新数据上表现差。原因是模型过于复杂,开始拟合训练数据中的噪声而非真实规律。解决方法包括:增加训练数据、降低模型复杂度、增加正则化、使用早停(early stopping)等。 MLMastery
5.3 偏差方差权衡曲线
偏差方差之间的权衡可以通过模型复杂度-误差曲线直观展示。随着模型复杂度从低到高增加,偏差(Bias²)持续下降,但方差(Variance)持续上升,两者之和构成总误差,呈现经典的U形曲线。总误差的最低点对应着恰当的模型复杂度——这是我们在实际调参中努力寻找的平衡位置。

图注:偏差方差权衡曲线横轴为模型复杂度,纵轴为误差。红色Bias²曲线随复杂度增加而下降,蓝色Variance曲线上升,黑色Total Error曲线呈U形,其极值点对应恰当的模型复杂度。MLMastery
理解偏差方差权衡,是掌握模型调优的关键。当模型在训练集上表现良好但在验证集上表现差时,首先判断是过拟合(高方差)还是欠拟合(高偏差):若是过拟合,增加数据或降低复杂度;若是欠拟合,增加模型复杂度或添加新特征。交叉验证中的验证分数是诊断这一问题的核心工具。
六、评估指标体系:如何客观回答「模型到底好不好」?
6.1 混淆矩阵:评估分类器的基础结构
在二分类问题中,**混淆矩阵(Confusion Matrix)**以四格结构汇总了模型的所有预测结果:
| 预测:阴性 | 预测:阳性 | |
|---|---|---|
| 实际:阴性 | TN(真阴性) | FP(假阳性) |
| 实际:阳性 | FN(假阴性) | TP(真阳性) |
准确率(Accuracy) = (TP + TN) / 总样本数,衡量整体正确率。然而在类别严重不平衡的场景中,准确率会给出虚假的乐观估计——例如99%的样本为阴性时,将所有样本预测为阴性即可达到99%的准确率,但所有阳性患者都被漏诊。 sklearn

图注:标准混淆矩阵结构图展示了Gold Standard Truth与Model Prediction两个维度交叉得到的四格标注。
精确率(Precision) = TP / (TP + FP):在所有被模型预测为阳性的样本中,实际为阳性的比例——衡量模型预测为阳性时的可靠性。召回率(Recall) = TP / (TP + FN):所有实际为阳性的样本中,被正确预测为阳性的比例——衡量模型对阳性样本的捕获能力。召回率也称敏感度(Sensitivity)或真阳性率(TPR)。
精确率与召回率之间存在固有的权衡:降低分类阈值会提高召回率(捕获更多阳性),但可能降低精确率(引入更多假阳性);提高阈值则相反。在医学诊断场景中,漏诊(假阴性)的代价通常远高于误诊(假阳性),因此优先保证高召回率;在垃圾邮件过滤场景中,误删重要邮件(假阳性)的代价通常更高,因此优先保证高精确率。
6.2 F1 Score:精确率与召回率的调和平均
当需要同时考虑精确率和召回率时,F1 Score是常用的综合指标:
$$F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$$
F1是精确率和召回率的调和平均,相比算术平均更重视两者的低值——如果其中一个指标很低,F1也会被拉低。 sklearn
6.3 ROC曲线与AUC
ROC曲线(Receiver Operating Characteristic Curve)通过绘制不同阈值下的假阳性率(FPR)(横轴)与真阳性率(TPR)(纵轴)的关系,全面展示分类器在所有阈值下的整体表现:
- $TPR = TP / (TP + FN)$(Recall / Sensitivity)
- $FPR = FP / (FP + TN)$(1 - Specificity)

图注:二分类ROC曲线以FPR为横轴、TPR为纵轴,对角虚线(AUC=0.5)为随机分类器基线,实际曲线越接近左上角表示分类器性能越好。sklearn
**AUC(Area Under the ROC Curve)**是ROC曲线下的面积,量化了分类器在不同阈值下区分正负样本能力的整体强弱:AUC = 0.5 表示分类器与随机猜测无异,AUC = 1.0 表示完美分类器。AUC的优势在于对阈值的选择不敏感,并且可以用于评估分类器在类别不平衡条件下的表现。 sklearn
在多分类场景下,ROC-AUC可以通过**宏平均(macro-average)或微平均(micro-average)**策略进行汇总:宏平均先对每个类计算单独的ROC-AUC再取平均(各类别权重相等),微平均则将所有类别的TP/FP/TN/FN汇总后统一计算(适合样本量差异大的场景)。

图注:多分类微平均ROC曲线示例(Iris 3类数据集,micro-average AUC=1.00),展示了通过OvR策略计算多分类ROC-AUC的方法。sklearn
ROC曲线在实际应用中有一个重要价值:它可以帮助选择最优阈值。如果应用场景要求在保证TPR不低于90%的前提下最小化FPR(即漏诊率不超过10%),可以在ROC曲线上找到满足TPR ≥ 0.9且FPR最小的点,对应曲线上最靠近左上角的阈值。
6.4 sklearn评估实战
sklearn提供了统一的评估指标API,在模型训练完成后可以快速计算所有常用指标:
from sklearn.metrics import (accuracy_score, precision_score, recall_score,
f1_score, roc_auc_score, confusion_matrix)
# 准确率
accuracy = accuracy_score(y_test, y_pred)
# 精确率、召回率、F1(支持多类别macro/weighted/micro平均)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
# ROC-AUC(需要predict_proba获取概率)
y_prob = model.predict_proba(X_test)
roc_auc = roc_auc_score(y_test, y_prob, multi_class='ovo', average='macro')
# 混淆矩阵
cm = confusion_matrix(y_test, y_pred)
sklearn的 cross_val_score 和 cross_validate 可以在交叉验证过程中直接计算评估指标,使评估流程与模型选择无缝衔接。Pipeline机制可以将数据标准化、特征工程和模型训练串联为统一对象,确保测试数据在预处理步骤中不会「泄露」到训练过程中。 sklearn
模型评估不是孤立的最后一步,而是贯穿整个建模过程的活动。交叉验证给出了可靠的泛化能力估计,偏差方差分析帮助选择恰当的模型复杂度,评估指标体系则提供了量化模型表现的多维视角。唯有将三者结合,才能真正回答「模型到底好不好」这一核心问题。
参考文献
- A Tutorial on Regression Analysis: From Linear Models to Deep Learning — arXiv:2512.04747
- Regression Analysis Lecture Notes - Intelligent Computing Course Cluster — arXiv:2512.04747
- scikit-learn Official Documentation: Getting Started, Supervised Learning, Model Evaluation — scikit-learn.org
- A Practical Guide to Support Vector Classification — NTU LIBSVM
- The Bias-Variance Trade-Off: A Visual Explainer and Practical Guide — MachineLearningMastery
- Best Classical ML Libraries: Scikit-learn vs XGBoost vs LightGBM — DeployBase
- ROC Curves and AUC Explained + scikit-learn Metrics Documentation — scikit-learn.org
- Support Vector Machines: Geometry, Convex Optimization, and Kernels - Teaching Material — HAL id: hal-05331339