在数据科学与人工智能快速发展的背景下,机器学习已成为解决分类、回归等问题的核心工具。R语言凭借其丰富的统计建模包(如caretmlr3)和可视化能力,成为学术界与工业界常用的分析工具之一。本文将以“从逻辑回归(基础线性模型)到XGBoost(集成学习代表)”为主线,结合R语言实践,系统讲解模型构建流程与关键调参技巧,帮助读者掌握从理论到落地的完整链路。


一、逻辑回归:分类任务的基准模型

逻辑回归(Logistic Regression)虽名为“回归”,实则是经典的二分类模型,通过Sigmoid函数将线性组合映射到概率空间,适用于医疗诊断(如疾病预测)、金融风控(如违约概率评估)等场景。

1. 数据准备与预处理

使用R内置数据集mtcars(汽车性能数据)作为示例,目标变量设为“是否为高油耗车”(am:0=自动挡/低油耗,1=手动挡/高油耗)。首先需检查缺失值(sum(is.na(mtcars)))、标准化连续变量(如mpghp),并通过caret::createDataPartition()划分训练集(70%)与测试集(30%)。

2. 模型构建与评估

通过glm()函数拟合逻辑回归模型,公式指定为am ~ mpg + hp + wt(以马力、油耗、车重为特征):

model_lr <- glm(am ~ mpg + hp + wt, data = train_data, family = binomial)  
summary(model_lr)  # 查看系数显著性(p值<0.05的特征更关键)

评估指标需关注准确率(Accuracy)、AUC(曲线下面积)及混淆矩阵。使用pROC::roc()计算AUC,caret::confusionMatrix()生成分类报告:

pred_prob <- predict(model_lr, test_data, type = "response")  
pred_class <- ifelse(pred_prob > 0.5, 1, 0)  
confusionMatrix(factor(pred_class), factor(test_data$am))

逻辑回归的优势在于可解释性(系数正负表示特征与目标的相关性方向),但对非线性关系捕捉能力有限,需进一步尝试更复杂的模型。


二、决策树与随机森林:非线性关系的突破

当数据存在交互项或非线性特征时,树模型(如决策树、随机森林)通过“分裂规则”更灵活地拟合数据。

1. 决策树(CART算法)

使用rpart包构建分类树,以iris数据集(鸢尾花分类)为例:

library(rpart)  
model_tree <- rpart(Species ~ ., data = iris_train, method = "class")  
plot(model_tree); text(model_tree)  # 可视化树结构  
pred_tree <- predict(model_tree, iris_test, type = "class")  

决策树的优点是直观(可查看分裂变量与阈值),但易过拟合(需通过剪枝参数cp控制复杂度)。

2. 随机森林(集成学习)

随机森林(Random Forest)通过“Bagging+随机特征选择”降低方差,提升泛化能力。使用randomForest包:

library(randomForest)  
model_rf <- randomForest(Species ~ ., data = iris_train, ntree = 500, mtry = 2)  
pred_rf <- predict(model_rf, iris_test)  

关键参数:ntree(树的数量,默认500足够)、mtry(每棵树分裂时随机选择的特征数,分类任务通常取特征总数的平方根)。随机森林无需严格调参即可获得较高精度,但计算成本随树数量增加而上升。


三、XGBoost:梯度提升的工业级利器

XGBoost(eXtreme Gradient Boosting)是梯度提升树(GBDT)的优化版本,通过正则化、并行计算和损失函数改进,在Kaggle竞赛中占据主导地位。

1. 数据格式转换

XGBoost要求输入为数值矩阵(无缺失值),且目标变量需转换为0/1(二分类)或连续值(回归)。使用model.matrix()处理分类变量,并通过xgb.DMatrix()转换数据:

library(xgboost)  
dtrain <- xgb.DMatrix(data = as.matrix(train_data[, -target_col]), label = train_data$target)  
dtest <- xgb.DMatrix(data = as.matrix(test_data[, -target_col]), label = test_data$target)  

2. 模型训练与核心参数

XGBoost的核心参数分为三类:

  • 通用参数booster(默认gbtree,可选gblinear线性模型)、nthread(并行线程数);
  • 树结构参数max_depth(树的最大深度,控制复杂度,默认6)、min_child_weight(叶子节点最小样本权重和,防过拟合,默认1);
  • 学习目标参数eta(学习率/收缩系数,默认0.3,越小需更多树)、objective(任务类型,二分类用binary:logistic,回归用reg:squarederror)。

示例代码(二分类任务):

params <- list(  
  objective = "binary:logistic",  
  eta = 0.1,  
  max_depth = 6,  
  eval_metric = "logloss"  
)  
model_xgb <- xgb.train(  
  params = params,  
  data = dtrain,  
  nrounds = 100,  # 迭代轮数(树的数量)  
  watchlist = list(train = dtrain, test = dtest)  
)  

3. 调参策略:从粗到精

调参顺序推荐:学习率→树深度→子采样比例→正则化参数

  • 学习率(eta):先固定为0.1,通过调整nrounds控制训练时间;
  • 树深度(max_depth):尝试3~10,深度越大拟合越强但易过拟合;
  • 子采样(subsample/colsample_bytree):随机选择80%~90%的样本/特征,增强泛化性;
  • 正则化(lambda/alpha):L2(lambda)和L1(alpha)惩罚项,抑制系数过大。

使用caret::train()tuneGrid自动化调参(示例略),或通过交叉验证(xgb.cv())选择最优nrounds


四、模型评估与部署建议

无论选择哪种模型,均需通过以下指标综合评估:

  • 分类任务:准确率、精确率、召回率、F1-score、AUC(优先关注AUC,反映排序能力);
  • 回归任务:均方误差(MSE)、R²(解释方差比例)。

部署时,R模型可通过pmml包转换为PMML格式(供Java/Python调用),或保存为RDS文件(saveRDS(model, "model.rds"))供本地复用。


结语

从逻辑回归的“可解释性基准”到XGBoost的“高性能集成”,R语言提供了完整的机器学习工具链。实践中需根据数据特点(线性/非线性、样本量大小)选择模型,并通过系统调参平衡偏差与方差。建议初学者从简单模型入手,逐步过渡到复杂集成方法,同时注重业务场景与评估指标的匹配。

更多推荐