6.3 正则化与其他常用模型


6.3 正则化与其他常用模型

本节摘要:线性与逻辑回归之外,破案工具箱还要备几副眼镜:正则化回归(岭回归与套索)治共线性与变量太多,多项回归处理多类别归属,决策树捕捉非线性交互。本节给出各模型的适用案情与 R 接口,核心主张是"先试简单模型,有证据再升级"。

正则化:给系数套缰绳

第 4 章的相关矩阵图里若两个解释变量高度相关,回归系数就会剧烈抖动——这是共线性。正则化的思路是在损失函数里给系数总幅度加罚:

  • 岭回归:按系数平方和罚,系数被整体压小但不归零,适合"变量都有点用、彼此纠缠"。
  • 套索:按系数绝对值和罚,能把弱变量压到恰好为零,自带变量筛选。
install.packages("glmnet") library(glmnet) x <- as.matrix(Boston[, c("lstat", "rm", "ptratio", "tax", "nox", "age")]) y <- Boston$medv cv_fit <- cv.glmnet(x, y, alpha = 1) # alpha 1 为套索,0 为岭回归 cv_fit$lambda.min # 交叉验证选出的罚强度 coef(cv_fit, s = "lambda.min") # 部分系数已被压为 0

罚强度不由人拍脑袋,交叉验证自动挑——这是正则化最省心的地方。

多项回归与决策树

结果变量超过两个类别(比如把房价切成低中高三档),二分类逻辑回归不够用:

library(nnet) Boston$price_band <- cut(Boston$medv, 3, labels = c("低", "中", "高")) fit_multi <- multinom(price_band ~ lstat + rm + ptratio, data = Boston)

关系非线性、变量之间有交互时,决策树递归切分,不要求任何线性前提:

fit_tree <- rpart::rpart(price_band ~ lstat + rm + ptratio, data = Boston, minsplit = 20, cp = 0.01) rpart.plot::rpart.plot(fit_tree) # 树状判决图,可解释性极强

模型选型档案

模型 适用案情 强项 弱点
线性回归 连续结果、关系近似线性 系数可解释 非线性失灵
逻辑回归 二分类 概率输出、几率比 类别多时要扩展
岭回归 共线性、变量多而都相关 稳定 不做变量筛选
套索 变量很多、想自动筛选 稀疏解 强相关变量二选一
多项回归 多类别归属 一套框架 类别失衡敏感
决策树 非线性与交互 直观可解释 单棵树易波动
# 所有模型的最终考试都是同一道题:留出集误差 library(rsample) split <- initial_split(Boston, prop = 0.8) B_tr <- training(split); B_te <- testing(split) pred_lm <- predict(lm(medv ~ ., data = B_tr, subset = select(B_tr, -price_band)), newdata = B_te) # 对每个候选模型算同一段留出集的均方根误差,谁的误差小用谁

💡 关键直觉:模型复杂度要和证据量、可解释需求匹配。给委托人解释"为什么",线性回归的系数表常常胜过黑箱;纯预测场景才值得上更复杂的模型。复杂不是奖杯,是负债。

岭与套索的对照实测

同一份数据、两种罚,把"压系数"与"做筛选"的差别看得见:

library(glmnet) x <- as.matrix(Boston[, c("crim", "zn", "indus", "nox", "rm", "age", "dis", "tax", "ptratio", "lstat")]) y <- Boston$medv cv_lasso <- cv.glmnet(x, y, alpha = 1) # 套索 cv_ridge <- cv.glmnet(x, y, alpha = 0) # 岭回归 coef(cv_lasso, s = "lambda.min") # 典型结果:若干变量系数恰为 0(例如 indus、age),名单自动出局 coef(cv_ridge, s = "lambda.min") # 所有变量都留任,只是幅度整体缩小,没有一个是精确的 0 # 交叉验证曲线怎么看:横轴对数罚强度,纵轴均方误差 plot(cv_lasso) # 左端欠罚方差大,右端过罚偏差大,最小点即 lambda.min

cv.glmnet 的两条虚线给出 lambda.min 与 lambda.1se:后者罚更强、模型更简,误差只多一个标准误——生产中常取 1se 版本,用一点误差换一份简洁。

决策树解读与收缰

library(rpart); library(rpart.plot) fit_tree <- rpart(medv ~ lstat + rm + ptratio, data = Boston, cp = 0.01, maxdepth = 3) rpart.plot(fit_tree) # 收缰证据:交叉验证误差随 cp 的变化 printcp(fit_tree) # 找 xerror 最小对应的 cp,作为剪枝依据 fit_prune <- prune(fit_tree, cp = 0.02)

树状判决的读法像玩"二十个问题":从根出发,每次按一个变量问一道是非题,叶节点给出落点均值。rpart.plot 图上每叶标注均值与样本占比,向委托人讲解时这张图常常比任何系数表都有说服力。但单棵树对数据扰动敏感(换一批样本长出另一副骨架),追求稳定需要随机森林这类集成——那是进阶方向,本册止步于"会种一棵、会剪枝"。

⚠️ 排错实录:glmnet 只吃矩阵不吃数据框,直接喂 data.frame 会报错;因变量与自变量要分别准备成 y 与 x。此外 x 里若有字符列必须先转哑变量,model.matrix 一行可代劳。

本节要点回顾

  • 岭回归压系数、套索做筛选:一副缰绳两种拴法
  • 交叉验证定罚强度:超参数不靠拍脑袋
  • 多项回归管多类别:二分类框架的直接扩展
  • 决策树免线性前提:交互与非线性一视同仁
  • 留出集是统一考场:所有模型用同一段数据比误差

一并提醒与本章前两节的收束关系:正则化救的是"变量太多、彼此纠缠"的回归,多项与决策树补的是"类别更多、关系更弯"的场景——它们不是取代 lm 与 glm,而是在诊断报警后按症状换的备胎。诊断在前、换型在后,这个次序贯穿全章。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U