R中的多标签分类

3

我有一个包含28个变量(13个标签和15个特征)的训练数据集。还有一个15个特征的测试数据集,需要根据这些特征预测标签。我为所有13个标签分别创建了KNN分类器。

是否有可能将这13个独立的标签KNN分类器合并成一个多标签分类器?

我当前用于单个标签的代码:

library(class)
train_from_train <- train[1:600,2:16] 
target_a_train_from_train <- train[1:600,17] 
test_from_train <- train[601:800,2:16]
target_a_test_from_train <- train[601:800,17] 
knn_pred_a <-knn (train = train_from_train, test = test_from_train, cl= target_a_train_from_train, k = 29) 
table(knn_pred_a, target_a_test_from_train)
mean(knn_pred_a != target_a_test_from_train) 
knn_pred_a_ON_TEST <-knn (train = train[,2:16], test = test[2:16], cl= train[,17], k = 29) 
knn_pred_a_ON_TEST

我搜索了互联网和软件包,发现mldr似乎是一个选项,但是我没能将其适应到我的需求。

你能添加KNN的代码吗?理论上讲,最近邻居的选择可以被组合起来。然而,https://dev59.com/eG025IYBdhLWcg3whGSx - CAFEBABE
@CAFEBABE抱歉格式不太好。等等。 "a" 是我第一个KNN分类器的标签。它表示细菌种类的存在(0/1)。 - Abhijeet
1个回答

2
您可以使用ARNN软件包来实现这一点。但是,据我所知,它不是完全准确的。
library(RANN)
library(reshape2)

####
## generate some sample data and randomize order
iris.knn <- iris[sample(1:150,150),]
#add a second class
iris.knn["Class2"] <- iris.knn[,5]=="versicolor"
iris.knn$org.row.id <- 1:nrow(iris.knn)
train <- iris.knn[1:100,]
test <- iris.knn[101:150,]
##
#####
## get nearest neighbours
nn.idx <- as.data.frame(nn2(train[1:4],query=test[1:4],k=4)$nn.idx)
## add row id
nn.idx$test.row.id <- test$rowid

#classes and row id
multiclass.vec <- data.frame(row.id=1:150,iris.knn[,5:6])
#1 row per nearest neighbour
melted <-melt(nn.idx,id.vars="row.id")
merged <- merge(melted,multiclass.vec, by.x = "value",by.y="org.row.id")
#aggrgate a single class
aggregate(merged$Species, list(merged$row.id), function(x) names(which.max(table(x))))

 #### aggregate for all classes
 all.classes <- melt(merged[c(2,4,5)],id.vars = "row.id")
 fun.agg <- function(x) {
               if(length(x)==0){
                 ""  #<-- default value adaptation might be needed.
               }else{
                 names(which.max(table(x)))
               }
 }
 dcast(all.classes,row.id~variable, fun.aggregate=fun.agg,fill=NULL)

我只对一个类进行了聚合。要同时对所有类执行此步骤,需要进行另一次融合操作,这会使代码变得相当混乱。


昨晚我实际上尝试使用mldr()并取得了一些进展。但我也会遵循你的建议,因为它对我来说更有意义。我有13个标签,所以一个后续问题是:我可以使用单个melt操作并行聚合下一个12个标签吗? - Abhijeet
相应地调整了代码。然而,所有列都变成了最后的字符串列。您可能需要调整fun.agg中的默认值。 (如果这个答案对您有帮助,请点赞和/或接受) - CAFEBABE
我最终使用了mldr来检查我的个别knn分类器的有效性。我已经将代码放在这里 - Abhijeet
实际上,我也使用SVM和RandomForest进行了分类,而在这种情况下,RandomForest似乎比knn给出了稍微更好的结果(在我的实际测试数据上)。我点赞了这个答案,但它没有接受我的投票。 - Abhijeet
嘿,你能分享相同的数据或结构吗? - nikki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接