Api v2 - developer documentation (API implementation)
Each model is a child of either BetaMLSuperVisedModel or BetaMLSuperVisedModel, both in turn child of BetaMLModel:
BetaMLSuperVisedModel <: BetaMLModel
BetaMLUnsupervisedModel <: BetaMLModel
RandomForestEstimator <: BetaMLSuperVisedModelThe model struct is composed of the following elements:
mutable struct DecisionTreeEstimator <: BetaMLSupervisedModel
hpar::DecisionTreeE_hp # Hyper-pharameters
opt::BML_options # Option sets, default or a specific one for the model
par::DT_lp # Model learnable parameters (needed for predictions)
cres::T # Cached results
trained::Bool # Trained flag
info # Complementary information, but not needed to make predictions
endEach specific model hyperparameter set and learnable parameter set are childs of BetaMLHyperParametersSet and BetaMLLearnedParametersSet and, if a specific model option set is used, this would be child of BetaMLOptionsSet.
While hyperparameters are elements that control the learning process, i.e. would influence the model training and prediction, the options have a more general meaning and do not directly affect the training (they can do indirectly, like the rng). The default option set is implemented as:
Base.@kwdef mutable struct BML_options
"Cache the results of the fitting stage, as to allow predict(mod) [default: `true`]. Set it to `false` to save memory for large data."
cache::Bool = true
"An optional title and/or description for this model"
descr::String = ""
"The verbosity level to be used in training or prediction (see [`Verbosity`](@ref)) [deafult: `STD`]
"
verbosity::Verbosity = STD
"Random Number Generator (see [`FIXEDSEED`](@ref)) [deafult: `Random.GLOBAL_RNG`]
"
rng::AbstractRNG = Random.GLOBAL_RNG
endNote that the user doesn't generally need to make a difference between an hyperparameter and an option, as both are provided as keyword arguments to the model constructor thanks to a model constructor like the following one:
function KMedoidsClusterer(;kwargs...)
m = KMedoidsClusterer(KMeansMedoidsHyperParametersSet(),BML_options(),KMeansMedoids_lp(),nothing,false,Dict{Symbol,Any}())
thisobjfields = fieldnames(nonmissingtype(typeof(m)))
for (kw,kwv) in kwargs
found = false
for f in thisobjfields
fobj = getproperty(m,f)
if kw in fieldnames(typeof(fobj))
setproperty!(fobj,kw,kwv)
found = true
end
end
found || error("Keyword \"$kw\" is not part of this model.")
end
return m
endSo, in order to implement a new model we need to:
- implement its struct and constructor
- implement the relative
ModelHyperParametersSet,ModelLearnedParametersSetand eventuallyModelOptionsSet. - define
fit!(model, X, [y]),predict(model,X)and eventuallyinverse_predict(model,X).