在R中使用kNN函数报错:'train'与'class'长度不一致的求助
问题原因与解决方法
核心错误原因
你调用knn()时参数传错了:knn()的第三个参数必须是训练集的类别标签(目标变量),而你传了整个training_data,这就导致训练特征集和类别标签的长度/维度不匹配,触发报错。
另外你的代码还有两个额外问题:
- 已经用
createDataPartition()生成了划分索引ind,但完全没用到,手动指定行号拆分数据既不严谨也容易出错 - 索引里的
[, ,1]属于三维数组索引,如果你用的是数据框,这种写法会把数据转成奇怪的结构,应该去掉多余的维度
修正后的代码示例
library(caret) library(class) set.seed(123) # 用生成的索引拆分数据,这才是createDataPartition的正确用法 ind <- createDataPartition(user_col$Nscore, p=0.7, list=FALSE) training_data <- user_col[ind, ] # 取训练行的所有列 testing_data <- user_col[-ind, ] # 取剩下的行作为测试集 # knn参数说明: # 第一个参数:训练集的特征(去掉目标列) # 第二个参数:测试集的特征(和训练集特征列一致) # 第三个参数:训练集的目标变量(类别标签) model <- knn(train = training_data[, -5], # 假设第5列是目标列,去掉它取特征 test = testing_data[, -5], cl = training_data[, 5], # 这里传训练集的目标列,作为类别标签 k=1) predictions <- as.factor(model) confusionMatrix(predictions, testing_data[,5])
额外说明
- 如果不确定目标列的位置,建议用列名索引(比如
training_data$target_col),比数字索引更可靠 - 手动拆分数据时,要确保训练集和测试集的特征列完全一致,不能有缺失或多余列
- 关于数据集分享:如果
dput()输出太长,可以用dput(head(user_col, 20))只分享前20行示例,或者用str(user_col)展示数据结构,这样别人能帮你更精准排查问题
内容的提问来源于stack exchange,提问作者ano273
相关产品推荐
相关产品推荐

