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
相关产品推荐
相关产品推荐

