use std::path::Path;
use automl::{
settings::{Algorithm, DecisionTreeRegressorParameters},
SupervisedModel,
};
use super::metaml::{MetaMLDataset, MetaMLModel};
#[derive(Default)]
pub struct LinearRegressor {
model: Option<SupervisedModel>,
}
impl LinearRegressor {
pub fn new() -> Self {
Self { model: None }
}
}
impl MetaMLModel for LinearRegressor {
fn train(&mut self, data: MetaMLDataset) {
let settings = automl::Settings::default_regression().only(Algorithm::Linear);
let mut model = SupervisedModel::new(data, settings);
model.train();
self.model = Some(model);
}
fn predict(&self, features: &[f32; 6]) -> f32 {
let model = self
.model
.as_ref()
.expect("Model must be trained before making predictions");
model.predict(vec![features.to_vec()])[0]
}
fn load(path: &Path) -> Result<Self, String> {
let path_str = path.to_str().ok_or("Failed to convert path to a string")?;
let model = SupervisedModel::new_from_file(path_str);
Ok(LinearRegressor { model: Some(model) })
}
fn save(&self, path: &Path) -> Result<(), String> {
let model = self.model.as_ref().expect("Model must be trained before being saved.");
let path_str = path.to_str().ok_or("Failed to convert path to a string")?;
model.save(path_str);
Ok(())
}
}
#[derive(Default)]
pub struct DecisionTreeRegressor {
model: Option<SupervisedModel>,
}
impl DecisionTreeRegressor {
const MAX_DEPTH: u16 = 3;
pub fn new() -> Self {
Self { model: None }
}
}
impl MetaMLModel for DecisionTreeRegressor {
fn train(&mut self, data: MetaMLDataset) {
let settings = automl::Settings::default_regression()
.only(Algorithm::DecisionTreeRegressor)
.with_decision_tree_regressor_settings(
DecisionTreeRegressorParameters::default().with_max_depth(Self::MAX_DEPTH),
);
let mut model = SupervisedModel::new(data, settings);
model.train();
self.model = Some(model);
}
fn predict(&self, features: &[f32; 6]) -> f32 {
let model = self
.model
.as_ref()
.expect("Model must be trained before making predictions");
model.predict(vec![features.to_vec()])[0]
}
fn load(path: &Path) -> Result<Self, String> {
let path_str = path.to_str().ok_or("Failed to convert path to a string")?;
let model = SupervisedModel::new_from_file(path_str);
Ok(DecisionTreeRegressor { model: Some(model) })
}
fn save(&self, path: &Path) -> Result<(), String> {
let model = self.model.as_ref().expect("Model must be trained before being saved");
let path_str = path.to_str().ok_or("Failed to convert path to a string")?;
model.save(path_str);
Ok(())
}
}