R:在对数据帧进行子集设置时进行循环

R:在对数据帧进行子集设置时进行循环,r,loops,dataframe,knn,R,Loops,Dataframe,Knn,我正在执行文本分类,我创建了功能,我有多个标签来训练和预测基本上是我想要预测的二进制变量 这是我的代码和错误日志 for (col in colnames(train_data)){ train_label <- train_data[,c(col)] test_pred <- knn(train = train_mat[ ,!(colnames(train_mat) == "Sentiment")], test = test_mat[ ,!(colnames(test_ma

我正在执行文本分类,我创建了功能,我有多个标签来训练和预测基本上是我想要预测的二进制变量

这是我的代码和错误日志

for (col in colnames(train_data)){
  train_label <- train_data[,c(col)]
  test_pred <- knn(train = train_mat[ ,!(colnames(train_mat) == "Sentiment")], test = test_mat[ ,!(colnames(test_mat) == "Sentiment")], cl = as.factor(train_label), k=6)

  table(test_pred,test_data[, col])
  acc.RF = mean(test_pred==test_data[, col])
  acc.RF
  confusionMatrix(table(test_pred,test_data[, col]))
}

Error in knn(train = train_mat[, !(colnames(train_mat) == "Sentiment")],  : 
  'train' and 'class' have different lengths
for(列名称中的列(列数据)){

train_label一个可能的问题是,R期望向量项为
cl
,但您有一个
data.table
。与
data.frame
不同,在直角坐标系中选择一个标签长度为1的单列会生成一个
data.table
的dim n乘以1。在
data.table
上调用
length
,得到t列数为1。
knn
的内部将该长度与
train
中的行数进行比较,并抛出错误。尝试使用
train\u数据[[col]]进行子集设置< /p> > 

< p>考虑<代码> map < /> >,包装>代码> MpIs<代码>,并建立一个混淆矩阵列表,从测试和训练数据中逐个传递每个列,也考虑<代码>转换>代码>删除情感:


matrix\u处理您的答案正在运行,但我面临另一个错误,即我的训练和测试数据中有不同的标签。请您将其发布为答案,我将其标记为答案。谢谢您可能应该在将数据集划分为测试和训练子集之前将类变量转换为因子。如果类的级别为1:4在测试中,但在训练中为0:6,你会让knn误以为你预测的是橘子和苹果。如果你的n太小,你可能需要引导验证数据集。
matrix_process <- function(test_label, train_label) {

  test_pred <- knn(train = transform(train_mat, Sentiment = NULL), 
                   test = transform(test_mat, Sentiment = NULL), 
                   cl = as.factor(train_label), k=6)

  print(table(test_pred, test_label))
  acc.RF = mean(test_pred == test_label)
  print(acc.RF)

  return(confusionMatrix(table(test_pred, test_label)))    
}

conf_matrix_list <- Map(matrix_process, test_data, train_data)

# EQUIVALENTLY:
conf_matrix_list <- mapply(matrix_process, test_data, train_data, SIMPLIFY=FALSE)