1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
#' @title Create learner object.
#'
#' @description
#' For a classification learner the `predict.type` can be set
#' to \dQuote{prob} to predict probabilities and the maximum
#' value selects the label. The threshold used to assign the label can later be changed using the
#' [setThreshold] function.
#'
#' To see all possible properties of a learner, go to: [LearnerProperties].
#'
#' @template arg_lrncl
#' @param id (`character(1)`)\cr
#' Id string for object. Used to display object.
#' Default is `cl`.
#' @param predict.type (`character(1)`)\cr
#' Classification: \dQuote{response} (= labels) or \dQuote{prob} (= probabilities and labels by selecting the ones with maximal probability).
#' Regression: \dQuote{response} (= mean response) or \dQuote{se} (= standard errors and mean response).
#' Survival: \dQuote{response} (= some sort of orderable risk) or \dQuote{prob} (= time dependent probabilities).
#' Clustering: \dQuote{response} (= cluster IDS) or \dQuote{prob} (= fuzzy cluster membership probabilities),
#' Multilabel: \dQuote{response} (= logical matrix indicating the predicted class labels) or \dQuote{prob} (= probabilities and corresponding logical matrix indicating class labels).
#' Default is \dQuote{response}.
#' @template arg_predictthreshold
#' @param fix.factors.prediction (`logical(1)`)\cr
#' In some cases, problems occur in underlying learners for factor features during prediction.
#' If the new features have LESS factor levels than during training (a strict subset),
#' the learner might produce an error like
#' \dQuote{type of predictors in new data do not match that of the training data}.
#' In this case one can repair this problem by setting this option to `TRUE`.
#' We will simply add the missing factor levels missing from the test feature
#' (but present in training) to that feature.
#' Default is `FALSE`.
#' @param ... (any)\cr
#' Optional named (hyper)parameters.
#' Alternatively these can be given using the `par.vals` argument.
#' @param par.vals ([list])\cr
#' Optional list of named (hyper)parameters. The arguments in
#' `...` take precedence over values in this list. We strongly
#' encourage you to use one or the other to pass (hyper)parameters
#' to the learner but not both.
#' @param config (named [list])\cr
#' Named list of config option to overwrite global settings set via [configureMlr]
#' for this specific learner.
#' @return ([Learner]).
#' @family learner
#' @export
#' @aliases Learner
#' @examples
#' makeLearner("classif.rpart")
#' makeLearner("classif.lda", predict.type = "prob")
#' lrn = makeLearner("classif.lda", method = "t", nu = 10)
#' print(lrn$par.vals)
makeLearner = function(cl, id = cl, predict.type = "response", predict.threshold = NULL,
fix.factors.prediction = FALSE, ..., par.vals = list(), config = list()) {
assertString(cl)
assertFlag(fix.factors.prediction)
assertList(config, names = "named")
if ("show.info" %in% names(config))
stop("'show.info' cannot be set in 'makeLearner', please use 'configureMlr' instead.")
assertSubset(names(config), choices = names(getMlrOptions()))
constructor = try(getS3method("makeRLearner", class = cl), silent = TRUE)
if (inherits(constructor, "try-error")) {
possibles = getNameProposals(cl, possible.inputs = suppressWarnings(listLearners()$class))
stopf("Couldn't find learner '%s'\nDid you mean one of these learners instead: %s",
cl, stri_flatten(possibles, collapse = " "))
}
wl = do.call(constructor, list())
wl$config = config
if (!missing(id)) {
assertString(id)
wl$id = id
}
# predict.threshold is checked in setter below
assertList(par.vals, names = "unique")
if (stri_isempty(cl))
stop("Cannot create learner from empty string!")
if (!inherits(wl, "RLearner"))
stop("Learner must be a basic RLearner!")
wl = setHyperPars(learner = wl, ..., par.vals = par.vals)
wl = setPredictType(learner = wl, predict.type = predict.type)
if (!is.null(predict.threshold))
wl = setPredictThreshold(wl, predict.threshold)
wl$fix.factors.prediction = fix.factors.prediction
return(wl)
}
|