1. 统计学习与R语言基础
统计学习是现代数据分析的核心工具之一,它通过算法从数据中提取规律和知识。R语言作为统计学习的首选工具,拥有丰富的包和函数库,能够高效地实现各种统计学习方法。
在R中,最基本的统计学习流程包括数据准备、模型构建和结果评估三个步骤。我们先来看一个简单的线性回归示例:
# 加载数据集
data(mtcars)
# 构建线性回归模型
model <- lm(mpg ~ wt + hp, data = mtcars)
# 查看模型摘要
summary(model)
这个简单的例子展示了R语言进行统计学习的基本模式。在实际应用中,我们需要考虑更多因素,比如数据预处理、特征选择和模型调优等。
统计学习方法主要分为监督学习和无监督学习两大类。监督学习包括回归和分类问题,无监督学习则包括聚类和降维等方法。R语言为这些方法提供了全面的支持:
- 回归分析:lm(), glm()
- 分类方法:glm(), rpart(), randomForest()
- 聚类分析:kmeans(), hclust()
- 降维技术:prcomp(), factanal()
2. 模型选择的关键考量
模型选择是统计学习中最具挑战性的环节之一。一个好的模型需要在偏差和方差之间取得平衡,同时考虑计算复杂度和解释性。
2.1 偏差-方差权衡
偏差-方差权衡是理解模型性能的核心概念。高偏差模型(如线性回归)可能过于简单而无法捕捉数据中的复杂关系,导致欠拟合;高方差模型(如高阶多项式回归)则可能过度拟合训练数据中的噪声。
我们可以通过以下R代码可视化这一概念:
library(ggplot2)
# 生成模拟数据
set.seed(123)
x <- seq(0, 1, length.out = 100)
true_f <- function(x) sin(2 * pi * x)
y <- true_f(x) + rnorm(100, sd = 0.3)
# 拟合不同复杂度的模型
fit1 <- lm(y ~ x) # 线性模型
fit3 <- lm(y ~ poly(x, 3)) # 三次多项式
fit10 <- lm(y ~ poly(x, 10)) # 十次多项式
# 预测并绘图
pred_data <- data.frame(x = x)
pred_data$y_true <- true_f(x)
pred_data$linear <- predict(fit1, newdata = pred_data)
pred_data$poly3 <- predict(fit3, newdata = pred_data)
pred_data$poly10 <- predict(fit10, newdata = pred_data)
ggplot(pred_data) +
geom_point(aes(x, y), alpha = 0.5) +
geom_line(aes(x, y_true), color = "black", size = 1) +
geom_line(aes(x, linear), color = "red", size = 1) +
geom_line(aes(x, poly3), color = "blue", size = 1) +
geom_line(aes(x, poly10), color = "green", size = 1) +
labs(title = "模型复杂度与拟合效果")
2.2 模型复杂度与数据规模
模型的选择还应考虑数据规模。对于小样本数据,简单模型通常更可靠;而大样本数据可以支持更复杂模型的训练。下表总结了不同场景下的模型选择建议:
| 数据规模 | 推荐模型类型 | 原因 |
|---|---|---|
| 小样本(n<100) | 线性模型、简单树模型 | 避免过拟合,保证模型稳定性 |
| 中等样本(100<n<1000) | 正则化回归、随机森林 | 平衡偏差和方差 |
| 大样本(n>1000) | 深度学习、复杂集成方法 | 充分利用数据信息 |
3. 模型评估方法
模型评估是统计学习中确保结果可靠的关键步骤。R语言提供了多种评估技术,最常用的是交叉验证。
3.1 交叉验证技术
k折交叉验证是最流行的模型评估方法之一。caret包提供了便捷的实现:
library(caret)
# 设置交叉验证参数
ctrl <- trainControl(method = "cv", number = 10)
# 训练线性回归模型
model <- train(mpg ~ .,
data = mtcars,
method = "lm",
trControl = ctrl)
# 查看交叉验证结果
print(model)
对于分类问题,我们还需要考虑混淆矩阵和各种分类指标:
# 分类模型评估示例
library(caret)
data(iris)
# 创建训练测试集
set.seed(123)
trainIndex <- createDataPartition(iris$Species, p = 0.7, list = FALSE)
trainData <- iris[trainIndex, ]
testData <- iris[-trainIndex, ]
# 训练模型
model <- train(Species ~ .,
data = trainData,
method = "rpart")
# 预测并评估
predictions <- predict(model, newdata = testData)
confusionMatrix(predictions, testData$Species)
3.2 评估指标选择
不同的预测任务需要不同的评估指标:
回归问题常用指标:
- 均方误差(MSE)
- R平方
- 平均绝对误差(MAE)
分类问题常用指标:
- 准确率
- 精确率与召回率
- F1分数
- AUC-ROC曲线
在R中,我们可以使用caret包的postResample函数计算回归指标,使用confusionMatrix计算分类指标。
4. 高级模型选择技巧
4.1 正则化方法
正则化是防止过拟合的有效手段。R中实现的正则化方法包括岭回归和Lasso回归:
library(glmnet)
# 准备数据
x <- as.matrix(mtcars[, -1]) # 移除响应变量
y <- mtcars$mpg
# 岭回归
ridge <- glmnet(x, y, alpha = 0)
plot(ridge, xvar = "lambda", label = TRUE)
# Lasso回归
lasso <- glmnet(x, y, alpha = 1)
plot(lasso, xvar = "lambda", label = TRUE)
# 交叉验证选择最优lambda
cv.lasso <- cv.glmnet(x, y, alpha = 1)
plot(cv.lasso)
coef(cv.lasso, s = "lambda.min")
4.2 集成方法
集成方法通过组合多个基础模型来提高预测性能。随机森林和梯度提升树是两种最流行的集成方法:
# 随机森林
library(randomForest)
rf <- randomForest(mpg ~ ., data = mtcars, importance = TRUE)
print(rf)
varImpPlot(rf)
# 梯度提升树
library(gbm)
boost <- gbm(mpg ~ ., data = mtcars,
distribution = "gaussian",
n.trees = 100,
interaction.depth = 4)
summary(boost)
4.3 超参数调优
模型超参数对性能有重要影响。R中的caret包提供了系统的调优方法:
library(caret)
# 定义调优网格
tuneGrid <- expand.grid(
n.trees = c(50, 100, 150),
interaction.depth = c(1, 2, 3),
shrinkage = c(0.01, 0.1),
n.minobsinnode = 10
)
# 训练模型
model <- train(mpg ~ .,
data = mtcars,
method = "gbm",
tuneGrid = tuneGrid,
trControl = trainControl(method = "cv", number = 5))
# 查看最优参数
print(model$bestTune)
5. 实战案例:房价预测模型
让我们通过一个完整的案例来应用前面介绍的技术。我们将使用Boston房价数据集构建预测模型。
# 加载数据
library(MASS)
data(Boston)
# 数据探索
summary(Boston)
pairs(Boston[, 1:5])
# 划分训练测试集
set.seed(123)
trainIndex <- createDataPartition(Boston$medv, p = 0.7, list = FALSE)
trainData <- Boston[trainIndex, ]
testData <- Boston[-trainIndex, ]
# 训练线性模型
lmModel <- train(medv ~ .,
data = trainData,
method = "lm",
trControl = trainControl(method = "cv", number = 10))
# 训练随机森林
rfModel <- train(medv ~ .,
data = trainData,
method = "rf",
trControl = trainControl(method = "cv", number = 5),
tuneLength = 3)
# 模型比较
results <- resamples(list(LM = lmModel, RF = rfModel))
summary(results)
bwplot(results)
# 测试集评估
lmPred <- predict(lmModel, newdata = testData)
rfPred <- predict(rfModel, newdata = testData)
postResample(lmPred, testData$medv)
postResample(rfPred, testData$medv)
这个案例展示了完整的建模流程:从数据探索、模型训练到性能评估。在实际项目中,我们还需要进行更细致的数据预处理和特征工程。
1232

被折叠的 条评论
为什么被折叠?



