Type: | Package |
Title: | Provides an R Interface to the 'FuzzyCoCo' C++ Library and Extends It |
Version: | 0.1.0 |
Description: | Provides and extends the 'Fuzzy Coco' algorithm by wrapping the 'FuzzyCoCo' 'C++' Library, cf https://github.com/Lonza-RND-Data-Science/fuzzycoco. 'Fuzzy Coco' constructs systems that predict the outcome of a human decision-making process while providing an understandable explanation of a possible reasoning leading to it. The constructed fuzzy systems are composed of rules and linguistic variables. This package provides a 'S3' classic interface (fit_xy()/fit()/predict()/evaluate()) and a 'tidymodels'/'parsnip' interface, a custom engine with custom iteration stop criterion and progress bar support as well as a systematic implementation that do not rely on genetic programming but rather explore all possible combinations. |
License: | GPL (≥ 3) |
URL: | https://github.com/Lonza-RND-Data-Science/Rfuzzycoco |
BugReports: | https://github.com/Lonza-RND-Data-Science/Rfuzzycoco/issues |
Depends: | R (≥ 4.1.0) |
Imports: | generics, methods, Rcpp, stats, utils |
Suggests: | knitr, parsnip, progressr, rlang, rmarkdown, testthat |
LinkingTo: | Rcpp |
VignetteBuilder: | knitr |
Config/testthat/edition: | 3 |
Encoding: | UTF-8 |
RoxygenNote: | 7.3.3 |
SystemRequirements: | C++17 |
NeedsCompilation: | yes |
Packaged: | 2025-10-16 13:11:13 UTC; ubuntu |
Author: | Karl Forner [aut, cre] |
Maintainer: | Karl Forner <karl.forner@gmail.com> |
Repository: | CRAN |
Date/Publication: | 2025-10-21 09:10:51 UTC |
Rfuzzycoco: Provides an R Interface to the 'FuzzyCoCo' C++ Library and Extends It
Description
Provides and extends the 'Fuzzy Coco' algorithm by wrapping the 'FuzzyCoCo' 'C++' Library, cf https://github.com/Lonza-RND-Data-Science/fuzzycoco. 'Fuzzy Coco' constructs systems that predict the outcome of a human decision-making process while providing an understandable explanation of a possible reasoning leading to it. The constructed fuzzy systems are composed of rules and linguistic variables. This package provides a 'S3' classic interface (fit_xy()/fit()/predict()/evaluate()) and a 'tidymodels'/'parsnip' interface, a custom engine with custom iteration stop criterion and progress bar support as well as a systematic implementation that do not rely on genetic programming but rather explore all possible combinations.
Features
Rfuzzycoco
provides the FuzzyCoCo algorithm, cf Fuzzy CoCo: a cooperative-coevolutionary approach to fuzzy modeling from Carlos Andrés Peña-Reyes
Author(s)
Maintainer: Karl Forner karl.forner@gmail.com
See Also
Useful links:
Report bugs at https://github.com/Lonza-RND-Data-Science/Rfuzzycoco/issues
computes the optimal fuzzy set positions based on the distribution of the data
Description
computes the optimal fuzzy set positions based on the distribution of the data
Usage
compute_optimal_quantile_fuzzy_set_positions(df, nb_sets)
Arguments
df |
the data as a data frame |
nb_sets |
the number of fuzzy sets |
Value
a list, named after the df column names, holding the vector of positions per variable
Examples
pos <- compute_optimal_quantile_fuzzy_set_positions(mtcars, 3)
print("position for 2nd fuzzy set for qsec var", pos$qsec[[2]])
evaluate the fuzzy system from a fit on some given data
Description
N.B: just a S3 method method wrapping the evaluate_fuzzy_system()
function
Usage
## S3 method for class 'fuzzycoco_fit'
evaluate(x, data, verbose = FALSE, ...)
Arguments
x |
the fuzzycoco_fit object containing the fuzzy system to evaluate |
data |
the data to evaluate the fuzzy system on |
verbose |
whether to be verbose |
... |
not used. Only for S3 generic consistency |
Value
the evaluation as a named list:
fitness: the fitness value
metrics: the evaluation metrics as a named list
Examples
model <- fuzzycoco("regression", example_mtcars()$params, seed = 123)
df <- mtcars[c("mpg", "hp", "wt", "qsec")]
fit <- fit(model, qsec ~ ., df, engine = "rcpp", seed = 456, max_generations = 20)
res <- evaluate(fit, df)
print(res$fitness)
evaluate the fuzzy system from a fit on some given data
Description
evaluate the fuzzy system from a fit on some given data
Usage
evaluate_fuzzy_system(fs, data, params, verbose = FALSE)
Arguments
fs |
the fuzzy system to evaluate (as a named list) |
data |
the data to evaluate the fuzzy system on |
params |
the fuzzycoco parameters. probably not needed... |
verbose |
whether to be verbose |
Value
the evaluation as a named list:
fitness: the fitness value
metrics: the evaluation metrics as a named list
Examples
model <- fuzzycoco("regression", example_mtcars()$params, seed = 123)
x <- mtcars[c("mpg", "hp", "wt")]
y <- mtcars["qsec"]
fit <- fit_xy(model, x, y, progress = FALSE)
res <- evaluate_fuzzy_system(fit$fuzzy_system, cbind(x, y), fit$params)
print(res$metrics$rmse)
model parameters and data for the IRIS36 classification example
Description
a small (36 rows) dataset extracted from iris with a binary 0/1 outcome OUT
response variable
Usage
example_iris36()
Value
the example as a named list with:
params: the model parameters
data: the data to fit as a data frame
Examples
model <- fuzzycoco("classification", example_iris36()$params, seed = 123)
fit <- fit(model, OUT ~ ., example_iris36()$data,
max_generations = 20, progress = FALSE)
model parameters and data for the IRIS36 classification example
Description
an example dataset based on iris with a binary categorical (non-factor) response
Usage
example_iris_binary_categorical()
Value
the example as a named list with:
params: the model parameters
data: the data to fit as a data frame
Examples
model <- fuzzycoco("classification", example_iris_binary_categorical()$params)
fit <- fit(model, Species ~ ., example_iris_binary_categorical()$data,
max_generations = 20, progress = FALSE)
model parameters and data for the mtcars regression example
Description
model parameters and data for the mtcars regression example
Usage
example_mtcars()
Value
the example as a named list with:
params: the model parameters
data: the data to fit as a data frame
Examples
model <- fuzzycoco("regression", example_mtcars()$params)
fit <- fit(model, qsec ~ ., example_mtcars()$data, max_generations = 20, progress = FALSE)
fit the FuzzyCoco model using the formula interface
Description
N.B: fix_xy()
is the workhorse, fit()
is a simple formula-based layer
Usage
## S3 method for class 'fuzzycoco_model'
fit(
object,
formula,
data,
engine = FUZZY_COCO_HYBRID_ENGINE,
max_generations = object$params$global_params$max_generations,
max_fitness = object$params$global_params$max_fitness,
seed = object$seed,
verbose = object$verbose,
...
)
Arguments
object |
the fuzzycoco_model object to fit |
formula |
the fuzzy coco model as a formula |
data |
the data to fit as a data frame. The output variables must be grouped AFTER the input variables |
engine |
the fuzzy coco fit engine to use, one of rcpp and hybrid |
max_generations |
The maximum number of iterations of the algorithm. Each iteration produces a new generation of the rules and membership functions populations. |
max_fitness |
a stop condition: the iterations stop as soon as a generated fuzzy system fitness reaches that threshold. |
seed |
the RNG seed to use (to fit the model) |
verbose |
whether to be verbose |
... |
Arguments passed on to
|
Value
the fit as a named list
Examples
model <- fuzzycoco("regression", example_mtcars()$params, seed = 123)
df <- mtcars[c("mpg", "hp", "wt", "qsec")]
fit <- fit(model, qsec ~ ., df, seed = 456, max_generations = 10, progress = FALSE)
print(names(fit))
a one-row overview of a fuzzy system with the usage of variables, the fitness, number of generations and optionally a metric
Description
a one-row overview of a fuzzy system with the usage of variables, the fitness, number of generations and optionally a metric
Usage
fit_to_df(fit, metric = NULL)
Arguments
fit |
a fit object, as returned by [fit. |
metric |
an optional metric name to report (e.g. |
Value
a one-row data frame
See Also
Other fit_utils:
fs_rules_to_df()
,
fs_used_vars_to_df()
Examples
model <- fuzzycoco("regression", example_mtcars()$params, seed = 123)
df <- mtcars[c("mpg", "hp", "wt", "qsec")]
fit <- fit(model, qsec ~ ., df, seed = 456, max_generations = 10, progress = FALSE)
print(fit_to_df(fit))
fit the FuzzyCoco model using the dataframe interface
Description
N.B: the underlying C++ implementation is able to automatically set some missing parameters (NA).
The final parameters are those returned by the function, is the params
slot.
Usage
## S3 method for class 'fuzzycoco_model'
fit_xy(
object,
x,
y,
engine = FUZZY_COCO_HYBRID_ENGINE,
max_generations = object$params$global_params$max_generations,
max_fitness = object$params$global_params$max_fitness,
seed = object$seed,
verbose = object$verbose,
...
)
Arguments
object |
the fuzzycoco_model object to fit |
x |
the input variables data (usually to fit) as a dataframe |
y |
the output variables data (usually to fit) as a dataframe |
engine |
the fuzzy coco fit engine to use, one of rcpp and hybrid |
max_generations |
The maximum number of iterations of the algorithm. Each iteration produces a new generation of the rules and membership functions populations. |
max_fitness |
a stop condition: the iterations stop as soon as a generated fuzzy system fitness reaches that threshold. |
seed |
the RNG seed to use (to fit the model) |
verbose |
whether to be verbose |
... |
Arguments passed on to
|
Value
the fit as a named list
Examples
model <- fuzzycoco("regression", example_mtcars()$params, seed = 123)
x <- mtcars[c("mpg", "hp", "wt")]
y <- mtcars["qsec"]
fit <- fit_xy(model, x, y, progress = FALSE)
print(names(fit))
format the fuzzy rules as a data frame
Description
format the fuzzy rules as a data frame
Usage
fs_rules_to_df(fuzzy_system_desc)
Arguments
fuzzy_system_desc |
a fuzzy system description as a named list |
Value
a data frame, one row per rule, including the default rule, in columns the input and output variables. The values are the corresponding fuzzy set number.
See Also
Other fit_utils:
fit_to_df()
,
fs_used_vars_to_df()
Examples
model <- fuzzycoco("regression", example_mtcars()$params, seed = 123)
df <- mtcars[c("mpg", "hp", "wt", "qsec")]
fit <- fit(model, qsec ~ ., df, seed = 456, max_generations = 10, progress = FALSE)
print(fs_rules_to_df(fit$fuzzy_system))
extract the usage of the variables by a fuzzy system
Description
extract the usage of the variables by a fuzzy system
Usage
fs_used_vars_to_df(fuzzy_system_desc)
Arguments
fuzzy_system_desc |
a fuzzy system description as a named list |
Value
a one-row data frame, in columns the input and output variables, with TRUE iff the variable is used.
See Also
Other fit_utils:
fit_to_df()
,
fs_rules_to_df()
Examples
model <- fuzzycoco("regression", example_mtcars()$params, seed = 123)
df <- mtcars[c("mpg", "hp", "wt", "qsec")]
fit <- fit(model, qsec ~ ., df, seed = 456, max_generations = 10, progress = FALSE)
print(fs_rules_to_df(fit$fuzzy_system))
parsnip model function
Description
parsnip model function
Usage
fuzzy_coco_parsnip(
mode = "unknown",
params,
engine = FUZZY_COCO_HYBRID_ENGINE,
seed = sample.int(10^5, 1),
verbose = FALSE
)
Arguments
mode |
the type of model, either classification or regression |
params |
fuzzy coco parameters, as a recursive named list, cf |
engine |
the fuzzy coco fit engine to use, one of rcpp and hybrid |
seed |
the RNG seed to use (to fit the model) |
verbose |
whether to be verbose |
Value
a parsnip model
Examples
spec <- fuzzy_coco_parsnip("regression", params = example_mtcars()$params, seed = 123)
fit <- spec |> parsnip::set_engine("hybrid") |> parsnip::fit(qsec ~ ., data = example_mtcars()$data)
this is an utility function used to implement the parsnip interface
Description
It should not be exported, it only is because of parsnip internal implementation
Usage
fuzzy_coco_parsnip_wrapper(
formula,
data,
object = NULL,
internal_model = NULL,
engine = NULL,
fit = NULL,
df = NULL,
pred = FALSE,
type = NULL,
...
)
Arguments
formula |
the fuzzy coco model as a formula |
data |
the data to fit as a data frame. The output variables must be grouped AFTER the input variables |
object , internal_model , fit , df , pred , type , ... |
no comment |
engine |
the fuzzy coco fit engine to use, one of rcpp and hybrid |
Value
either a prediction (cf predict()
), a fit (cf fit()
) or the prediction probabilities
as a named numeric vector
systematic search
Description
This is a R implementation of a systematic search, where the fuzzy set positions are determined
by the distribution of the data (cf compute_optimal_quantile_fuzzy_set_positions()
and the rules
are systematically explored
Usage
fuzzy_coco_systematic_fit(x, y, params, fitter)
Arguments
x |
the input variables data (usually to fit) as a dataframe |
y |
the output variables data (usually to fit) as a dataframe |
params |
fuzzy coco parameters, as a recursive named list, cf |
fitter |
a function metrics –> fitness value providing the objective/fitness function to optimize TODO: describe the metrics |
Details
N.B: this is experimental, only possible for a small number of variables. Not all parameters are used, obviously, and currently fitness_params$output_vars_defuzz_thresholds has to be set explicitly.
Value
a list of the best results (all ties). Each result is also a named list(metric=,fs=) holding the corresponding metric value and the fuzzy system.
Examples
fitter <- function(metrics) 2^-metrics$rms
params <- example_mtcars()$params
params$fitness_params$output_vars_defuzz_thresholds <- 0
params$global_params$nb_rules <- 1
params$global_params$nb_max_var_per_rule <- 2
params$output_vars_params$nb_sets <- 2
x <- mtcars[c("mpg", "hp", "wt")]
y <- mtcars["qsec"]
fit <- fuzzy_coco_systematic_fit(x, y, params, fitter)
creates a model for the Fuzzy Coco algorithm
Description
creates a model for the Fuzzy Coco algorithm
Usage
fuzzycoco(
mode = c("classification", "regression"),
params,
seed = sample.int(10^5, 1),
verbose = FALSE
)
Arguments
mode |
the type of model, either classification or regression |
params |
fuzzy coco parameters, as a recursive named list, cf |
seed |
the RNG seed to use (to fit the model) |
verbose |
whether to be verbose |
Value
a fuzzycoco_model object (named list)
Examples
model <- fuzzycoco("regression", params(nb_rules = 1, nb_max_var_per_rule = 3), seed = 123)
lowest-level implementation of the fitting of a fuzzy coco model using the hybrid engine
Description
lowest-level implementation of the fitting of a fuzzy coco model using the hybrid engine
Usage
fuzzycoco_fit_df_hybrid(
model,
x,
y,
until = stop_engine_on_first_of(max_generations =
model$params$global_params$max_generations, max_fitness =
model$params$global_params$max_fitness),
verbose = model$verbose,
progress = TRUE
)
Arguments
model |
a Fuzzy Coco model as a |
x |
the input variables data (usually to fit) as a dataframe |
y |
the output variables data (usually to fit) as a dataframe |
until |
function that takes an |
verbose |
whether to be verbose |
progress |
whether to display the computation progress (using progressr, if available) |
Value
a named list as a fuzzy_coco
fit object
Examples
model <- fuzzycoco("regression", example_mtcars()$params)
fit <- fuzzycoco_fit_df_hybrid(model, mtcars[c("mpg", "hp", "wt")], mtcars["qsec"])
utility to build the Fuzzy Coco parameters data structure
Description
utility to build the Fuzzy Coco parameters data structure
Usage
params(
nb_rules,
nb_max_var_per_rule,
max_generations = 100,
max_fitness = 1,
nb_cooperators = 2,
influence_rules_initial_population = FALSE,
influence_evolving_ratio = 0.8,
ivars.nb_sets = 3,
ivars.nb_bits_vars = NA_integer_,
ivars.nb_bits_sets = NA_integer_,
ivars.nb_bits_pos = NA_integer_,
ovars.nb_sets = 3,
ovars.nb_bits_vars = NA_integer_,
ovars.nb_bits_sets = NA_integer_,
ovars.nb_bits_pos = NA_integer_,
rules.pop_size = 100,
rules.elite_size = 5,
rules.cx_prob = 0.5,
rules.mut_flip_genome = 0.5,
rules.mut_flip_bit = 0.025,
mfs.pop_size = 100,
mfs.elite_size = 5,
mfs.cx_prob = 0.5,
mfs.mut_flip_genome = 0.5,
mfs.mut_flip_bit = 0.025,
output_vars_defuzz_thresholds = NA,
metricsw.sensitivity = 1,
metricsw.specificity = 0.8,
metricsw.accuracy = 0,
metricsw.ppv = 0,
metricsw.rmse = 0,
metricsw.rrse = 0,
metricsw.rae = 0,
metricsw.mse = 0,
metricsw.distanceThreshold = 0,
metricsw.distanceMinThreshold = 0,
metricsw.nb_vars = 0,
metricsw.overLearn = 0,
metricsw.true_positives = 0,
metricsw.false_positives = 0,
metricsw.true_negatives = 0,
metricsw.false_negatives = 0,
features_weights = list()
)
Arguments
nb_rules |
(mandatory) the number of rules in the fuzzy system |
nb_max_var_per_rule |
(mandatory) The maximum number of antecedents (input variables) to use in each rule. |
max_generations , max_fitness , nb_cooperators , influence_rules_initial_population , influence_evolving_ratio , ivars.nb_sets , ivars.nb_bits_vars , ivars.nb_bits_sets , ivars.nb_bits_pos , ovars.nb_sets , ovars.nb_bits_vars , ovars.nb_bits_sets , ovars.nb_bits_pos , rules.pop_size , rules.elite_size , rules.cx_prob , rules.mut_flip_genome , rules.mut_flip_bit , mfs.pop_size , mfs.elite_size , mfs.cx_prob , mfs.mut_flip_genome , mfs.mut_flip_bit , output_vars_defuzz_thresholds , metricsw.sensitivity , metricsw.specificity , metricsw.accuracy , metricsw.ppv , metricsw.rmse , metricsw.rrse , metricsw.rae , metricsw.mse , metricsw.distanceThreshold , metricsw.distanceMinThreshold , metricsw.nb_vars , metricsw.overLearn , metricsw.true_positives , metricsw.false_positives , metricsw.true_negatives , metricsw.false_negatives , features_weights |
Value
a nested named list
Examples
pms <- params(
nb_rules = 2, nb_max_var_per_rule = 3, rules.pop_size = 20, mfs.pop_size = 20,
ivars.nb_sets = 3, ivars.nb_bits_vars = 3, ivars.nb_bits_sets = 2, ivars.nb_bits_pos = 8,
ovars.nb_sets = 3, ovars.nb_bits_vars = 1, ovars.nb_bits_sets = 2, ovars.nb_bits_pos = 8,
metricsw.sensitivity = 0, metricsw.specificity = 0, metricsw.rmse = 1,
output_vars_defuzz_thresholds = list(3, 17)
)
predict the outcome on some input data using a fitted model
Description
N.B: just a S3 method method wrapping the predict_fuzzy_system()
function
Usage
## S3 method for class 'fuzzycoco_fit'
predict(object, x, verbose = FALSE, bin = TRUE, ...)
Arguments
object |
the fuzzycoco_fit object containing the fuzzy system to predict on |
x |
the input data to use with the fuzzy system to predict the output |
verbose |
whether to be verbose |
bin |
whether to transform the output data into a binary response. Only applies to classification models. |
... |
not used. Only for S3 generic consistency |
Value
the predicted output data as a data frame
Examples
model <- fuzzycoco("regression", example_mtcars()$params, seed = 123)
x <- mtcars[c("mpg", "hp", "wt")]
y <- mtcars["qsec"]
fit <- fit_xy(model, x, y, progress = FALSE)
y2 <- predict(fit, x)
predict the outcome of a fuzzy system on some input data
Description
predict the outcome of a fuzzy system on some input data
Usage
predict_fuzzy_system(fs, x, verbose = FALSE)
Arguments
fs |
the fuzzy system to predict on (as a named list) |
x |
the input data to use with the fuzzy system to predict the output |
verbose |
whether to be verbose |
Value
the predicted output data as a data frame
Examples
model <- fuzzycoco("regression", example_mtcars()$params, seed = 123)
x <- mtcars[c("mpg", "hp", "wt")]
y <- mtcars["qsec"]
fit <- fit_xy(model, x, y, progress = FALSE)
y2 <- predict_fuzzy_system(fit$fuzzy_system,x)
Objects exported from other packages
Description
These objects are imported from other packages. Follow the links below to see their documentation.
shared params
Description
shared params
Arguments
data |
the data to fit as a data frame. The output variables must be grouped AFTER the input variables |
engine |
the fuzzy coco fit engine to use, one of rcpp and hybrid |
formula |
the fuzzy coco model as a formula |
fuzzy_system_desc |
a fuzzy system description as a named list |
max_generations |
The maximum number of iterations of the algorithm. Each iteration produces a new generation of the rules and membership functions populations. |
max_fitness |
a stop condition: the iterations stop as soon as a generated fuzzy system fitness reaches that threshold. |
mode |
the type of model, either classification or regression |
model |
a Fuzzy Coco model as a |
params |
fuzzy coco parameters, as a recursive named list, cf |
progress |
whether to display the computation progress (using progressr, if available) |
seed |
the RNG seed to use (to fit the model) |
until |
function that takes an |
verbose |
whether to be verbose |
x |
the input variables data (usually to fit) as a dataframe |
y |
the output variables data (usually to fit) as a dataframe |
an utility function to easily generate a stop function that stops when the convergence is stalling
Description
an utility function to easily generate a stop function that stops when the convergence is stalling
Usage
stop_engine_if_stalling(nb_iterations)
Arguments
nb_iterations |
number of iterations of the stalling: stops if the fitness has not increased during that number of iterations. |
Value
a function: (engine) –> logical that stops (i.e/ returns TRUE) if the convergence is stalling
Examples
until <- stop_engine_on_first_of(max_generations = 1000, other_func = stop_engine_if_stalling(5))
an utility function to easily generate the commonly used until
parameter, as used by fuzzycoco_fit_df_hybrid()
Description
an utility function to easily generate the commonly used until
parameter, as used by fuzzycoco_fit_df_hybrid()
Usage
stop_engine_on_first_of(
max_generations = NULL,
max_fitness = NULL,
other_func = NULL
)
Arguments
max_generations |
The maximum number of iterations of the algorithm. Each iteration produces a new generation of the rules and membership functions populations. |
max_fitness |
a stop condition: the iterations stop as soon as a generated fuzzy system fitness reaches that threshold. |
other_func |
if not NULL, a function: (engine) –>logical that should return TRUE to stop the evolution
(cf |
Value
a function: (engine) –> logical that stops (i.e/ returns TRUE) when the number of generations or the fitness
are reached, or when the other_func
if provided returns TRUE
Examples
until <- stop_engine_on_first_of(max_generations = 100)
until <- stop_engine_on_first_of(max_generations = 100, max_fitness = 0.8)
until <- stop_engine_on_first_of(max_fitness = 0.9, other_func = stop_engine_if_stalling(5))