2016-01-17 2 views
3

У меня есть набор данных для тренировки с 28 переменными (13 меток и 15 функций). Набор тестовых данных с 15 функциями, и я должен предсказать метки для этого набора тестовых данных на основе этих функций. Я сделал классификаторы KNN для всех 13 меток отдельно.Классификация с несколькими метками в R

Есть ли возможность объединения всех этих 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, кажется, вариант, но я не мог приспособить его к моим потребностям.

+0

Можете вы добавить код для своего KNN? Действительно, выбор ближайших соседей можно комбинировать, чисто теоретически. Тем не менее, http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – CAFEBABE

+0

@CAFEBABE Извините за форматирование. И так далее. «a» - это метка для первого моего первого классификатора KNN. Его присутствие видов бактерий (0/1) – Abhijeet

ответ

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) 

Я сделал aggreation только для одного класса. Выполнение этого шага для всех классов параллельно потребует другой операции таяния и сделает код довольно грязным.

+0

Я действительно пробовал сделать это с mldr() прошлой ночью и сделал некоторый прогресс. Но я тоже буду следовать твоему предложению, потому что это имеет больше смысла для меня. У меня есть 13 ярлыков, поэтому последующая работа: я могу объединить следующие 12 ярлыков параллельно одной операции с расплавом? – Abhijeet

+0

Адаптирован код соответствующим образом. Однако все столбцы находятся в столбцах конечной строки. Возможно, вам придется адаптировать значение по умолчанию в fun.agg. (Если бы этот ответ помог вам, было бы неплохо проголосовать и/или принять) – CAFEBABE

+0

Я закончил использовать mldr для проверки действительности моих отдельных классификаторов knn. Я поставил код [здесь] (http://pastebin.com/HyEqpKWg). – Abhijeet

 Смежные вопросы

  • Нет связанных вопросов^_^