机器学习:更多分类回归算法之决策树、SVM、KNN

发布于:2025-07-09 ⋅ 阅读:(32) ⋅ 点赞:(0)

下面介绍的这几种算法,既能用于回归问题又能用于分类问题,接下来了解下吧。

决策树

可参考:

决策树(Decision Tree) | 菜鸟教程

决策树(Decision Tree)是一种常用的监督学习算法,可用于分类和回归任务。它通过构建树形结构进行决策,每个内部节点代表一个特征上的 “判断”,分支代表判断结果,叶节点代表最终的预测类别或值。决策树的核心思想是:通过对数据的特征进行逐层划分,最终将数据映射到不同的类别或数值。

一、决策树的基本结构

决策树由三部分组成:

  1. 根节点:最初的决策点,包含全部训练样本。

  2. 内部节点:对应一个特征上的测试条件(如 “年龄> 30?”)。

  3. 叶节点:最终的预测结果(如 “购买” 或 “不购买”)。

例如,一个简单的 “是否出门打篮球” 决策树可能如下:

二、决策树的构建过程

决策树的构建是一个递归划分的过程,主要步骤如下:

  • 特征选择:从当前节点的特征中选择一个最优特征(如 “天气”)作为划分依据。

  • 划分数据集:根据该特征的不同取值,将数据集划分为多个子集(如 “晴天” 和 “非晴天”)。

  • 递归生成子树:对每个子集重复步骤 1-2,直到满足终止条件(如:

    • 子集中所有样本属于同一类别。

    • 没有剩余特征可供划分。

    • 树的深度达到预设上限。

其中,特征选择是核心环节,常用的准则有:

  • 信息增益(ID3 算法):选择能最大减少信息熵的特征。

  • 信息增益率(C4.5 算法):对信息增益进行修正,避免偏向取值多的特征。

  • 基尼不纯度(CART 算法):选择能最小化基尼指数(样本被误分类的概率)的特征。

三、决策树的优缺点

优点

  1. 直观易懂:决策树可以可视化,便于理解和解释(如医生诊断规则)。

  2. 无需预处理:对数据尺度、分布不敏感,无需归一化或标准化。

  3. 处理非线性关系:能自动学习特征间的复杂非线性关系。

  4. 支持多输出:可同时预测多个目标变量。

缺点

  1. 容易过拟合:决策树可能过度拟合训练数据,导致泛化能力差(解决方案:剪枝、随机森林)。

  2. 不稳定:数据的微小变化可能导致树结构剧烈变化(集成学习可缓解)。

  3. 偏向问题:对具有较多取值的特征有偏好(如 ID3)。

  4. 计算复杂度高:构建树的时间复杂度较高(尤其是特征和样本量较大时)。

四、决策树的应用场景

  • 分类任务:

    • 医疗诊断(如根据症状判断疾病类型)。

    • 客户细分(如根据消费行为划分客户类别)。

  • 回归任务:

    • 房价预测(根据房屋面积、位置等预测价格)。

    • 销量预测(根据促销活动、季节等预测销量)。

  • 集成学习基础:作为随机森林、梯度提升树(GBDT)等集成算法的基模型。

五、决策树的优化方法

  • 剪枝(Pruning):

    • 预剪枝:在树构建过程中提前停止划分(如限制树的最大深度)。

    • 后剪枝:构建完整树后,通过交叉验证移除不必要的节点。

  • 特征选择优化:使用信息增益率(C4.5)或基尼不纯度(CART)替代信息增益。

  • 集成学习:结合多个决策树(如随机森林、XGBoost)提高稳定性和准确性。

六、常见决策树算法对比

算法 支持任务 特征选择准则 树结构 缺失值处理
ID3 分类 信息增益 多叉树 不支持
C4.5 分类 信息增益率 多叉树 支持
CART 分类 + 回归 基尼不纯度(分类)/ 均方误差(回归) 二叉树 支持

总结

决策树是一种强大且直观的机器学习算法,适合处理非线性关系和需要可解释性的场景。虽然它存在过拟合风险,但通过剪枝、集成学习等优化手段,决策树在实际应用中仍然表现出色,尤其是作为集成模型(如随机森林)的基础组件。

SVM

可参考:

支持向量机 | 菜鸟教程

SVM(Support Vector Machine,支持向量机)是一种强大的监督学习算法,主要用于分类和回归任务,尤其在处理高维数据时表现出色。其核心思想是:通过寻找一个最优超平面,将不同类别的数据分隔开,并最大化类别之间的间隔(Margin),从而获得良好的泛化能力。

支持向量

  • 离超平面最近的样本点被称为“支持向量”。这些支持向量对于定义超平面至关重要。

  • 支持向量机通过最大化支持向量到超平面的距离(即最大化间隔)来选择最佳的超平面。

SVM 分类流程

  1. 选择一个超平面:找到一个能够最大化分类边界的超平面。

  2. 训练支持向量:通过支持向量机算法,选择离超平面最近的样本点作为支持向量。

  3. 通过最大化间隔来找到最优超平面:选择一个最优超平面,使得间隔最大化。

  4. 使用核函数处理非线性问题:通过核函数将数据映射到高维空间来解决非线性可分问题。

SVM 也可用于回归任务(Support Vector Regression,SVR)。与分类不同,SVR 的目标是找到一个超平面,使得所有训练数据点到该超平面的距离不超过 \(\epsilon\),同时尽量使超平面平坦。

SVM 的优缺点

优点

  1. 适用于高维数据:在特征维度远大于样本数时仍表现良好(如文本分类)。

  2. 鲁棒性强:只依赖支持向量,对离群点不敏感(通过软间隔控制)。

  3. 避免过拟合:通过最大化间隔和核技巧,获得良好的泛化能力。

  4. 核函数灵活性:可通过选择不同核函数处理各种数据分布。

缺点

  1. 计算复杂度高:训练时间随样本数增加显著增长(尤其在大数据集上)。

  2. 参数敏感:核函数参数(如 RBF 的 \(\gamma\))和正则化参数 C 需要仔细调优。

  3. 不适用于大规模数据:传统 SVM 求解器在样本数超过 10 万时效率较低(可使用 SGD 等优化)。

  4. 多分类需扩展:SVM 原生只支持二分类,处理多分类需组合多个二分类器(如 One-vs-One 或 One-vs-All)。

SVM 的应用场景

  1. 文本分类:如垃圾邮件识别、新闻分类(高维稀疏数据)。

  2. 图像识别:如手写数字识别、人脸识别。

  3. 生物信息学:如蛋白质结构预测、癌症分类。

  4. 异常检测:通过 One-Class SVM 识别罕见事件。

  5. 金融风控:如信用评分、欺诈检测。

SVM 的优化与扩展

  1. 高效求解算法:如序列最小优化算法(SMO)、梯度下降法(SGD)。

  2. 集成 SVM:与 Bagging 或 Boosting 结合提高性能。

  3. 多分类扩展:如 One-vs-One、One-vs-All、DAG-SVM。

  4. 在线学习:如核感知机(Kernel Perceptron)。

总结

SVM 是一种优雅且强大的机器学习算法,特别适合处理高维、小样本数据,且具有严格的数学理论保证。虽然其计算复杂度较高,但在许多领域(如文本和图像分析)仍是首选算法之一。使用 SVM 时,需注意选择合适的核函数和调优参数,以获得最佳性能。

KNN

可参考:

K 近邻算法 | 菜鸟教程

KNN(K-Nearest Neighbors,K 近邻算法)是一种简单且常用的监督学习算法,主要用于分类和回归任务。

KNN(K-Nearest Neighbors)不属于深度学习算法,而是一种传统的机器学习算法。其核心思想可以概括为:“物以类聚,人以群分”—— 一个样本的类别或数值,由与其最接近的 K 个邻居的类别或数值决定。

一、KNN 的基本原理

  • 核心逻辑 对于一个待预测的样本,KNN 会在训练数据集中找到与该样本 “距离最近” 的 K 个样本(即 “邻居”),然后根据这 K 个邻居的信息来预测结果:

    • 分类任务:采用 “少数服从多数” 原则,K 个邻居中出现次数最多的类别即为预测类别。

    • 回归任务:取 K 个邻居的数值的平均值(或加权平均值)作为预测结果。

  • 距离度量 衡量样本间 “接近程度” 的常用指标包括:

二、KNN 的执行步骤

以分类任务为例,KNN 的工作流程如下:

  1. 准备训练数据:包含已知类别的样本(特征 + 标签)。

  2. 确定参数 K:即选择多少个邻居(K 为正整数,需人为设定)。

  3. 计算距离:计算待预测样本与训练集中所有样本的距离。

  4. 筛选邻居:按距离从小到大排序,选取前 K 个样本作为 “邻居”。

  5. 投票预测:统计 K 个邻居中出现次数最多的类别,作为待预测样本的类别。

三、关键参数 K 的影响

K 的取值对模型结果影响很大,需要谨慎选择:

  • K=1:模型容易过拟合(对噪声敏感,决策边界复杂)。

  • K 过大:模型会过度平滑,忽略局部特征,导致欠拟合(决策边界简单)。

  • 经验选择:通常通过交叉验证(如网格搜索)选择最优 K 值,且 K 一般取奇数(避免投票平局)。

四、KNN 的优缺点

优点

  • 简单易懂:无需复杂的数学推导,原理直观。

  • 无需训练过程:属于 “懒惰学习”(Lazy Learning),新样本到来时才计算距离,适合动态数据集。

  • 适用于多分类问题:天然支持多类别预测,无需额外处理。

缺点

  • 计算成本高:预测时需与所有训练样本计算距离,数据量大时效率低(时间复杂度为 O (n),n 为样本数)。

  • 对不平衡数据敏感:若某类样本数量远多于其他类,可能主导预测结果。

  • 对特征尺度敏感:不同特征的量纲差异会影响距离计算(需先标准化 / 归一化特征)。

五、KNN 的应用场景

  • 分类任务:如手写数字识别、鸢尾花种类分类、客户流失预测等。

  • 回归任务:如房价预测、用户评分预测等。

  • 推荐系统:基于用户相似度的 “近邻推荐”(如 “和你相似的用户也喜欢...”)。

六、优化方法

为解决 KNN 的效率问题,常用优化手段包括:

  • 数据降维:减少特征数量,降低距离计算复杂度(如 PCA)。

  • 索引结构:使用 KD 树、球树等数据结构加速邻居搜索。

  • 加权 KNN:给距离近的邻居赋予更高权重,减少远邻的干扰。

总之,KNN 是一种 “简单但不简陋” 的算法,在小规模数据集或对可解释性要求高的场景中非常实用,但在大数据场景下需结合优化手段使用。

补充

补充更多相关内容。

主成分分析

主成分分析(Principal Component Analysis,简称PCA)是一种常用的数据降维方法,它的核心思想是通过线性变换,将高维数据映射到低维空间,在尽可能保留原始数据信息(即方差)的前提下,减少数据的维度,从而简化数据结构、去除冗余信息,并便于后续的分析或建模。

从严格意义上来说,PCA 更偏向于一种数据预处理技术。其本质是数据的线性变换与压缩,而非 “学习” 输入到输出的映射关系:

  • 它不涉及 “标签”(即无监督),也不构建预测模型,仅关注数据本身的分布结构(方差、相关性)。

  • 目标是简化数据(降维)、去除冗余或噪声,为后续任务(如分类、回归)做准备。

PCA 不是严格意义上的机器学习算法,而是一种无监督的数据降维与预处理技术。但由于其在机器学习流程中的广泛应用(如数据预处理、特征工程),常被纳入机器学习的工具链中进行讨论。

PCA 的核心目标

  • 降维:将高维特征(如 100 个特征)转化为低维特征(如 2 个或 3 个特征),降低计算复杂度。

  • 保留信息:新的低维特征(称为 “主成分”)应尽可能保留原始数据的大部分变异(方差),即数据的核心信息。

  • 去相关性:新的主成分之间彼此线性无关,消除原始特征间的冗余关联。

PCA 的基本原理

PCA 的本质是寻找一组新的正交坐标轴(主成分),使得数据在这些坐标轴上的投影具有最大的方差。具体步骤可概括为:

  • 数据标准化 对原始数据进行均值中心化(每个特征减去其均值),确保各特征在同一量级上,避免方差大的特征主导结果(例如,若特征 A 的单位是 “米”,特征 B 是 “厘米”,需先标准化)。

  • 计算协方差矩阵 协方差矩阵用于描述特征之间的相关性:若两个特征的协方差为正,说明它们正相关;为负则负相关;为 0 则无关。PCA 的目标是通过变换消除这种相关性。

  • 求解协方差矩阵的特征值和特征向量

    • 特征向量:代表新的坐标轴(主成分)的方向。

    • 特征值:表示数据在对应特征向量方向上的方差大小,特征值越大,该方向包含的信息越多。

  • 选择主成分 按特征值从大到小排序,选取前 k 个特征向量作为主成分(k < 原始维度),确保这 k 个主成分的累计方差贡献率(即前 k 个特征值之和 / 总特征值之和)达到预设阈值(如 95%),以保留大部分信息。

  • 映射数据到新空间 用选中的 k 个特征向量构成变换矩阵,将原始数据投影到该矩阵上,得到降维后的低维数据。

举例说明

假设我们有一组二维数据(特征 X1 和 X2),分布近似一个椭圆。

  • 原始数据中,X1 和 X2 可能存在相关性(例如,“身高” 和 “体重”)。

  • PCA 会找到椭圆的长轴(第一主成分)和短轴(第二主成分),其中长轴方向的方差最大,包含最多信息。

  • 若我们选择保留第一主成分,就将二维数据降为一维,此时数据在长轴上的投影保留了大部分原始信息。

PCA 的应用场景

  • 数据可视化:将高维数据(如 100 维)降为 2 或 3 维,便于绘图观察分布(例如,用 PCA 将图像的像素特征降维后可视化)。

  • 降噪:低方差的主成分可能对应噪声,去除这些成分可简化数据并减少干扰。

  • 预处理:在机器学习中,降维后的数据可加速模型训练(如减少 SVM、KNN 的计算量)。

PCA 的局限性

  • 是线性降维方法,无法处理非线性结构的数据(此时可考虑核 PCA、t-SNE 等非线性方法)。

  • 降维后的数据(主成分)失去了原始特征的物理意义,解释性较差(例如,原始特征是 “年龄”“收入”,主成分可能是两者的混合,难以直接解读)。

总之,PCA 是一种高效的降维工具,通过聚焦数据的核心变异方向,在简化数据的同时保留关键信息,广泛应用于数据分析、机器学习和模式识别等领域。

欠拟合和过拟合

过拟合(Overfitting)和欠拟合(Underfitting)是机器学习中两种常见的模型性能问题,直接影响模型对新数据的预测能力。它们的本质是模型对训练数据的 “学习程度” 与泛化能力之间的失衡,具体区别和应对方法如下:

一、欠拟合(Underfitting)

定义

模型无法充分捕捉训练数据中的规律,导致在训练集和测试集上的表现都很差(误差较高)。形象地说,就是模型 “学得太浅”,对数据的复杂模式视而不见。

表现

  • 训练集准确率低,测试集准确率也低(两者误差都大)。

  • 模型在训练过程中收敛缓慢,甚至难以收敛。

常见原因

  1. 模型过于简单:例如用线性模型(如线性回归)去拟合非线性数据(如二次函数分布的数据)。

  2. 特征不足:输入的特征数量太少或质量太低,无法描述数据的关键规律(如用 “身高” 单一特征预测 “体重”,忽略了 “年龄”“性别” 等重要因素)。

  3. 训练时间不足:模型尚未充分学习到数据模式就停止训练(如神经网络迭代次数太少)。

解决方法

  • 增加模型复杂度:例如将线性模型替换为非线性模型(如决策树、多项式回归、神经网络)。

  • 丰富特征工程:增加更多相关特征,或对现有特征进行组合、转换(如多项式特征、特征交叉)。

  • 延长训练时间:增加迭代次数,让模型有更多机会学习数据规律。

二、过拟合(Overfitting)

定义

模型过度学习训练数据中的细节,甚至包括噪声,导致在训练集上表现极好,但对新数据(测试集)的泛化能力很差。形象地说,就是模型 “学得太死”,把偶然现象当成了普遍规律。

表现

  • 训练集准确率极高(误差极小),但测试集准确率骤降(误差显著增大)。

  • 模型在训练过程中,训练误差持续下降,但测试误差先降后升。

常见原因

  1. 模型过于复杂:例如用高阶多项式拟合简单线性数据,或神经网络层数 / 参数过多。

  2. 训练数据不足或有噪声:数据量太少时,模型容易记住每个样本的细节;数据中存在异常值或错误标签(噪声)时,模型会 “记住” 这些噪声。

  3. 训练过度:模型在训练集上迭代次数过多,以至于拟合了无关的细节。

解决方法

  • 简化模型:减少模型参数(如减小神经网络层数、限制决策树深度),或选择更简单的模型(如用线性回归替代复杂的集成模型)。

  • 增加训练数据:更多的数据能让模型更难记住细节,被迫学习普遍规律(如数据增强技术,通过旋转、裁剪等方式扩充图像数据)。

  • 正则化(Regularization):通过惩罚模型的复杂度来限制过拟合,常见方法包括:

    • L1 正则化(Lasso 回归):对参数绝对值施加惩罚,可能使部分参数为 0(特征选择)。

    • L2 正则化(Ridge 回归):对参数平方施加惩罚,使参数值趋向于 0(权重衰减)。

    • Dropout(适用于神经网络):训练时随机丢弃部分神经元,防止模型过度依赖特定神经元。

  • 早停(Early Stopping):在训练过程中监控测试误差,当测试误差不再下降时提前停止训练,避免过度拟合。

  • 交叉验证:通过将数据分为多组训练集和验证集,选择在验证集上表现最佳的模型,减少对单一训练集的依赖。

三、过拟合与欠拟合的对比

维度 欠拟合 过拟合
模型与数据的关系 模型太简单,无法拟合数据规律 模型太复杂,过度拟合数据细节(含噪声)
训练集性能 差(误差高) 好(误差低)
测试集性能 差(误差高) 差(误差高)
核心问题 学习不足(欠学习) 学习过度(过学习)
解决思路 增强模型能力(增加复杂度、特征) 限制模型能力(简化模型、正则化)

总结

过拟合和欠拟合的本质是模型复杂度与数据规律的不匹配。理想的模型应处于 “拟合适中” 的状态:既能捕捉训练数据的核心规律,又不过度关注细节,从而在新数据上表现稳定。在实际建模中,通常通过调整模型复杂度、优化数据质量、使用正则化等方法来平衡两者,追求更强的泛化能力。

数据分离

数据分离是指将原始数据集划分为不同的子集,以实现模型的训练、验证和测试,其核心目的是确保模型能够在未见过的数据上评估泛化能力,避免因过度依赖训练数据而导致的过拟合。

1. 常见的数据集划分方式

  • 训练集(Training Set) 用于模型的训练过程,模型通过学习该数据集的特征与标签之间的关系,调整自身参数(如决策树的分裂阈值、神经网络的权重)。 占比通常为 60%~80%。

  • 验证集(Validation Set) 用于模型训练过程中的参数调优(如选择正则化系数、调整树的深度)和超参数优化,帮助判断模型是否过拟合或欠拟合,并选择最优模型。 占比通常为 10%~20%。 注:在交叉验证中,验证集的角色由训练集的子集交替承担,无需单独划分。

  • 测试集(Test Set) 用于最终评估模型的泛化能力,模拟模型在真实场景中的表现。测试集在模型训练和调优阶段需严格 “隐藏”,避免因人为调整模型适配测试集而导致评估结果失真。 占比通常为 10%~20%。

2. 划分原则

  • 随机性:划分需随机进行,避免因数据顺序(如时间序列中的趋势)导致子集分布不一致。

  • 分布一致性:各子集的特征分布和标签分布应与原始数据集保持一致(如分类任务中,各子集的类别比例需匹配)。

  • 独立性:测试集需与训练集、验证集完全独立,确保评估结果真实反映泛化能力。

3. 常见工具

在 Python 中,可通过sklearn.model_selection.train_test_split实现快速划分,例如:

from sklearn.model_selection import train_test_split
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)  # 先分训练集(70%)和临时集(30%)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)  # 临时集再分为验证集(15%)和测试集(15%)

