从统计建模到机器学习:差在哪

之前我们用 R 做线性回归、聚类——那些是"统计建模":你先假设数据服从某种模型(比如线性),再估计参数。机器学习更像"让模型自己从数据里找规律":你给它一堆带标签的数据,它自己学出一个分类或预测规则。

R 在机器学习入门阶段依然非常顺手:内置了 iris 这种经典数据集,caret、randomForest 这些包把训练和评估都封装得很简单。本文就用 R 把一条完整的机器学习流水线走一遍。

机器学习的核心套路:数据 → 切训练/测试 → 训练模型 → 在测试集上评估 → 看哪些特征最重要。
本文核心知识点
  • 训练/测试集把数据随机切成两份,一份学、一份考。
  • 决策树一连串 if-else 把数据分到不同类别。
  • 随机森林很多棵树一起投票,更稳。
  • confusion matrix看模型在测试集上猜对了多少。
  • 特征重要性哪些变量对预测最有用。
R 机器学习配图:蓝绿渐变背景,中央一棵发光的树状决策结构,由发光节点和分支组成,底部是数据流入口,向上分叉出多个发光节点,节点周围环绕发光散点云与分类边界曲线
一棵发光的决策树——从底部数据流入,向上分叉出判断节点,最后落到不同类别。

准备数据:训练集与测试集

最关键的一步:不能拿训练模型用的同一批数据去考它——那样它只是"背答案"。要把数据随机切成两份:训练集让模型学,测试集留着考它。

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="特征重要性")

对鸢尾花数据,你通常会看到花瓣长度和花瓣宽度排最前面——这和植物学常识一致:这两个特征最能区分三种花。