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

R语言泰坦尼克号KNN建模train与class长度不一致报错如何解决

R语言KNN分类报错解决方案

报错说明

Error in knn(train = train.survived, test = test.survived, cl = train.survived_labels, : 'train' and 'class' have different lengths

核心错误原因

  • 归一化代码逻辑错误:对单列向量使用lapply导致生成的Survived.subset.n行数异常,基于该数据集行数抽样得到的索引长度不符合预期,最终训练特征矩阵和标签长度不匹配
  • 额外逻辑错误:
    • 分类变量Sex未转成数值编码,不符合KNN算法输入要求
    • 未将特征列和目标列Survived拆分,目标列被误放入训练特征中
    • 归一化后的数据未实际用于模型训练,用了原始未归一化数据

修复后完整代码

# 加载依赖包
library(haven)
library(dplyr)
library(class)

# 读取数据并清洗全局缺失值
df = read_spss("Desktop/titanicTrain.sav")
df = na.omit(df)

# 提取所需特征与标签列
Survived.subset = df %>% select(Age, Sex, Survived)
# 分类变量Sex转数值编码(因子转数值后减1实现0/1编码)
Survived.subset$Sex = as.numeric(as.factor(Survived.subset$Sex)) - 1

# 定义最大最小归一化函数
normalize = function(x){
  return((x - min(x)) / (max(x) - min(x))) 
}
# 仅对特征列(Age、Sex)做归一化,排除标签列Survived
Survived.subset.n = as.data.frame(lapply(Survived.subset[, c("Age", "Sex")], normalize))

# 7:3拆分训练测试集
set.seed(123)
dat.d = sample(1:nrow(Survived.subset.n), size = nrow(Survived.subset.n)*0.7, replace = FALSE)
# 拆分特征集
train.survived = Survived.subset.n[dat.d, ]
test.survived = Survived.subset.n[-dat.d, ]
# 拆分标签
train.survived_labels = Survived.subset[dat.d, ]$Survived
test.survived_labels = Survived.subset[-dat.d, ]$Survived

# 运行KNN模型
knn.22 = knn(train = train.survived, test = test.survived, cl = train.survived_labels, k = 22)
knn.23 = knn(train = train.survived, test = test.survived, cl = train.survived_labels, k = 23)

修复验证

运行模型前可先执行下方语句确认长度匹配:

print(nrow(train.survived) == length(train.survived_labels))

返回TRUE即可正常运行模型。


内容的提问来源于stack exchange,提问作者Omid Mehrpour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:54:03