(
keys: &[String],
idx: usize,
grid: &BTreeMap<String, Vec<HyperParamValue>>,
current: &mut ParamSet,
out: &mut Vec<ParamSet>,
)
| 204 | } |
| 205 | |
| 206 | if sum_w <= 0.0 { |
| 207 | return Err(TuningError::ZeroSampleWeightSum); |
| 208 | } |
| 209 | |
| 210 | let accuracy = weighted_correct / sum_w; |
| 211 | let neg_log_loss = -(weighted_loss / sum_w); |
| 212 | |
| 213 | match scoring { |
| 214 | SearchScoring::Accuracy => Ok(accuracy), |
| 215 | SearchScoring::NegLogLoss => Ok(neg_log_loss), |
| 216 | SearchScoring::BalancedAccuracy => { |
| 217 | // Handle single-class folds by averaging recall over classes present in the fold. |
| 218 | let mut recalls = Vec::new(); |
| 219 | if pos_total > 0.0 { |
| 220 | recalls.push(pos_correct / pos_total); |
| 221 | } |
| 222 | if neg_total > 0.0 { |
| 223 | recalls.push(neg_correct / neg_total); |
| 224 | } |
| 225 | if recalls.is_empty() { |
| 226 | return Err(TuningError::NoLabeledSamples); |
| 227 | } |
| 228 | Ok(recalls.iter().sum::<f64>() / recalls.len() as f64) |
no test coverage detected