如何用knn.reg预测Auto数据集指定horsepower对应的mpg?
问题描述
我正在尝试使用knn.reg函数,基于Auto数据集的horsepower变量,预测对应的mpg值。
我先用knn.reg构建了k=10的KNN回归模型,代码如下:
#Preliminary setup library(ISLR) library(fastDummies) library(leaps) library(boot) library(FNN) library(caTools) df<-Auto df$origin <- as.factor(df$origin) df <- dummy_cols(df, select_columns = "origin") df <- df[,!(names(df) %in% c("name", "origin","origin_1"))] #Attempted models knn.model<-knn.reg(train=df$horsepower, y=df$mpg, k=10) split<-sample.split(df$mpg, SplitRatio=0.8) train=df[split,] test=df[!split,] knn.model<-knn.reg(train=train[c('horsepower')], test=test[c('horsepower')], y=df$mpg, k=10)
我尝试了两种模型(包含/不包含拆分的测试集),但目标是用整个数据集作为训练集。
之后我想用predict()函数估算horsepower为200的车辆的mpg,代码如下:
mpg<-c(200) predict(knn.model, newdata=mpg)
但运行后报错:predict() can't be applied to class "knnRegCV.",不确定是否该用其他函数,或者代码有遗漏。
解决方案
核心问题原因
FNN包的knn.reg函数返回的对象没有内置predict方法,直接调用predict()会报错;另外你最后一次调用knn.reg时传入了test参数,返回的是测试集的预测结果对象,而非可用于后续预测的训练模型结构。
修正步骤
用全数据集训练模型
要使用整个数据集作为训练集,调用knn.reg时只传入train和y参数,不要加test。同时注意train参数需为数据框/矩阵格式,避免向量引发维度问题:# 用全数据集训练k=10的KNN回归模型 knn.model <- knn.reg(train = df[, "horsepower", drop = FALSE], y = df$mpg, k = 10)自定义预测逻辑
因为knn.reg没有内置预测方法,需要手动实现KNN的核心逻辑:找到新数据点在训练集中的k个最近邻,取它们的mpg平均值作为预测值。可以用FNN包的knnx.index函数实现:# 定义KNN预测函数 predict_knn_reg <- function(model, new_data, k) { # 获取训练数据集 train_data <- model$train # 找到新数据的k个最近邻索引 nn_index <- knnx.index(train = train_data, test = new_data, k = k) # 计算最近邻y值的平均值 apply(nn_index, 1, function(idx) mean(model$y[idx])) } # 预测horsepower=200的mpg值 new_horsepower <- data.frame(horsepower = 200) predicted_mpg <- predict_knn_reg(knn.model, new_data = new_horsepower, k = 10) print(predicted_mpg)额外注意事项
- 确保训练数据和新数据结构一致:均为数据框/矩阵,且列名相同(此处为
horsepower)。 - KNN对特征尺度敏感,若后续加入其他特征,建议先做标准化处理(比如
scale()函数),避免数值范围大的特征主导距离计算。
- 确保训练数据和新数据结构一致:均为数据框/矩阵,且列名相同(此处为
内容的提问来源于stack exchange,提问作者Boogie Ly
相关产品推荐
相关产品推荐

