nkululeko 0.88.11__tar.gz → 0.89.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. {nkululeko-0.88.11 → nkululeko-0.89.0}/CHANGELOG.md +12 -2
  2. {nkululeko-0.88.11/nkululeko.egg-info → nkululeko-0.89.0}/PKG-INFO +18 -11
  3. {nkululeko-0.88.11 → nkululeko-0.89.0}/README.md +5 -8
  4. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/constants.py +1 -1
  5. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_agender.py +4 -3
  6. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_auddim.py +2 -3
  7. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_audmodel.py +2 -3
  8. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_opensmile.py +1 -1
  9. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_oxbow.py +6 -10
  10. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/featureset.py +1 -0
  11. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model.py +42 -35
  12. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_cnn.py +4 -4
  13. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_mlp.py +1 -1
  14. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_mlp_regression.py +2 -2
  15. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_tree.py +3 -1
  16. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/reporting/reporter.py +18 -0
  17. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/utils/util.py +5 -4
  18. {nkululeko-0.88.11 → nkululeko-0.89.0/nkululeko.egg-info}/PKG-INFO +18 -11
  19. {nkululeko-0.88.11 → nkululeko-0.89.0}/LICENSE +0 -0
  20. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/aesdd/process_database.py +0 -0
  21. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/androids/process_database.py +0 -0
  22. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/ased/process_database.py +0 -0
  23. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/asvp-esd/process_database.py +0 -0
  24. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/baved/process_database.py +0 -0
  25. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/cafe/process_database.py +0 -0
  26. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/clac/process_database.py +0 -0
  27. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/cmu-mosei/process_database.py +0 -0
  28. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/demos/process_database.py +0 -0
  29. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/ekorpus/process_database.py +0 -0
  30. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/emns/process_database.py +0 -0
  31. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/emofilm/convert_to_16k.py +0 -0
  32. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/emofilm/process_database.py +0 -0
  33. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/emorynlp/process_database.py +0 -0
  34. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/emov-db/process_database.py +0 -0
  35. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/emovo/process_database.py +0 -0
  36. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/emozionalmente/create.py +0 -0
  37. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/enterface/process_database.py +0 -0
  38. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/esd/process_database.py +0 -0
  39. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/gerparas/process_database.py +0 -0
  40. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/iemocap/process_database.py +0 -0
  41. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/jl/process_database.py +0 -0
  42. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/jtes/process_database.py +0 -0
  43. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/meld/process_database.py +0 -0
  44. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/mesd/process_database.py +0 -0
  45. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/mess/process_database.py +0 -0
  46. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/mlendsnd/process_database.py +0 -0
  47. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/msp-improv/process_database2.py +0 -0
  48. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/msp-podcast/process_database.py +0 -0
  49. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/oreau2/process_database.py +0 -0
  50. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/portuguese/process_database.py +0 -0
  51. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/ravdess/process_database.py +0 -0
  52. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/ravdess/process_database_speaker.py +0 -0
  53. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/savee/process_database.py +0 -0
  54. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/shemo/process_database.py +0 -0
  55. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/subesco/process_database.py +0 -0
  56. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/tess/process_database.py +0 -0
  57. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/thorsten-emotional/process_database.py +0 -0
  58. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/urdu/process_database.py +0 -0
  59. {nkululeko-0.88.11 → nkululeko-0.89.0}/data/vivae/process_database.py +0 -0
  60. {nkululeko-0.88.11 → nkululeko-0.89.0}/docs/source/conf.py +0 -0
  61. {nkululeko-0.88.11 → nkululeko-0.89.0}/meta/demos/demo_best_model.py +0 -0
  62. {nkululeko-0.88.11 → nkululeko-0.89.0}/meta/demos/my_experiment.py +0 -0
  63. {nkululeko-0.88.11 → nkululeko-0.89.0}/meta/demos/my_experiment_local.py +0 -0
  64. {nkululeko-0.88.11 → nkululeko-0.89.0}/meta/demos/plot_faster_anim.py +0 -0
  65. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/__init__.py +0 -0
  66. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/aug_train.py +0 -0
  67. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/augment.py +0 -0
  68. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/augmenting/__init__.py +0 -0
  69. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/augmenting/augmenter.py +0 -0
  70. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/augmenting/randomsplicer.py +0 -0
  71. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/augmenting/randomsplicing.py +0 -0
  72. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/augmenting/resampler.py +0 -0
  73. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/__init__.py +0 -0
  74. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/ap_age.py +0 -0
  75. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/ap_arousal.py +0 -0
  76. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/ap_dominance.py +0 -0
  77. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/ap_gender.py +0 -0
  78. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/ap_mos.py +0 -0
  79. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/ap_pesq.py +0 -0
  80. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/ap_sdr.py +0 -0
  81. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/ap_snr.py +0 -0
  82. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/ap_stoi.py +0 -0
  83. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/ap_valence.py +0 -0
  84. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/autopredict/estimate_snr.py +0 -0
  85. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/cacheddataset.py +0 -0
  86. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/data/__init__.py +0 -0
  87. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/data/dataset.py +0 -0
  88. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/data/dataset_csv.py +0 -0
  89. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/demo.py +0 -0
  90. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/demo_feats.py +0 -0
  91. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/demo_predictor.py +0 -0
  92. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/ensemble.py +0 -0
  93. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/experiment.py +0 -0
  94. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/explore.py +0 -0
  95. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/export.py +0 -0
  96. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/__init__.py +0 -0
  97. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_agender_agender.py +0 -0
  98. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_analyser.py +0 -0
  99. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_ast.py +0 -0
  100. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_clap.py +0 -0
  101. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_hubert.py +0 -0
  102. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_import.py +0 -0
  103. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_mld.py +0 -0
  104. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_mos.py +0 -0
  105. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_praat.py +0 -0
  106. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_snr.py +0 -0
  107. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_spectra.py +0 -0
  108. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_spkrec.py +0 -0
  109. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_squim.py +0 -0
  110. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_trill.py +0 -0
  111. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_wav2vec2.py +0 -0
  112. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_wavlm.py +0 -0
  113. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feats_whisper.py +0 -0
  114. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feat_extract/feinberg_praat.py +0 -0
  115. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/feature_extractor.py +0 -0
  116. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/file_checker.py +0 -0
  117. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/filter_data.py +0 -0
  118. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/glob_conf.py +0 -0
  119. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/losses/__init__.py +0 -0
  120. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/losses/loss_ccc.py +0 -0
  121. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/losses/loss_softf1loss.py +0 -0
  122. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/modelrunner.py +0 -0
  123. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/__init__.py +0 -0
  124. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_bayes.py +0 -0
  125. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_gmm.py +0 -0
  126. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_knn.py +0 -0
  127. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_knn_reg.py +0 -0
  128. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_lin_reg.py +0 -0
  129. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_svm.py +0 -0
  130. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_svr.py +0 -0
  131. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_tree_reg.py +0 -0
  132. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_tuned.py +0 -0
  133. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_xgb.py +0 -0
  134. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/models/model_xgr.py +0 -0
  135. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/multidb.py +0 -0
  136. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/nkuluflag.py +0 -0
  137. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/nkululeko.py +0 -0
  138. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/plots.py +0 -0
  139. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/predict.py +0 -0
  140. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/reporting/__init__.py +0 -0
  141. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/reporting/defines.py +0 -0
  142. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/reporting/latex_writer.py +0 -0
  143. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/reporting/report.py +0 -0
  144. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/reporting/report_item.py +0 -0
  145. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/reporting/result.py +0 -0
  146. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/resample.py +0 -0
  147. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/runmanager.py +0 -0
  148. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/scaler.py +0 -0
  149. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/segment.py +0 -0
  150. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/segmenting/__init__.py +0 -0
  151. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/segmenting/seg_inaspeechsegmenter.py +0 -0
  152. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/segmenting/seg_silero.py +0 -0
  153. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/syllable_nuclei.py +0 -0
  154. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/test.py +0 -0
  155. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/test_predictor.py +0 -0
  156. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/test_pretrain.py +0 -0
  157. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/utils/__init__.py +0 -0
  158. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/utils/files.py +0 -0
  159. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko/utils/stats.py +0 -0
  160. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko.egg-info/SOURCES.txt +0 -0
  161. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko.egg-info/dependency_links.txt +0 -0
  162. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko.egg-info/requires.txt +0 -0
  163. {nkululeko-0.88.11 → nkululeko-0.89.0}/nkululeko.egg-info/top_level.txt +0 -0
  164. {nkululeko-0.88.11 → nkululeko-0.89.0}/pyproject.toml +0 -0
  165. {nkululeko-0.88.11 → nkululeko-0.89.0}/setup.cfg +0 -0
  166. {nkululeko-0.88.11 → nkululeko-0.89.0}/setup.py +0 -0
  167. {nkululeko-0.88.11 → nkululeko-0.89.0}/venv/bin/activate_this.py +0 -0
