File: RLearner_classif_dcSVM.R

package info (click to toggle)
r-cran-mlr 2.19.2%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 8,264 kB
  • sloc: ansic: 65; sh: 13; makefile: 5
file content (92 lines) | stat: -rw-r--r-- 3,235 bytes parent folder | download
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
89
90
91
92
#' @export
makeRLearner.classif.dcSVM = function() {
  makeRLearnerClassif(
    cl = "classif.dcSVM",
    package = c("SwarmSVM", "e1071"),
    par.set = makeParamSet(
      makeIntegerLearnerParam(id = "k", default = 4, lower = 1),
      makeIntegerLearnerParam(id = "m", lower = 1),
      makeDiscreteLearnerParam(id = "kernel", default = 3, values = c(1, 2, 3)),
      makeIntegerLearnerParam(id = "max.levels", lower = 1),
      makeIntegerLearnerParam(id = "early", default = 0, lower = 0),
      makeLogicalLearnerParam(id = "final.training", default = FALSE),
      makeLogicalLearnerParam(id = "pre.scale", default = FALSE),
      makeNumericLearnerParam(id = "seed"),
      makeLogicalLearnerParam(id = "verbose", default = TRUE),
      makeUntypedLearnerParam(id = "valid.x", default = NULL),
      makeUntypedLearnerParam(id = "valid.y", default = NULL),
      makeUntypedLearnerParam(id = "valid.metric", default = NULL),
      makeDiscreteLearnerParam(id = "cluster.method", default = "kmeans", values = c("kmeans", "kernkmeans")),
      makeFunctionLearnerParam(id = "cluster.fun"),
      makeFunctionLearnerParam(id = "cluster.predict")
    ),
    properties = c("twoclass", "numerics"),
    name = "Divided-Conquer Support Vector Machines",
    short.name = "dcSVM",
    callees = c("dcSVM", "svm")
  )
}

#' @export
trainLearner.classif.dcSVM = function(.learner, .task, .subset, .weights = NULL, ...) {

  d = getTaskData(.task, .subset, target.extra = TRUE)
  pars = list(...)
  m.flag = FALSE
  max.levels.flag = FALSE
  if (!any(stri_detect_regex(names(pars), "m"))) {
    m = 800
    m.flag = TRUE
  } else {
    m = pars$m
  }
  if (!any(stri_detect_regex(names(pars), "max.levels"))) {
    max.levels = 1
    max.levels.flag = TRUE
  } else {
    max.levels = pars$max.levels
  }
  if (!any(stri_detect_regex(names(pars), "k"))) {
    k = 4
  } else {
    k = pars$k
  }
  m = min(nrow(d$data), m)
  min.cluster = ceiling(5 * m / (k^max.levels))
  if (min.cluster > m) {
    f = getTaskFormula(.task)
    # map kernel to corresponding e1071 kernel
    if (!is.null(pars$kernel)) {
      kernel = c("linear", "polynomial", "radial")[pars$kernel]
    } else {
      kernel = "radial"
    }
    pars$kernel = kernel
    result = do.call(e1071::svm, c(f, list(data = getTaskData(.task, .subset), probability = FALSE), pars))
    return(result)
  }


  if (m.flag && max.levels.flag) {
    pname = "SwarmSVM"
    asNamespace(pname)$dcSVM(x = d$data, y = d$target, m = m, max.levels = max.levels, ...)
  } else if (!m.flag && max.levels.flag) {
    pname = "SwarmSVM"
    asNamespace(pname)$dcSVM(x = d$data, y = d$target, max.levels = max.levels, ...)
  } else if (m.flag && !max.levels.flag) {
    pname = "SwarmSVM"
    asNamespace(pname)$dcSVM(x = d$data, y = d$target, m = m, ...)
  } else {
    pname = "SwarmSVM"
    asNamespace(pname)$dcSVM(x = d$data, y = d$target, ...)
  }
}

#' @export
predictLearner.classif.dcSVM = function(.learner, .model, .newdata, ...) {
  prediction = predict(.model$learner.model, newdata = .newdata, ...)
  if (!is.factor(prediction)) { # depends on parameters AND data
    prediction = factor(prediction, levels = c(1, 2), labels = .model$factor.levels[[1]])
  }
  prediction
}