@@ -64,7 +64,6 @@ pub struct DecisionTreeClassifier {
6464 max_depth : Option < usize > ,
6565 min_samples_split : Option < usize > ,
6666
67-
6867 // params set after train
6968 n_classes : usize ,
7069 n_features : usize ,
@@ -265,12 +264,6 @@ fn uniquify(values: &Vec<f64>) -> Vec<f64> {
265264 values
266265}
267266
268- #[ test]
269- fn test_uniquify ( ) {
270- assert_eq ! ( uniquify( & vec![ 0.1 , 0.2 , 0.1 ] ) , vec![ 0.1 , 0.2 ] ) ;
271- assert_eq ! ( uniquify( & vec![ 0.3 , 0.1 , 0.1 , 0.1 , 0.2 , 0.2 ] ) , vec![ 0.1 , 0.2 , 0.3 ] ) ;
272- }
273-
274267/// Uniquify values, then get splitter values, i.e. midpoints of unique values
275268fn get_splits ( values : & Vec < f64 > ) -> Vec < f64 > {
276269 let uniques = uniquify ( values) ;
@@ -280,13 +273,6 @@ fn get_splits(values: &Vec<f64>) -> Vec<f64> {
280273 . collect ( )
281274}
282275
283- #[ test]
284- fn test_get_splits ( ) {
285- assert_eq ! ( get_splits( & vec![ 0.1 , 0.2 , 0.1 ] ) , vec![ 0.15000000000000002 ] ) ;
286- assert_eq ! ( get_splits( & vec![ 0.3 , 0.1 , 0.1 , 0.1 , 0.2 , 0.2 ] ) , vec![ 0.15000000000000002 , 0.25 ] ) ;
287- assert_eq ! ( get_splits( & vec![ 1. , 3. , 7. , 3. , 7. ] ) , vec![ 2. , 5. ] ) ;
288- }
289-
290276/// Split Vec to left and right, depending on given bool Vec values
291277fn split_slice < T : Copy > ( values : & Vector < T > , bindexer : & Vec < bool > ) -> ( Vector < T > , Vector < T > ) {
292278 let mut left: Vec < T > = Vec :: with_capacity ( values. size ( ) ) ;
@@ -303,17 +289,6 @@ fn split_slice<T: Copy>(values: &Vector<T>, bindexer: &Vec<bool>) -> (Vector<T>,
303289 ( Vector :: new ( left) , Vector :: new ( right) )
304290}
305291
306- #[ test]
307- fn test_split_slice ( ) {
308- let ( l, r) = split_slice ( & Vector :: new ( vec ! [ 1 , 2 , 3 ] ) , & vec ! [ true , false , true ] ) ;
309- assert_eq ! ( l, Vector :: new( vec![ 1 , 3 ] ) ) ;
310- assert_eq ! ( r, Vector :: new( vec![ 2 ] ) ) ;
311-
312- let ( l, r) = split_slice ( & Vector :: new ( vec ! [ 1 , 2 , 3 ] ) , & vec ! [ true , true , true ] ) ;
313- assert_eq ! ( l, Vector :: new( vec![ 1 , 2 , 3 ] ) ) ;
314- assert_eq ! ( r, Vector :: new( vec![ ] ) ) ;
315- }
316-
317292fn xlogy ( x : f64 , y : f64 ) -> f64 {
318293 if x == 0. {
319294 0.
@@ -322,12 +297,6 @@ fn xlogy(x: f64, y: f64) -> f64 {
322297 }
323298}
324299
325- #[ test]
326- fn test_xlogy ( ) {
327- assert_eq ! ( xlogy( 3. , 8. ) , 6.2383246250395068 ) ;
328- assert_eq ! ( xlogy( 0. , 100. ) , 0. ) ;
329- }
330-
331300/// Count target label frequencies
332301fn freq ( labels : & Vector < usize > ) -> ( Vector < usize > , Vector < usize > ) {
333302 let mut map: BTreeMap < usize , usize > = BTreeMap :: new ( ) ;
@@ -345,17 +314,6 @@ fn freq(labels: &Vector<usize>) -> (Vector<usize>, Vector<usize>) {
345314 ( Vector :: new ( uniques) , Vector :: new ( counts) )
346315}
347316
348- #[ test]
349- fn test_freq ( ) {
350- let ( uniques, counts) = freq ( & Vector :: new ( vec ! [ 1 , 2 , 3 , 1 , 2 , 4 ] ) ) ;
351- assert_eq ! ( uniques, Vector :: new( vec![ 1 , 2 , 3 , 4 ] ) ) ;
352- assert_eq ! ( counts, Vector :: new( vec![ 2 , 2 , 1 , 1 ] ) ) ;
353-
354- let ( uniques, counts) = freq ( & Vector :: new ( vec ! [ 1 , 2 , 2 , 2 , 2 ] ) ) ;
355- assert_eq ! ( uniques, Vector :: new( vec![ 1 , 2 ] ) ) ;
356- assert_eq ! ( counts, Vector :: new( vec![ 1 , 4 ] ) ) ;
357- }
358-
359317/// Split criterias
360318#[ derive( Debug ) ]
361319pub enum Metrics {
@@ -390,31 +348,76 @@ impl Metrics {
390348 }
391349}
392350
393- #[ test]
394- fn test_entropy ( ) {
395- assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 1. ] ) , 0. ) ;
396- assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 1. , 0. , 0. ] ) , 0. ) ;
397- assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 0.5 , 0.5 ] ) , 0.69314718055994529 ) ;
398- assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 1. / 3. , 1. / 3. , 1. / 3. ] ) , 1.0986122886681096 ) ;
399- assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 0.4 , 0.3 , 0.3 ] ) , 1.0888999753452238 ) ;
400- }
351+ #[ cfg( test) ]
352+ mod tests {
401353
402- #[ test]
403- fn test_gini_from_probas ( ) {
404- assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 1. , 0. , 0. ] ) , 0. ) ;
405- assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 1. / 3. , 1. / 3. , 1. / 3. ] ) , 0.6666666666666667 ) ;
406- assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 0. , 1. / 46. , 45. / 46. ] ) , 0.04253308128544431 ) ;
407- assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 0. , 49. / 54. , 5. / 54. ] ) , 0.16803840877914955 ) ;
408- }
354+ #[ test]
355+ fn test_uniquify ( ) {
356+ assert_eq ! ( uniquify( & vec![ 0.1 , 0.2 , 0.1 ] ) , vec![ 0.1 , 0.2 ] ) ;
357+ assert_eq ! ( uniquify( & vec![ 0.3 , 0.1 , 0.1 , 0.1 , 0.2 , 0.2 ] ) , vec![ 0.1 , 0.2 , 0.3 ] ) ;
358+ }
409359
410- #[ test]
411- fn test_entropy_from_labels ( ) {
412- assert_eq ! ( Metrics :: Entropy . from_labels( & Vector :: new( vec![ 1 , 2 , 3 ] ) ) , 1.0986122886681096 ) ;
413- assert_eq ! ( Metrics :: Entropy . from_labels( & Vector :: new( vec![ 1 , 1 , 2 , 2 ] ) ) , 0.69314718055994529 ) ;
414- }
360+ #[ test]
361+ fn test_get_splits ( ) {
362+ assert_eq ! ( get_splits( & vec![ 0.1 , 0.2 , 0.1 ] ) , vec![ 0.15000000000000002 ] ) ;
363+ assert_eq ! ( get_splits( & vec![ 0.3 , 0.1 , 0.1 , 0.1 , 0.2 , 0.2 ] ) , vec![ 0.15000000000000002 , 0.25 ] ) ;
364+ assert_eq ! ( get_splits( & vec![ 1. , 3. , 7. , 3. , 7. ] ) , vec![ 2. , 5. ] ) ;
365+ }
415366
416- #[ test]
417- fn test_gini_from_labels ( ) {
418- assert_eq ! ( Metrics :: Gini . from_labels( & Vector :: new( vec![ 1 , 1 , 1 ] ) ) , 0. ) ;
419- assert_eq ! ( Metrics :: Gini . from_labels( & Vector :: new( vec![ 1 , 1 , 2 , 2 , 3 , 3 ] ) ) , 0.6666666666666667 ) ;
420- }
367+ #[ test]
368+ fn test_split_slice ( ) {
369+ let ( l, r) = split_slice ( & Vector :: new ( vec ! [ 1 , 2 , 3 ] ) , & vec ! [ true , false , true ] ) ;
370+ assert_eq ! ( l, Vector :: new( vec![ 1 , 3 ] ) ) ;
371+ assert_eq ! ( r, Vector :: new( vec![ 2 ] ) ) ;
372+
373+ let ( l, r) = split_slice ( & Vector :: new ( vec ! [ 1 , 2 , 3 ] ) , & vec ! [ true , true , true ] ) ;
374+ assert_eq ! ( l, Vector :: new( vec![ 1 , 2 , 3 ] ) ) ;
375+ assert_eq ! ( r, Vector :: new( vec![ ] ) ) ;
376+ }
377+
378+ #[ test]
379+ fn test_xlogy ( ) {
380+ assert_eq ! ( xlogy( 3. , 8. ) , 6.2383246250395068 ) ;
381+ assert_eq ! ( xlogy( 0. , 100. ) , 0. ) ;
382+ }
383+
384+ #[ test]
385+ fn test_freq ( ) {
386+ let ( uniques, counts) = freq ( & Vector :: new ( vec ! [ 1 , 2 , 3 , 1 , 2 , 4 ] ) ) ;
387+ assert_eq ! ( uniques, Vector :: new( vec![ 1 , 2 , 3 , 4 ] ) ) ;
388+ assert_eq ! ( counts, Vector :: new( vec![ 2 , 2 , 1 , 1 ] ) ) ;
389+
390+ let ( uniques, counts) = freq ( & Vector :: new ( vec ! [ 1 , 2 , 2 , 2 , 2 ] ) ) ;
391+ assert_eq ! ( uniques, Vector :: new( vec![ 1 , 2 ] ) ) ;
392+ assert_eq ! ( counts, Vector :: new( vec![ 1 , 4 ] ) ) ;
393+ }
394+
395+ #[ test]
396+ fn test_entropy ( ) {
397+ assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 1. ] ) , 0. ) ;
398+ assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 1. , 0. , 0. ] ) , 0. ) ;
399+ assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 0.5 , 0.5 ] ) , 0.69314718055994529 ) ;
400+ assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 1. / 3. , 1. / 3. , 1. / 3. ] ) , 1.0986122886681096 ) ;
401+ assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 0.4 , 0.3 , 0.3 ] ) , 1.0888999753452238 ) ;
402+ }
403+
404+ #[ test]
405+ fn test_gini_from_probas ( ) {
406+ assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 1. , 0. , 0. ] ) , 0. ) ;
407+ assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 1. / 3. , 1. / 3. , 1. / 3. ] ) , 0.6666666666666667 ) ;
408+ assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 0. , 1. / 46. , 45. / 46. ] ) , 0.04253308128544431 ) ;
409+ assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 0. , 49. / 54. , 5. / 54. ] ) , 0.16803840877914955 ) ;
410+ }
411+
412+ #[ test]
413+ fn test_entropy_from_labels ( ) {
414+ assert_eq ! ( Metrics :: Entropy . from_labels( & Vector :: new( vec![ 1 , 2 , 3 ] ) ) , 1.0986122886681096 ) ;
415+ assert_eq ! ( Metrics :: Entropy . from_labels( & Vector :: new( vec![ 1 , 1 , 2 , 2 ] ) ) , 0.69314718055994529 ) ;
416+ }
417+
418+ #[ test]
419+ fn test_gini_from_labels ( ) {
420+ assert_eq ! ( Metrics :: Gini . from_labels( & Vector :: new( vec![ 1 , 1 , 1 ] ) ) , 0. ) ;
421+ assert_eq ! ( Metrics :: Gini . from_labels( & Vector :: new( vec![ 1 , 1 , 2 , 2 , 3 , 3 ] ) ) , 0.6666666666666667 ) ;
422+ }
423+ }
0 commit comments