Die akzeptierte Antwort auf diese Frage ist gut, soweit es geht, aber es befasst sich nicht tatsächlich, wie Perplexität auf einem Validierungsdatensatz schätzen und wie Kreuzvalidierung verwenden.
Mit Ratlosigkeit für einfache Validierung
Perplexity ist ein Maß dafür, wie gut ein Wahrscheinlichkeitsmodell einen neuen Satz von Daten paßt. In dem topicmodels
R-Paket ist es einfach, mit der perplexity
-Funktion zu passen, die als Argumente ein zuvor angepasstes Themenmodell und einen neuen Datensatz verwendet und eine einzelne Zahl zurückgibt. Je niedriger, desto besser.
Um zum Beispiel die AssociatedPress
Daten in einen Trainingssatz (75% der Zeilen) und einen Validierungssatz (25% der Zeilen) Abspalten:
# load up some R packages including a few we'll need later
library(topicmodels)
library(doParallel)
library(ggplot2)
library(scales)
data("AssociatedPress", package = "topicmodels")
burnin = 1000
iter = 1000
keep = 50
full_data <- AssociatedPress
n <- nrow(full_data)
#-----------validation--------
k <- 5
splitter <- sample(1:n, round(n * 0.75))
train_set <- full_data[splitter, ]
valid_set <- full_data[-splitter, ]
fitted <- LDA(train_set, k = k, method = "Gibbs",
control = list(burnin = burnin, iter = iter, keep = keep))
perplexity(fitted, newdata = train_set) # about 2700
perplexity(fitted, newdata = valid_set) # about 4300
Die Perplexität ist höher für den Validierungssatz als das Trainingssatz, weil die Themen basierend auf dem Trainingssatz optimiert wurden.
Ratlosigkeit Verwendung und Kreuzvalidierung eine gute Anzahl von Themen ist einfach
Die Erweiterung dieser Idee Kreuzvalidierung zu bestimmen. Teilen Sie die Daten in verschiedene Teilmengen auf (z. B. 5) und jede Teilmenge erhält eine Umdrehung als Validierungsmenge und vier Umdrehungen als Teil des Trainingssatzes. Es ist jedoch sehr rechenintensiv, besonders wenn man die größere Anzahl von Themen ausprobiert.
Sie können möglicherweise caret
verwenden, um dies zu tun, aber ich vermute, dass Thema Modellierung noch nicht behandelt. Auf jeden Fall ist es das, was ich am liebsten selbst mache, um sicher zu sein, dass ich verstehe, was vor sich geht.
Der Code unten, auch mit der parallelen Bearbeitung auf 7 logischen CPUs, nahm 3,5 Stunden auf meinem Laptop laufen:
#----------------5-fold cross-validation, different numbers of topics----------------
# set up a cluster for parallel processing
cluster <- makeCluster(detectCores(logical = TRUE) - 1) # leave one CPU spare...
registerDoParallel(cluster)
# load up the needed R package on all the parallel sessions
clusterEvalQ(cluster, {
library(topicmodels)
})
folds <- 5
splitfolds <- sample(1:folds, n, replace = TRUE)
candidate_k <- c(2, 3, 4, 5, 10, 20, 30, 40, 50, 75, 100, 200, 300) # candidates for how many topics
# export all the needed R objects to the parallel sessions
clusterExport(cluster, c("full_data", "burnin", "iter", "keep", "splitfolds", "folds", "candidate_k"))
# we parallelize by the different number of topics. A processor is allocated a value
# of k, and does the cross-validation serially. This is because it is assumed there
# are more candidate values of k than there are cross-validation folds, hence it
# will be more efficient to parallelise
system.time({
results <- foreach(j = 1:length(candidate_k), .combine = rbind) %dopar%{
k <- candidate_k[j]
results_1k <- matrix(0, nrow = folds, ncol = 2)
colnames(results_1k) <- c("k", "perplexity")
for(i in 1:folds){
train_set <- full_data[splitfolds != i , ]
valid_set <- full_data[splitfolds == i, ]
fitted <- LDA(train_set, k = k, method = "Gibbs",
control = list(burnin = burnin, iter = iter, keep = keep))
results_1k[i,] <- c(k, perplexity(fitted, newdata = valid_set))
}
return(results_1k)
}
})
stopCluster(cluster)
results_df <- as.data.frame(results)
ggplot(results_df, aes(x = k, y = perplexity)) +
geom_point() +
geom_smooth(se = FALSE) +
ggtitle("5-fold cross-validation of topic modelling with the 'Associated Press' dataset",
"(ie five different models fit for each candidate number of topics)") +
labs(x = "Candidate number of topics", y = "Perplexity when fitting the trained model to the hold-out set")
Wir in den Ergebnissen sehen, dass 200 Themen zu viele und hat einige Überanpassung und 50 ist zu wenig. Von den Anzahl der probierten Themen ist 100 die beste, mit der niedrigsten durchschnittlichen Perplexität bei den fünf verschiedenen Hold-out-Sets.
Was in der Dokumentation '? Seq' und'? AssociatedPress' und die anderen Funktionen habe Sie nicht verstanden? – probabilityislogic
Ich habe den Code dafür aktualisiert und als Kern gespeichert. hat eine Plot-Methode, die standardmäßig druckt. 'devtools :: source_url (" https://gist.githubusercontent.com/trinker/594bd132b180a43945f7/raw/70fbb1aa2a9113837a9a9f8a6c43d884c2ef5bd0/optimal_k%25202 ")' +1 nette Antwort. –