diff --git a/src/xgboost/xgb_regressor.rs b/src/xgboost/xgb_regressor.rs index fcc12490..3f97ee73 100644 --- a/src/xgboost/xgb_regressor.rs +++ b/src/xgboost/xgb_regressor.rs @@ -535,6 +535,13 @@ impl, Y: Array1> XGRegres } let (n_samples, _) = data.shape(); + if n_samples == 0 { + return Err(Failed::because( + FailedError::ParametersError, + "Training data must have at least one row.", + )); + } + let learning_rate = parameters.learning_rate; let mut predictions = vec![parameters.base_score; n_samples]; @@ -817,6 +824,18 @@ mod tests { assert!(predictions[0] > 0.5 && predictions[0] < 5.0); } + #[test] + fn test_fit_on_empty_data_returns_error() { + let full = DenseMatrix::from_2d_vec(&vec![vec![1.0, 1.0], vec![2.0, 1.0]]).unwrap(); + let empty = full.take(&[] as &[usize], 0); + assert_eq!(empty.shape(), (0, 2)); + + let y: Vec = vec![]; + let model = XGRegressor::fit(&empty, &y, XGRegressorParameters::default()); + assert!(model.is_err()); + assert_eq!(model.err().unwrap().error(), FailedError::ParametersError); + } + #[test] fn test_sample_without_replacement_clamps_to_one_row() { // (population, ratio): each pair gives `floor(population * ratio) == 0`.