【一】 什么是 逻辑回归?
尽管名字中带有“回归”二字,但逻辑回归(Logistic Regression,简称LR)实际上是一种经典的分类算法,主要用于二分类问题,也可以扩展用于多分类。在面试中,面试官通常会首先询问你对该算法的基本定义及其适用场景的理解。
⚙️ 核心定义
逻辑回归是通过拟合一个Sigmoid函数,将线性回归的输出映射到(0,1)区间,从而表示样本属于某一类的概率。
⚙️ 为什么叫回归?
因为它使用了类似线性回归的加权求和形式(z = wx + b),只是最后多了一层非线性激活函数。
⚙️ 典型应用场景
点击率预测(CTR)、垃圾邮件分类、贷款违约预测、疾病风险诊断等概率输出型分类任务。
【二】 核心原理与数学推导
在面试中,深入理解数学原理是区分初级和高级候选人的关键。我们需要从假设函数、损失函数到优化算法进行层层剖析。
2.1 Sigmoid 函数
逻辑回归的核心在于将线性输出映射为概率。Sigmoid函数公式如下:
g(z) = 1 / (1 + e^(-z))
其中 z = w^T x + b
该函数将任意实数映射到(0, 1)之间,当z趋近于正无穷时,g(z)趋近于1;当z趋近于负无穷时,g(z)趋近于0。在面试中,面试官可能会问:“为什么选择Sigmoid而不是其他激活函数?” 答案通常涉及其导数形式简单、输出具有概率意义以及历史原因等。
2.2 损失函数(Loss Function)
逻辑回归使用对数损失函数(Log Loss),而不是均方误差(MSE)。这是因为MSE在逻辑回归中是非凸函数,容易导致梯度下降陷入局部最优。
| 比较维度 | 均方误差 (MSE) | 对数损失 (Log Loss) |
|---|---|---|
| 凸性 | 非凸(有多个局部极小值) | 严格凸函数(有全局最优解) |
| 梯度收敛速度 | 在误差较大时梯度更新慢 | 误差越大,梯度更新越快 |
| 适用性 | 线性回归 | 逻辑回归 |
2.3 极大似然估计
逻辑回归的参数求解通常基于极大似然估计(MLE)。我们假设样本独立同分布,构建似然函数,取对数后得到对数似然函数,然后通过梯度上升(或梯度下降最小化负对数似然)来求解参数w和b。
【三】 面试官最爱问的 10 个高频问题
根据对各大厂面试真题的统计分析,以下问题是关于逻辑回归算法面试问题中出现频率最高的考点。我们采用选项卡形式分类展示,便于阅读。
Q1: 逻辑回归和线性回归有什么区别?
这是最基础的问题。线性回归用于回归任务,输出连续值,假设误差服从正态分布;逻辑回归用于分类任务,输出离散概率,假设误差服从伯努利分布。此外,线性回归直接使用线性函数,而逻辑回归引入了Sigmoid非线性变换。
Q2: 为什么逻辑回归要用Sigmoid函数?
主要目的有两个:一是将线性输出映射到(0,1)区间,使其具有概率意义;二是Sigmoid函数的导数形式非常简单(g'(z) = g(z)(1-g(z))),便于后续梯度计算。虽然ReLU等函数在深层网络中表现更好,但在逻辑回归这种浅层模型中,Sigmoid的统计解释性更强。
Q3: 逻辑回归是线性模型还是非线性模型?
从决策边界的角度看,如果特征之间没有交互项或多项式特征,逻辑回归是一个线性分类器,其决策边界是一条直线(或超平面)。但如果引入了多项式特征或核技巧,它可以拟合非线性边界。在面试中,通常默认指其线性分类器的本质。
Q4: 逻辑回归的损失函数为什么是对数损失?
如对前文所述,使用MSE会导致非凸优化问题。对数损失源于极大似然估计。当我们假设标签y服从伯努利分布,参数为p时,对数似然函数的负值即为对数损失。这种形式保证了损失函数是凸的,且对错误预测施加了更大的惩罚(例如,真实为1,预测概率接近0时,Loss趋向无穷大)。
Q5: 如何处理逻辑回归中的类别不平衡问题?
在实际业务中,正负样本比例往往失衡。解决方法包括: 1. 重采样:过采样少数类(SMOTE)或欠采样多数类。 2. 调整阈值:默认阈值为0.5,可根据PR曲线调整。 3. 样本权重:在损失函数中给少数类赋予更高的权重。 4. 更换评估指标:不使用Accuracy,而使用AUC或F1-Score。
Q6: 逻辑回归中的梯度下降有哪些变体?
主要有三种: 1. 批量梯度下降(BGD):使用所有样本计算梯度,收敛稳定但速度慢,内存消耗大。 2. 随机梯度下降(SGD):每次用一个样本更新,收敛快但震荡大。 3. 小批量梯度下降(Mini-batch GD):折中方案,兼顾速度和稳定性,是工业界最常用的方法。
Q7: 逻辑回归需要做特征缩放(Feature Scaling)吗?
是的,必须做。因为逻辑回归通常使用梯度下降法优化,如果特征量纲差异巨大(如年龄0-100,收入0-100000),损失函数的等高线会变成狭长的椭圆,导致梯度下降路径呈“之”字形,收敛极慢。标准化(Standardization)或归一化(Normalization)可以加速收敛。
Q8: 如何处理逻辑回归中的多重共线性?
多重共线性会导致参数估计方差增大,模型不稳定。解决方法包括: 1. 正则化:使用L1(Lasso)或L2(Ridge)正则化,L1还能进行特征选择。 2. 特征选择:移除相关性极高的特征。 3. PCA:主成分分析降维。
Q9: L1和L2正则化在逻辑回归中的区别?
L1正则化(Lasso)倾向于产生稀疏解,即大部分权重为0,可用于特征选择;L2正则化(Ridge)倾向于使权重均匀变小,防止过拟合,且解更稳定。在面试中,常问为什么L1能产生稀疏解,这可以从几何角度(L1的可行域是菱形,更容易在轴上与损失函数等高线相切)解释。
Q10: 逻辑回归的优缺点是什么?
优点:实现简单,计算效率高,可解释性强(输出概率,权重代表特征重要性),适合大规模数据。 缺点:难以处理非线性数据(需人工构造特征),对异常值敏感,假设特征与对数几率呈线性关系。
【四】 代码实现要点
在面试中,手写逻辑回归代码虽然不常见,但理解其核心实现逻辑至关重要。以下是一个基于NumPy的简化实现框架。
import numpy as np
class LogisticRegression:
def __init__(self, learning_rate=0.01, n_iterations=1000):
self.lr = learning_rate
self.n_iter = n_iterations
self.weights = None
self.bias = None
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def fit(self, X, y):
n_samples, n_features = X.shape
self.weights = np.zeros(n_features)
self.bias = 0
for _ in range(self.n_iter):
linear_model = np.dot(X, self.weights) + self.bias
y_predicted = self.sigmoid(linear_model)
# 计算梯度
dw = (1 / n_samples) np.dot(X.T, (y_predicted - y))
db = (1 / n_samples) np.sum(y_predicted - y)
# 更新参数
self.weights -= self.lr dw
self.bias -= self.lr db
def predict(self, X):
linear_model = np.dot(X, self.weights) + self.bias
y_predicted = self.sigmoid(linear_model)
return [1 if i > 0.5 else 0 for i in y_predicted]
注意:在实际面试中,如果能提到向量化操作的重要性,以及如何处理数值溢出(如np.clip防止exp溢出),会是巨大的加分项。
【五】 评估指标深度解读
分类问题的评估不能仅看准确率(Accuracy),尤其是在样本不平衡时。以下是逻辑回归常用的评估体系:
- 混淆矩阵(Confusion Matrix):TP, TN, FP, FN的基础构成,是计算其他指标的基础。
- Precision(查准率):预测为正的样本中,真正为正的比例。关注“宁缺毋滥”的场景(如垃圾邮件过滤)。
- Recall(查全率):真正为正的样本中,被正确预测出来的比例。关注“宁可错杀”的场景(如癌症筛查)。
- F1-Score:Precision和Recall的调和平均数,用于综合评估。
- AUC-ROC曲线:ROC曲线横轴为FPR,纵轴为TPR。AUC值越大,模型性能越好。AUC衡量的是模型排序能力,即正样本预测概率大于负样本预测概率的概率。
【七】 总结与备考建议
掌握逻辑回归算法面试问题,不仅需要背诵公式,更需要理解其背后的统计学习思想和工程实践考量。建议备考者: 1. 亲手推导一遍梯度下降过程。 2. 使用Sklearn实现LR,并调试正则化参数C。 3. 深入理解AUC的物理意义。 4. 思考LR在推荐系统、广告系统中的具体应用案例。
本站持续更新最新算法面试题,请关注 kaoacca.cn 获取更多资源。