S呐_
发布于

R 语言 KNN 算法实战:预测波士顿房价

   在机器学习的入门实践中,波士顿房价预测是一个经典案例,而KNN(K 近邻)算法则是最直观的监督学习算法之一。本文将带大家一步步用 R 语言实现 KNN 算法对波士顿房价的预测,从数据准备到模型评估,全流程拆解。

一、背景介绍

1. 波士顿房价数据集

波士顿房价数据集来自MASS包,包含美国波士顿地区 506 个街区的房价相关数据,核心信息如下:

  • 目标变量medv(房价中位数,单位:千美元)。
  • 特征变量:13 个,包括犯罪率、住宅用地比例、平均房间数、 pupil-teacher 比例等(如crimznrmptratio等)。

2. KNN 算法原理

KNN 是一种懒惰学习算法,核心逻辑是:

  • 对于新样本,计算它与训练集中所有样本的距离(通常用欧氏距离);
  • 选取距离最近的k个样本;
  • 用这k个样本的目标变量均值 / 众数(回归用均值,分类用众数)作为新样本的预测值。

二、实战步骤

步骤 1:加载工具包与数据集

首先加载所需包,MASS用于获取波士顿数据集,caret用于数据划分、模型训练与评估,dplyr用于数据预览:

# 加载包
library(MASS)    # 导入波士顿房价数据集
library(caret)   # 数据划分、模型训练、评估
library(dplyr)   # 数据预览

# 加载数据集
data(Boston)

预览数据集结构:

# 查看数据维度与变量
glimpse(Boston)
# 查看前5行数据
head(Boston)

步骤 2:数据预处理

KNN 对特征量纲非常敏感(比如 “犯罪率” 是 0-100 的数值,“房间数” 是 5-8 的数值,直接计算距离会被量纲大的特征主导),因此必须先进行标准化。同时,将数据划分为训练集(70%)和测试集(30%)

# 1. 特征标准化
scaler <- preProcess(Boston[, -14], method = "center")  # 对特征列(除medv外)做中心化
Boston_scaled <- predict(scaler, Boston[, -14])
Boston_scaled$medv <- Boston$medv  # 保留原始房价标签

# 2. 划分训练集与测试集
set.seed(123)  # 固定随机种子,确保结果可复现
train_index <- createDataPartition(Boston_scaled$medv, p = 0.7, list = FALSE)
train_data <- Boston_scaled[train_index, ]
test_data  <- Boston_scaled[-train_index, ]

步骤 3:训练 KNN 模型

用caret包的train函数训练 KNN 模型,通过交叉验证选择最优的k(近邻数)。

# 训练KNN模型,用交叉验证选最优k
set.seed(123)
knn_model <- train(
  medv ~ .,  # 目标变量~所有特征
  data = train_data,
  method = "knn",  # 算法选择KNN
  trControl = trainControl(method = "cv", number = 5),  # 5折交叉验证
  preProcess = NULL,  # 已提前标准化,此处无需再处理
  tuneGrid = data.frame(k = 1:20)  # 测试k=1到20的效果
)

# 查看最优k与模型结果
knn_model

运行后,会输出最优的k值(比如通常 k=5 或 7 时性能较好),以及模型在训练集的表现。

步骤 4:模型评估

用测试集评估模型的预测精度,主要看均方误差(MSE)和决定系数(R²)

# 测试集预测
test_pred <- predict(knn_model, newdata = test_data)

# 计算MSE和R²
mse <- mean((test_pred - test_data$medv)^2)
r2 <- cor(test_pred, test_data$medv)^2

cat("测试集MSE:", mse, "\n")
cat("测试集R²:", r2, "\n")

# 可视化预测值与实际值的对比
plot(test_data$medv, test_pred, 
     xlab = "实际房价(千美元)", 
     ylab = "预测房价(千美元)", 
     main = "KNN预测波士顿房价:实际值vs预测值")
abline(0, 1, col = "red")  # 绘制参考线(完美预测时的直线)

三、结果分析与总结

1. 模型表现解读

  • MSE:数值越小,说明预测值与实际值的平均偏差越小;
  • :越接近 1,说明模型解释的方差比例越高,拟合效果越好。
  • 以波士顿房价数据集为例,KNN 通常能达到R²≈0.7-0.8,MSE 在20-30左右(具体数值因随机划分略有差异)。

2. KNN 的优缺点

  • 优点
  1. 原理简单,容易理解;
  2. 无需假设数据分布,对非线性关系拟合较好。
  • 缺点
  1. 对特征量纲敏感(需严格标准化);
  2. 计算量大(预测时需遍历所有训练样本);
  3. k值选择较关键(需交叉验证优化)。

3. 进一步优化方向

  • 尝试不同的距离度量方法(如曼哈顿距离);
  • 对特征进行降维(如 PCA),减少计算量并避免过拟合;
  • 结合caret包的其他调参策略,或对比决策树、线性回归等算法的表现。
浏览 (170)
点赞 (1)
收藏
删除
评论