一、前言

在数据科学的世界中,机器学习(Machine Learning) 是核心技术之一。
无论你做科研、数据分析还是预测建模,都离不开它。

而R语言,作为专为统计与数据分析而生的工具,不仅功能强大、生态丰富,还拥有便捷的可视化与建模接口。

本教程将通过两个经典算法:

  • 线性回归(Linear Regression)

  • 决策树(Decision Tree)

一步步带你从数据探索、特征分析到建模预测,掌握R语言机器学习的基础思维。


⚙️ 二、R语言机器学习的基本流程

在R中,机器学习通常遵循以下标准流程👇:

  1. 数据准备(Data Preparation)
    加载、清洗、选择特征、划分训练集与测试集。

  2. 探索性分析(EDA, Exploratory Data Analysis)
    用统计和图形手段理解数据分布和变量关系。

  3. 模型训练(Model Training)
    选择算法并在训练集上拟合模型。

  4. 模型预测(Prediction)
    在测试集或新数据上做预测。

  5. 模型评估(Evaluation)
    使用指标(MSE、R²、Accuracy等)评价模型好坏。

  6. 可视化与优化(Visualization & Tuning)
    绘图对比结果,进行参数调整与改进。


🧩 三、准备工作与环境配置

首先安装并加载我们需要的R包:

install.packages(c("tidyverse", "caret", "rpart", "rpart.plot", "ggpubr"))

加载库:

library(tidyverse)
library(caret)
library(rpart)
library(rpart.plot)
library(ggpubr)

这些包的作用如下👇:

  • tidyverse:数据清洗、变换与可视化

  • caret:机器学习通用框架

  • rpart / rpart.plot:构建与绘制决策树

  • ggpubr:可视化结果组合展示


📘 四、数据集介绍:mtcars

R自带的 mtcars 数据集包含32种汽车的性能指标,包括油耗、重量、马力、变速方式等。

data(mtcars)
head(mtcars)

输出示例:

mpgcyldisphpwtqsecamgear
21.061601102.6216.4614
21.061601102.8817.0214

变量解释:

  • mpg:每加仑油行驶英里数(燃油效率)

  • hp:马力(Horse Power)

  • wt:车重(单位:1000磅)

  • am:变速方式(0=自动,1=手动)


🔍 五、探索性数据分析(EDA)

1️⃣ 数据基本统计

summary(mtcars)

我们可以快速观察数据范围、均值、中位数、最大最小值,判断是否有异常。

2️⃣ 查看变量关系

我们想预测的是 mpg(油耗),先看看它与其他变量的关系:

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(color = "steelblue", size = 3) +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(title = "汽车重量与油耗的关系", x = "重量", y = "油耗")

结果分析:
从图中可以看到,重量越大,油耗越低,两者呈负相关。


🧮 六、线性回归模型(Linear Regression)

线性回归是最基础的监督学习模型,它假设目标变量 yyy 与输入特征 XXX 存在线性关系:

y=β0+β1x1+β2x2+⋯+βnxn+ϵy = \beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_nx_n + \epsilony=β0​+β1​x1​+β2​x2​+⋯+βn​xn​+ϵ

1️⃣ 模型训练

我们使用 重量(wt)马力(hp) 来预测 油耗(mpg)

model_lm <- lm(mpg ~ wt + hp, data = mtcars)
summary(model_lm)

结果示例:

Coefficients:
(Intercept)   37.2273  
wt           -3.8778  
hp           -0.0318  
R-squared: 0.8268

解释:

  • 截距(37.22):理论上车重与马力为0时的油耗。

  • 每增加1单位重量,油耗降低约3.88。

  • 每增加1单位马力,油耗降低约0.03。

  • R2=0.8268R^2 = 0.8268R2=0.8268,说明模型能解释约82.7%的油耗变异。


2️⃣ 模型预测

mtcars$pred_lm <- predict(model_lm, newdata = mtcars)

3️⃣ 可视化对比真实值与预测值

ggplot(mtcars, aes(x = mpg, y = pred_lm)) +
  geom_point(color = "blue", size = 3) +
  geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed") +
  labs(title = "线性回归预测 vs 真实值", x = "真实油耗", y = "预测油耗")

图中点越靠近红色虚线(y=x),说明预测越准确。


4️⃣ 计算误差指标

mse_lm <- mean((mtcars$mpg - mtcars$pred_lm)^2)
rmse_lm <- sqrt(mse_lm)
cat("线性回归模型 MSE:", round(mse_lm, 3), "\nRMSE:", round(rmse_lm, 3))

输出示例:

线性回归模型 MSE: 6.003 
RMSE: 2.45

🌳 七、决策树模型(Decision Tree)

线性模型适合线性关系,而决策树能捕捉非线性特征与交互效应,是一种强大的可解释算法。

1️⃣ 模型训练

model_tree <- rpart(mpg ~ wt + hp, data = mtcars, method = "anova")

