首页 文章

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 似乎是一个选项,但我不能适应我的需要 .

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)
    

    我只针对一个 class 进行了聚合 . 对所有类并行执行此步骤将需要另一个熔解操作,并且会使代码变得非常混乱 .

相关问题