use linfa::prelude::{Fit, Predict, ToConfusionMatrix};
use linfa_ensemble::EnsembleLearnerParams;
use linfa_trees::DecisionTree;
use ndarray_rand::rand::SeedableRng;
use rand::rngs::SmallRng;
fn main() {
let ensemble_size = 100;
let bootstrap_proportion = 0.7;
let mut rng = SmallRng::seed_from_u64(42);
let (train, test) = linfa_datasets::iris()
.shuffle(&mut rng)
.split_with_ratio(0.8);
let model = EnsembleLearnerParams::new(DecisionTree::params())
.ensemble_size(ensemble_size)
.bootstrap_proportion(bootstrap_proportion)
.fit(&train)
.unwrap();
let final_predictions_ensemble = model.predict(&test);
println!("Final Predictions: \n{final_predictions_ensemble:?}");
let cm = final_predictions_ensemble.confusion_matrix(&test).unwrap();
println!("{cm:?}");
println!("Test accuracy: {} \n with default Decision Tree params, \n Ensemble Size: {ensemble_size},\n Bootstrap Proportion: {bootstrap_proportion}",
100.0 * cm.accuracy());
}