@@ -1,6 +1,16 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ Version 0.89.0
5
+ --------------
6
+ * added Roc plots and classification report on Debug
7
+
8
+
9
+ Version 0.88.12
10
+ ---------------
11
+ * added n_jobs for sklearn processing
12
+ * re_named num_workers n_jobs
13
+
4
14
  Version 0.88.11
5
15
  --------------
6
16
  * removed hack in Praat script
@@ -470,9 +480,9 @@ Version 0.66.3
470
480
 
471
481
  Version 0.66.2
472
482
  --------------
473
- * enabled data-pathes with quotes
483
+ * enabled data-pacthes with quotes
474
484
  * enabled missing category labels
475
- * used tgdm for progress display
485
+ * used tqdm for progress display
476
486
 
477
487
  Version 0.66.1
478
488
  --------------
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nkululeko
3
- Version: 0.88.11
3
+ Version: 0.89.0
4
4
  Summary: Machine learning audio prediction experiments based on templates
5
5
  Home-page: https://github.com/felixbur/nkululeko
6
6
  Author: Felix Burkhardt
@@ -204,7 +204,7 @@ All of them take *--config <my_config.ini>* as an argument.
204
204
  * *configurations*: which experiments to combine
205
205
  * *--method* (optional): majority_voting, mean (default), max, sum, uncertainty, uncertainty_weighted, confidence_weighted, performance_weighted
206
206
  * *--threshold*: uncertainty threshold (1.0 means no threshold)
