R Studio中K近邻(KNN)函数报错排查求助
R中knn函数报错排查与解决
报错信息
> knn(Taxi_train,Taxi_test,cl,k=100) Error in knn(Taxi_train, Taxi_test, cl, k = 100) : NA/NaN/Inf in foreign function call (arg 6) In addition: Warning messages: 1: In knn(Taxi_train, Taxi_test, cl, k = 100) : NAs introduced by coercion 2: In knn(Taxi_train, Taxi_test, cl, k = 100) : NAs introduced by coercion
问题背景
调用knn函数时持续触发上述错误,已尝试将变量转为数值型但未解决,怀疑与cl因子参数有关,需定位并修复问题。
当前代码
date<-chicago_taxi$date class(date) Date <- as.Date(date) class(Date) Julian <- yday(Date) class(Julian) head(Julian) chicago_taxi <- cbind(chicago_taxi,Julian) chicago_taxi$seconds <- as.numeric(chicago_taxi$seconds) set.seed(7777) train_set <- sample(1:13081,10400,replace = FALSE) Taxi_train <- chicago_taxi[train_set,] Taxi_test <- chicago_taxi[-train_set,] cl <- Taxi_train$payment_type scale(chicago_taxi$miles) scale(chicago_taxi$seconds) scale(chicago_taxi$Julian) knn(Taxi_train,Taxi_test,cl,k=100)
核心问题定位
- 输入数据包含非数值列:
knn要求训练/测试集仅包含数值型特征,但你直接传入了整个数据框子集,其中的date、payment_type等非数值列会在函数内部被强制转换,生成NA从而触发报错。 - 标准化操作未生效:调用
scale()后未将结果赋值回原数据框,等于没有执行标准化,会影响knn的距离计算逻辑。 - 潜在缺失值风险:
seconds、miles等列可能存在NA,或cl(标签列)有缺失值,这也会导致函数运行失败。
修正后的代码示例
# 加载class包(knn函数所属包) library(class) # 处理日期并提取儒略日 chicago_taxi$Julian <- yday(as.Date(chicago_taxi$date)) # 转换seconds为数值型 chicago_taxi$seconds <- as.numeric(chicago_taxi$seconds) # 筛选仅用于建模的数值型特征列 feature_cols <- c("miles", "seconds", "Julian") # 对特征执行标准化并覆盖原列 chicago_taxi[feature_cols] <- lapply(chicago_taxi[feature_cols], scale) # 划分训练集和测试集 set.seed(7777) train_set <- sample(1:nrow(chicago_taxi), 10400, replace = FALSE) # 仅提取特征列作为knn输入 Taxi_train <- chicago_taxi[train_set, feature_cols] Taxi_test <- chicago_taxi[-train_set, feature_cols] # 提取并清洗标签列 cl <- chicago_taxi$payment_type[train_set] # 移除标签为NA的样本 na_idx <- is.na(cl) if(sum(na_idx) > 0) { Taxi_train <- Taxi_train[!na_idx, ] cl <- cl[!na_idx] } # 确保标签为因子类型 cl <- as.factor(cl) # 调用knn函数 knn_result <- knn(Taxi_train, Taxi_test, cl, k = 100)
额外检查点
- 检查特征列是否存在缺失值:
sum(is.na(chicago_taxi[feature_cols])),若有缺失可使用na.omit()或均值/中位数填充。 - 确认
payment_type列无异常值(如空字符串),避免影响分类标签的有效性。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

