## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
has_tidymodels <- all(vapply(
  c("parsnip", "dials", "recipes", "rsample", "tune", "workflows", "yardstick"),
  requireNamespace, logical(1), quietly = TRUE
))

## -----------------------------------------------------------------------------
library(FuzzyClass)

set.seed(123)
train_index <- sample(nrow(iris), nrow(iris) * 0.7)
train_data <- iris[train_index, ]
test_data <- iris[-train_index, ]

## -----------------------------------------------------------------------------
model <- GauNBFuzzyParamModel$new(metd = 2)
model

## -----------------------------------------------------------------------------
model$fit(train = train_data[, -5], cl = train_data$Species)
model

## -----------------------------------------------------------------------------
pred <- model$predict(test_data[, -5])
head(pred)
mean(pred == test_data$Species)

head(model$predict(test_data[, -5], type = "prob"))

## -----------------------------------------------------------------------------
model$set_params(metd = 5)$fit(train_data[, -5], train_data$Species, verbose = FALSE)
mean(model$predict(test_data[, -5]) == test_data$Species)

## -----------------------------------------------------------------------------
fit <- FuzzyGaussianNaiveBayes(train = train_data[, -5], cl = train_data$Species)
class(fit)
head(predict(fit, test_data[, -5]))
head(predict(fit, test_data[, -5], type = "matrix"))

## ----eval = has_tidymodels, message = FALSE-----------------------------------
library(parsnip)
library(workflows)
library(recipes)
library(rsample)
library(tune)
library(yardstick)

spec <- fuzzy_naive_bayes(fuzzy = TRUE) |>
  set_engine("gaussian")
spec

iris_fit <- fit(spec, Species ~ ., data = train_data)
predict(iris_fit, test_data[1:5, ])
predict(iris_fit, test_data[1:5, ], type = "prob")

## ----eval = has_tidymodels----------------------------------------------------
fuzzy_naive_bayes() |>
  set_engine("dw_gamma", wdelta = rep(1/3, 3), weta = rep(1/4, 4), verbose = FALSE) |>
  fit(Species ~ ., data = train_data) |>
  augment(new_data = test_data) |>
  yardstick::accuracy(truth = Species, estimate = .pred_class)

## ----eval = has_tidymodels----------------------------------------------------
options(FuzzyClass.verbose = FALSE)

split <- initial_split(iris, prop = 0.7, strata = Species)
folds <- vfold_cv(training(split), v = 5, strata = Species)

wf <- workflow() |>
  add_recipe(recipe(Species ~ ., data = training(split))) |>
  add_model(
    fuzzy_naive_bayes(alpha_cut = tune(), ranking_method = tune()) |>
      set_engine("gaussian_fuzzy_param")
  )

set.seed(1)
tuned <- tune_grid(wf, resamples = folds, grid = 6,
                   metrics = metric_set(yardstick::accuracy, yardstick::roc_auc))
show_best(tuned, metric = "accuracy", n = 3)

final <- finalize_workflow(wf, select_best(tuned, metric = "accuracy")) |>
  last_fit(split, metrics = metric_set(yardstick::accuracy, yardstick::roc_auc))
collect_metrics(final)

options(FuzzyClass.verbose = TRUE)

