1. 线性模型:机器学习的第一块基石
第一次翻开《机器学习》(西瓜书)第三章时,我被周志华老师那句"线性模型是机器学习中最基础的模型"深深触动。作为从业十年的算法工程师,我至今记得自己第一次用线性回归预测房价时,看着那条简单直线竟然能拟合真实数据的震撼。这就像建筑工人打地基,看似简单的水泥浇筑,却决定了整栋楼的高度和稳固性。
线性模型的核心魅力在于其"大道至简"——用y=wx+b这样的线性方程,就能解决从用户点击率预测到金融风险评估等各种问题。我在电商平台做的第一个推荐系统,就是用逻辑回归实现的,虽然现在深度学习当道,但每逢新业务冷启动,我仍然会先搭建线性模型baseline。这章要啃的南瓜书补充推导,正是帮我们理解这些"简单"模型背后的数学之美。
2. 线性回归:从数学推导到实战调参
2.1 最小二乘法背后的几何意义
西瓜书3.2节给出的最小二乘解w=(X^TX)^(-1)X^Ty,本质上是在寻找使预测值与真实值欧氏距离最小的参数。我在教学时常用投影来比喻——就像把散乱的数据点投射到模型空间的超平面上。
南瓜书对此的矩阵求导补充尤为珍贵。记得有次面试,候选人被要求手动推导正态方程,90%的人卡在矩阵求导步骤。其实记住这两个关键点就能应对大部分场景:
- ∂(w^TAw)/∂w = (A+A^T)w
- 当A对称时简化为2Aw
重要提示:实践中直接调用scikit-learn的LinearRegression而非自己实现,因为涉及矩阵求逆稳定性处理(如SVD分解)。曾有个项目因自写代码未处理列共线性,导致预测出现严重偏差。
2.2 正则化:解决过拟合的利器
当特征维数高或存在多重共线性时,普通最小二乘会失效。这时就需要引入L2正则化(岭回归)或L1正则化(Lasso)。我在信贷评分项目中就遇到过——原始特征300+维,Lasso自动筛选出20个关键特征,模型效果反而提升7%。
参数选择上,建议:
- 先用热力图观察特征相关性
- 从α=0.1开始网格搜索
- 对Lasso使用np.logspace(-3,3,7)等比数列
# 标准化的必要步骤 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 带交叉验证的Lasso from sklearn.linear_model import LassoCV model = LassoCV(alphas=np.logspace(-3,3,7), cv=5) model.fit(X_scaled, y)3. 对数几率回归:分类问题的起点
3.1 从线性回归到逻辑回归
虽然名叫"回归",但逻辑回归实为分类模型。它的巧妙之处在于用sigmoid函数将线性输出压缩到(0,1)区间。我在医疗诊断系统中就用它预测患病概率,相比直接阈值判断,概率输出更能辅助医生决策。
南瓜书对极大似然估计的推导值得反复品味。理解这个:
- 为什么用交叉熵而非MSE作为损失函数?
- 梯度下降时∂L/∂w = X^T(y_pred-y)的物理意义是什么?
3.2 多分类扩展与工程实践
面对多分类问题,两种主流方案:
- OvR(One vs Rest):训练K个二分类器
- Softmax回归:直接输出多类概率
在商品品类预测项目中,我发现当类别不平衡时:
- Softmax对头部类别偏向严重
- OvR+类别权重调整效果更稳定
# 样本加权示例 class_weight = compute_class_weight('balanced', classes=np.unique(y), y=y) model = LogisticRegression(class_weight=dict(zip(np.unique(y), class_weight)))4. 线性判别分析:降维与分类的双重奏
4.1 类间分散与类内分散的博弈
LDA试图找到使类间距离最大、类内距离最小的投影方向。在人脸识别项目中,我们先用PCA降维到100维,再用LDA提取10维特征,识别准确率比纯PCA提升15%。
关键公式J(w)=w^TS_b w / w^TS_w w的优化,实为广义特征值问题。南瓜书详细推导了如何转化为标准特征值分解,这对理解sklearn的LDA实现至关重要。
4.2 实际应用中的陷阱
- 小样本问题:当n_samples < n_features时,类内散度矩阵奇异
- 解决方案:先PCA降维
- 非线性可分数据效果差
- 可尝试核化版本(但计算量大)
经验之谈:LDA假设各类数据同协方差矩阵,实际项目中建议先用seaborn的pairplot观察各类分布形态。
5. 多分类学习的策略对比
5.1 OvO与OvR的时空权衡
- OvO(One vs One):训练C(k,2)个分类器,预测时投票
- 适合类别少、数据量大的场景
- OvR:训练k个分类器,预测取概率最大者
- 内存占用小,但可能遇到数据不平衡
在广告CTR预测中,我们对比发现:
- 当类别数k>15时,OvO训练时间呈平方增长
- 但对长尾类别,OvO的recall比OvR高3-5%
5.2 误差校正编码的妙用
西瓜书提到的ECOC是处理多分类的优雅方案。我们曾在商品评论情感分析(正面/中性/负面)中使用:
- 编码矩阵设计为:
[[1, 1, -1], [1, -1, 1], [-1, 1, 1]] - 每个列训练一个二分类器
- 解码时计算汉明距离
这种方法比直接Softmax对模糊语句(如"还行吧")的分类准确率提升8%。
6. 类别不平衡问题的实战解决方案
6.1 重采样技术的选择
- 过采样SMOTE:适合中等不平衡(1:3到1:10)
- 但可能引入噪声
- 欠采样:适合极端不平衡(1:100+)
- 可能丢失重要信息
在金融风控中,我们采用混合策略:
- 对多数类做Tomek Links欠采样
- 对少数类用Borderline-SMOTE过采样
- 最后用集成学习组合多组采样数据
6.2 代价敏感学习
修改模型损失函数,给少数类更高惩罚权重。以逻辑回归为例:
# 计算类别权重 neg = np.sum(y==0) pos = np.sum(y==1) class_weight = {0:1, 1:neg/pos} model = LogisticRegression(class_weight=class_weight)在医疗诊断中,这种设置使得模型对阳性病例的召回率从60%提升到85%,虽然准确率略有下降,但符合业务需求。
7. 线性模型的现代扩展
7.1 核技巧:非线性能力的注入
通过核函数将特征映射到高维空间,保持线性模型的计算效率。我在推荐系统中常用以下核:
- 多项式核:适合显式特征交叉
- Sigmoid核:模仿神经网络行为
from sklearn.kernel_ridge import KernelRidge model = KernelRidge(kernel='polynomial', degree=2)7.2 稀疏建模与特征选择
当特征维数极高(如文本TF-IDF特征),L1正则化能自动选择重要特征。在新闻分类项目中,原始特征50万维,Lasso筛选出3000个关键词语,模型大小缩减到1/50,推理速度提升40倍。
实际操作建议:
- 先用方差阈值过滤低频特征
- 再用SelectFromModel配合LassoCV
- 最后用保留的特征训练最终模型
8. 工程实践中的性能优化技巧
8.1 增量学习处理大数据
当数据无法一次性加载时,可用partial_fit方法:
from sklearn.linear_model import SGDClassifier model = SGDClassifier(loss='log', warm_start=True) for chunk in pd.read_csv('bigdata.csv', chunksize=10000): X = preprocess(chunk) model.partial_fit(X, y, classes=classes)8.2 模型压缩与加速
线性模型可通过权重量化大幅压缩:
- 训练时用32位浮点
- 预测时转为8位整型
- 对稀疏模型使用CSR存储格式
在边缘设备部署时,这种优化能使推理速度提升5-8倍,内存占用减少75%。