207
- * *--weightes*: weights for performance_weighted method (could be from previous UAR, ACC)
207
+ * *--weights*: weights for performance_weighted method (could be from previous UAR, ACC)
208
208
  * *--outfile* (optional): name of CSV file for output (default: ensemble_result.csv)
209
209
  * *--no_labels* (optional): indicate that no ground truth is given
210
210
  * **nkululeko.multidb**: do [multiple experiments](http://blog.syntheticspeech.de/2024/01/02/nkululeko-compare-several-databases/), comparing several databases cross and in itself
@@ -220,14 +220,11 @@ All of them take *--config <my_config.ini>* as an argument.
220
220
  * **nkululeko.predict**: [predict features](http://blog.syntheticspeech.de/2023/08/16/nkululeko-how-to-predict-labels-for-your-data-from-existing-models-and-check-them/) like SNR, MOS, arousal/valence, age/gender, with DNN models
221
221
  * **nkululeko.segment**: [segment a database](http://blog.syntheticspeech.de/2023/07/14/nkululeko-segmenting-a-database/) based on VAD (voice activity detection)
222
222
  * **nkululeko.resample**: check on all [sampling rates and change](http://blog.syntheticspeech.de/2023/08/31/how-to-fix-different-sampling-rates-in-a-dataset-with-nkululeko/) to 16kHz
223
- * **nkululeko.nkuluflag**: a convenient module to specify configuration parameters on the command-line.
224
- * usage: nkuluflag.py [-h] [--config CONFIG] [--data [DATA ...]] [--label [LABEL ...]] [--tuning_params [TUNING_PARAMS ...]] [--layers [LAYERS ...]] [--model MODEL] [--feat FEAT] [--set SET]
225
- [--with_os WITH_OS] [--target TARGET] [--epochs EPOCHS] [--runs RUNS] [--learning_rate LEARNING_RATE] [--drop DROP]
226
-
227
-
228
-
229
-
223
+ * **nkululeko.nkuluflag**: a convenient module to specify configuration parameters on the command-line. Usage:
230
224
 
225
+ ```bash
226
+ $ python -m nkululeko.nkuluflag.py [-h] [--config CONFIG] [--data [DATA ...]] [--label [LABEL ...]] [--tuning_params [TUNING_PARAMS ...]] [--layers [LAYERS ...]] [--model MODEL] [--feat FEAT] [--set SET] [--with_os WITH_OS] [--target TARGET] [--epochs EPOCHS] [--runs RUNS] [--learning_rate LEARNING_RATE] [--drop DROP]
227
+ ```
231
228
 
232
229
  There's my [blog](http://blog.syntheticspeech.de/?s=nkululeko) with tutorials:
233
230
  * [Introduction](http://blog.syntheticspeech.de/2021/08/04/machine-learning-experiment-framework/)
@@ -359,6 +356,16 @@ F. Burkhardt, Johannes Wagner, Hagen Wierstorf, Florian Eyben and Björn Schulle
359
356
  Changelog
360
357
  =========
361
358
 
359
+ Version 0.89.0
360
+ --------------
361
+ * added Roc plots and classification report on Debug
362
+
363
+
364
+ Version 0.88.12
365
+ ---------------
366
+ * added n_jobs for sklearn processing
367
+ * re_named num_workers n_jobs
368
+
362
369
  Version 0.88.11
363
370
  --------------
364
371
  * removed hack in Praat script
@@ -828,9 +835,9 @@ Version 0.66.3
828
835
 
829
836
  Version 0.66.2
830
837
  --------------
831
- * enabled data-pathes with quotes
838
+ * enabled data-pacthes with quotes
832
839
  * enabled missing category labels
833
- * used tgdm for progress display
840
+ * used tqdm for progress display
834
841
 
835
842
  Version 0.66.1
836
843
  --------------
@@ -160,7 +160,7 @@ All of them take *--config <my_config.ini>* as an argument.
160
160
  * *configurations*: which experiments to combine
161
161
  * *--method* (optional): majority_voting, mean (default), max, sum, uncertainty, uncertainty_weighted, confidence_weighted, performance_weighted
162
162
  * *--threshold*: uncertainty threshold (1.0 means no threshold)
163
- * *--weightes*: weights for performance_weighted method (could be from previous UAR, ACC)
163
+ * *--weights*: weights for performance_weighted method (could be from previous UAR, ACC)
164
164
  * *--outfile* (optional): name of CSV file for output (default: ensemble_result.csv)
165
165
  * *--no_labels* (optional): indicate that no ground truth is given
166
166
  * **nkululeko.multidb**: do [multiple experiments](http://blog.syntheticspeech.de/2024/01/02/nkululeko-compare-several-databases/), comparing several databases cross and in itself
@@ -176,14 +176,11 @@ All of them take *--config <my_config.ini>* as an argument.
176
176
  * **nkululeko.predict**: [predict features](http://blog.syntheticspeech.de/2023/08/16/nkululeko-how-to-predict-labels-for-your-data-from-existing-models-and-check-them/) like SNR, MOS, arousal/valence, age/gender, with DNN models
177
177
  * **nkululeko.segment**: [segment a database](http://blog.syntheticspeech.de/2023/07/14/nkululeko-segmenting-a-database/) based on VAD (voice activity detection)
178
178
  * **nkululeko.resample**: check on all [sampling rates and change](http://blog.syntheticspeech.de/2023/08/31/how-to-fix-different-sampling-rates-in-a-dataset-with-nkululeko/) to 16kHz
179
- * **nkululeko.nkuluflag**: a convenient module to specify configuration parameters on the command-line.
180
- * usage: nkuluflag.py [-h] [--config CONFIG] [--data [DATA ...]] [--label [LABEL ...]] [--tuning_params [TUNING_PARAMS ...]] [--layers [LAYERS ...]] [--model MODEL] [--feat FEAT] [--set SET]
181
- [--with_os WITH_OS] [--target TARGET] [--epochs EPOCHS] [--runs RUNS] [--learning_rate LEARNING_RATE] [--drop DROP]
182
-
183
-
184
-
185
-
179
+ * **nkululeko.nkuluflag**: a convenient module to specify configuration parameters on the command-line. Usage:
186
180
 
181
+ ```bash
182
+ $ python -m nkululeko.nkuluflag.py [-h] [--config CONFIG] [--data [DATA ...]] [--label [LABEL ...]] [--tuning_params [TUNING_PARAMS ...]] [--layers [LAYERS ...]] [--model MODEL] [--feat FEAT] [--set SET] [--with_os WITH_OS] [--target TARGET] [--epochs EPOCHS] [--runs RUNS] [--learning_rate LEARNING_RATE] [--drop DROP]
183
+ ```
187
184
 
188
185
  There's my [blog](http://blog.syntheticspeech.de/?s=nkululeko) with tutorials:
189
186
  * [Introduction](http://blog.syntheticspeech.de/2021/08/04/machine-learning-experiment-framework/)
@@ -1,2 +1,2 @@
1
- VERSION="0.88.11"
1
+ VERSION="0.89.0"
2
2
  SAMPLING_RATE = 16000
@@ -2,6 +2,7 @@
2
2
 
3
3
  from nkululeko.feat_extract.featureset import Featureset
4
4
  import os
5
+
5
6
  # import pandas as pd
6
7
  import audeer
7
8
  import nkululeko.glob_conf as glob_conf
@@ -10,6 +11,7 @@ import numpy as np
10
11
  import audinterface
11
12
  import torch
12
13
 
14
+
13
15
  class AgenderSet(Featureset):
14
16
  """
15
17
  Embeddings from the wav2vec2. based model finetuned on agender data, described in the paper
@@ -30,8 +32,7 @@ class AgenderSet(Featureset):
30
32
  if not os.path.isdir(model_root):
31
33
  cache_root = audeer.mkdir("cache")
32
34
  model_root = audeer.mkdir(model_root)
33
- archive_path = audeer.download_url(
34
- model_url, cache_root, verbose=True)
35
+ archive_path = audeer.download_url(model_url, cache_root, verbose=True)
35
36
  audeer.extract_archive(archive_path, model_root)
36
37
  cuda = "cuda" if torch.cuda.is_available() else "cpu"
37
38
  device = self.util.config_val("MODEL", "device", cuda)
@@ -62,7 +63,7 @@ class AgenderSet(Featureset):
62
63
  },
63
64
  sampling_rate=16000,
64
65
  resample=True,
65
- num_workers=5,
66
+ num_workers=self.n_jobs,
66
67
  verbose=True,
67
68
  )
68
69
  self.df = hidden_states.process_index(self.data_df.index)
@@ -32,8 +32,7 @@ class AuddimSet(Featureset):
32
32
  if not os.path.isdir(model_root):
33
33
  cache_root = audeer.mkdir("cache")
34
34
  model_root = audeer.mkdir(model_root)
35
- archive_path = audeer.download_url(
36
- model_url, cache_root, verbose=True)
35
+ archive_path = audeer.download_url(model_url, cache_root, verbose=True)
37
36
  audeer.extract_archive(archive_path, model_root)
38
37
  cuda = "cuda" if torch.cuda.is_available() else "cpu"
39
38
  device = self.util.config_val("MODEL", "device", cuda)
@@ -63,7 +62,7 @@ class AuddimSet(Featureset):
63
62
  },
64
63
  sampling_rate=16000,
65
64
  resample=True,
66
- num_workers=5,
65
+ num_workers=self.n_jobs,
67
66
  verbose=True,
68
67
  )
69
68
  self.df = logits.process_index(self.data_df.index)
@@ -30,8 +30,7 @@ class AudmodelSet(Featureset):
30
30
  if not os.path.isdir(model_root):
31
31
  cache_root = audeer.mkdir("cache")
32
32
  model_root = audeer.mkdir(model_root)
33
- archive_path = audeer.download_url(
34
- model_url, cache_root, verbose=True)
33
+ archive_path = audeer.download_url(model_url, cache_root, verbose=True)
35
34
  audeer.extract_archive(archive_path, model_root)
36
35
  cuda = "cuda" if torch.cuda.is_available() else "cpu"
37
36
  device = self.util.config_val("MODEL", "device", cuda)
@@ -61,7 +60,7 @@ class AudmodelSet(Featureset):
61
60
  },
62
61
  sampling_rate=16000,
63
62
  resample=True,
64
- num_workers=5,
63
+ num_workers=self.n_jobs,
65
64
  verbose=True,
66
65
  )
67
66
  self.df = hidden_states.process_index(self.data_df.index)
@@ -38,7 +38,7 @@ class Opensmileset(Featureset):
38
38
  smile = opensmile.Smile(
39
39
  feature_set=self.feature_set,
40
40
  feature_level=self.feature_level,
41
- num_workers=5,
41
+ num_workers=self.n_jobs,
42
42
  verbose=True,
43
43
  )
44
44
  if isinstance(self.data_df.index, pd.MultiIndex):
@@ -22,17 +22,15 @@ class Openxbow(Featureset):
22
22
  self.feature_set = eval(f"opensmile.FeatureSet.{self.featset}")
23
23
  store = self.util.get_path("store")
24
24
  storage = f"{store}{self.name}_{self.featset}.pkl"
25
- extract = self.util.config_val(
26
- "FEATS", "needs_feature_extraction", False)
25
+ extract = self.util.config_val("FEATS", "needs_feature_extraction", False)
27
26
  no_reuse = eval(self.util.config_val("FEATS", "no_reuse", "False"))
28
27
  if extract or no_reuse or not os.path.isfile(storage):
29
28
  # extract smile features first
30
- self.util.debug(
31
- "extracting openSmile features, this might take a while...")
29
+ self.util.debug("extracting openSmile features, this might take a while...")
32
30
  smile = opensmile.Smile(
33
31
  feature_set=self.feature_set,
34
32
  feature_level=opensmile.FeatureLevel.LowLevelDescriptors,
35
- num_workers=5,
33
+ num_workers=self.n_jobs,
36
34
  )
37
35
  if isinstance(self.data_df.index, pd.MultiIndex):
38
36
  is_multi_index = True
@@ -51,13 +49,11 @@ class Openxbow(Featureset):
51
49
  # save the smile features
52
50
  smile_df.to_csv(lld_name, sep=";", header=False)
53
51
  # get the path of the xbow java jar file
54
- xbow_path = self.util.config_val(
55
- "FEATS", "xbow.model", "openXBOW")
52
+ xbow_path = self.util.config_val("FEATS", "xbow.model", "openXBOW")
56
53
  # check if JAR file exist
57
54
  if not os.path.isfile(f"{xbow_path}/openXBOW.jar"):
58
55
  # download using wget if not exist and locate in xbow_path
59
- os.system(
60
- f"git clone https://github.com/openXBOW/openXBOW")
56
+ os.system(f"git clone https://github.com/openXBOW/openXBOW")
61
57
  # get the size of the codebook
62
58
  size = self.util.config_val("FEATS", "size", 500)
63
59
  # get the number of assignements
@@ -87,7 +83,7 @@ class Openxbow(Featureset):
87
83
  smile = opensmile.Smile(
88
84
  feature_set=opensmile.FeatureSet.eGeMAPSv02, # always use eGemaps for this
89
85
  feature_level=opensmile.FeatureLevel.Functionals,
90
- num_workers=5,
86
+ num_workers=self.n_jobs,
91
87
  )
92
88
  if isinstance(self.data_df.index, pd.MultiIndex):
93
89
  is_multi_index = True
@@ -16,6 +16,7 @@ class Featureset:
16
16
  self.data_df = data_df
17
17
  self.util = Util("featureset")
18
18
  self.feats_type = feats_type
19
+ self.n_jobs = int(self.util.config_val("MODEL", "n_jobs", "8"))
19
20
 
20
21
  def extract(self):
21
22
  pass
@@ -3,6 +3,7 @@ import ast
3
3
  import pickle
4
4
  import random
5
5
 
6
+ from joblib import parallel_backend
6
7
  import numpy as np
7
8
  import pandas as pd
8
9
  from sklearn.model_selection import GridSearchCV
@@ -34,6 +35,7 @@ class Model:
34
35
  self.epoch = 0
35
36
  self.logo = self.util.config_val("MODEL", "logo", False)
36
37
  self.xfoldx = self.util.config_val("MODEL", "k_fold_cross", False)
38
+ self.n_jobs = int(self.util.config_val("MODEL", "n_jobs", "8"))
37
39
 
38
40
  def set_model_type(self, type):
39
41
  self.model_type = type
@@ -75,7 +77,8 @@ class Model:
75
77
  ):
76
78
  train_x = feats.iloc[train_index].to_numpy()
77
79
  train_y = targets[train_index]
78
- self.clf.fit(train_x, train_y)
80
+ with parallel_backend("threading", n_jobs=self.n_jobs):
81
+ self.clf.fit(train_x, train_y)
79
82
  truth_x = feats.iloc[test_index].to_numpy()
80
83
  truth_y = targets[test_index]
81
84
  predict_y = self.clf.predict(truth_x)
@@ -141,7 +144,8 @@ class Model:
141
144
  ):
142
145
  train_x = feats.iloc[train_index].to_numpy()
143
146
  train_y = targets.iloc[train_index]
144
- self.clf.fit(train_x, train_y)
147
+ with parallel_backend("threading", n_jobs=self.n_jobs):
148
+ self.clf.fit(train_x, train_y)
145
149
 
146
150
  truth_x = feats.iloc[test_index].to_numpy()
147
151
  truth_y = targets.iloc[test_index]
@@ -171,7 +175,7 @@ class Model:
171
175
  )
172
176
 
173
177
  def train(self):
174
- """Train the model"""
178
+ """Train the model."""
175
179
  # # first check if the model already has been trained
176
180
  # if os.path.isfile(self.store_path):
177
181
  # self.load(self.run, self.epoch)
@@ -204,22 +208,39 @@ class Model:
204
208
  )
205
209
 
206
210
  tuning_params = self.util.config_val("MODEL", "tuning_params", False)
207
- if tuning_params:
208
- # tune the model meta parameters
209
- tuning_params = ast.literal_eval(tuning_params)
210
- tuned_params = {}
211
- try:
212
- scoring = glob_conf.config["MODEL"]["scoring"]
213
- except KeyError:
214
- self.util.error("got tuning params but no scoring")
215
- for param in tuning_params:
216
- values = ast.literal_eval(glob_conf.config["MODEL"][param])
217
- tuned_params[param] = values
218
- self.util.debug(f"tuning on {tuned_params}")
219
- self.clf = GridSearchCV(
220
- self.clf, tuned_params, refit=True, verbose=3, scoring=scoring
221
- )
222
- try:
211
+ with parallel_backend("threading", n_jobs=self.n_jobs):
212
+ if tuning_params:
213
+ # tune the model meta parameters
214
+ tuning_params = ast.literal_eval(tuning_params)
215
+ tuned_params = {}
216
+ try:
217
+ scoring = glob_conf.config["MODEL"]["scoring"]
218
+ except KeyError:
219
+ self.util.error("got tuning params but no scoring")
220
+ for param in tuning_params:
221
+ values = ast.literal_eval(glob_conf.config["MODEL"][param])
222
+ tuned_params[param] = values
223
+ self.util.debug(f"tuning on {tuned_params}")
224
+ self.clf = GridSearchCV(
225
+ self.clf, tuned_params, refit=True, verbose=3, scoring=scoring
226
+ )
227
+ try:
228
+ class_weight = eval(
229
+ self.util.config_val("MODEL", "class_weight", "False")
230
+ )
231
+ if class_weight:
232
+ self.util.debug("using class weight")
233
+ self.clf.fit(
234
+ feats,
235
+ self.df_train[self.target],
236
+ sample_weight=self.classes_weights,
237
+ )
238
+ else:
239
+ self.clf.fit(feats, self.df_train[self.target])
240
+ except KeyError:
241
+ self.clf.fit(feats, self.df_train[self.target])
242
+ self.util.debug(f"winner parameters: {self.clf.best_params_}")
243
+ else:
223
244
  class_weight = self.util.config_val("MODEL", "class_weight", False)
224
245
  if class_weight:
225
246
  self.util.debug("using class weight")
@@ -229,22 +250,8 @@ class Model:
229
250
  sample_weight=self.classes_weights,
230
251
  )
231
252
  else:
232
- self.clf.fit(feats, self.df_train[self.target])
233
- except KeyError:
234
- self.clf.fit(feats, self.df_train[self.target])
235
- self.util.debug(f"winner parameters: {self.clf.best_params_}")
236
- else:
237
- class_weight = self.util.config_val("MODEL", "class_weight", False)
238
- if class_weight:
239
- self.util.debug("using class weight")
240
- self.clf.fit(
241
- feats,
242
- self.df_train[self.target],
243
- sample_weight=self.classes_weights,
244
- )
245
- else:
246
- labels = self.df_train[self.target]
247
- self.clf.fit(feats, labels)
253
+ labels = self.df_train[self.target]
254
+ self.clf.fit(feats, labels)
248
255
 
249
256
  def get_predictions(self):
250
257
  # predictions = self.clf.predict(self.feats_test.to_numpy())
@@ -80,7 +80,7 @@ class CNNModel(Model):
80
80
  # batch size
81
81
  self.batch_size = int(self.util.config_val("MODEL", "batch_size", 8))
82
82
  # number of parallel processes
83
- self.num_workers = int(self.util.config_val("MODEL", "num_workers", 5))
83
+ self.num_workers = self.n_jobs
84
84
 
85
85
  # set up the data_loaders
86
86
 
@@ -100,13 +100,13 @@ class CNNModel(Model):
100
100
  train_set,
101
101
  batch_size=self.batch_size,
102
102
  shuffle=True,
103
- num_workers=self.num_workers,
103
+ num_workers=self.n_jobs,
104
104
  )
105
105
  self.testloader = torch.utils.data.DataLoader(
106
106
  test_set,
107
107
  batch_size=self.batch_size,
108
108
  shuffle=False,
109
- num_workers=self.num_workers,
109
+ num_workers=self.n_jobs,
110
110
  )
111
111
 
112
112
  class Dataset_image(Dataset):
@@ -136,7 +136,7 @@ class CNNModel(Model):
136
136
  test_set,
137
137
  batch_size=self.batch_size,
138
138
  shuffle=False,
139
- num_workers=self.num_workers,
139
+ num_workers=self.n_jobs,
140
140
  )
141
141
 
142
142
  def reset_test(self, df_test, feats_test):
@@ -71,7 +71,7 @@ class MLPModel(Model):
71
71
  # batch size
72
72
  self.batch_size = int(self.util.config_val("MODEL", "batch_size", 8))
73
73
  # number of parallel processes
74
- self.num_workers = int(self.util.config_val("MODEL", "num_workers", 5))
74
+ self.num_workers = self.n_jobs
75
75
  if feats_train.isna().to_numpy().any():
76
76
  self.util.debug(
77
77
  f"Model, train: replacing {feats_train.isna().sum().sum()} NANs"
@@ -64,7 +64,7 @@ class MLP_Reg_model(Model):
64
64
  # batch size
65
65
  self.batch_size = int(self.util.config_val("MODEL", "batch_size", 8))
66
66
  # number of parallel processes
67
- self.num_workers = int(self.util.config_val("MODEL", "num_workers", 5))
67
+ self.num_workers = self.n_jobs
68
68
  # set up the data_loaders
69
69
  if feats_train.isna().to_numpy().any():
70
70
  self.util.debug(
@@ -117,7 +117,7 @@ class MLP_Reg_model(Model):
117
117
  dataset=data_set,
118
118
  batch_size=self.batch_size,
119
119
  shuffle=shuffle,
120
- num_workers=self.num_workers,
120
+ num_workers=self.n_jobs,
121
121
  )
122
122
  return loader
123
123
 
@@ -12,4 +12,6 @@ class Tree_model(Model):
12
12
  def __init__(self, df_train, df_test, feats_train, feats_test):
13
13
  super().__init__(df_train, df_test, feats_train, feats_test)
14
14
  self.name = "tree"
15
- self.clf = DecisionTreeClassifier() # set up the classifier
15
+ self.clf = DecisionTreeClassifier(
16
+ random_state=42
17
+ ) # set up the classifier
@@ -27,6 +27,7 @@ from sklearn.metrics import (
27
27
  r2_score,
28
28
  roc_auc_score,
29
29
  roc_curve,
30
+ RocCurveDisplay,
30
31
  )
31
32
 
32
33
  import nkululeko.glob_conf as glob_conf
@@ -75,6 +76,7 @@ class Reporter:
75
76
  self.result = Result(0, 0, 0, 0, "unknown")
76
77
  self.run = run
77
78
  self.epoch = epoch
79
+ self.model_type = self.util.get_model_type()
78
80
  self._set_metric()
79
81
  self.filenameadd = ""
80
82
  self.cont_to_cat = False
@@ -387,6 +389,7 @@ class Reporter:
387
389
  epoch = self.epoch
388
390
  """Print all evaluation values to text file."""
389
391
  res_dir = self.util.get_path("res_dir")
392
+ fig_dir = self.util.get_path("fig_dir")
390
393
  file_name = f"{res_dir}{self.util.get_exp_name()}_{epoch}{self.filenameadd}.txt"
391
394
  if self.util.exp_is_classification():
392
395
  labels = glob_conf.labels
@@ -397,6 +400,10 @@ class Reporter:
397
400
  target_names=labels,
398
401
  output_dict=True,
399
402
  )
403
+ # print classifcation report in console
404
+ self.util.debug(
405
+ f"\n {classification_report(self.truths, self.preds, target_names=labels)}"
406
+ )
400
407
  except ValueError as e:
401
408
  self.util.debug(
402
409
  "Reporter: caught a ValueError when trying to get"
@@ -415,6 +422,17 @@ class Reporter:
415
422
  if len(np.unique(self.truths)) == 2:
416
423
  fpr, tpr, _ = roc_curve(self.truths, self.preds)
417
424
  auc_score = auc(fpr, tpr)
425
+ display = RocCurveDisplay(
426
+ fpr=fpr,
427
+ tpr=tpr,
428
+ roc_auc=auc_score,
429
+ estimator_name=f"{self.model_type} estimator",
430
+ )
431
+ # save plot
432
+ plot_path = f"{fig_dir}{self.util.get_exp_name()}_{epoch}{self.filenameadd}_roc.{self.format}"
433
+ display.plot(ax=None)
434
+ plt.savefig(plot_path)
435
+ self.util.debug(f"Saved ROC curve to {plot_path}")
418
436
  pauc_score = roc_auc_score(self.truths, self.preds, max_fpr=0.1)
419
437
  auc_pauc = f"auc: {auc_score:.3f}, pauc: {pauc_score:.3f} from epoch: {epoch}"
420
438
  self.util.debug(auc_pauc)
@@ -27,6 +27,7 @@ class Util:
27
27
  "pkl",
28
28
  "eGeMAPSv02",
29
29
  "functionals",
30
+ "n_jobs",
30
31
  ]
31
32
 
32
33
  def __init__(self, caller=None, has_config=True):
@@ -150,7 +151,7 @@ class Util:
150
151
  # self.logged_configs.clear()
151
152
 
152
153
  def get_save_name(self):
153
- """Return a relative path to a name to save the experiment"""
154
+ """Return a relative path to a name to save the experiment."""
154
155
  store = self.get_path("store")
155
156
  return f"{store}/{self.get_exp_name()}.pkl"
156
157
 
@@ -161,7 +162,7 @@ class Util:
161
162
  return f"{store}/pred_{target}_{pred_name}.csv"
162
163
 
163
164
  def is_categorical(self, pd_series):
164
- """Check if a dataframe column is categorical"""
165
+ """Check if a dataframe column is categorical."""
165
166
  return pd_series.dtype.name == "object" or isinstance(
166
167
  pd_series.dtype, pd.CategoricalDtype
167
168
  )
@@ -174,7 +175,7 @@ class Util:
174
175
  """Get the experiment directory."""
175
176
  root = os.path.join(self.config["EXP"]["root"], "")
176
177
  name = self.config["EXP"]["name"]
177
- dir_name = f"{root}{name}"
178
+ dir_name = f"{root}/{name}"
178
179
  audeer.mkdir(dir_name)
179
180
  return dir_name
180
181
 
@@ -307,7 +308,7 @@ class Util:
307
308
  self.config[section][key] = str(value)
308
309
 
309
310
  def check_df(self, i, df):
310
- """Check a dataframe"""
311
+ """Check a dataframe."""
311
312
  print(f"check {i}: {df.shape}")
312
313
  print(df.head(1))
313
314
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nkululeko
3
- Version: 0.88.11
3
+ Version: 0.89.0
4
4
  Summary: Machine learning audio prediction experiments based on templates
5
5
  Home-page: https://github.com/felixbur/nkululeko
6
6
  Author: Felix Burkhardt
@@ -204,7 +204,7 @@ All of them take *--config <my_config.ini>* as an argument.
204
204
  * *configurations*: which experiments to combine
205
205
  * *--method* (optional): majority_voting, mean (default), max, sum, uncertainty, uncertainty_weighted, confidence_weighted, performance_weighted
206
206
  * *--threshold*: uncertainty threshold (1.0 means no threshold)
207
- * *--weightes*: weights for performance_weighted method (could be from previous UAR, ACC)
207
+ * *--weights*: weights for performance_weighted method (could be from previous UAR, ACC)
208
208
  * *--outfile* (optional): name of CSV file for output (default: ensemble_result.csv)
209
209
  * *--no_labels* (optional): indicate that no ground truth is given
210
210
  * **nkululeko.multidb**: do [multiple experiments](http://blog.syntheticspeech.de/2024/01/02/nkululeko-compare-several-databases/), comparing several databases cross and in itself
@@ -220,14 +220,11 @@ All of them take *--config <my_config.ini>* as an argument.
220
220
  * **nkululeko.predict**: [predict features](http://blog.syntheticspeech.de/2023/08/16/nkululeko-how-to-predict-labels-for-your-data-from-existing-models-and-check-them/) like SNR, MOS, arousal/valence, age/gender, with DNN models
221
221
  * **nkululeko.segment**: [segment a database](http://blog.syntheticspeech.de/2023/07/14/nkululeko-segmenting-a-database/) based on VAD (voice activity detection)
222
222
  * **nkululeko.resample**: check on all [sampling rates and change](http://blog.syntheticspeech.de/2023/08/31/how-to-fix-different-sampling-rates-in-a-dataset-with-nkululeko/) to 16kHz
223
- * **nkululeko.nkuluflag**: a convenient module to specify configuration parameters on the command-line.
224
- * usage: nkuluflag.py [-h] [--config CONFIG] [--data [DATA ...]] [--label [LABEL ...]] [--tuning_params [TUNING_PARAMS ...]] [--layers [LAYERS ...]] [--model MODEL] [--feat FEAT] [--set SET]
225
- [--with_os WITH_OS] [--target TARGET] [--epochs EPOCHS] [--runs RUNS] [--learning_rate LEARNING_RATE] [--drop DROP]
226
-
227
-
228
-
229
-
223
+ * **nkululeko.nkuluflag**: a convenient module to specify configuration parameters on the command-line. Usage:
230
224
 
225
+ ```bash
226
+ $ python -m nkululeko.nkuluflag.py [-h] [--config CONFIG] [--data [DATA ...]] [--label [LABEL ...]] [--tuning_params [TUNING_PARAMS ...]] [--layers [LAYERS ...]] [--model MODEL] [--feat FEAT] [--set SET] [--with_os WITH_OS] [--target TARGET] [--epochs EPOCHS] [--runs RUNS] [--learning_rate LEARNING_RATE] [--drop DROP]
227
+ ```
231
228
 
232
229
  There's my [blog](http://blog.syntheticspeech.de/?s=nkululeko) with tutorials:
233
230
  * [Introduction](http://blog.syntheticspeech.de/2021/08/04/machine-learning-experiment-framework/)
@@ -359,6 +356,16 @@ F. Burkhardt, Johannes Wagner, Hagen Wierstorf, Florian Eyben and Björn Schulle
359
356
  Changelog
360
357
  =========
361
358
 
359
+ Version 0.89.0
360
+ --------------
361
+ * added Roc plots and classification report on Debug
362
+
363
+
364
+ Version 0.88.12
365
+ ---------------
366
+ * added n_jobs for sklearn processing
367
+ * re_named num_workers n_jobs
368
+
362
369
  Version 0.88.11
363
370
  --------------
364
371
  * removed hack in Praat script
@@ -828,9 +835,9 @@ Version 0.66.3
828
835
 
829
836
  Version 0.66.2
830
837
  --------------
831
- * enabled data-pathes with quotes
838
+ * enabled data-pacthes with quotes
832
839
  * enabled missing category labels
833
- * used tgdm for progress display
840
+ * used tqdm for progress display
834
841
 
835
842
  Version 0.66.1
836
843
  --------------
File without changes