我正在进行文本分类,我创建了功能,我有多个标签来训练和预测哪些基本上是二元变量,我想要预测。
这是我的代码和错误日志。
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
我收到以下错误。
情绪是一个变量,它是预测的主要变量,但我想训练火车/测试原始df中存在的所有变量。
请在train / test_mat中添加了Sentiment列,因此我在向KNN提供功能时将其排除。
答案 0 :(得分:1)
一个可能的问题是R期望向量条目cl
,但你有一个data.table
。与data.frame
不同,选择长度为1的标签的矩形坐标中的单个列会产生data.table
暗淡n次1.在length
上调用data.table
会给出列数它是1. knn
的内部结构将该长度与train
中的行数进行比较并抛出错误。尝试使用train_data[[col]]
进行子集化。
答案 1 :(得分:1)
考虑Map
,mapply
的包装,并构建一个混淆矩阵列表,从 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)