数据分离通过划分训练集、验证集、测试集,确保模型训练和评估的客观性,是构建可靠模型的基础。

混淆矩阵

混淆矩阵是用于评估分类模型性能的可视化工具,通过展示模型对不同类别的预测结果与真实标签的匹配情况,直观反映模型的错误类型(如将 A 类误判为 B 类的频率)。它适用于二分类和多分类任务,以下以二分类为例说明:

1. 二分类混淆矩阵的基本结构

假设分类任务为 “判断样本是否为正例(Positive)”,混淆矩阵为 2×2 矩阵:

预测为正例(Predicted Positive) 预测为负例(Predicted Negative)
真实正例(Actual Positive) TP(True Positive,真正例) FN(False Negative,假负例)
真实负例(Actual Negative) FP(False Positive,假正例) TN(True Negative,真负例)
  • TP:模型正确预测为正例的样本(如将 “癌症患者” 正确预测为 “患病”)。

  • TN:模型正确预测为负例的样本(如将 “健康人” 正确预测为 “健康”)。

  • FP:模型错误地将负例预测为正例(如 “健康人” 被误诊为 “患病”,又称 “第一类错误”)。

  • FN:模型错误地将正例预测为负例(如 “癌症患者” 被漏诊为 “健康”,又称 “第二类错误”)。

