R:for循环,同时对数据帧进行子集化

时间:2018-01-29 17:18:24

标签: 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_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
  1. train / test_data =原始数据框
  2. train / test_mat = TFIDF功能 原始目标变量出现在train / test_data中。
  3. 我收到以下错误。

    情绪是一个变量,它是预测的主要变量,但我想训练火车/测试原始df中存在的所有变量。

    请在train / test_mat中添加了Sentiment列,因此我在向KNN提供功能时将其排除。

2 个答案:

答案 0 :(得分:1)

一个可能的问题是R期望向量条目cl,但你有一个data.table。与data.frame不同,选择长度为1的标签的矩形坐标中的单个列会产生data.table暗淡n次1.在length上调用data.table会给出列数它是1. knn的内部结构将该长度与train中的行数进行比较并抛出错误。尝试使用train_data[[col]]进行子集化。

答案 1 :(得分:1)

考虑Mapmapply的包装,并构建一个混淆矩阵列表,从 test train 元素元素中传递每一列。另外,请在删除 Sentiment 时考虑transform

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)