@@ -64,7 +64,6 @@ pub struct DecisionTreeClassifier {
64
64
max_depth : Option < usize > ,
65
65
min_samples_split : Option < usize > ,
66
66
67
-
68
67
// params set after train
69
68
n_classes : usize ,
70
69
n_features : usize ,
@@ -265,12 +264,6 @@ fn uniquify(values: &Vec<f64>) -> Vec<f64> {
265
264
values
266
265
}
267
266
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
-
274
267
/// Uniquify values, then get splitter values, i.e. midpoints of unique values
275
268
fn get_splits ( values : & Vec < f64 > ) -> Vec < f64 > {
276
269
let uniques = uniquify ( values) ;
@@ -280,13 +273,6 @@ fn get_splits(values: &Vec<f64>) -> Vec<f64> {
280
273
. collect ( )
281
274
}
282
275
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
-
290
276
/// Split Vec to left and right, depending on given bool Vec values
291
277
fn split_slice < T : Copy > ( values : & Vector < T > , bindexer : & Vec < bool > ) -> ( Vector < T > , Vector < T > ) {
292
278
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>,
303
289
( Vector :: new ( left) , Vector :: new ( right) )
304
290
}
305
291
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
-
317
292
fn xlogy ( x : f64 , y : f64 ) -> f64 {
318
293
if x == 0. {
319
294
0.
@@ -322,12 +297,6 @@ fn xlogy(x: f64, y: f64) -> f64 {
322
297
}
323
298
}
324
299
325
- #[ test]
326
- fn test_xlogy ( ) {
327
- assert_eq ! ( xlogy( 3. , 8. ) , 6.2383246250395068 ) ;
328
- assert_eq ! ( xlogy( 0. , 100. ) , 0. ) ;
329
- }
330
-
331
300
/// Count target label frequencies
332
301
fn freq ( labels : & Vector < usize > ) -> ( Vector < usize > , Vector < usize > ) {
333
302
let mut map: BTreeMap < usize , usize > = BTreeMap :: new ( ) ;
@@ -345,17 +314,6 @@ fn freq(labels: &Vector<usize>) -> (Vector<usize>, Vector<usize>) {
345
314
( Vector :: new ( uniques) , Vector :: new ( counts) )
346
315
}
347
316
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
-
359
317
/// Split criterias
360
318
#[ derive( Debug ) ]
361
319
pub enum Metrics {
@@ -390,31 +348,80 @@ impl Metrics {
390
348
}
391
349
}
392
350
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 {
401
353
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 ;
409
355
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 } ;
415
357
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