Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
import org.grouplens.lenskit.knn.item.*
import org.grouplens.lenskit.baseline.*
import org.grouplens.lenskit.transform.normalize.*
import org.grouplens.lenskit.ItemScorer
import org.grouplens.lenskit.baseline.ItemMeanRatingItemScorer
import org.grouplens.lenskit.core.Transient
import org.grouplens.lenskit.data.dao.EventDAO
import org.grouplens.lenskit.data.dao.UserDAO
import org.grouplens.lenskit.eval.data.traintest.QueryData
import org.grouplens.lenskit.eval.metrics.predict.*
import org.grouplens.lenskit.external.ExternalProcessItemScorerBuilder
import javax.inject.Inject
import javax.inject.Provider
/**
* Shim class to run item-mean.py to build an ItemScorer.
*/
class ExternalItemMeanScorerBuilder implements Provider {
EventDAO eventDAO
UserDAO userDAO
@Inject
public ExternalItemMeanScorerBuilder(@Transient EventDAO events,
@Transient @QueryData UserDAO users) {
eventDAO = events
userDAO = users
}
@Override
ItemScorer get() {
def wrk = new File("external-scratch")
wrk.mkdirs()
def builder = new ExternalProcessItemScorerBuilder()
// Note: don't use file names because it will interact badly with crossfolding
return builder.setWorkingDir(wrk)
.setExecutable("python") //can be "R", "matlab", "ruby" etc
.addArgument("/user/home/item_mean.py") //location of sample recommender
.addArgument("--for-users")
.addRatingFileArgument(eventDAO)
.addUserFileArgument(userDAO)
.build()
}
}
trainTest {
dataset crossfold("ml-100k") {
source csvfile("u.data") {
delimiter "\t"
domain {
minimum 1.0
maximum 5.0
precision 1.0
}
}
}
algorithm("PersMean") {
bind ItemScorer to UserMeanItemScorer
bind (UserMeanBaseline, ItemScorer) to ItemMeanRatingItemScorer
}
metric RMSEPredictMetric
metric topNnDCG {
listSize 10
candidates ItemSelectors.allItems()
exclude ItemSelectors.trainingItems()
}
output "eval-results.csv"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment