R 语言 KNN 算法实战:预测波士顿房价
在机器学习的入门实践中,波士顿房价预测是一个经典案例,而KNN(K 近邻)算法则是最直观的监督学习算法之一。本文将带大家一步步用 R 语言实现 KNN 算法对波士顿房价的预测,从数据准备到模型评估,全流程拆解。
一、背景介绍
1. 波士顿房价数据集
波士顿房价数据集来自MASS包,包含美国波士顿地区 506 个街区的房价相关数据,核心信息如下:
- 目标变量:
medv(房价中位数,单位:千美元)。 - 特征变量:13 个,包括犯罪率、住宅用地比例、平均房间数、 pupil-teacher 比例等(如
crim、zn、rm、ptratio等)。
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:数值越小,说明预测值与实际值的平均偏差越小;
- R²:越接近 1,说明模型解释的方差比例越高,拟合效果越好。
- 以波士顿房价数据集为例,KNN 通常能达到R²≈0.7-0.8,MSE 在20-30左右(具体数值因随机划分略有差异)。
2. KNN 的优缺点
- 优点:
- 原理简单,容易理解;
- 无需假设数据分布,对非线性关系拟合较好。
- 缺点:
- 对特征量纲敏感(需严格标准化);
- 计算量大(预测时需遍历所有训练样本);
- k值选择较关键(需交叉验证优化)。
3. 进一步优化方向
- 尝试不同的距离度量方法(如曼哈顿距离);
- 对特征进行降维(如 PCA),减少计算量并避免过拟合;
- 结合
caret包的其他调参策略,或对比决策树、线性回归等算法的表现。
