mlr3pipelines
mlr3pipelines copied to clipboard
`PipeOpEncode` doesn't work for features of type `character()`
The doc says that is should encode character() columns, but:
library(mlr3)
library(mlr3pipelines)
data = data.table::data.table(x = letters[1:3], y = factor(letters[1:3]))
task = as_task_classif(data, id = "task", target = "y")
poe = po("encode")
poe$train(list(task))[[1]]$data() # no encoding!
#> y x
#> 1: a a
#> 2: b b
#> 3: c c
Created on 2023-12-11 with reprex v2.0.2
The semantics of a character feature (at least as far as mlr3pipelines sees it) are that it contains "free text", as opposed to levels of a fixed set of possible values (like factors). One would typically apply "nlp" methods on character features, e.g. using po("textvectorizer") to extract a bag of words representation.
If you really want to do factor encoding on character features, then your case is comparable to wanting to do factor encoding on numeric features: what you really want is for mlr3 to see the semantics of your feature in a non-standard way. The solution for this is to convert your feature, using po("colapply", applicator = as.factor). Does your usecase work with that?
Martin the issue here is that many datasets that we use in R, have factors as characters (in terms of their type). So when users try to do (factor) encoding, they expect to get the feature called sex ("male" and "female") encoded but they don't. The colapply is a workaround for sure (+affect_columns needs to be configured properly, extra thing) but if docs says the PipeOp does work on character features but it actually doesn't work, well one of the two needs to be changed/updated :)