Я пытаюсь интегрировать функцию MiniBatchKmeans пакета ClusterR в mlr.В соответствии с документами я внес следующие изменения:
- Создан makeRLearner.cluster.MiniBatchKmeans
- Создан trainLearner.cluster.MiniBatchKmeans
- CreedrealtLearner.cluster.MiniBatchKmeans
- Зарегистрированные выше методы S3 (как описано здесь )
На данный момент я могу создать ученика,и вызвать поезд и предсказать их.Однако проблема возникает при попытке создать учащегося без какого-либо значения «кластеров».
Базовый пакет (в ClusterR ) не имеет значения по умолчанию, определенного для кластеров аргумента».Согласно подходу mlr, я попытался предоставить значение по умолчанию «кластеров», используя аргумент par.vals.Тем не менее, этот аргумент по умолчанию игнорируется.
Мой код:
#' @export
makeRLearner.cluster.MiniBatchKmeans = function() {
makeRLearnerCluster(
cl = "cluster.MiniBatchKmeans",
package = "ClusterR",
par.set = makeParamSet(
makeIntegerLearnerParam(id = "clusters", lower = 1L),
makeIntegerLearnerParam(id = "batch_size", default = 10L, lower = 1L),
makeIntegerLearnerParam(id = "num_init", default = 1L, lower = 1L),
makeIntegerLearnerParam(id = "max_iters", default = 100L, lower = 1L),
makeNumericLearnerParam(id = "init_fraction", default = 1, lower = 0),
makeDiscreteLearnerParam(id = "initializer", default = "kmeans++",
values = c("optimal_init", "quantile_init", "kmeans++", "random")),
makeIntegerLearnerParam(id = "early_stop_iter", default = 10L, lower = 1L),
makeLogicalLearnerParam(id = "verbose", default = FALSE,
tunable = FALSE),
makeUntypedLearnerParam(id = "CENTROIDS", default = NULL),
makeNumericLearnerParam(id = "tol", default = 1e-04, lower = 0),
makeNumericLearnerParam(id = "tol_optimal_init", default = 0.3, lower = 0),
makeIntegerLearnerParam(id = "seed", default = 1L)
),
par.vals = list(clusters = 2L),
properties = c("numerics", "prob"),
name = "MiniBatchKmeans",
note = "Note",
short.name = "MBatchKmeans",
callees = c("MiniBatchKmeans", "predict_MBatchKMeans")
)
}
#' @export
trainLearner.cluster.MiniBatchKmeans = function(.learner, .task, .subset, .weights = NULL, ...) {
ClusterR::MiniBatchKmeans(getTaskData(.task, .subset), ...)
}
#' @export
predictLearner.cluster.MiniBatchKmeans = function(.learner, .model, .newdata, ...) {
if (.learner$predict.type == "prob") {
pred = ClusterR::predict_MBatchKMeans(data = .newdata,
CENTROIDS = .model$learner.model$centroids,
fuzzy = TRUE, ...)
res = pred$fuzzy_clusters
return(res)
} else {
pred = ClusterR::predict_MBatchKMeans(data = .newdata,
CENTROIDS = .model$learner.model$centroids,
fuzzy = FALSE, ...)
res = as.integer(pred)
return(res)
}
}
Проблема (значение кластеров по умолчанию в пар .vals выше игнорируется):
## When defining a value of clusters, it works as expected
lrn <- makeLearner("cluster.MiniBatchKmeans", clusters = 3L)
getLearnerParVals(lrn)
# The below commented lines are printed
# $clusters
# [1] 3
## When not providing a value for clusters, default is not used
lrn <- makeLearner("cluster.MiniBatchKmeans")
getLearnerParVals(lrn)
# The below commented lines are printed
# named list()
Любой совет, почему я вижу это поведение?Я проверил код других учащихся (например, cluster.kmeans, cluster.kkmeans и т. Д.) И вижу, что они могут успешно определять значения по умолчанию в том же формате, что и я.Кроме того, вот документация , что это правильный путь.
Вот мой код на github, на случай, если это поможет воспроизвести проблему.Есть добавленный тестовый файл (в tests / testthat), но у него есть свои проблемы.
Редактировать 1 - Сообщение о фактической ошибке Вот фактическое сообщение об ошибке, которое я вижу при попыткеобучать ученика без явного указания значения по умолчанию «кластеров»:
lrn <- makeLearner("cluster.MiniBatchKmeans")
train(lrn, cluster_task)
Error in ClusterR::MiniBatchKmeans(getTaskData(.task, .subset), ...) :
argument "clusters" is missing, with no default
10.
ClusterR::MiniBatchKmeans(getTaskData(.task, .subset), ...) at RLearner_cluster_MiniBatchKmeans.R#32
9.
trainLearner.cluster.MiniBatchKmeans(.learner = structure(list(
id = "cluster.MiniBatchKmeans", type = "cluster", package = "ClusterR",
properties = c("numerics", "prob"), par.set = structure(list(
pars = list(clusters = structure(list(id = "clusters", ... at trainLearner.R#24
8.
(function (.learner, .task, .subset, .weights = NULL, ...)
{
UseMethod("trainLearner")
})(.learner = structure(list(id = "cluster.MiniBatchKmeans", ...
7.
do.call(trainLearner, pars) at train.R#96
6.
fun3(do.call(trainLearner, pars)) at train.R#96
5.
fun2(fun3(do.call(trainLearner, pars))) at train.R#96
4.
fun1({
learner.model = fun2(fun3(do.call(trainLearner, pars)))
}) at train.R#96
3.
force(expr) at helpers.R#93
2.
measureTime(fun1({
learner.model = fun2(fun3(do.call(trainLearner, pars)))
})) at train.R#96
1.
train(lrn, cluster_task)