【问题标题】:Multi label classification in RR中的多标签分类
【发布时间】:2016-01-17 22:41:12
【问题描述】:

我有一个包含 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 添加代码吗?实际上,从理论上讲,可以组合最近邻居的选择。但是,stackoverflow.com/questions/5963269/…
  • @CAFEBABE 为格式化道歉。等等。 “a”是我的第一个 KNN 分类器的标签。其存在的细菌种类(0/1)

标签: r machine-learning knn multilabel-classification


【解决方案1】:

您可以为此使用包 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 个标签,所以跟进:我可以在单个熔化操作的同时聚合接下来的 12 个标签吗?
  • 相应地调整了代码。但是,所有列都位于末尾字符串列。您可能需要调整 fun.agg 中的默认值。 (如果这个答案对您有帮助,那么投票和/或接受会很好)
  • 我最终使用 mldr 检查我的各个 knn 分类器的有效性。我已经把代码here.
  • 事实上,我也使用 SVM 和 RandomForest 进行了分类,在这种情况下,RandomForest 的结果似乎比 knn 略好(根据我的实际测试数据)。我赞成答案,但它不接受我的投票。
  • 嘿,你能不能也分享一下相同的数据或者它的结构
猜你喜欢
  • 2018-08-04
  • 1970-01-01
  • 2019-04-01
  • 2019-03-22
  • 2019-02-26
  • 2013-07-23
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多