2️⃣ 可视化树结构

rpart.plot(model_tree, type = 3, fallen.leaves = TRUE, box.palette = "Blues")

树状图解释:

  • 每个节点代表一个特征划分条件;

  • 叶子节点显示该区域的平均油耗;

  • 模型通过“分裂”逐步细化预测。


3️⃣ 模型预测与误差

mtcars$pred_tree <- predict(model_tree, newdata = mtcars)

mse_tree <- mean((mtcars$mpg - mtcars$pred_tree)^2)
rmse_tree <- sqrt(mse_tree)
cat("决策树模型 MSE:", round(mse_tree, 3), "\nRMSE:", round(rmse_tree, 3))

输出示例:

决策树模型 MSE: 5.450 
RMSE: 2.33

比线性回归略优,说明树模型在捕捉非线性方面更灵活。


📊 八、模型效果对比与可视化

1️⃣ 两种模型预测结果对比

comparison <- data.frame(
  mpg = mtcars$mpg,
  pred_lm = mtcars$pred_lm,
  pred_tree = mtcars$pred_tree
)

ggplot(comparison) +
  geom_point(aes(x = mpg, y = pred_lm), color = "steelblue", size = 3) +
  geom_point(aes(x = mpg, y = pred_tree), color = "orange", size = 3) +
  geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed") +
  labs(title = "线性回归 vs 决策树预测对比", x = "真实油耗", y = "预测油耗")

2️⃣ 模型精度比较图

mse_df <- data.frame(
  model = c("Linear Regression", "Decision Tree"),
  MSE = c(mse_lm, mse_tree)
)

ggplot(mse_df, aes(x = model, y = MSE, fill = model)) +
  geom_bar(stat = "identity") +
  labs(title = "模型MSE对比", y = "均方误差") +
  theme_minimal()

🧭 九、模型总结与扩展方向

模型优点缺点适用场景
线性回归简单易懂、速度快、可解释性强只能拟合线性关系数值型特征、线性趋势数据
决策树可处理非线性、特征自动选择易过拟合、对噪声敏感多变量、复杂关系数据

结论:

  • 对简单数据,线性回归已能很好地解释;

  • 若变量间存在复杂交互,决策树往往更优;

  • 实际项目中,可以通过交叉验证、集成模型(如随机森林)进一步提升精度。


💡 十、下一步学习建议

如果你已经掌握了本文的基础内容,推荐继续学习以下方向👇:

  1. 随机森林(Random Forest)

    • 包:randomForest

    • 原理:集成多棵决策树投票平均,提升泛化能力。

  2. 梯度提升树(XGBoost / LightGBM)

    • 包:xgboost, lightgbm

    • 常用于比赛与工业级建模。

  3. 分类问题模型

    • glm() 逻辑回归

    • rpart(method="class") 分类树

  4. 模型调参(Hyperparameter Tuning)

    • 使用 caret::train() 统一管理模型训练与交叉验证。

  5. 可解释性分析

    • 学习 vipDALEX 包来解释模型特征重要性。


📘 十一、完整可复制代码汇总

# 加载库
library(tidyverse)
library(caret)
library(rpart)
library(rpart.plot)
library(ggpubr)

# 数据集
data(mtcars)

# 线性回归
model_lm <- lm(mpg ~ wt + hp, data = mtcars)
mtcars$pred_lm <- predict(model_lm, newdata = mtcars)
mse_lm <- mean((mtcars$mpg - mtcars$pred_lm)^2)

# 决策树
model_tree <- rpart(mpg ~ wt + hp, data = mtcars, method = "anova")
mtcars$pred_tree <- predict(model_tree, newdata = mtcars)
mse_tree <- mean((mtcars$mpg - mtcars$pred_tree)^2)

# 可视化对比
ggarrange(
  ggplot(mtcars, aes(x = mpg, y = pred_lm)) +
    geom_point(color = "blue", size = 3) +
    geom_abline(slope = 1, intercept = 0, linetype = "dashed") +
    labs(title = "线性回归预测", x = "真实值", y = "预测值"),
  
  ggplot(mtcars, aes(x = mpg, y = pred_tree)) +
    geom_point(color = "orange", size = 3) +
    geom_abline(slope = 1, intercept = 0, linetype = "dashed") +
    labs(title = "决策树预测", x = "真实值", y = "预测值"),
  
  ncol = 2, nrow = 1
)

🏁 十二、总结

通过本篇文章,你已经掌握了R语言中:

  • 数据分析与可视化基本流程;

  • 使用 lm() 构建线性回归模型;

  • 使用 rpart() 构建决策树模型;

  • 模型预测与误差评估;

  • 两种模型的可视化与对比。

这就是R语言机器学习的入门路径。
理解了这两种算法后,你就能轻松过渡到更复杂的模型(如随机森林、SVM、XGBoost),
从而逐步迈入真正的数据科学实战。

更多推荐