从统计建模到机器学习:差在哪
之前我们用 R 做线性回归、聚类——那些是"统计建模":你先假设数据服从某种模型(比如线性),再估计参数。机器学习更像"让模型自己从数据里找规律":你给它一堆带标签的数据,它自己学出一个分类或预测规则。
R 在机器学习入门阶段依然非常顺手:内置了 iris 这种经典数据集,caret、randomForest 这些包把训练和评估都封装得很简单。本文就用 R 把一条完整的机器学习流水线走一遍。
机器学习的核心套路:数据 → 切训练/测试 → 训练模型 → 在测试集上评估 → 看哪些特征最重要。
- 训练/测试集把数据随机切成两份,一份学、一份考。
- 决策树一连串 if-else 把数据分到不同类别。
- 随机森林很多棵树一起投票,更稳。
- confusion matrix看模型在测试集上猜对了多少。
- 特征重要性哪些变量对预测最有用。
准备数据:训练集与测试集
最关键的一步:不能拿训练模型用的同一批数据去考它——那样它只是"背答案"。要把数据随机切成两份:训练集让模型学,测试集留着考它。
library(dplyr)
# iris 是 R 自带的经典数据集:三种鸢尾花的花萼花瓣尺寸
data(iris)
set.seed(42) # 固定随机种子,结果可复现
idx <- sample(1:nrow(iris), 0.7*nrow(iris))
train <- iris[idx, ] # 70% 训练
test <- iris[-idx, ] # 30% 测试
set.seed(42) 让每次随机切分结果一样,方便你复现实验。
决策树:if-else 堆出来的模型
决策树像一连串"如果……就……":先按花瓣长度切一刀,再按花萼宽度切一刀,最后落到哪个叶子,就是哪个类别。
library(rpart)
tree <- rpart(Species ~ ., data=train, method="class")
print(tree)
# 预测测试集
pred <- predict(tree, newdata=test, type="class")
Species ~ . 的意思是"用所有其他列去预测 Species"。决策树的好处是结果能画出来、能读懂——不像神经网络那样是个黑盒。
随机森林:很多棵树投票
单棵决策树容易"过拟合"——在训练集上很准,换批新数据就崩。随机森林一次训练几百棵树,每棵只看一部分数据和一部分特征,最后大家投票,结果稳得多。
library(randomForest)
set.seed(42)
rf <- randomForest(Species ~ ., data=train, ntree=200)
print(rf)
pred_rf <- predict(rf, newdata=test)
随机森林是机器学习入门里最"性价比高"的模型:不用怎么调参,效果通常就不错,还能顺便告诉你哪些特征重要。
用测试集评估:confusion matrix
模型在测试集上猜得准不准?用混淆矩阵:行是真实类别,列是模型猜的类别,对角线就是猜对的。
cm <- table(真实=test$Species, 预测=pred_rf)
print(cm)
# 算准确率
acc <- sum(diag(cm)) / sum(cm)
cat("准确率:", round(acc*100, 2), "%\n")
鸢尾花这种简单数据集,随机森林经常能到 95% 以上准确率。但更重要的是看:哪两类最容易被混淆——这往往告诉你数据里哪部分最难分。
特征重要性:哪些变量最关键
随机森林自带一个"特征重要性"评分:哪些列对预测贡献最大。这在解释模型时特别有用——你不是只知道"模型准",还知道"它靠什么准"。
importance(rf)
varImpPlot(rf, main="特征重要性")
对鸢尾花数据,你通常会看到花瓣长度和花瓣宽度排最前面——这和植物学常识一致:这两个特征最能区分三种花。
实战:给鸢尾花分类
把整条流水线串起来:切数据 → 训练随机森林 → 在测试集上评估 → 看特征重要性。
library(randomForest)
data(iris); set.seed(42)
idx <- sample(1:nrow(iris), 0.7*nrow(iris))
train <- iris[idx, ]; test <- iris[-idx, ]
rf <- randomForest(Species ~ ., data=train, ntree=200)
pred <- predict(rf, newdata=test)
cm <- table(真实=test$Species, 预测=pred)
print(cm)
cat("准确率:", round(sum(diag(cm))/sum(cm)*100, 2), "%\n")
varImpPlot(rf)
从切数据到出结果,十几行代码。这就是 R 在机器学习入门阶段的优势:不用搭环境、不用写类、不用管 GPU,一个脚本跑完整条流水线,重点放在"数据和结果"上。
机器学习入门的关键不是算法多炫,而是把"训练/测试切分 + 评估 + 特征解释"这套流程走顺——R 让你最快跑通它。