2. 基于混淆矩阵的评估指标

混淆矩阵可衍生出多个关键指标,用于量化模型性能:

指标 计算公式 含义
准确率(Accuracy) (TP + TN) / (TP + TN + FP + FN) 模型整体预测正确的比例(适用于平衡数据集)。
精确率(Precision) TP / (TP + FP) 预测为正例的样本中,真正为正例的比例(如 “被诊断为患病者中,实际患病的比例”)。
召回率(Recall)/ 灵敏度 TP / (TP + FN) 真实正例中,被模型正确预测的比例(如 “所有患者中,被成功诊断的比例”)。
特异度(Specificity) TN / (TN + FP) 真实负例中,被模型正确预测的比例(如 “所有健康人中,被正确排除的比例”)。
F1 分数(F1-Score) 2×(Precision×Recall)/(Precision+Recall) 精确率和召回率的调和平均,平衡两者的冲突(适用于不平衡数据集)。

3. 多分类混淆矩阵

对于多分类任务(如识别手写数字 0-9),混淆矩阵为 N×N 矩阵(N 为类别数),其中第 i 行第 j 列的数值表示 “真实类别为 i 但被预测为 j” 的样本数。通过分析对角线(正确预测)和非对角线(错误预测)的数值,可定位模型对哪些类别容易混淆(如将 “8” 误判为 “3”)。

4. 应用场景

  • 诊断模型错误类型:例如在医疗诊断中,FN(漏诊)可能比 FP(误诊)后果更严重,需优先提高召回率。

  • 指导模型优化:若某一类别的错误率极高,可针对性增加该类别的训练样本或调整模型参数。


网站公告

今日签到

点亮在社区的每一天
去签到