use hessboost::objective::Multiclass;
use hessboost::prelude::*;
mod common;
use common::{accuracy, fill_random, lcg};
fn main() -> Result<()> {
let (n, f, k) = (1500usize, 4usize, 3usize);
let mut rng = lcg(7);
let mut x = vec![0f32; n * f];
let mut y = vec![0f32; n];
fill_random(&mut rng, &mut x);
for i in 0..n {
let s = x[i * f] + x[i * f + 1];
y[i] = if s < 0.7 {
0.0
} else if s < 1.3 {
1.0
} else {
2.0
};
}
let dtrain = DMatrix::from_dense(&x, n, f)?.with_labels(&y)?;
let params = TrainingParams::builder()
.objective(Objective::Softprob(Multiclass::new(k)?)) .max_depth(4)
.eta(0.2)
.build()?;
let model = train(¶ms, &dtrain, 60)?;
let probs = model.predict(&dtrain, Iterations::Best)?;
let row0 = probs.row(0).expect("row 0 exists");
println!(
"row 0 class probabilities: {row0:?} (sums to {:.3})",
row0.iter().sum::<f32>()
);
let classes = model.predict_class(&dtrain, Iterations::Best)?;
let acc = accuracy(classes.as_slice(), &y);
println!("training accuracy: {acc:.3}");
Ok(())
}