use hessboost::metric::Auc;
use hessboost::prelude::*;
mod common;
use common::{accuracy, fill_random, lcg};
fn main() -> Result<()> {
let (n, f) = (2000usize, 4usize);
let mut rng = lcg(42);
let mut x = vec![0f32; n * f];
let mut y = vec![0f32; n];
for i in 0..n {
fill_random(&mut rng, &mut x[i * f..(i + 1) * f]);
let logit = 3.0 * x[i * f] - 2.0 * x[i * f + 1] - 0.5;
let p = 1.0 / (1.0 + (-logit).exp());
y[i] = if p > rng() { 1.0 } else { 0.0 };
}
let split = 1600 * f;
let dtrain = DMatrix::from_dense(&x[..split], 1600, f)?.with_labels(&y[..1600])?;
let dvalid = DMatrix::from_dense(&x[split..], 400, f)?.with_labels(&y[1600..])?;
let params = TrainingParams::builder()
.objective("binary:logistic")
.eval_metric("logloss")
.eval_metric("auc")
.max_depth(4)
.eta(0.1)
.subsample(0.9)
.build()?;
let out = train_with_eval(¶ms, &dtrain, 500, &[(&dvalid, "valid")], Some(20))?;
let model = out.model;
println!(
"stopped at {} trees (best iteration {:?})",
model.num_trees(),
model.best_iteration()
);
let probs = model.predict(&dvalid)?; let classes = model.predict_class(&dvalid)?; let acc = accuracy(&classes, dvalid.labels().unwrap());
let auc = Auc.eval(&probs, dvalid.labels().unwrap(), None);
println!("valid accuracy {acc:.3}, AUC {auc:.3}");
Ok(())
}