数据挖掘实习面经一
写在前面:其实数据挖掘、风控、机器学习算法与搜广推的八股还是有重合的部分,毕竟都是面对结构化数据。特别是我自己是做竞赛的,平时LGBM、CatBoost用的挺多的,所以感觉这些八股还是有必要看看,建议大家也可以看一下。
京东数据挖掘算法
一、介绍贝叶斯优化的原理
贝叶斯优化(Bayesian Optimization)是一种用于优化黑盒函数的有效方法,特别适用于目标函数评估成本较高、不可导或难以解析表达的情况。它广泛应用于超参数调优、实验设计、自动化机器学习等领域。
1.1. 核心思想
贝叶斯优化的核心思想是通过构建目标函数的概率模型(通常称为代理模型),结合贝叶斯推断逐步更新对目标函数的理解,并选择下一个采样点以最大化信息增益或目标值。
具体来说:
- 概率建模:使用一个概率模型(通常是高斯过程,Gaussian Process, GP)来近似目标函数。
- 不确定性量化:通过概率模型捕捉目标函数的不确定性。
- 采样策略:利用采集函数(Acquisition Function)在探索与开发之间权衡,选择下一个采样点。
1.2. 工作流程
贝叶斯优化的工作流程可以分为以下几个步骤:
(1) 初始化
- 随机选择一些初始点 { x 1 , x 2 , … , x n } \{x_1, x_2, \dots, x_n\} {x1,x2,…,xn},并计算对应的目标函数值 { y 1 , y 2 , … , y n } \{y_1, y_2, \dots, y_n\} {y1,y2,…,yn}。这些初始点用于初始化代理模型。
(2) 构建代理模型
- 使用高斯过程(或其他概率模型)拟合已有的观测数据 { ( x i , y i ) } \{(x_i, y_i)\} {(xi,yi)}。高斯过程是一种非参数化的概率模型,能够输出目标函数值及其不确定性估计。
(3) 定义采集函数
采集函数(Acquisition Function)用于衡量候选点的价值,帮助决定下一个采样点。
- 常见的采集函数包括:
- Expected Improvement (EI):期望改进,选择可能比当前最优解更好的点。
- Probability of Improvement (PI):改进概率,选择可能比当前最优解更好的点的概率。
- Upper Confidence Bound (UCB):上置信界,综合考虑目标值和不确定性。
- Thompson Sampling:随机采样模型后验分布中的函数,选择其最大值点。
(4) 选择下一个采样点
- 在定义好的采集函数下,优化采集函数以找到下一个最有潜力的采样点 x n + 1 x_{n+1} xn+1。
- 计算该点的实际目标函数值 y n + 1 y_{n+1} yn+1。
(5) 更新模型
- 将新采样点 ( x n + 1 , y n + 1 ) (x_{n+1}, y_{n+1}) (xn+1,yn+1) 添加到数据集中,更新代理模型。
- 重复步骤 (3)-(5),直到满足停止条件(如达到最大迭代次数或目标值收敛)。
1.3. 数学描述
假设目标函数为 f ( x ) f(x) f(x),我们希望最大化 f ( x ) f(x) f(x)。贝叶斯优化的过程可以用以下公式描述:
-
代理模型:
- 使用高斯过程建模目标函数:
f ( x ) ∼ G P ( m ( x ) , k ( x , x ′ ) ) f(x) \sim \mathcal{GP}(m(x), k(x, x')) f(x)∼GP(m(x),k(x,x′))
其中 m ( x ) m(x) m(x) 是均值函数, k ( x , x ′ ) k(x, x') k(x,x′) 是核函数(Kernel Function)。
- 使用高斯过程建模目标函数:
-
后验分布:
- 给定观测数据
D
=
{
(
x
i
,
y
i
)
}
i
=
1
n
D = \{(x_i, y_i)\}_{i=1}^n
D={(xi,yi)}i=1n,高斯过程给出目标函数在任意点
x
x
x 的后验分布:
p ( f ( x ) ∣ D ) ∼ N ( μ ( x ) , σ 2 ( x ) ) p(f(x) | D) \sim \mathcal{N}(\mu(x), \sigma^2(x)) p(f(x)∣D)∼N(μ(x),σ2(x))
其中 μ ( x ) \mu(x) μ(x) 和 σ 2 ( x ) \sigma^2(x) σ2(x) 分别表示均值和方差。
- 给定观测数据
D
=
{
(
x
i
,
y
i
)
}
i
=
1
n
D = \{(x_i, y_i)\}_{i=1}^n
D={(xi,yi)}i=1n,高斯过程给出目标函数在任意点
x
x
x 的后验分布:
-
采集函数:
- 以 Expected Improvement (EI) 为例,其定义为:
EI ( x ) = E [ max ( f ( x ) − f best , 0 ) ] \text{EI}(x) = \mathbb{E}\left[\max(f(x) - f_{\text{best}}, 0)\right] EI(x)=E[max(f(x)−fbest,0)]
其中 $ f_{\text{best}} = \max_{i=1,\dots,n} y_i $ 是当前最优值。
- 以 Expected Improvement (EI) 为例,其定义为:
-
优化采集函数:
- 找到使采集函数最大的点:
x n + 1 = arg max x Acquisition ( x ) x_{n+1} = \arg\max_x \text{Acquisition}(x) xn+1=argxmaxAcquisition(x)
- 找到使采集函数最大的点:
1.5. 应用场景
- 超参数调优:如深度学习模型的超参数(学习率、正则化参数等)。
- 自动化机器学习:自动选择模型架构和算法。
- 实验设计:在物理实验或化学实验中优化实验条件。
- 金融优化:如投资组合优化或风险控制。
二、GBDT、Boosting、Bagging算法的不同
在机器学习领域,集成学习方法通过组合多个模型(通常称为“基模型”或“弱学习器”)来提高预测性能。其中,GBDT(Gradient Boosting Decision Tree)、Boosting、Bagging是三种重要的集成学习技术。尽管它们都旨在提升模型的表现,但各自的工作机制和应用场景存在显著差异。
2.1. Bagging
Bagging 的全称是 Bootstrap Aggregating,它是一种并行的集成学习方法,主要通过减少模型的方差来改善模型的泛化能力。Bagging 的核心思想是对原始数据集进行多次有放回抽样(Bootstrap Sampling),生成若干个子数据集,然后基于每个子数据集训练一个独立的基模型,最后将所有基模型的结果通过**投票(分类问题)或平均(回归问题)**的方式结合起来得到最终结果。
- 样本选择: Bagging 使用有放回的随机抽样方法生成多个子数据集,这些子数据集之间是相互独立的。
- 模型训练: 每个基模型可以独立并行地训练,因为它们之间的依赖性较低。
- 模型组合: 对于分类问题,Bagging 通常采用多数投票法;对于回归问题,则采用平均值法。
- 优点: Bagging 能够有效降低模型的方差,防止过拟合,尤其是在处理高方差模型时表现良好,如未剪枝的决策树。
- 缺点: Bagging 对于低偏差模型的效果可能不如 Boosting 方法显著。
2.2. Boosting
Boosting 是一种串行的集成学习方法,其目标是通过组合多个弱学习器形成一个强学习器。Boosting 的基本策略是逐步构建一系列基模型,每个新的基模型都会尝试纠正前一个基模型的错误。具体来说,Boosting 算法会根据前一轮中基模型的表现调整样本权重,使得那些被错误分类的样本在下一轮中获得更高的关注 。
- 样本选择: Boosting 不改变训练集本身,而是调整样本的权重。初始时,所有样本的权重相同,随着迭代进行,分错的样本权重会被增大。
- 模型训练: Boosting 是一种串行方法,每个基模型的训练都需要以前一个基模型为基础。
- 模型组合: Boosting 通常使用加权组合的方式,其中误差较小的基模型会被赋予更大的权重。
- 优点: Boosting 主要关注降低偏差,因此在处理复杂问题时通常能获得更好的效果。
- 缺点: 由于是串行训练,Boosting 的计算成本较高,且对噪声数据较为敏感。
2.3. GBDT
GBDT(Gradient Boosting Decision Tree)是一种具体的 Boosting 方法,它结合了梯度下降的思想和决策树模型。GBDT 的工作原理是通过多轮迭代,每轮构建一棵新的回归树,这棵树用于拟合上一轮模型预测值与真实值之间的残差(即误差)。换句话说,GBDT 每次都在之前模型的基础上改进,试图最小化整体损失函数。
- 样本选择: 类似于其他 Boosting 方法,GBDT 不直接修改样本集,而是通过调整残差来间接影响样本的重要性。
- 模型训练: GBDT 是一种串行方法,每棵新树都是基于之前的模型残差构建的。
- 模型组合: GBDT 将所有树的结果累加起来作为最终预测输出,类似于线性模型中的特征加权求和。
- 优点: GBDT 能够很好地处理非线性关系,并且适用于多种类型的预测任务,包括分类和回归。
- 缺点: GBDT 的训练过程较慢,因为它需要依次构建每棵树;此外,GBDT 对异常值较为敏感,可能导致过拟合。
2.3. 总结对比
特性 | Bagging | Boosting | GBDT |
---|---|---|---|
样本选择 | 有放回随机抽样 | 根据错误率调整样本权重 | 基于残差调整样本重要性 |
模型训练 | 并行训练 | 串行训练 | 串行训练 |
模型组合 | 投票/平均 | 加权组合 | 累加 |
主要目标 | 减少方差 | 减少偏差 | 减少偏差 |
适用场景 | 高方差模型 | 复杂问题 | 非线性关系、多种预测任务 |
综上所述,Bagging 和 Boosting 是两种不同的集成学习策略,而 GBDT 是 Boosting 家族中的一个重要成员。Bagging 更适合用来降低模型的方差,而 Boosting 和 GBDT 则更侧重于减少模型的偏差,从而提高模型的准确性。选择哪种方法取决于具体的应用场景以及数据特性。
三、介绍机器学习的可解释性
机器学习的可解释性是指能够理解和解释机器学习模型的预测过程和结果的能力。随着机器学习模型(尤其是深度学习模型)的复杂性增加,模型的可解释性变得越来越重要,特别是在高风险的领域(如医疗、金融、自动驾驶等)。
3.1. 可解释性定义
可解释性可以被定义为通过开发可解释性技术来解释已经训练好的机器学习模型的能力。根据解释目标和解释对象的不同,可解释性方法可以分为全局可解释性和局部可解释性。
- 全局可解释性旨在帮助人们理解复杂模型背后的整体工作机制
- 局部可解释性则关注于单个预测的具体原因
3.2. 可解释性方法
4.1 特征重要性
- 全局特征重要性:衡量每个特征对模型预测的总体贡献。
- 方法:线性模型的系数、决策树的分裂重要性、随机森林的特征重要性。
- 局部特征重要性:衡量每个特征对单个样本预测的贡献。
- 方法:LIME、SHAP。
4.2 局部解释方法
- LIME(Local Interpretable Model-agnostic Explanations):
- 通过在局部拟合一个简单模型(如线性模型)来解释复杂模型的预测。
- SHAP(SHapley Additive exPlanations):
- 基于博弈论的 Shapley 值,公平地分配每个特征对预测的贡献。
4.3. Permuted Feature Importance(null_importance)
- Permuted Feature Importance 是一种通过打乱特征值来检查特征对模型预测贡献的重要性计算方法。这种方法通过破坏某个特征与标签之间的关系,然后观察模型性能的变化来衡量该特征的重要性
3.3. 可解释性工具
3.3.1. SHAP
- 基于 Shapley 值的解释工具,支持全局和局部解释。
- 适用于多种模型(如树模型、深度学习模型)。
3.3.2. LIME
- 局部解释工具,适用于任何黑箱模型。
3.3.3. ELI5
- 提供特征重要性和模型解释的可视化工具。
3.3.4. InterpretML
- 提供多种可解释性方法(如 PDP、ICE、SHAP)的统一框架。
四、347. 前 K 个高频元素(力扣hot100_堆_中等)
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
# 使用 defaultdict 统计每个元素出现的次数
coll_dea = collections.defaultdict(int)
for i in nums:
coll_dea[i] += 1
# 按频率排序(从高到低),然后取前 k 个元素
sorted_items = sorted(coll_dea.items(), key=lambda x: x[1], reverse=True)
ans = [item[0] for item in sorted_items[:k]] # 提取前 k 个元素的值
return ans