搜广推实习面经四
字节跳动TAC 广告算法
一、回归任务的评价指标有哪些
- 1.均方误差(Mean Squared Error, MSE)/均方根误差(Root Mean Squared Error, RMSE)
M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1∑n(yi−y^i)2 - 2.平均绝对误差(Mean Absolute Error, MAE)
M A E = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| MAE=n1i=1∑n∣yi−y^i∣ - 3.平均绝对百分比误差(Mean Absolute Percentage Error, MAPE)
MAPE 衡量模型预测误差相对于真实值的百分比。
M A P E = 1 n ∑ i = 1 n ∣ y i − y ^ i y i ∣ × 100 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 - 4.R² 或 决定系数(Coefficient of Determination)
R² 反映了模型对数据的拟合程度,值的范围在 [0,1]之间。R² 值越接近 1,表示模型越能解释数据的方差;接近 0 则表示模型的解释能力较弱。
R 2 = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2 = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2} R2=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2 - 5.调整后的 R²(Adjusted R²)
调整后的 R² 是对 R² 的修正,考虑到模型中自变量的数量。当自变量较多时,R² 值可能会偏高(特征多了更容易拟合),防止模型因增加无关特征而导致 R² 值虚高。因此调整后的 R² 提供了更可靠的评价。
R adj 2 = 1 − ( 1 − R 2 ) n − 1 n − p − 1 R^2_{\text{adj}} = 1 - \left(1 - R^2\right) \frac{n - 1}{n - p - 1} Radj2=1−(1−R2)n−p−1n−1
- n n n 是样本数,
- p p p 是自变量数量。
二、标签长尾分布,多峰分布怎么应对?
- 1.长尾分布
- 少数类范围的样本做过采样、多数类范围的样本做降采样
- 做log、Box_Cox变换等
- 变换目标(比如房价,大部分价格都是百万级别,尾巴肯定有千万、上亿的,可以通过房价/面积得到每平方价格,用每平方价格当作标签计数)
- 用无监督模型对每个样本预先打上一个标签(这个类别标签表示这个样本大概属于那个范围)
- 稀疏样本加权
- 2.多峰分布
感觉和长尾分布处理方式差不多。但是多峰分布可能更适合采用分组建模
分组建模:如果数据中的不同部分存在不同的模式,考虑使用分组建模或分段模型,为每个群体(峰值区域)建立单独的模型。
三、优化器有哪些
在机器学习中,优化器负责调整模型的参数以最小化损失函数,帮助模型更好地拟合数据。
- 1.基础的优化器
- Ⅰ.随机梯度下降 (SGD)
θ = θ − η ⋅ ∇ θ J ( θ ) \theta = \theta - \eta \cdot \nabla_{\theta} J(\theta) θ=θ−η⋅∇θJ(θ)
- θ \theta θ: 模型参数
- η \eta η: 学习率
- J ( θ ) J(\theta) J(θ): 损失函数 - Ⅱ.动量法 (Momentum)
引入动量,使得更新方向受之前梯度的影响,平滑收敛路径。
v t = β v t − 1 + ( 1 − β ) ∇ θ J ( θ ) θ = θ − η v t v_t = \beta v_{t-1} + (1 - \beta) \nabla_{\theta} J(\theta) \\ \theta = \theta - \eta v_t vt=βvt−1+(1−β)∇θJ(θ)θ=θ−ηvt
- v t v_t vt: 动量向量
- β \beta β: 动量系数(如 0.9)
- Ⅰ.随机梯度下降 (SGD)
- 2.自适应优化器
自适应优化器(Adaptive Optimizer)是指能够根据梯度变化动态调整学习率的优化算法。这类优化器的主要目标是改进传统优化器(如SGD)的收敛速度和稳定性,特别是在训练非凸深度学习模型时表现优异。- Ⅰ.Adagrad
可以为每个参数自适应调整学习率,但是累积历史梯度平方和导致学习率持续下降,后期更新较慢
θ = θ − η G t , i i + ϵ ∇ θ J ( θ ) \theta = \theta - \frac{\eta}{\sqrt{G_{t,ii} + \epsilon}} \nabla_{\theta} J(\theta) θ=θ−Gt,ii+ϵη∇θJ(θ)- G t G_t Gt: 梯度平方的累加矩阵。
- ϵ \epsilon ϵ: 防止分母为零的小值。
- Ⅱ.RMSprop
通过梯度平方的指数加权平均,解决了 Adagrad 的学习率衰减问题。
E [ g 2 ] t = β E [ g 2 ] t − 1 + ( 1 − β ) g t 2 θ = θ − η E [ g 2 ] t + ϵ ∇ θ J ( θ ) E[g^2]_t = \beta E[g^2]_{t-1} + (1 - \beta) g_t^2 \\ \ \\ \theta = \theta - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \nabla_{\theta} J(\theta) E[g2]t=βE[g2]t−1+(1−β)gt2 θ=θ−E[g2]t+ϵη∇θJ(θ)- E [ g 2 ] t E[g^2]_t E[g2]t: 梯度平方的指数加权平均。
- Ⅲ.Adam (Adaptive Moment Estimation)
综合了动量法和 RMSprop 的优点,基本默认的都是用Adam
一阶动量: m t = β 1 m t − 1 + ( 1 − β 1 ) g t 二阶动量: v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 参数更新: θ = θ − η ⋅ m ^ t v ^ t + ϵ 一阶动量:m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t \\ 二阶动量:v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 \\ 参数更新:\theta = \theta - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} \\ 一阶动量:mt=β1mt−1+(1−β1)gt二阶动量:vt=β2vt−1+(1−β2)gt2参数更新:θ=θ−η⋅v^t+ϵm^t- m ^ t \hat{m}_t m^t, v ^ t \hat{v}_t v^t: 偏差校正。
- Ⅰ.Adagrad
- 3.高级的优化器
- Ⅰ.SGDW / AdamW
增加权重衰减项(Weight Decay),替代 L2 正则化。 - Ⅱ.LAMB (Layer-wise Adaptive Moments)
专为大规模分布式训练设计,适用于大批量训练。每一层都有独立的学习率调整。
- Ⅰ.SGDW / AdamW
- 四、力扣_215. 数组中的第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
这是一道经典的使用快排和堆的,这里可以背一下快排的模板
class Solution:def findKthLargest(self, nums, k):def quick_select(nums, k):# 随机选择基准数pivot = random.choice(nums)big, equal, small = [], [], []# 将大于、小于、等于 pivot 的元素划分至 big, small, equal 中for num in nums:if num > pivot:big.append(num)elif num < pivot:small.append(num)else:equal.append(num)if k <= len(big):# 第 k 大元素在 big 中,递归划分return quick_select(big, k)if len(nums) - len(small) < k:# 第 k 大元素在 small 中,递归划分return quick_select(small, k - len(nums) + len(small))# 第 k 大元素在 equal 中,直接返回 pivotreturn pivotreturn quick_select(nums, k)