0

このコードは、パッケージを使用したマルチラベル分類に関するチュートリアルで見つけましたmlr

library("mlr")

yeast = getTaskData(yeast.task)
labels = colnames(yeast)[1:14]
yeast.task = makeMultilabelTask(id = "multi", data = yeast, target = labels)

lrn.br = makeLearner("classif.rpart", predict.type = "prob")
lrn.br = makeMultilabelBinaryRelevanceWrapper(lrn.br)

mod = train(lrn.br, yeast.task, subset = 1:1500, weights = rep(1/1500, 1500))

pred = predict(mod, task = yeast.task, subset = 1:10)
pred = predict(mod, newdata = yeast[1501:1600,])

データセットの構造はyeast理解していますが、ラベルに TRUE または FALSE の値がないため、分類したい新しいデータがある場合にコードを使用する方法がわかりません。実際には、同じ構造のトレーニング データがいくつかありますyeastが、新しいデータの場合、列 1:14 が欠落します。私は何か誤解していますか?そうでない場合: コードを正しく使用するにはどうすればよいですか?

編集:

コードの使用方法のサンプルコードは次のとおりです。

library("tm")

train.data = data.frame("id" = c(1,1,2,3,4,4), "text" = c("Monday is nice weather.", "Monday is nice weather.", "Dogs are cute.", "It is very rainy.", "My teacher is angry.", "My teacher is angry."), "label" = c("label1", "label2", "label3", "label1", "label4", "label5"))
test.data = data.frame("id" = c(5,6), "text" = c("Next Monday I will meet my teacher.", "Dogs do not like rain."))

train.data$text = as.character(train.data$text)
train.data$id = as.character(train.data$id)
train.data$label = as.character(train.data$label)
test.data$text = as.character(test.data$text)
test.data$id = as.character(test.data$id)

### Bring training data into structure
train.data$label = make.names(train.data$label)
labels = unique(train.data$label)

# DocumentTermMatrix for all texts
texts = unique(c(train.data$text, test.data$text))
docs <- Corpus(VectorSource(unique(texts)))
terms <-DocumentTermMatrix(docs)
m <- as.data.frame(as.matrix(terms))

# Logical columns for labels
test = data.frame("id" = train.data$id, "topic"=train.data$label)
test2 = as.data.frame(unclass(table(test)))
test2[,c(1:ncol(test2))] = as.logical(unlist(test2[,c(1:ncol(test2))]))
rownames(test2) = unique(test$id)

# Bind columns from dtm
termsDf = cbind(test2, m[1:nrow(test2),])
names(termsDf) = make.names(names(termsDf))

### Create Multilabel Task
classify.task = makeMultilabelTask(id = "multi", data = termsDf, target = labels)

### Now the model
lrn.br = makeLearner("classif.rpart", predict.type = "prob")
lrn.br = makeMultilabelBinaryRelevanceWrapper(lrn.br)
mod = train(lrn.br, classify.task)

### How can I predict for test.data?

問題は、test.data実際に計算したいラベルがないことです。

編集2:

単純に使うと

names(m) = make.names(names(m))
pred = predict(mod, newdata = m[(nrow(termsDf)+1):(nrow(termsDf)+nrow(test.data)),])

結果は両方のテキストで同じであり、実際には私が期待するものではありません.

4

0 に答える 0