You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:05:30