@@ -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,80 @@ 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+ use linalg:: Vector ;
409355
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- }
356+ use super :: { uniquify, get_splits, split_slice, xlogy, freq, Metrics } ;
415357
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- }
358+ #[ test]
359+ fn test_uniquify ( ) {
360+ assert_eq ! ( uniquify( & vec![ 0.1 , 0.2 , 0.1 ] ) , vec![ 0.1 , 0.2 ] ) ;
361+ assert_eq ! ( uniquify( & vec![ 0.3 , 0.1 , 0.1 , 0.1 , 0.2 , 0.2 ] ) , vec![ 0.1 , 0.2 , 0.3 ] ) ;
362+ }
363+
364+ #[ test]
365+ fn test_get_splits ( ) {
366+ assert_eq ! ( get_splits( & vec![ 0.1 , 0.2 , 0.1 ] ) , vec![ 0.15000000000000002 ] ) ;
367+ assert_eq ! ( get_splits( & vec![ 0.3 , 0.1 , 0.1 , 0.1 , 0.2 , 0.2 ] ) , vec![ 0.15000000000000002 , 0.25 ] ) ;
368+ assert_eq ! ( get_splits( & vec![ 1. , 3. , 7. , 3. , 7. ] ) , vec![ 2. , 5. ] ) ;
369+ }
370+
371+ #[ test]
372+ fn test_split_slice ( ) {
373+ let ( l, r) = split_slice ( & Vector :: new ( vec ! [ 1 , 2 , 3 ] ) , & vec ! [ true , false , true ] ) ;
374+ assert_eq ! ( l, Vector :: new( vec![ 1 , 3 ] ) ) ;
375+ assert_eq ! ( r, Vector :: new( vec![ 2 ] ) ) ;
376+
377+ let ( l, r) = split_slice ( & Vector :: new ( vec ! [ 1 , 2 , 3 ] ) , & vec ! [ true , true , true ] ) ;
378+ assert_eq ! ( l, Vector :: new( vec![ 1 , 2 , 3 ] ) ) ;
379+ assert_eq ! ( r, Vector :: new( vec![ ] ) ) ;
380+ }
381+
382+ #[ test]
383+ fn test_xlogy ( ) {
384+ assert_eq ! ( xlogy( 3. , 8. ) , 6.2383246250395068 ) ;
385+ assert_eq ! ( xlogy( 0. , 100. ) , 0. ) ;
386+ }
387+
388+ #[ test]
389+ fn test_freq ( ) {
390+ let ( uniques, counts) = freq ( & Vector :: new ( vec ! [ 1 , 2 , 3 , 1 , 2 , 4 ] ) ) ;
391+ assert_eq ! ( uniques, Vector :: new( vec![ 1 , 2 , 3 , 4 ] ) ) ;
392+ assert_eq ! ( counts, Vector :: new( vec![ 2 , 2 , 1 , 1 ] ) ) ;
393+
394+ let ( uniques, counts) = freq ( & Vector :: new ( vec ! [ 1 , 2 , 2 , 2 , 2 ] ) ) ;
395+ assert_eq ! ( uniques, Vector :: new( vec![ 1 , 2 ] ) ) ;
396+ assert_eq ! ( counts, Vector :: new( vec![ 1 , 4 ] ) ) ;
397+ }
398+
399+ #[ test]
400+ fn test_entropy ( ) {
401+ assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 1. ] ) , 0. ) ;
402+ assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 1. , 0. , 0. ] ) , 0. ) ;
403+ assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 0.5 , 0.5 ] ) , 0.69314718055994529 ) ;
404+ assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 1. / 3. , 1. / 3. , 1. / 3. ] ) , 1.0986122886681096 ) ;
405+ assert_eq ! ( Metrics :: Entropy . from_probas( & vec![ 0.4 , 0.3 , 0.3 ] ) , 1.0888999753452238 ) ;
406+ }
407+
408+ #[ test]
409+ fn test_gini_from_probas ( ) {
410+ assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 1. , 0. , 0. ] ) , 0. ) ;
411+ assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 1. / 3. , 1. / 3. , 1. / 3. ] ) , 0.6666666666666667 ) ;
412+ assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 0. , 1. / 46. , 45. / 46. ] ) , 0.04253308128544431 ) ;
413+ assert_eq ! ( Metrics :: Gini . from_probas( & vec![ 0. , 49. / 54. , 5. / 54. ] ) , 0.16803840877914955 ) ;
414+ }
415+
416+ #[ test]
417+ fn test_entropy_from_labels ( ) {
418+ assert_eq ! ( Metrics :: Entropy . from_labels( & Vector :: new( vec![ 1 , 2 , 3 ] ) ) , 1.0986122886681096 ) ;
419+ assert_eq ! ( Metrics :: Entropy . from_labels( & Vector :: new( vec![ 1 , 1 , 2 , 2 ] ) ) , 0.69314718055994529 ) ;
420+ }
421+
422+ #[ test]
423+ fn test_gini_from_labels ( ) {
424+ assert_eq ! ( Metrics :: Gini . from_labels( & Vector :: new( vec![ 1 , 1 , 1 ] ) ) , 0. ) ;
425+ assert_eq ! ( Metrics :: Gini . from_labels( & Vector :: new( vec![ 1 , 1 , 2 , 2 , 3 , 3 ] ) ) , 0.6666666666666667 ) ;
426+ }
427+ }
0 commit comments