经典机器学习算法是人工智能领域的基础,涵盖了从线性模型到集成学习的多种方法。这些算法在实际应用中仍然广泛使用,是面试中考察基础知识的重点。本文整理了最常考的十大经典机器学习算法:线性回归、逻辑回归、SVM、决策树、随机森林、GBDT、XGBoost、LightGBM、K-Means和KNN。
线性回归是利用线性函数对自变量和因变量之间关系进行建模的一种回归分析方法。
常见问题:
为什么线性回归使用均方误差作为损失函数? 从概率角度,如果假设误差服从高斯分布,通过极大似然估计可以推导出均方误差。
梯度下降法和最小二乘法的比较:
| 方法 | 优点 | 缺点 |
|---|---|---|
| 梯度下降 | 适用于大规模数据,不需要计算矩阵逆 | 需要选择学习率,迭代过程 |
| 最小二乘法 | 不需要迭代,一步求解 | 需要计算矩阵逆,数据量大时计算慢 |
逻辑回归虽然名字叫回归,实际上是经典的二分类算法。
核心问题:
为什么LR使用sigmoid函数?
为什么LR用交叉熵损失而不是均方误差? 如果使用均方误差,梯度会受到sigmoid导数的影响,在饱和区梯度非常小,导致学习速度慢。而交叉熵损失的梯度不包含sigmoid导数,预测误差越大,参数更新越快,训练更高效。
LR如何解决多分类问题?
支持向量机通过寻找最大间隔超平面来进行分类。
核心思想:间隔最大化,转化为凸二次优化问题
三种SVM:
核函数:将低维空间线性不可分数据映射到高维空间变得线性可分
关键问题:
为什么SVM要引入对偶问题?
SVM对缺失数据敏感吗? 是的,SVM对缺失数据敏感,因为核函数计算依赖于特征空间的距离计算。
LR vs SVM:
| 对比项 | LR | SVM |
|---|---|---|
| 损失函数 | 对数似然损失(交叉熵) | Hinge损失 |
| 支持向量 | 所有样本都贡献 | 只有支持向量贡献 |
| 正则化 | 天然支持 | 天然支持 |
| 处理大规模数据 | 更快 | 核矩阵计算量大,较慢 |
| 概率输出 | 直接输出概率 | 需要特殊处理 |
决策树是一种树结构的分类/回归模型,通过递归选择最优特征进行划分。
三种经典算法:
纯度度量:
剪枝:
优点:
缺点:
KNN是基于实例的学习,通过距离找到最近的K个样本投票预测。
关键问题:
为什么用欧氏距离而不是曼哈顿距离? 曼哈顿距离只计算水平或垂直距离,有维度限制;欧氏距离可用于任何空间的距离计算,更适合高维空间中的距离计算。
K值选择:
优缺点:
K-Means是最经典的无监督聚类算法。
算法流程:
K-means++优化:初始聚类中心之间的相互距离要尽可能远:
时间复杂度:O(tKmn),t迭代次数,K簇数,m样本数,n维数
优缺点:
Bagging:并行训练多个基学习器,然后投票/平均
Boosting:串行训练,每一轮根据上一轮结果调整样本权重,最终加权组合
随机森林是Bagging的扩展,在样本随机采样基础上,增加了特征随机选择。
特点:
特征重要性评估:
处理缺失值:
优点:
梯度提升决策树通过迭代多棵树,每棵树学习之前所有树的残差。
| 对比项 | GBDT | XGBoost |
|---|---|---|
| 损失函数 | 只用一阶导数 | 泰勒展开,使用一二阶导数 |
| 正则化 | 无显式正则 | 加入L1/L2正则,控制模型复杂度 |
| 分裂标准 | 基尼系数 | 基于二阶导数计算增益 |
| 缺失值处理 | 需要手动处理 | 自动学习分裂方向 |
XGBoost是GBDT的高效实现,工程优化和正则化改进。
核心改进:
为什么用泰勒展开? 去耦合了损失函数选择和优化算法,使得XGBoost可以支持自定义损失函数,只要能求出一二阶导数即可。
优点:精度高,正则化防止过拟合,速度快,支持并行
LightGBM是XGBoost的改进版,更快更省内存。
核心改进:
XGBoost vs LightGBM:
| 对比项 | XGBoost | LightGBM |
|---|---|---|
| 分裂方式 | 按层生长 | 按叶子生长 |
| 处理稀疏 | 预排序,占用内存大 | 基于直方图,省内存 |
| 训练速度 | 较慢 | 更快 |
| 内存占用 | 较大 | 较小 |
**LR和线性回归的区别与联系?
**L1和L2正则化的区别?L1为什么能产生稀疏性?
**决策树如何防止过拟合?
**为什么XGBoost要用泰勒展开,优势在哪里? XGBoost使用一阶和二阶偏导,二阶导数有利于梯度下降更快更准。使用泰勒展开可以在不选定损失函数具体形式的情况下进行优化分析,本质上把损失函数选取和模型优化参数选择分开,增加了XGBoost的适用性,支持自定义损失函数。
**XGBoost如何处理缺失值? XGBoost在训练时,自动学习缺失值的分裂方向。对于每个树节点,算法会尝试把缺失值分到左子树和右子树,选择分裂增益更大的方向,这样在预测时遇到缺失值就按学习到的方向分裂。
**LightGBM的GOSS和EFB是什么?
**生成模型和判别模型的区别?举例说明
**哪些机器学习算法不需要做归一化处理?为什么?
**KMeans中,K的选择方法?
**LR和SVM的联系与区别?