KNN.reg返回N/A,R²预测值无结果的技术求助
问题:knn.reg返回N/A,无法获取R²预测值(R2Pred)
以下是导致你问题的核心原因及修正方案:
错误原因
- K值非法:
knn.reg要求k为正整数,你循环从0开始,k=0时函数无法生成有效结果,直接返回N/A。 - R2Pred提取错误:你错误地从标准化/归一化后的数据集(如
knn_2000_norm$R2Pred)提取R²值,实际上R2Pred是knn.reg函数返回对象的属性,应该从knn_norm和knn_stan这两个返回结果中获取。 - 训练集混入目标变量:你在
train参数中包含了Life.expectancy(即你的目标变量y),训练集应该只包含特征变量,不能将标签纳入特征,这会导致模型无效。 - 目标变量数据源不匹配:你使用
life_ex$Life.expectancy作为y,但处理后的数据集来自set_2000,两者行索引可能不一致,建议直接从处理后的数据集提取目标变量。
修正后的代码
pacman::p_load(GGally, FNN, dplyr) # 标准化函数 standardize <- function(x){ return((x - mean(x))/sd(x)) } # 归一化函数 normalize <- function(x){ return((x - min(x))/(max(x) - min(x))) } # 数据预处理:移除NA列,然后标准化/归一化(排除目标变量,避免提前处理标签) knn_2000_stan <- set_2000 %>% select(-where(~any(is.na(.)))) %>% # 移除含NA的列 mutate(across(.cols = where(is.numeric) & !matches("Life.expectancy"), .fns = standardize)) knn_2000_norm <- set_2000 %>% select(-where(~any(is.na(.)))) %>% # 移除含NA的列 mutate(across(.cols = where(is.numeric) & !matches("Life.expectancy"), .fns = normalize)) # 初始化结果数据框 grid_results <- data.frame(k = numeric(), stan = numeric(), norm = numeric()) # 网格搜索k(从1开始,到50) for (k in 1:50) { # 归一化数据的KNN回归 knn_norm <- knn.reg( train = knn_2000_norm %>% select(Measles, under.five.deaths, HIV.AIDS), # 仅特征变量 y = knn_2000_norm$Life.expectancy, # 从处理后的数据集取目标变量 k = k ) r2_norm <- knn_norm$R2Pred # 从返回结果提取R2Pred # 标准化数据的KNN回归 knn_stan <- knn.reg( train = knn_2000_stan %>% select(Measles, under.five.deaths, HIV.AIDS), # 仅特征变量 y = knn_2000_stan$Life.expectancy, # 从处理后的数据集取目标变量 k = k ) r2_stan <- knn_stan$R2Pred # 从返回结果提取R2Pred # 追加结果 grid_results <- grid_results %>% add_row(k = k, stan = r2_stan, norm = r2_norm) }
内容的提问来源于stack exchange,提问作者oumou sama
相关产品推荐
相关产品推荐

