mlr-org / mlr3pipelines

Dataflow Programming for Machine Learning in R
https://mlr3pipelines.mlr-org.com/
GNU Lesser General Public License v3.0
132 stars 25 forks source link

`PipeOpEncode` doesn't work for features of type `character()` #749

Closed bblodfon closed 3 months ago

bblodfon commented 8 months ago

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

mb706 commented 8 months ago

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?

bblodfon commented 8 months ago

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 :)