diff --git a/AnomalyDetection/Core/pom.xml b/AnomalyDetection/Core/pom.xml
index 3b10e0e11..374cdeb6c 100644
--- a/AnomalyDetection/Core/pom.xml
+++ b/AnomalyDetection/Core/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-anomaly
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
AnomalyDetection-Core
diff --git a/AnomalyDetection/LibLinear/pom.xml b/AnomalyDetection/LibLinear/pom.xml
index 3494cc444..12712f101 100644
--- a/AnomalyDetection/LibLinear/pom.xml
+++ b/AnomalyDetection/LibLinear/pom.xml
@@ -20,7 +20,7 @@
org.tribuo
tribuo-anomaly
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
AnomalyDetection-LibLinear
diff --git a/AnomalyDetection/LibSVM/pom.xml b/AnomalyDetection/LibSVM/pom.xml
index 44f45705f..131af27ab 100644
--- a/AnomalyDetection/LibSVM/pom.xml
+++ b/AnomalyDetection/LibSVM/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-anomaly
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
AnomalyDetection-LibSVM
diff --git a/AnomalyDetection/pom.xml b/AnomalyDetection/pom.xml
index 5eb42a852..8679ed8c1 100644
--- a/AnomalyDetection/pom.xml
+++ b/AnomalyDetection/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
tribuo-anomaly
diff --git a/Classification/Core/pom.xml b/Classification/Core/pom.xml
index dadf3c4ff..d04e19721 100644
--- a/Classification/Core/pom.xml
+++ b/Classification/Core/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-classification
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Classification-Core
diff --git a/Classification/DecisionTree/pom.xml b/Classification/DecisionTree/pom.xml
index 871e7714a..1b8dc5184 100644
--- a/Classification/DecisionTree/pom.xml
+++ b/Classification/DecisionTree/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-classification
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Classification-Tree
diff --git a/Classification/Experiments/pom.xml b/Classification/Experiments/pom.xml
index 462b2d383..95f8d87f7 100644
--- a/Classification/Experiments/pom.xml
+++ b/Classification/Experiments/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-classification
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Classification-Experiments
diff --git a/Classification/Explanations/pom.xml b/Classification/Explanations/pom.xml
index 6fb30cf2f..cd3d3c185 100644
--- a/Classification/Explanations/pom.xml
+++ b/Classification/Explanations/pom.xml
@@ -20,7 +20,7 @@
org.tribuo
tribuo-classification
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Classification-Explanations
diff --git a/Classification/LibLinear/pom.xml b/Classification/LibLinear/pom.xml
index 6f7b9c254..3e3aaa6f8 100644
--- a/Classification/LibLinear/pom.xml
+++ b/Classification/LibLinear/pom.xml
@@ -20,7 +20,7 @@
org.tribuo
tribuo-classification
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Classification-LibLinear
diff --git a/Classification/LibSVM/pom.xml b/Classification/LibSVM/pom.xml
index bd98db140..8d828c91f 100644
--- a/Classification/LibSVM/pom.xml
+++ b/Classification/LibSVM/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-classification
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Classification-LibSVM
diff --git a/Classification/MultinomialNaiveBayes/pom.xml b/Classification/MultinomialNaiveBayes/pom.xml
index c918de3f9..67de36e58 100644
--- a/Classification/MultinomialNaiveBayes/pom.xml
+++ b/Classification/MultinomialNaiveBayes/pom.xml
@@ -22,7 +22,7 @@
org.tribuo
tribuo-classification
- 4.2.0-SNAPSHOT
+ 4.2.0
Classification-MultinomialNaiveBayes
tribuo-classification-mnnaivebayes
diff --git a/Classification/SGD/pom.xml b/Classification/SGD/pom.xml
index 79cc4d22f..5c7982c12 100644
--- a/Classification/SGD/pom.xml
+++ b/Classification/SGD/pom.xml
@@ -20,7 +20,7 @@
org.tribuo
tribuo-classification
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Classification-SGD
diff --git a/Classification/XGBoost/pom.xml b/Classification/XGBoost/pom.xml
index 640ef376f..a99eb6c6e 100644
--- a/Classification/XGBoost/pom.xml
+++ b/Classification/XGBoost/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-classification
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Classification-XGBoost
diff --git a/Classification/pom.xml b/Classification/pom.xml
index 10bc8f8f9..47d5f544f 100644
--- a/Classification/pom.xml
+++ b/Classification/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
tribuo-classification
diff --git a/Clustering/Core/pom.xml b/Clustering/Core/pom.xml
index b9fe82fd0..490e39065 100644
--- a/Clustering/Core/pom.xml
+++ b/Clustering/Core/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-clustering
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Clustering-Core
diff --git a/Clustering/Hdbscan/pom.xml b/Clustering/Hdbscan/pom.xml
index e6caaed43..4116dea84 100644
--- a/Clustering/Hdbscan/pom.xml
+++ b/Clustering/Hdbscan/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-clustering
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Clustering-Hdbscan
diff --git a/Clustering/KMeans/pom.xml b/Clustering/KMeans/pom.xml
index 15f849d8e..155c1a350 100644
--- a/Clustering/KMeans/pom.xml
+++ b/Clustering/KMeans/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-clustering
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Clustering-KMeans
diff --git a/Clustering/pom.xml b/Clustering/pom.xml
index 44bb0e371..bf1bcf32e 100644
--- a/Clustering/pom.xml
+++ b/Clustering/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
tribuo-clustering
diff --git a/Common/LibLinear/pom.xml b/Common/LibLinear/pom.xml
index 5ff8d6252..d67fa2ccf 100644
--- a/Common/LibLinear/pom.xml
+++ b/Common/LibLinear/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-common
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Common-LibLinear
diff --git a/Common/LibSVM/pom.xml b/Common/LibSVM/pom.xml
index 1dc9fc3ea..2dbdaca26 100644
--- a/Common/LibSVM/pom.xml
+++ b/Common/LibSVM/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-common
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Common-LibSVM
diff --git a/Common/NearestNeighbour/pom.xml b/Common/NearestNeighbour/pom.xml
index cf458f45c..868e39e71 100644
--- a/Common/NearestNeighbour/pom.xml
+++ b/Common/NearestNeighbour/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-common
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Common-NearestNeighbour
diff --git a/Common/SGD/pom.xml b/Common/SGD/pom.xml
index a94d2dfae..185f82117 100644
--- a/Common/SGD/pom.xml
+++ b/Common/SGD/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-common
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Common-SGD
diff --git a/Common/Trees/pom.xml b/Common/Trees/pom.xml
index fc929a87f..d3c273237 100644
--- a/Common/Trees/pom.xml
+++ b/Common/Trees/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-common
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Common-Tree
diff --git a/Common/XGBoost/pom.xml b/Common/XGBoost/pom.xml
index 2e6eb4034..693732895 100644
--- a/Common/XGBoost/pom.xml
+++ b/Common/XGBoost/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-common
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Common-XGBoost
diff --git a/Common/pom.xml b/Common/pom.xml
index 252617bef..7f50f0297 100644
--- a/Common/pom.xml
+++ b/Common/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
tribuo-common
diff --git a/Core/pom.xml b/Core/pom.xml
index 875a7d665..9abaaca27 100644
--- a/Core/pom.xml
+++ b/Core/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Core
diff --git a/Data/pom.xml b/Data/pom.xml
index d48a0d2e8..27373b730 100644
--- a/Data/pom.xml
+++ b/Data/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Data
diff --git a/Interop/Core/pom.xml b/Interop/Core/pom.xml
index e481c8461..53ad6fd6b 100644
--- a/Interop/Core/pom.xml
+++ b/Interop/Core/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-interop
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Interop-Core
diff --git a/Interop/OCI/pom.xml b/Interop/OCI/pom.xml
index b479cad6e..6aa4e281e 100644
--- a/Interop/OCI/pom.xml
+++ b/Interop/OCI/pom.xml
@@ -20,7 +20,7 @@
org.tribuo
tribuo-interop
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
OCI
diff --git a/Interop/ONNX/pom.xml b/Interop/ONNX/pom.xml
index 3c5023369..b89dc5a85 100644
--- a/Interop/ONNX/pom.xml
+++ b/Interop/ONNX/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-interop
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Interop-ONNX
diff --git a/Interop/Tensorflow/pom.xml b/Interop/Tensorflow/pom.xml
index e04fc119d..d5c6fecf7 100644
--- a/Interop/Tensorflow/pom.xml
+++ b/Interop/Tensorflow/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-interop
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Interop-Tensorflow
diff --git a/Interop/pom.xml b/Interop/pom.xml
index 56b0c0252..79e812d08 100644
--- a/Interop/pom.xml
+++ b/Interop/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
tribuo-interop
diff --git a/Json/pom.xml b/Json/pom.xml
index dcf76472d..4c82a4355 100644
--- a/Json/pom.xml
+++ b/Json/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
4.0.0
Json
diff --git a/Math/pom.xml b/Math/pom.xml
index 212fa37ab..af713ae8c 100644
--- a/Math/pom.xml
+++ b/Math/pom.xml
@@ -20,7 +20,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Math
diff --git a/MultiLabel/Core/pom.xml b/MultiLabel/Core/pom.xml
index 8f70b4d8f..1c255d12f 100644
--- a/MultiLabel/Core/pom.xml
+++ b/MultiLabel/Core/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-multilabel
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
MultiLabel-Core
diff --git a/MultiLabel/SGD/pom.xml b/MultiLabel/SGD/pom.xml
index d9b45b398..3fdb28cbd 100644
--- a/MultiLabel/SGD/pom.xml
+++ b/MultiLabel/SGD/pom.xml
@@ -20,7 +20,7 @@
org.tribuo
tribuo-multilabel
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
MultiLabel-SGD
diff --git a/MultiLabel/pom.xml b/MultiLabel/pom.xml
index e254bb591..074f61827 100644
--- a/MultiLabel/pom.xml
+++ b/MultiLabel/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
tribuo-multilabel
diff --git a/README.md b/README.md
index 398aaf60e..58aecc830 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
![Tribuo Logo](docs/img/Tribuo_Logo_Colour.png)
-# Tribuo - A Java prediction library (v4.1)
+# Tribuo - A Java prediction library (v4.2)
[Tribuo](https://tribuo.org) is a machine learning library in Java that
provides multi-class classification, regression, clustering, anomaly detection
@@ -26,7 +26,8 @@ trainer. In the case of evaluations, this provenance information also includes
the specific model used. Provenance information can be extracted as JSON, or
serialised directly using Java serialisation. For production deployments,
provenance information can be redacted and replaced with a hash to provide
-model tracking through an external system.
+model tracking through an external system. Many Tribuo models can be exported
+in ONNX format for deployment in other languages, platforms or cloud services.
Tribuo runs on Java 8+, and we test on LTS versions of Java along with the
latest release. Tribuo itself is a pure Java library and is supported on all
@@ -44,7 +45,7 @@ deployment.
* [Library Architecture](docs/Architecture.md)
* [Package Overview](docs/PackageOverview.md)
-* Javadoc [4.1](https://tribuo.org/learn/4.1/javadoc/), [4.0](https://tribuo.org/learn/4.0/javadoc/)
+* Javadoc [4.2](https://tribuo.org/learn/4.2/javadoc), [4.1](https://tribuo.org/learn/4.1/javadoc/), [4.0](https://tribuo.org/learn/4.0/javadoc/)
* [Helper Programs](docs/HelperPrograms.md)
* [Developer Documentation](docs/Internals.md)
* [Roadmap](docs/Roadmap.md)
@@ -54,11 +55,12 @@ deployment.
Tutorial notebooks, including examples of Classification, Clustering,
Regression, Anomaly Detection, TensorFlow, document classification, columnar
-data loading, working with externally trained models, and the configuration
-system, can be found in the [tutorials](tutorials). These use the
-[IJava](https://github.com/SpencerPark/IJava) Jupyter notebook kernel, and
-work with Java 10+. To convert the tutorials' code back to Java 8, in most
-cases simply replace the `var` keyword with the appropriate types.
+data loading, working with externally trained models, and the configuration
+system, can be found in the [tutorials](tutorials). These use the
+[IJava](https://github.com/SpencerPark/IJava) Jupyter notebook kernel, and work
+with Java 10+, except the reproducibility tutotiral which requires Java 17. To
+convert the tutorials' code back to Java 8, in most cases simply replace the
+`var` keyword with the appropriate types.
## Algorithms
@@ -78,7 +80,7 @@ of prediction tasks:
The ensembles and K-NN use a combination function to produce their output.
These combiners are prediction task specific, but the ensemble & K-NN
implementations are task agnostic. We provide voting and averaging combiners
-for classification and regression tasks.
+for multi-class classification, multi-label classification and regression tasks.
### Classification
@@ -99,9 +101,10 @@ Tribuo has implementations or interfaces for:
Tribuo also supplies a linear chain CRF for sequence classification tasks. This
CRF is trained via SGD using any of Tribuo's gradient optimizers.
-To explain classifier predictions there is an implementation of the LIME algorithm. Tribuo's
-implementation allows the mixing of text and tabular data, along with the use of any sparse model
-as an explainer (e.g., regression trees, lasso etc), however it does not support images.
+To explain classifier predictions there is an implementation of the LIME
+algorithm. Tribuo's implementation allows the mixing of text and tabular data,
+along with the use of any sparse model as an explainer (e.g., regression trees,
+lasso etc), however it does not support images.
### Regression
@@ -181,13 +184,13 @@ Maven:
org.tribuo
tribuo-all
- 4.1.0
+ 4.2.0
pom
```
or from Gradle:
```groovy
-implementation ("org.tribuo:tribuo-all:4.1.0@pom") {
+implementation ("org.tribuo:tribuo-all:4.2.0@pom") {
transitive = true // for build.gradle (i.e., Groovy)
// isTransitive = true // for build.gradle.kts (i.e., Kotlin)
}
@@ -201,12 +204,12 @@ interfaces link to libraries which use native code. Those interfaces
(TensorFlow, ONNX Runtime and XGBoost) only run on supported platforms for the
respective published binaries, and Tribuo has no control over which binaries
are supplied. If you need support for a specific platform, reach out to the
-maintainers of those projects. As of the 4.1 release these native packages
-all provide x86\_64 binaries for Windows, macOS and Linux. It is also possible
-to compile each package for macOS ARM64 (i.e., Apple Silicon), though there are
-no binaries available on Maven Central for that platform. When developing
-on an ARM platform you can select the `arm` profile in Tribuo's pom.xml to
-disable the native library tests.
+maintainers of those projects. As of the 4.1 release these native packages all
+provide x86\_64 binaries for Windows, macOS and Linux. It is also possible to
+compile each package for macOS ARM64 (i.e., Apple Silicon), though there are no
+binaries available on Maven Central for that platform. When developing on an
+ARM platform you can select the `arm` profile in Tribuo's pom.xml to disable
+the native library tests.
Individual jars are published for each Tribuo module. It is preferable to
depend only on the modules necessary for the specific project. This prevents
@@ -251,10 +254,12 @@ Tribuo is licensed under the [Apache 2.0 License](./LICENSE.txt).
## Release Notes:
-- v4.1.0 - Added TensorFlow training support, a BERT feature extractor, ExtraTrees, K-Means++, many linear model & CRF performance improvements, new tutorials on TF and document classification. Many bug fixes & documentation improvements.
-- v4.0.2 - Many bug fixes (CSVDataSource, JsonDataSource, RowProcessor, LibSVMTrainer, Evaluations, Regressor serialization). Improved javadoc and documentation. Added two new tutorials (columnar data and external models).
-- v4.0.1 - Bugfix for CSVReader to cope with blank lines, added IDXDataSource to allow loading of native MNIST format data.
-- v4.0.0 - Initial public release.
+- [v4.2.0](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-2-release-notes.md) - Added factorization machines, classifier chains, HDBSCAN. Added ONNX export and OCI Data Science integration. Added reproducibility framework. Various other small fixes and improvements, including the regression fixes from v4.1.1. Filled out the remaining javadoc, added 4 new tutorials (onnx export, multi-label classification, reproducibility, hdbscan), expanded existing tutorials.
+- [v4.1.1](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-1-1-release-notes.md) - Bug fixes for multi-output regression, multi-label evaluation, KMeans & KNN with SecurityManager, and update TF-Java 0.4.0.
+- [v4.1.0](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-1-release-notes.md) - Added TensorFlow training support, a BERT feature extractor, ExtraTrees, K-Means++, many linear model & CRF performance improvements, new tutorials on TF and document classification. Many bug fixes & documentation improvements.
+- [v4.0.2](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-0-2-release-notes.md) - Many bug fixes (CSVDataSource, JsonDataSource, RowProcessor, LibSVMTrainer, Evaluations, Regressor serialization). Improved javadoc and documentation. Added two new tutorials (columnar data and external models).
+- [v4.0.1](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-0-1-release-notes.md) - Bugfix for CSVReader to cope with blank lines, added IDXDataSource to allow loading of native MNIST format data.
+- [v4.0.0](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-0-release-notes.md) - Initial public release.
- v3 - Added provenance system, the external model support and onnx integrations.
- v2 - Expanded beyond a classification system, to support regression, clustering and multi-label classification.
- v1 - Initial internal release. This release only supported multi-class classification.
diff --git a/Regression/Core/pom.xml b/Regression/Core/pom.xml
index cbcfa0534..bf0f2a7a3 100644
--- a/Regression/Core/pom.xml
+++ b/Regression/Core/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-regression
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Regression-Core
diff --git a/Regression/LibLinear/pom.xml b/Regression/LibLinear/pom.xml
index 60522800d..ad1b51be8 100644
--- a/Regression/LibLinear/pom.xml
+++ b/Regression/LibLinear/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-regression
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Regression-LibLinear
diff --git a/Regression/LibSVM/pom.xml b/Regression/LibSVM/pom.xml
index b64bd14be..a70121f19 100644
--- a/Regression/LibSVM/pom.xml
+++ b/Regression/LibSVM/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-regression
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Regression-LibSVM
diff --git a/Regression/RegressionTree/pom.xml b/Regression/RegressionTree/pom.xml
index 0138b1bc7..040befb00 100644
--- a/Regression/RegressionTree/pom.xml
+++ b/Regression/RegressionTree/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-regression
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Regression-Tree
diff --git a/Regression/SGD/pom.xml b/Regression/SGD/pom.xml
index 6544746bc..4b8c2a6ae 100644
--- a/Regression/SGD/pom.xml
+++ b/Regression/SGD/pom.xml
@@ -20,7 +20,7 @@
org.tribuo
tribuo-regression
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Regression-SGD
diff --git a/Regression/SLM/pom.xml b/Regression/SLM/pom.xml
index a0852bfed..96451d4d8 100644
--- a/Regression/SLM/pom.xml
+++ b/Regression/SLM/pom.xml
@@ -20,7 +20,7 @@
org.tribuo
tribuo-regression
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Regression-SLM
diff --git a/Regression/XGBoost/pom.xml b/Regression/XGBoost/pom.xml
index 292b90ae1..44b7ae1ba 100644
--- a/Regression/XGBoost/pom.xml
+++ b/Regression/XGBoost/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-regression
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Regression-XGBoost
diff --git a/Regression/pom.xml b/Regression/pom.xml
index 9994f5463..d8012f4fb 100644
--- a/Regression/pom.xml
+++ b/Regression/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
tribuo-regression
diff --git a/Reproducibility/pom.xml b/Reproducibility/pom.xml
index ce95e9256..03d4aa78e 100644
--- a/Reproducibility/pom.xml
+++ b/Reproducibility/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
4.0.0
Reproducibility
diff --git a/THIRD_PARTY_LICENSES.txt b/THIRD_PARTY_LICENSES.txt
index d779c402d..359ab25aa 100644
--- a/THIRD_PARTY_LICENSES.txt
+++ b/THIRD_PARTY_LICENSES.txt
@@ -1943,7 +1943,7 @@ of the input file used when generating it. This code is not
standalone and requires a support library to be linked with it. This
support library is itself covered by the above license.
-oci-java-sdk 2.11.1 - Dual licensed UPL/Apache 2.0
+oci-java-sdk 2.12.0 - Dual licensed UPL/Apache 2.0
Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
diff --git a/Util/InformationTheory/pom.xml b/Util/InformationTheory/pom.xml
index 8c5555f26..8e8810785 100644
--- a/Util/InformationTheory/pom.xml
+++ b/Util/InformationTheory/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-util
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
InformationTheory
diff --git a/Util/ONNXExport/pom.xml b/Util/ONNXExport/pom.xml
index 1462c062c..9302597d8 100644
--- a/Util/ONNXExport/pom.xml
+++ b/Util/ONNXExport/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-util
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
ONNXExport
diff --git a/Util/Tokenization/pom.xml b/Util/Tokenization/pom.xml
index 0a4badd6b..c21a59d6a 100644
--- a/Util/Tokenization/pom.xml
+++ b/Util/Tokenization/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo-util
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
Tokenization
diff --git a/Util/pom.xml b/Util/pom.xml
index ec97f0ba1..c68645118 100644
--- a/Util/pom.xml
+++ b/Util/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
tribuo-util
diff --git a/distribution/pom.xml b/distribution/pom.xml
index 146429d9f..4421cb376 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -21,7 +21,7 @@
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
diff --git a/docs/Roadmap.md b/docs/Roadmap.md
index 85f2cae2a..73dd4790a 100644
--- a/docs/Roadmap.md
+++ b/docs/Roadmap.md
@@ -96,4 +96,4 @@ in a Tribuo compatible interface, but the codebase isn't quite ready for release
- Add more tutorials.
- Tribuo 4.0.2 adds tutorials for external model loading and columnar data processing.
- Tribuo 4.1 adds tutorials for TensorFlow and document classification.
- - Tribuo 4.2 adds tutorials for multi-label classification, ONNX export, and model reproducibility.
+ - Tribuo 4.2 adds tutorials for multi-label classification, HDBSCAN clustering, ONNX export, and model reproducibility.
diff --git a/pom.xml b/pom.xml
index aa5b22859..524d52bca 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
4.0.0
org.tribuo
tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
pom
Core
@@ -282,7 +282,7 @@
Utility Packages
- org.tribuo.util.*:org.tribuo.tests
+ org.tribuo.util.*:org.tribuo.reproducibility:org.tribuo.tests
@@ -339,7 +339,7 @@
Utility Packages
- org.tribuo.util.*
+ org.tribuo.util.*:org.tribuo.reproducibility:org.tribuo.tests
diff --git a/tests/pom.xml b/tests/pom.xml
index 23ac752e8..56d1f6d15 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -21,7 +21,7 @@
tribuo
org.tribuo
- 4.2.0-SNAPSHOT
+ 4.2.0
../pom.xml
4.0.0
diff --git a/tutorials/README.md b/tutorials/README.md
index a51c8334e..becfc2e4b 100644
--- a/tutorials/README.md
+++ b/tutorials/README.md
@@ -14,7 +14,7 @@ The tutorials cover:
- [Intro regression with wine-quality](regression-tribuo-v4.ipynb)
- [Configuration files, provenance and feature transformations on MNIST](configuration-tribuo-v4.ipynb)
- [Clustering with K-Means](clustering-tribuo-v4.ipynb)
-- [Clustering with HDBSCAN*](clustering-hdbscan-tribuo-v4.ipynb)
+- [Clustering with HDBSCAN\*](clustering-hdbscan-tribuo-v4.ipynb)
- [Anomaly Detection with LibSVM](anomaly-tribuo-v4.ipynb)
- [Multi-label classification with Classifier Chains](multi-label-tribuo-v4.ipynb)
- [Loading columnar data](columnar-tribuo-v4.ipynb)
diff --git a/tutorials/anomaly-tribuo-v4.ipynb b/tutorials/anomaly-tribuo-v4.ipynb
index 24fe2e523..38b12d05d 100644
--- a/tutorials/anomaly-tribuo-v4.ipynb
+++ b/tutorials/anomaly-tribuo-v4.ipynb
@@ -19,7 +19,7 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-anomaly-libsvm-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars ./tribuo-anomaly-libsvm-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -111,7 +111,7 @@
"obj = 289.5926348816893, rho = 3.144570476807895\n",
"nSV = 296, nBSV = 114\n",
"\n",
- "Training took (00:00:00:179)\n"
+ "Training took (00:00:00:147)\n"
]
}
],
@@ -210,7 +210,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "17+0"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/clustering-hdbscan-tribuo-v4.ipynb b/tutorials/clustering-hdbscan-tribuo-v4.ipynb
index 5e26406d3..a87c72b7d 100644
--- a/tutorials/clustering-hdbscan-tribuo-v4.ipynb
+++ b/tutorials/clustering-hdbscan-tribuo-v4.ipynb
@@ -19,7 +19,7 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-clustering-hdbscan-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-clustering-hdbscan-4.2.0-jar-with-dependencies.jar\n",
"%jars ./xchart-3.8.1.jar"
]
},
@@ -166,9 +166,9 @@
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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08b89a86U7q4uCKf6+/a1Xz2mc5AOXPGHD9u8vLMuXN6CgDcKEJ/yMjQX08j4/bbdawUqan66jJGjtQxeFqyxNSr9/2+io4227bpAAAYitA/hg/XHSYjNNR8/rlOlqRfP311GQ0amPPndRJu69bp3VWzpjlxQscAgCL0h7599Z2ye/z+9zpZknbt9HVlhISUo0qd5pJ77Oc/1zEAoAj9YcoUfY8so25dc/asTpbkvvv01WVce62Owe3MGVOjht5dMlq21EkAoAj94dQpExWl75Sfe07HSpGXZ2rV0mtYvlzHUKBJE727ZPTooWMAQBH6SWamadXq+7vjsDDrXE7l/fzDtm3WOz7ca6hd26Sk6AA8PfywbkEZL7+sYwBAEfrPuXPWgd3+/RX/2MN//2u93ePQIfPll3oKyhdfmJtuKtKCd93FhygAXAJFiGpLjrlTU82DD5px48zGjXoWANwowmro7FkzY4bp0MF6P84tt5jt23UAAFCAIqyGBg7Ur4299prOAADcKMLqZvNm3YIy6tfnZUUAuDSKsLqZOFG3oHscOKCTAABDEVY/FCEAlAtFWN1s2aIr0MVTowBQMoqwGrrzTl2EfAcNAJTEniLMzs5euHDh8OHD27dvn56erqe948Mi/Ppr65nDt94y772np3zi3/82b79tHav94x96qiqcPWtmzTIdO1onIerWzToJFACgJPYU4aJFi370ox+1bt3a5XJt3rxZT3vHV0W4f79p3rzw4On++81XX+lMZSxYYOrU+X7l4eHmxRd1AABgI3uK0G3o0KG2F+Ff/2qd1U89kTh6tI5VWHq6XrmMN9/UMQCAXZxehAkJuqVcF87zV+GvA1V69dIrl9Gli44BAOwSfEU404PnQv2Teefuu3VLuUdmpk5WTOPGes0yIiLKd2b5U6dMXJxp3dp62W/CBE7GCwC+FHxFWMAnRXjJU+bK+PvfdbJiYmL0mmW0aaNjpfjTn0zDhkWu3qqVdWoFAIBPOL0IT540NWvqourXT8cqbP58vXIZzz+vY6W44w59dRmTJ+sYAKBi7CnC7OzsjIyMgQMHShEuXbp0165dOuEFnxShWLLEejNnQcd06mQ9Fekr589bpwHy7LB77inHKXklWbeubkEZnTvrJACgYuwpwsWLF0d76Nixo054wVdFKP73f83cudZh1ptvWie/9bn9+2VH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",
"text/plain": [
- "BufferedImage@82b341e: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0"
+ "BufferedImage@5c4722f0: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0"
]
},
"execution_count": 8,
@@ -269,9 +269,9 @@
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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",
"text/plain": [
- "BufferedImage@65e69c81: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0"
+ "BufferedImage@4d071d36: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0"
]
},
"execution_count": 12,
@@ -372,9 +372,9 @@
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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",
"text/plain": [
- "BufferedImage@2aa283b8: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0"
+ "BufferedImage@1535978a: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0"
]
},
"execution_count": 16,
@@ -446,9 +446,9 @@
"outputs": [
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAq5ElEQVR4Xu3dC3wU5b3/8SWAyEWhCGoB8VIvVBEvVLxUJSByUTgRKCgilfgHIYBRRMBKVEDuCBZSkUDwAhRQCwTkEkBEUEIJEEK81fZUeztajnqOFbWohN//ec28kjP5TS6bzSazm+fz7vPytZ3nu8Nkksx3Z7O7EyoAAMBiIb0AAACbUIQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq8V0EU6dOrX49vz586cCAFB5ixYt8nSLFjdFaG4LAACV520TP4oQAFDLUYQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYQAgPjzlci7It/rxZGgCAEA8eRTkX4iIWc0EPmVyHc6UjkUIQCgev2vyDd6WYTMKeDVRS1YPB7QqcqhCAEA1WWHyKVOVyWIdBZ5T89X2kpfC7or/7sOVgJFCACoFrucivI2VlORv+lU5Yz1taA7snSwEihCAEC16OirKzP+n05VznTfCt2xVwcrgSIEAETfv0Xq+erKjPY6WDn5pa32HOefixhFCACIvkKRJr7GMuMGHay0WSJ1PCs8TWSnjlQORQgAqBbFb3LwjqgcrN8UGSnSXWScyMd6stIoQgBAtfiHSOuSLdhJ5LhOBY8iBABUl/8VmeA8HWrO3mZH6YNgoo4iBABYjSIEAFiNIgQAWI0iBABYjSIEAFiNIgQQl/7ufKDzf+rFiKZjIntEDsbkex6iiCIEEGc+F+nveWtalyp/jjNKtUCkUdFOPktkg56vPShCAHHmNt+HlVwdq29Qi1/+qx3VFzmkUxFa7Tx8aSvSTWS9nqwcc856wHm3YlVQhADiyQHfAdodVTyeQrnEt4fN+IVORSLNt9pZOhKWY86nrBWvpK/IUR0JVzBFuGTJkms8HnroIZ0IA0UIWGiZ7zDqjsk6iMh947uOoDsu1sFKe1+krm+1p0T0eaF3+dZzg/NJ3xEIpghnzpx56qmnJhWZPHmyToSBIgQstM13+HNHpg6iSlr49nDIeT6zihb51umOFTpYgXd8a3BHZH/IDKwI27Rpo5dWEkUIWOiYc/E5dfhrKvJfOogqGe3byWZk6FSl/dq3Tncs08EKvOhbgzue1MGwBFaEzZs3nzRp0rJly/Lz8/V0uaZ6eBfqrwxALbVbpLnn2NdY5FUdQVWZBxw/L9kxQ0RO6lSlHfRVV8h5GvYPOliBrb6VuGORDoYlmCJcsWJFUlJSp06dEhISLrnkkp07d+pEGChCwFqfijwtMlRkOm8lrDaFzjOW5tRwrFM80TLM115jdaRi/3Le0aHW01DkIx0MSzBFWGzWrFmhUKhv3756IgwUIQDEnRMic0QucqqrncjCSE80t4g08bRg/Sr8nTjgIty9e7cpwiuvvFJPhIEiBACb/VlkvEgfkYeq9h7HYIowOzs7NzfX3Bg/frwpwsGDB+tEGChCAEDVBVOEI0eONP132mmnJSQk3Hrrrfv27dOJMFCEAICqC6YIjTfeeMOcF+bk5OiJsFGEAICqC6wIq44iBABUHUUIALAaRQgAsBpFCACwGkUIALAaRQgAsBpFCACwGkUIAKjAuyLzRR51LvgX2cVvYxlFCAAozxznI62LP976RpH/0ZEKfCzymV4WQyhCAECZdjnXC1QXPLpHp8q0VqR10b06iOTq+ZhAEQIAypTsa0H3mkf/1sFSbBGpU/KOjWPy+pEUIQCgTJ19LeiOP+lgKTr47mXGL3UqeBQhAKBMo3xNZkYj5/q65ftWpK7vjmZcqoPBowgBAGV6X+RUX5k9plOlOClyuu+OZtykg8GjCAEA5dko0rKoxuqIpIh8pyOlu9vXgiHnNaixhiIEAFTgK5HtIq9U8qUuR0UuLNmCt4j8oFPBowgBANXla5HpIr1F+oksjdU341OEQHkKCws//vjjr7/+Wk8AqC0oQqB0J06cWL58eY8ePRIdEyZMOHr0qA4BiH8UIVC6zMxMtwKLDRky5Pjx4zoHIM5RhEApjh07dsstt6giNLKysnQUQJyjCIFSHD58WHegY/bs2ToKIM5RhEApPv74Y92BjsWLF+sogDhHEQKlKCwsvOeee1QLdunSxfyw6SiAOBdwEb799tvZ2dmHDx9Wy3NycrI99u7dqwIFFCGq2fvvv9+7d29vEWZmZuoQapFvnYsE5Yl8r2dQywVZhLt37z777LNDodDWrVvVVGpqasgjJSVFBQooQlS/zz77LCMjY8KECXPnzj1w4ICeRi2yWOS0ok8/Ocu5DjvsEVgR5ufnd+rUqUWLFmUV4UUXXbSsiDkpVIECihBAlLzq+zzMeiI88LFHYEU4dOjQiy+++MknnyyrCG+44Qa1UKEIAUTF5b4iNOMOnUKtFUwRzps3r2nTplu2bJk1a1ZZRXjqqae2bdu2Z8+eq1at8k5N9fAu1F8ZAIThuzIum3eeDqLWCqAIs7KyGjdunJaWlp2dPXHiRFOEL730knq9zJtvvvnaa6/NnTvXdGH9+vVXrFjhnXVRhACi4se+FjTjRp1CrRVAEbrlp2zatEnnHEuXLjWz/fr10xMUIYAoSfW1oBkLdAq1VgBFuGPHjuJXwQwdOtT03Jw5cw4cOLBmzZpp06ap18UsWbKEIgRQrb4W+XnJFhwQqxcMQnUIoAi9Jk+eHCr6G2FycrK5PXfuXHP70UcfNSeOTzzxxHnnnXfKKaesXLlS35MiBBA9J0SWO9deN2eHfJ6sbQIuwpdffjklJcV9v7w5+TO3169fb26bc8Rbbrnlmmuuueuuu9auXavv5qAIAQBVF3ARVgVFCACoOooQAGA1ihAAYDWKMF79+9///vzzz/VSAEAlUYTx55///OfEiRO7dOmSmJjYt2/fzZs36wQAIGwUYZz55ptv7rzzTu+1gYyNGzfqHAAgPBRhnFmxYoVqQaN3796Fhbz9FwAiQRHGmccee0zXoOMvf/mLjgIAwkARxpmZM2fqDnR88cUXOgoACANFGGd27dqlOzAxcfjw4ToHAAgPRRh/pk2b5m3BPn36/PnPf9YhAEB4KMK4tGPHjscff3zs2LGLFi3i3YQAUBUUIQDAahQhAMBqFCEAwGoUIQDAahQhAMBqFCEAwGoUIQDAahQhAMBqFCEAwGoUIQDAahQhAMBqFCEAwGoBF2FOTk52dvbhw4f1RBgoQgBA1QVZhHv37m3btm0oFNq6daueCwNFCACousCK8MiRI507d27atClFCAAIUGBFOGrUqHPPPTctLY0iBAAEKJgifPbZZ5s0abJ+/fpZs2ZRhACAAAVQhFu2bGnatOn8+fPN7QiKcKqHd6H+ygAACEMARThx4sSQz6ZNm3SuIhQhAKDqAijCHTt2LCsydOhQ04Jz5sw5cOCAzlWEIgQAVF0AReg1efLkUCWfGi1GEQIAqi7gInzhhReSkpL27NmjJ8JAEQIAqi7gIqwKihAAUHUUIQDAahQhAMBqFCEAwGoUIQDAahQhAMBqFCEAwGoUIQDAahQhAMBqFCEAwGoUIQDAahQhAMBqFCEAwGoUIQDAahQhAMBqFCEAwGoUIQDAahQhAMBqFCEAwGoUIQDAahQhAMBqFCEAwGoUIQDAahQhAMBqFCEAwGqBFWF2dvayZcteeeWVI0eO6LnwUIQAgKoLpgh79uzZpEmTVq1a1alT59xzz922bZsKpKamhjxSUlJUoIAiBABEQzBFuGnTJvdE0Pzzpufuv/9+FTBF2LZt22lFzImjChRQhACAaAimCIvNmTPHFGFaWppaborwuuuuUwsVihAAUHXBFGF+fn5KSsqgQYOaN28+ePDgw4cPq4ApwmbNmpkuTE5Ozs7O9k5N9fAu1F8ZAABhCKwIk5KSunTp0qhRo65du+7atUsFNm/evGTJkocffviMM85o0qTJ+vXrVaCAM0IAQDQEU4TFfvvb34ZCoV69eumJIunp6SYwcOBAPUERAgCiIeAiPHjwYEJCQrt27cztLVu2LFu2bPfu3d7ASy+9ZIqwT58+3oUuihAAUHXBFOGYMWPmzJmTmZlpzgVNzw0fPtwsTE5ONrfnzp1rbs+aNWv+/PnPPfdchw4dTFOaG3oVFCEAIBqCKULTeabhWrVqZf47YcKE/Px8s9BUYFJS0qpVq8ztSZMmtW/f3gQSExMXL16s7++gCAEAVRdMEUYFRQgAqDqKEABgNYoQAGA1ihAAYDWKEABgNYoQAGA1ihAAYDWKEABgNYoQQLkKRRaK3CxyichAkQI9D8Q7ihBAufqKhDzjFJHtOgLENYoQQNleLdmC7jjHOU0EaguKELDP+yLLRNaK/FPPaPf7WtAd7+kgEL8oQsAm34sM9/RZE5HndaSEX/oq0B2HdBCIXxQhYJMnfZVWVyRHp/5Phi9vRlOR73QQiF8UIWCT5r5WM+Nunfo/5gzyal9+mU4BcY0iBKzxT1+lueNqHSzhS5ERRQ3a3vnLIlC7UISANU46z2r6i3CgDpbuuF4A1A4UIWCTh30tWIf3BSJIn3766YwZM+69997hw4c///zzx48H8ICLIgSq4HuR9SJPibwkclRPxqJvRe7wtGB9kbk6UjFzZrlVZKbzUpq/6kkgfB999NFtt92W6GHq8Pvvv9e5akYRApH6s0gHT6k0F9miIzHqTZHJIvNF/qRnKva5SGfPV92oojdgAGV74IEHvC3oWrlypc5VM4oQiEihyPW+pxmbivxDB2NOlsj5RU+KdhH5g56vwJ2+r9qcVubpFFCh48ePd+3aVddgYuLYsWN1tJpRhEBE3vH1gTue0cHYstG3wWeIfKpTZfqXSIJvDWY8qINAhY4dO9alSxddg4mJY8aM0dFqRhECEVnvKwN3jNbB2HKRb4PNSNWpMuX57uuO23UQCMd9992nazAxMSMjQ+eqGUUIROQDXxm44zc6GEO+cJ4O9W/ztTpYpq+dT6Lxr+ERHQTCkZ+fr54dHThw4Ndff61z1SzyIhw2bJjpbb20BlGECFgPXx+cJfKZTsWQ487f8/w11kMHyzPCd/dGIh/qFBCmd999d/To0d26devdu7c5kn/xxRc6Uf0iL8IJEybUq1fv1ltv3b59u56ryOLFi++6667bbrutX79+6enpejo8FGGVvC3yhMhDIi9zSZ1Ifeq82KS4D84T2asjVfKOyCznudalztseIvafIvNEUkQWiXTz1ZgZC/Q9ynNMZIDnvi1ENugIUFknT57Ui2pQ5EVorFu3rmPHjo0aNXrooYfy8vL0dNnuu+8+c0KZlpZ2+eWXh0Kh+fPn60QYKMLIqXdV3+i8CAIRML+8v3eKamvVusrvWecSuMXfo0tEPtKRsKwWaexZTyunurzf/VtETug7VSzf+cRRU4H/q2eAuFOlInSZFgyVpBNly8zMNHlTinoiDBRhhF4ueRx0x3CdQpDyROr5vkc36VTFPirZgu5o5/xJz6ytj0h6RC0I1C5VKsKDBw8+8MAD5ozQlFnLli1bFdG5MuTm5iYlJTVo0GDVqlV6LgwUYYSSfEdGM07jCdJYMtH3DXJHZT/GZb5vDe7I1UHAZpEX4XPPPde6dWtTgWedddbMmTP1dLny8/NNX5r7Nm7cuLJ/I5zq4V2ovzKU5UrfYdEdsfwqD9sM8n133LFHByvwoG8N7vidDgI2i7wIb731VnMyN2LECHNip+fCkJ2dvXTp0s6dO9erV4+/EdaoIb7Dohk/1ikEabrvGxRy3vnwPzpYgUzfStzBizwBj8iLcMqUKabM9NJK2r9/f0JCwhVXXKEnwkARRii/5Ksw3LFQpxCkoyItfd+jFJ2q2DGRC3zr6adTgOUiL8KqKD6JXL9+fSgU6tSpU8n5sFCEkcsSObPosFhf5Enn1Y+oDn9z3qYywHl9yjt6sjz7S34KzDCRb3QkLO+JXOVZzy8qf1oJ1HbBFOFPf/rTyy+//KabbmrSpMnpp5++fPlynQgDRVglXztvJXyNPw1Wp50lL4Rb33nLQfi+EznkfJZbZV8jo5xwngZYH9G1JgALBFOE5kRw5syZ06ZNmz9//t69e/V0eChCxDTzUKON72nJhs7Fm1Ar/SCyXOQBkUnR/mgFVLNgijAqKEJE7guRHJEv9eJo2ulrQXek62BM+NT5ZICa/ojHWuRzkZ95vst1RCboCGIWRQjLHC35TsrkavtUnZW+CnTHYzoYsI+cN9e721ZXZLzzlCwq627fNzrk/DEe8YAihE0KRW7wHa2q6VWU7/n+IXe8qoNB+qa0CzM9pFOogHno0MC3G0PORYwRDyhC2GST71Dljmq6wLr/ffEdnb8kxY5Fvi0MOZfe/W8dRHn+5tuH7rheBxGbKELYZKrvUOWOSr2YM3zHnA9xLf5Xeor8l44EzLt53rFdB1GBH/n2Yci5ZBXiAUUImyzxHarcsVkHo+lL550qsXmOlebbFe4o0EFUYK5vHzbkE3ziBkUIm/y1tKsxnFXNLx+NZQdLu+J8Oy5JUXmFzqOK4muGtBbZpiOIWRQhLLO85CfMNRHZoiN2meX8UbB4h7QUOaAjCNfnzrMLZgf+W88gllGEsM+7IuOcF4v+KtKr3dYye53rVJgdMsV5ewlgGYoQAGA1ihAAYDWKEAjUDueTbi4U6cMHkQDBoAiB4PzG+VBK7ys2p+kIgOpGEQIB+YfzVjNvC4ac199/oIMAqhVFCARkta8F3bFIBwFUK4oQCMgyXwW6Y54OAqhWFCEQkPd9fyB0R44OAqhWFCEQnFG+FrxbRwBUN4oQiJ7/cS448BPng8r6ifxRz2snRGY7n0sZcj7y9EmR73UEQHWjCIEo+ZfIBSVP7xqJvKNTpTumFwCoMRQhECUTfM9zmtFZpwDEGooQiJJOvhYMOVe6OK6DAGIKRQhEyTW+FjSjPkUIxDqKEIiScb4WNOMmnQIQawIrwiNHjmRnZ+/bt09PhI0iRGz5UuTcki14qshhnYrQD3pBtav5fxEISDBF2Llz53r16oVCoTp16nTr1i0nJ0cFHnvssVYeEydOVIECihAx6HORZJE2Ij8S6S3ynp6vtBMiM4v69XyRp0UKdST6djpP89YTaSYyROQzPQ/UMsEUYVpamjkdPHz4cEpKiqnD++67TwVSU1PPPvvslCLLli1TgQKKEDa4z/dc62gdibJNvs+7uVDka50CapNgirDYmjVrTBH26tVLLTdFeO2116qFCkWIWu6grwVDTku9q4PRdJ7vXzTjKZ0CapOAi3DIkCGmCJ9++mm13BThWWed1bdv30mTJu3du9c7NdXDu1B/ZUC8W+ArJHcs0cGo+Yfv33JHDx0EapMgi3D27NkJCQkjRozQEwUFr7766pQpU+66666GDRueeeaZ27Zt0wnOCFHrZfgKyR3LdTBqPvM9L+qOJB0EapPAijAtLa1Bgwbl//MFTlmaU8Z77rlHT1CEqPU+dF6xojrpFJGPdTCarvT9i2ak6xRQm5TfRNVVhI8//ript7lz53oXvv3229nZ2fv37/cu/O1vf2uSt99+u3ehiyJE7TfV10lzdSTKcp2PSPX+izc6L14Faq8AinDnzp1169Y1p4NJRczZoVmenJxc3I6LFy9etWpVVlbWzTffbBbOmTNHr4UihCXWivR0XsNym8hrerJa/Mm5GlQ7500U07kgBmq/AIrw9ddfv6ak0aNHFzinieZ2ZmamuW2WtGjRwvRlu3btJk+erFfhoAgBAFUXQBFGC0UIAKg6ihAAYDWKEABgNYoQAGA1ihAAYDWKEABgNYoQAGA1ihAAYDWKEABgNYoQAGA1ihAAYDWKEABgNYoQAGA1ihAAYDWKEABgNYoQAGA1ihAAYDWKEABgNYoQAGA1ihAAYDWKEABgNYoQAGA1ijDmfC/fT5WpV8qVLaVlD+mRIzk6AQCIHoowtpyUk92le0hCxaOu1M2SLJ0DAERJkEV46NAhvagyamURrpSV3hZ0x1ly1gk5oaMAgGgIpgh79erVsGHDUCjUoEGDpKSk3NxcnQhDrSzCYTLMX4RmFEiBjgIAoiGYIhw7duzatWt37tw5dOhQU4f333+/ToShVhZhsiT7W9CMw3JYRwEA0RBMERZbs2aNKcKePXvqiTDUyiJ8QV7wt+AZcsYP8oOOAgCiIeAiHDZsmCnC6dOn64kw1MoiLJTCG+VGbwvWkTqrZbXOAQCiJMgiTE9Pr1u37t13360nyjXVw7tQf2Vx61v5dryMv0AuaCgNr5frt8t2nQAARE9gRThr1qwGDRqMHz9eT4StthYhAKAmBVOEM2fOTEhImDx5sp6oDIoQAFB1ARThrl27TjnllEaNGqUUmT9/vg6FgSIEgBr25ZdfZmVlPfvssxs3bvzqq6/0dHwKoAizs7NblVTZPxO6KEIAqEl5eXl33HFHYpF+/fq98847OhSHAijCaKEIAaDGmPO//v37F7ega+DAgd98842OxhuKEABQsV27dqkWdOXkxP2FAShCAEDFVq1apTvQsXbtWh2NNxQhAKBi+/bt0x3oyMvL09F4QxECACr2ww8/DBs2TLVgSkpKYWGhjsYbihAAEJZPPvlk1KhRxS2Ympp69OhRHYpDFCEAIFzm/O+Pf/zj66+//qc//enkyZN6Oj5RhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYQAAKtRhAAAqwVThDk5OXPmzBkwYMB5552XlZWlpwsKZsyYcY3HtGnTdIIiBBDPfvjhh+XLlw8fPrx///6TJk368MMPdQI1JZgizMjISExMbN++fSgUKrUIU1NTmzdvnlRkwYIFOkERAohbJ0+eHDt2bKJHt27dcnNzdQ41IpgidA0aNKicIuzUqZNeWhJFCCBObd261duCroEDB5qC1FFUv9gtwrZt244aNSo9PT0vL887NdXDu1B/ZdHzjrzzG/nNElnyB/mDngOAypsxY4auQcff//53HUX1i9EifPHFF0eOHNm5c+eEhISLL754z549OlEjZ4Qn5eQD8kAdqROSkBn1pN4T8oQOAUAlPfXUU7oDHX/5y190FNUvRouw2KRJk0xm2LBheqJGinChLHQr0DtWySqdA4DKMMc93YGJiXfccQdPjQYi1otw9erVJtOrVy89USNF+FP5qb8Ib5abdQ4AKuPEiRMjRozwtmCXLl3efPNNnUONCKYIc3Nzs7Oz+/TpY0pu6dKlO3bsMAuTk5PN/507d665vWbNmjfeeGP//v1JSUlmYVpaml5F9RdhoRTWl/r+IjxbztZRAKikb7/9duHChQMGDOjevfuoUaMOHjyoE6gpwRRhRkZGK48OHTqYhQ8++KC5nZ6ebm4PHjw45GjatOnIkSPz8/P1Kqq/CI1L5VJ/EXJGCAC1STBFGI68vDxzUqiXetRAEaZLur8IV8tqnQMAxK3YLcIK1UARnpSTD8qD3leNPilP6hAAIJ5RhBV7V95dJIsyJfND4TOQAKC2oQgBAFajCAEAVqMIAQBWowgBAFajCAEAVqMIa84G2fCgPDhGxqySVSel0p8oWCiF5o7m7mYlZlV6GgAQEYqwJpgO6y/9ve/KT5TEb+VbnSubCZu7eNdgVmhWq3Mo6Zgc2yf7PpAP9AQAFKEIa8I8mef/hJrxMl7nyvaIPOJfw3yZr3MockJOTJWpxZ8W207a5QqX/wZQCoqwJlwr1/prrK201bmynSPn+NdwnVyncygyS2ap3fUj+dEn8onOAbAeRVgTWktrf42ZkxVz1qKjpTGxUq+D0Uba6CgcZo81kSb+PTZRJuooAOtRhDXhNrnNf1C+Sq7SubKZsH8Nt8vtOgfHB/KBf3eZ0V266ygA61GENWGv7K0rddVBeb2s17myrZN16u5mhTmSo3NwfClfFn9UunckS7KOArAeRVhDfie/ayEt3MPxaXLaElmiExXJkAxzR3cNZlVmhToBD3Py5y/CzbJZ5wBYjyKsOcfl+EE5aE7jvpFv9Fx4zB3N3c1KzKr0HEr6q/z1QrnQ24KVepkuAHtQhKi1zOOGhbLwl/LLsTJ2l+zS0wDgoAhroa/kqzEy5ifyk2bSrLt0PySHdAIAUIQirG2Oy/H20t77lGB9qb9bduscAMBBEdY2/jeSm3GpXKpzAAAHRVjb9JJe/iI047/lv3UUAEAR1j4UIQBUCkVY25T61OhlcpnOAQAcFGFtc1yOXy6Xe1uwvtTfI3t0DgDgCKYIc3NzFy1alJyc3L59+02bNunp8ESxCL+UL7fK1nWy7h/yDz0XDX+Tv62Vtdtk27/kX3quGnwlX6VK6kVy0Y/kR72kV57k6QQAoEgwRfjcc8/97Gc/u/jii0OhUFZWlp4OT7SKcIWsaCpN3ZOnelJvkkyK4PLxZSmUwkfkkeIPGm0uzV+VV3UIABCcYIrQNWjQoMCLMEdy/B+HnS7pOhepOTJHrby+1Ocd7gAQO2wvwv7SXxVVqJKXzC1fS2npX/8QGaJzAICAxF8RTvXwLtRfWXjaSTt/UZnxlXylo5V3VI7612zG1XK1jpbriBwxhX2+nN9ROs6QGd/L9zoBAIhU/BVhsagUYanvumshLXQuIoVSWHzhJO8wraajZXtD3jhFTvHevat0NWvWOQBARGwvwtWy2l9UD8vDOhepFEnxr3+DbNC5sl0gF/jXsEyW6RwAICLBFGFubm52dnafPn1MES5dunTHjh06EYaoFKExTsZ5r2beU3p+K9/qUKSOyTFzAle88gRJSJM0HSrbR/KRvwXNuFvu1lEAQESCKcKMjIxWHh06dNCJMESrCI39sn+mzHxMHquOK5iflJOvyWsTZeJsmV3Z14t+KB/6W9CMATJARwEAEQmmCKMiikUYs0yJni1n+4twgSzQUQBARCjCWLdW1qoWvEKu+E6+0zkAQEQowjiwXbZ3kk6nyClnypmjZFTNfE4bAFiCIgQAWI0iBABYjSIEYAVzoFi5cuXq1avfe+89PQe7UYQAarmTJ0/OmDEj0WPevHlmoc7BVhShvC/vL5bFi2TRe8LjRKAWevnll70t6MrKytI52Mr2IpwoE4svw5QgCeNknE5E6gvzPwAxYOjQoboGExNHjhypc7CV1UX4vDzvf6/6Elmic5XxtXw9Wka7V/ptJa0WysIoXuYXQAR69OihazAxsU+fPjoHW1ldhJ2kk78Ir5KrdC5spvO8nyzqjkp9uCiAqLv//vt1DSYmpqam6hxsZXURuudtajSWxjoXtvWy3r/CelLvE/lERwHUlNdff13XYGLinj17dA62sroISz0jrOxVc70myAT/Cs3YKBt1FEANWrlyZbdu3dwK7N69+yuvvKITsJjVRfiCvOAvraWyVOfCNlWm+ldoxk7ZqaMAatbnn39uzgLfeuutL77ghWwoweoiNB6VR72vGh0v43WiMvbJPu+lDd3RXJp/JV/pKAAgNthehMYH8sESWZIhGe/L+3qu8sbJOG8L1pN6rwhPwgBA7KIIo2+NrPkP+Y/L5LI75c4DckBPAwBiCUUIALAaRQgAsBpFCACwGkUIALAaRQgAsBpFCACwGkUIALAaRQgAsBpFCACwWi0pwnnz5k0FAKDynn76aU+3aDFdhAAAVDeKEABgNYoQAGA1ihAAYLW4KUL9p08AAMKmS8UjboowBpW/Z2NE7G9k7G9hARsZPbG/kbG/hQVsZLRRhJGLi29z7G9k7G9hARsZPbG/kbG/hQVsZLRRhJGLi29z7G9k7G9hARsZPbG/kbG/hQVsZLRRhAAAq1GEAACrUYQAAKtRhFWybt26X/3qV4cOHdITAcnJyUlPT7/33nvNf/VcQcG2bdtSPKZNm6YTNW7Dhg0TJkwwG/Pggw+uX79eTwdh1apVgwYN6tSp03XXXTd69Oj9+/erwJ49e7y7cdKkSSpQ8/Lz84cNG3b99ddfc801vXv3XrNmjU4E4emnn+7atavZpJtvvnnKlCl6uqDghRde8O7J559/XieCM2/evAULFuilgcrMzDR7aePGjWr5a6+95t2Nc+fOVYFALF261LtVy5cv14lYQhFG6JlnnmnWrFlCQkIoFPr973+vp4NgWrBhw4Zt27Y1m/T444/r6YKCl156yUx17NjxGseQIUN0osZdcskl5ijZt2/fNm3a1K1bt9T+rmEjR468++67n3rqKbN/zO5KTExUAXPcMcuvuOIKdzcmJSWpQM07ePBgv379pk+f/sQTT7Ro0aJRo0amrXWoxqWmpqalpc2YMcM0tNljZvNUYMyYMU2aNHF3o+EPBMU8ujUbfOGFF+qJ4GRlZTVu3Nhs1cKFC9WU+a0xB6Li3ThixAgVCIR5ZHb66acXb1WM1HNZKMIIZWdnmxOsLl26xE4RmtMCc0A0j2TLKULzC3PkyBE9EZziXWfOrc1m//znPy85H7BWrVr595hbhG+++aZ3YewYMGCA2bzf/e53eiI4S5YsMZvkP0CbIjRn3mph4MyviXkkccEFF8ROEZrHuOeff363bt3KKkJTOWph4EwRmse4emmsogirJKaK0FV+EdavXz8zM3Pz5s16LmgrV640m3377bfrieCYk6oGDRr85Cc/UcvdIjRHnw0bNqipwJlvccuWLc0DcPOoSM8FZMeOHebXpGnTpv7dZYrwsssuW7Zs2VtvvaWmgrJz506zA82vT8+ePWOkCM3jsFtuucWUyquvvlpOEZrdaB6aq6kAmSK86qqrzFbt3btXz8UeirBK4qsI165daw6R7nOnHTt2NL/zOhGQw4cPm+1p3LhxjPyZsMA5vTZHn4YNG/r/tmGO7GY3mjMGsxsvvfTSGHlUMWvWrJCjXbt2MXJAPHTokLtJ5jtb6t/bpk+fbvak+ycGcyJrfgx0ombl5eWZY3e/fv3M7dgpwtTUVPM7a+rE/P6WWoQrVqwwu7FVq1Yh5zmVGHlU8eSTT5qtMg1dr169wYMHx84js1JRhFUSX0VYbPbs2SZjDvR6IggHDx7s1q2beRi+evVqPRcQcwQ3x0GzSatWrdJzHhkZGeYIbg6deiII+/fvz87ONg/ATUObajG3dSIIZjPMg5s+ffrUqVOnrLdXm0PkwIEDzQ/ko48+qudqVnJycosWLRYvXmx2Y6dOnVq3bl3+D0ANMHvP/Iz16NEjJSXF3UvmJzMrK0vnHJMmTTKBvn376ongmMcWSUlJZqsmT56s52IJRVglcVqEhjnXOfPMM/XSGpebm2uOOObY/frrr+u5gJhiNg+rzUFw+/btes7HxMwDXr00UDNmzDA/AI888oieCM6BAwdMEXbo0EFPFDF9E4qBJ8avvfZa5wz2/5ifTB2qWa+88krx600uvfTSkPMSnhdffFHnHO4puP/J/GA9//zzZqv69++vJ2IJRVglsV+EK1euNL9CEyZMKPC8MsWce5mMWV58r0AcOXIkMTHRFEmMPLvoch93jx49epnDfU3/xo0bze4yj8oLnMO6+zzPpk2b6tevHwvHHfN4ovgvMYMHDzbbX9bpV00qfu7dfbnyjTfeaG6npaWZPenu1eIfyIcfftgE3N0bI8yvdow8NVrMfbjgPjW6ZMkSsxvd06zi3ZiRkWECXbt29dwpMMVbZb6tZqvMt7jEdIyhCCNkfhDNKf+Pf/zjkPNIdsyYMTpR43Jyclq1atW8eXOzSc2aNTO3s7Ozn332WfN/77zzThOYMmWKWX7FFVc0aNDAnMqsW7dOr6JmmWN3qKTrr79eh2pcu3btvJuUkJBQUHQMuvXWWwuKXptgdqM5q27ZsqX/j4g1b8OGDebxxCWXXHLuueea7ezcuXMsvLf1oosuMj+E7du3N9tmflPcn7ehQ4eaLTQP18zt3r17n3POOe4ON2dj+/bt06sITowX4cyZM83t4cOHm9vjxo0744wzzAm3eVh2/vnnb9myRd0xEN26dTM/jeZn0mznTTfdZB6r6UQsoQgjZA490zxM3+hEjTOnKdklHT582Jy+mBvu38/NYzRzgmh+kcxvVOAvTChwnsnx7kNj8eLFOlTjzHmM2o0FzqaaG7t37y5wzgjNDjS7ccWKFbHQNwXOt97UTGZm5oIFC/wvzgyK2ZPmlPqZZ54xP3V5eXnuwrffftvsSfewaPanCZg9GTsvkirm7ky9NFDuD6G769w/CbtPA5hHwObRmNmNq1evjp3XpOzatcv95vo/ASAGUYQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYRAHJswYUJSUpL70Z0Fzqd69u3bNycnp2QKQHkoQiCOrVy5MiEhoW3btgcPHty/f3+bNm3uvfdeHQJQLooQiG/9+vULhUKjRo0aPHjwOeecE+OfbgzEIIoQiG979uxp2rRpgwYNzKlhZmamngZQEYoQiHvjxo0zJ4Xt2rXTEwDCQBEC8e3IkSNXX321OR00XZienq6nAVSEIgTi22OPPXbaaaf9+te/Nl3YunXrAwcO6ASAclGEQBzbtm1b48aNJ0+ebG7/4he/MCeFI0eO1CEA5aIIgTh2ww03XHfdde7tt956q1mzZg0aNNi8eXPJFIDyUIQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYQAAKtRhAAAq1GEAACrUYQAAKv9fzOA3NhE/cl+AAAAAElFTkSuQmCC",
+ "image/png": "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",
"text/plain": [
- "BufferedImage@4c2e1b64: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0"
+ "BufferedImage@b571c2a: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0"
]
},
"execution_count": 19,
@@ -536,7 +536,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "11.0.12+8-LTS-237"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/clustering-tribuo-v4.ipynb b/tutorials/clustering-tribuo-v4.ipynb
index 1d02b1e74..430bd36e9 100644
--- a/tutorials/clustering-tribuo-v4.ipynb
+++ b/tutorials/clustering-tribuo-v4.ipynb
@@ -4,9 +4,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Clustering Tutorial\n",
+ "# K-Means Clustering Tutorial\n",
"\n",
- "This guide will show how to use Tribuo’s clustering models to find clusters in a toy dataset drawn from a mixture of Gaussians. We'll look at Tribuo's K-Means implementation and also discuss how evaluation works for clustering tasks.\n",
+ "This guide will show how to use one of Tribuo’s clustering models to find clusters in a toy dataset drawn from a mixture of Gaussians. We'll look at Tribuo's K-Means implementation and also discuss how evaluation works for clustering tasks.\n",
"\n",
"## Setup\n",
"\n",
@@ -19,7 +19,7 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-clustering-kmeans-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars ./tribuo-clustering-kmeans-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -98,7 +98,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training with 5 clusters took (00:00:00:048)\n"
+ "Training with 5 clusters took (00:00:00:054)\n"
]
}
],
@@ -180,7 +180,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training with 5 clusters took (00:00:00:023)\n"
+ "Training with 5 clusters took (00:00:00:039)\n"
]
}
],
@@ -282,8 +282,8 @@
"data": {
"text/plain": [
"Clustering Evaluation\n",
- "Normalized MI = 0.8154291916732409\n",
- "Adjusted MI = 0.8139169342020223"
+ "Normalized MI = 0.8154291916732408\n",
+ "Adjusted MI = 0.8139169342020222"
]
},
"execution_count": 10,
@@ -352,7 +352,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training with 5 clusters on 4 threads took (00:00:00:035)\n"
+ "Training with 5 clusters on 4 threads took (00:00:00:055)\n"
]
}
],
@@ -381,7 +381,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training with 20 clusters on 4 threads took (00:00:00:027)\n"
+ "Training with 20 clusters on 4 threads took (00:00:00:049)\n"
]
}
],
@@ -409,8 +409,8 @@
"data": {
"text/plain": [
"Clustering Evaluation\n",
- "Normalized MI = 0.8104463467727059\n",
- "Adjusted MI = 0.8088941747451209"
+ "Normalized MI = 0.8104463467727057\n",
+ "Adjusted MI = 0.8088941747451207"
]
},
"execution_count": 14,
@@ -457,7 +457,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "We see that the multi-threaded versions run in less time than the single threaded trainer, despite having 4 times the training data. The 20 centroid model has a tighter fit of the test data, though it is overparameterised. This is common in clustering tasks where it's hard to balance the model fitting with complexity. We'll look at adding more performance metrics so users can diagnose such issues in future releases. "
+ "We see that the multi-threaded versions run in about the same time as the single threaded trainer, but have 4 times the training data. The 20 centroid model has a tighter fit of the test data, though it is overparameterised. This is common in clustering tasks where it's hard to balance the model fitting with complexity. We'll look at adding more performance metrics so users can diagnose such issues in future releases. "
]
},
{
@@ -467,7 +467,7 @@
"## Conclusion\n",
"We looked at clustering using Tribuo's K-Means implementation, experimented with different initialisations, and compared both the single-threaded and multi-threaded versions. Then we looked at the performance metrics available when there are ground truth clusterings.\n",
"\n",
- "We plan to further expand Tribuo's clustering functionality to incorporate other algorithms in the future. If you want to help, or have specific algorithmic requirements, file an issue on our [github page](https://github.com/oracle/tribuo)."
+ "We plan to further expand Tribuo's clustering functionality to incorporate other algorithms in the future, and added HDBSCAN in Tribuo v4.2. If you want to help, or have specific algorithmic requirements, file an issue on our [github page](https://github.com/oracle/tribuo)."
]
}
],
@@ -483,7 +483,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "17+0"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/columnar-tribuo-v4.ipynb b/tutorials/columnar-tribuo-v4.ipynb
index e81068fde..36782fff7 100644
--- a/tutorials/columnar-tribuo-v4.ipynb
+++ b/tutorials/columnar-tribuo-v4.ipynb
@@ -38,8 +38,8 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -568,7 +568,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "17-ea+22-1964"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/configuration-tribuo-v4.ipynb b/tutorials/configuration-tribuo-v4.ipynb
index 0ab70c3d5..7ba4be122 100644
--- a/tutorials/configuration-tribuo-v4.ipynb
+++ b/tutorials/configuration-tribuo-v4.ipynb
@@ -32,8 +32,8 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -487,7 +487,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training logistic regression took (00:00:03:669)\n"
+ "Training logistic regression took (00:00:03:494)\n"
]
}
],
@@ -807,7 +807,7 @@
"\t\t\t\t\t\t\tfeaturesPath = /Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz\n",
"\t\t\t\t\t\t\tfeatures-file-modified-time = 2000-07-21T14:20:24-04:00\n",
"\t\t\t\t\t\t\toutput-resource-hash = 3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C\n",
- "\t\t\t\t\t\t\tdatasource-creation-time = 2021-05-24T12:24:14.958637-04:00\n",
+ "\t\t\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:07:51.388837-05:00\n",
"\t\t\t\t\t\t\toutput-file-modified-time = 2000-07-21T14:20:27-04:00\n",
"\t\t\t\t\t\t\tidx-feature-type = UBYTE\n",
"\t\t\t\t\t\t\tfeatures-resource-hash = 440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609\n",
@@ -819,7 +819,7 @@
"\t\t\t\t\tnum-examples = 60000\n",
"\t\t\t\t\tnum-features = 717\n",
"\t\t\t\t\tnum-outputs = 10\n",
- "\t\t\t\t\ttribuo-version = 4.1.0\n",
+ "\t\t\t\t\ttribuo-version = 4.2.0\n",
"\t\t\t\t)\n",
"\t\t\ttrainer = LinearSGDTrainer(\n",
"\t\t\t\t\tclass-name = org.tribuo.classification.sgd.linear.LinearSGDTrainer\n",
@@ -839,17 +839,17 @@
"\t\t\t\t\t\t\tclass-name = org.tribuo.classification.sgd.objectives.LogMulticlass\n",
"\t\t\t\t\t\t\thost-short-name = LabelObjective\n",
"\t\t\t\t\t\t)\n",
- "\t\t\t\t\ttribuo-version = 4.1.0\n",
+ "\t\t\t\t\ttribuo-version = 4.2.0\n",
"\t\t\t\t\ttrain-invocation-count = 0\n",
"\t\t\t\t\tis-sequence = false\n",
"\t\t\t\t\thost-short-name = Trainer\n",
"\t\t\t\t)\n",
- "\t\t\ttrained-at = 2021-05-24T12:24:19.604718-04:00\n",
+ "\t\t\ttrained-at = 2021-12-18T20:07:55.508414-05:00\n",
"\t\t\tinstance-values = Map{\n",
"\t\t\t\treconfigured-model=true\n",
"\t\t\t}\n",
- "\t\t\ttribuo-version = 4.1.0\n",
- "\t\t\tjava-version = 17-ea\n",
+ "\t\t\ttribuo-version = 4.2.0\n",
+ "\t\t\tjava-version = 17.0.1\n",
"\t\t\tos-name = Mac OS X\n",
"\t\t\tos-arch = x86_64\n",
"\t\t)\n",
@@ -864,7 +864,7 @@
"\t\t\t\t\tfeaturesPath = /Users/apocock/Development/Tribuo/tutorials/t10k-images-idx3-ubyte.gz\n",
"\t\t\t\t\tfeatures-file-modified-time = 2000-07-21T14:19:56-04:00\n",
"\t\t\t\t\toutput-resource-hash = F7AE60F92E00EC6DEBD23A6088C31DBD2371ECA3FFA0DEFAEFB259924204AEC6\n",
- "\t\t\t\t\tdatasource-creation-time = 2021-05-24T12:24:03.396403-04:00\n",
+ "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:07:41.373899-05:00\n",
"\t\t\t\t\toutput-file-modified-time = 2000-07-21T14:20:05-04:00\n",
"\t\t\t\t\tidx-feature-type = UBYTE\n",
"\t\t\t\t\tfeatures-resource-hash = 8D422C7B0A1C1C79245A5BCF07FE86E33EEAFEE792B84584AEC276F5A2DBC4E6\n",
@@ -876,9 +876,9 @@
"\t\t\tnum-examples = 10000\n",
"\t\t\tnum-features = 668\n",
"\t\t\tnum-outputs = 10\n",
- "\t\t\ttribuo-version = 4.1.0\n",
+ "\t\t\ttribuo-version = 4.2.0\n",
"\t\t)\n",
- "\ttribuo-version = 4.1.0\n",
+ "\ttribuo-version = 4.2.0\n",
")\n"
]
}
@@ -906,7 +906,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training transformed logistic regression took (00:00:05:252)\n"
+ "Training transformed logistic regression took (00:00:04:707)\n"
]
}
],
@@ -1113,7 +1113,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "17-ea+22-1964"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/document-classification-tribuo-v4.ipynb b/tutorials/document-classification-tribuo-v4.ipynb
index 6bbf85e6c..ca1ffcfc6 100644
--- a/tutorials/document-classification-tribuo-v4.ipynb
+++ b/tutorials/document-classification-tribuo-v4.ipynb
@@ -49,8 +49,8 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-onnx-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-onnx-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -198,7 +198,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training the model on BoW features took (00:00:09:659)\n",
+ "Training the model on BoW features took (00:00:09:601)\n",
"\n",
"Class n tp fn fp recall prec f1\n",
"soc.religion.christian 398 352 46 110 0.884 0.762 0.819\n",
@@ -244,7 +244,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "We got a macro F1 score of 79.1%, which is a fairly good starting point and it's roughly what other linear models get on this task (e.g., scikit-learn's text classification tutorial gets 76.9% macro F1 when using a similar multinomial Naive Bayes model)."
+ "We got a macro F1 score of 79.6%, which is a fairly good starting point and it's roughly what other linear models get on this task (e.g., scikit-learn's text classification tutorial gets 76.9% macro F1 when using a similar multinomial Naive Bayes model)."
]
},
{
@@ -291,7 +291,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training the model on Unigram features took (00:00:10:529)\n",
+ "Training the model on Unigram features took (00:00:09:146)\n",
"\n",
"Class n tp fn fp recall prec f1\n",
"soc.religion.christian 398 362 36 88 0.910 0.804 0.854\n",
@@ -381,7 +381,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training the model on Bigram features took (00:00:41:981)\n",
+ "Training the model on Bigram features took (00:00:43:790)\n",
"\n",
"Class n tp fn fp recall prec f1\n",
"soc.religion.christian 398 331 67 57 0.832 0.853 0.842\n",
@@ -480,7 +480,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training the model on TF-IDF features took (00:00:42:471)\n",
+ "Training the model on TF-IDF features took (00:00:45:063)\n",
"\n",
"Class n tp fn fp recall prec f1\n",
"soc.religion.christian 398 350 48 183 0.879 0.657 0.752\n",
@@ -570,7 +570,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training the model on hashed features took (00:00:24:289)\n",
+ "Training the model on hashed features took (00:00:23:354)\n",
"\n",
"Class n tp fn fp recall prec f1\n",
"soc.religion.christian 398 306 92 125 0.769 0.710 0.738\n",
@@ -662,7 +662,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training the model on trimmed TF-IDF features took (00:00:19:049)\n",
+ "Training the model on trimmed TF-IDF features took (00:00:19:928)\n",
"\n",
"Class n tp fn fp recall prec f1\n",
"soc.religion.christian 398 337 61 93 0.847 0.784 0.814\n",
@@ -707,7 +707,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "As with the feature hashing above, this model trains more quickly because there is less data to process, but the speed improvement is more stubstantial as the number of features in each example is lower (because the hashing produces a denser example than trimming out infrequent features). Performance dropped slightly as compared to the TF-IDF model, but again it is around 10% of the parameters, with a corresponding reduction in memory and runtime in inference and training. Performance is improved over the hashing as we're not colliding features at random, we're simply removing ones which are infrequent. If a feature is infrequent we probably can't estimate the weight for it very well so it helps remove some of the noise.\n",
+ "As with the feature hashing above, this model trains more quickly because there is less data to process, but the speed improvement is more substantial as the number of features in each example is lower (because the hashing produces a denser example than trimming out infrequent features). Performance dropped slightly as compared to the TF-IDF model, but again it is around 10% of the parameters, with a corresponding reduction in memory and runtime in inference and training. Performance is improved over the hashing as we're not colliding features at random, we're simply removing ones which are infrequent. If a feature is infrequent we probably can't estimate the weight for it very well so it helps remove some of the noise.\n",
"\n",
"Choosing which one of feature hashing and trimming out infrequent features to apply is problem dependent. Feature hashing can work in denser feature spaces than trimming infrequent features, but both still require some amount of sparsity in the problem to have any useful effect. With text datasets then trimming the infrequent words/features is usually helpful."
]
@@ -750,7 +750,7 @@
"text": [
"bert training data size = 11314, number of features = 768, number of classes = 20\n",
"bert testing data size = 7532, number of features = 768, number of classes = 20\n",
- "Extracting features with BERT took (01:06:52:756)\n"
+ "Extracting features with BERT took (00:38:37:476)\n"
]
}
],
@@ -789,7 +789,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training a LR on BERT features took (00:00:08:960)\n",
+ "Training a LR on BERT features took (00:00:06:082)\n",
"Class n tp fn fp recall prec f1\n",
"soc.religion.christian 398 353 45 111 0.887 0.761 0.819\n",
"rec.autos 396 332 64 99 0.838 0.770 0.803\n",
@@ -880,7 +880,7 @@
"\t\t\tclass-name = org.tribuo.classification.LabelFactory\n",
"\t\t)\n",
"\tfile-modified-time = 2003-03-18T07:24:55-05:00\n",
- "\tdatasource-creation-time = 2021-05-24T12:46:58.801385-04:00\n",
+ "\tdatasource-creation-time = 2021-12-18T20:50:57.169758-05:00\n",
")\n"
]
}
@@ -918,7 +918,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "17-ea+22-1964"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/external-models-tribuo-v4.ipynb b/tutorials/external-models-tribuo-v4.ipynb
index f9cf61689..72d17fc4d 100644
--- a/tutorials/external-models-tribuo-v4.ipynb
+++ b/tutorials/external-models-tribuo-v4.ipynb
@@ -24,8 +24,8 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars tribuo-onnx-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n",
+ "%jars tribuo-onnx-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -469,7 +469,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "17+35-LTS-2724"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/irises-tribuo-v4.ipynb b/tutorials/irises-tribuo-v4.ipynb
index fa10fe888..8cf09625f 100644
--- a/tutorials/irises-tribuo-v4.ipynb
+++ b/tutorials/irises-tribuo-v4.ipynb
@@ -27,8 +27,8 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -410,7 +410,7 @@
"\t\t\tdataPath = /Users/apocock/Development/Tribuo/tutorials/bezdekIris.data\n",
"\t\t\tresource-hash = 0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC\n",
"\t\t\tfile-modified-time = 1999-12-14T15:12:39-05:00\n",
- "\t\t\tdatasource-creation-time = 2021-11-01T12:52:18.814629-04:00\n",
+ "\t\t\tdatasource-creation-time = 2021-12-18T20:31:02.286464-05:00\n",
"\t\t\thost-short-name = DataSource\n",
"\t\t)\n",
"\ttrain-proportion = 0.7\n",
@@ -462,7 +462,7 @@
"\t\t\tclass-name = org.tribuo.classification.sgd.objectives.LogMulticlass\n",
"\t\t\thost-short-name = LabelObjective\n",
"\t\t)\n",
- "\ttribuo-version = 4.2.0-SNAPSHOT\n",
+ "\ttribuo-version = 4.2.0\n",
"\ttrain-invocation-count = 0\n",
"\tis-sequence = false\n",
"\thost-short-name = Trainer\n",
@@ -523,7 +523,7 @@
" \"tribuo-version\" : {\n",
" \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n",
" \"key\" : \"tribuo-version\",\n",
- " \"value\" : \"4.2.0-SNAPSHOT\",\n",
+ " \"value\" : \"4.2.0\",\n",
" \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.StringProvenance\",\n",
" \"additional\" : \"\",\n",
" \"is-reference\" : false\n",
@@ -531,7 +531,7 @@
" \"java-version\" : {\n",
" \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n",
" \"key\" : \"java-version\",\n",
- " \"value\" : \"17\",\n",
+ " \"value\" : \"17.0.1\",\n",
" \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.StringProvenance\",\n",
" \"additional\" : \"\",\n",
" \"is-reference\" : false\n",
@@ -555,7 +555,7 @@
" \"trained-at\" : {\n",
" \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n",
" \"key\" : \"trained-at\",\n",
- " \"value\" : \"2021-11-01T12:52:19.228195-04:00\",\n",
+ " \"value\" : \"2021-12-18T20:31:02.707624-05:00\",\n",
" \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.DateTimeProvenance\",\n",
" \"additional\" : \"\",\n",
" \"is-reference\" : false\n",
@@ -618,7 +618,7 @@
" \"tribuo-version\" : {\n",
" \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n",
" \"key\" : \"tribuo-version\",\n",
- " \"value\" : \"4.2.0-SNAPSHOT\",\n",
+ " \"value\" : \"4.2.0\",\n",
" \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.StringProvenance\",\n",
" \"additional\" : \"\",\n",
" \"is-reference\" : false\n",
@@ -677,7 +677,7 @@
" \"tribuo-version\" : {\n",
" \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n",
" \"key\" : \"tribuo-version\",\n",
- " \"value\" : \"4.2.0-SNAPSHOT\",\n",
+ " \"value\" : \"4.2.0\",\n",
" \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.StringProvenance\",\n",
" \"additional\" : \"\",\n",
" \"is-reference\" : false\n",
@@ -982,7 +982,7 @@
" \"datasource-creation-time\" : {\n",
" \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n",
" \"key\" : \"datasource-creation-time\",\n",
- " \"value\" : \"2021-11-01T12:52:18.814629-04:00\",\n",
+ " \"value\" : \"2021-12-18T20:31:02.286464-05:00\",\n",
" \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.DateTimeProvenance\",\n",
" \"additional\" : \"\",\n",
" \"is-reference\" : false\n",
@@ -1443,7 +1443,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "linear-sgd-model - Model(class-name=org.tribuo.classification.sgd.linear.LinearSGDModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=SplitDataSourceProvenance(className=org.tribuo.evaluation.TrainTestSplitter,innerSourceProvenance=DataSource(class-name=org.tribuo.data.csv.CSVDataSource,headers=[sepalLength, sepalWidth, petalLength, petalWidth, species],rowProcessor=RowProcessor(class-name=org.tribuo.data.columnar.RowProcessor,metadataExtractors=[],fieldProcessorList=[FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor)],featureProcessors=[],responseProcessor=ResponseProcessor(class-name=org.tribuo.data.columnar.processors.response.FieldResponseProcessor,uppercase=false,fieldNames=[species],defaultValues=[],displayField=false,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),host-short-name=ResponseProcessor),weightExtractor=null,replaceNewlinesWithSpaces=true,regexMappingProcessors={},host-short-name=RowProcessor),quote=\",outputRequired=true,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),separator=,,dataPath=/Users/apocock/Development/Tribuo/tutorials/bezdekIris.data,resource-hash=SHA-256[0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC],file-modified-time=1999-12-14T15:12:39-05:00,datasource-creation-time=2021-11-01T12:52:18.814629-04:00,host-short-name=DataSource),trainProportion=0.7,seed=1,size=150,isTrain=true),transformations=[],is-sequence=false,is-dense=true,num-examples=105,num-features=4,num-outputs=3,tribuo-version=4.2.0-SNAPSHOT),trainer=Trainer(class-name=org.tribuo.classification.sgd.linear.LogisticRegressionTrainer,seed=12345,minibatchSize=1,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=1.0,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=1000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0-SNAPSHOT,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-11-01T12:52:19.228195-04:00,instance-values={},tribuo-version=4.2.0-SNAPSHOT,java-version=17,os-name=Mac OS X,os-arch=x86_64)\n"
+ "linear-sgd-model - Model(class-name=org.tribuo.classification.sgd.linear.LinearSGDModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=SplitDataSourceProvenance(className=org.tribuo.evaluation.TrainTestSplitter,innerSourceProvenance=DataSource(class-name=org.tribuo.data.csv.CSVDataSource,headers=[sepalLength, sepalWidth, petalLength, petalWidth, species],rowProcessor=RowProcessor(class-name=org.tribuo.data.columnar.RowProcessor,metadataExtractors=[],fieldProcessorList=[FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor)],featureProcessors=[],responseProcessor=ResponseProcessor(class-name=org.tribuo.data.columnar.processors.response.FieldResponseProcessor,uppercase=false,fieldNames=[species],defaultValues=[],displayField=false,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),host-short-name=ResponseProcessor),weightExtractor=null,replaceNewlinesWithSpaces=true,regexMappingProcessors={},host-short-name=RowProcessor),quote=\",outputRequired=true,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),separator=,,dataPath=/Users/apocock/Development/Tribuo/tutorials/bezdekIris.data,resource-hash=SHA-256[0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC],file-modified-time=1999-12-14T15:12:39-05:00,datasource-creation-time=2021-12-18T20:31:02.286464-05:00,host-short-name=DataSource),trainProportion=0.7,seed=1,size=150,isTrain=true),transformations=[],is-sequence=false,is-dense=true,num-examples=105,num-features=4,num-outputs=3,tribuo-version=4.2.0),trainer=Trainer(class-name=org.tribuo.classification.sgd.linear.LogisticRegressionTrainer,seed=12345,minibatchSize=1,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=1.0,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=1000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-12-18T20:31:02.707624-05:00,instance-values={},tribuo-version=4.2.0,java-version=17.0.1,os-name=Mac OS X,os-arch=x86_64)\n"
]
}
],
@@ -1468,12 +1468,12 @@
"output_type": "stream",
"text": [
"{\n",
- " \"tribuo-version\" : \"4.2.0-SNAPSHOT\",\n",
+ " \"tribuo-version\" : \"4.2.0\",\n",
" \"dataset-provenance\" : {\n",
" \"num-features\" : \"4\",\n",
" \"num-examples\" : \"45\",\n",
" \"num-outputs\" : \"3\",\n",
- " \"tribuo-version\" : \"4.2.0-SNAPSHOT\",\n",
+ " \"tribuo-version\" : \"4.2.0\",\n",
" \"datasource\" : {\n",
" \"train-proportion\" : \"0.7\",\n",
" \"seed\" : \"1\",\n",
@@ -1531,7 +1531,7 @@
" \"file-modified-time\" : \"1999-12-14T15:12:39-05:00\",\n",
" \"quote\" : \"\\\"\",\n",
" \"outputRequired\" : \"true\",\n",
- " \"datasource-creation-time\" : \"2021-11-01T12:52:18.814629-04:00\",\n",
+ " \"datasource-creation-time\" : \"2021-12-18T20:31:02.286464-05:00\",\n",
" \"outputFactory\" : {\n",
" \"class-name\" : \"org.tribuo.classification.LabelFactory\"\n",
" },\n",
@@ -1551,11 +1551,11 @@
" \"class-name\" : \"org.tribuo.provenance.EvaluationProvenance\",\n",
" \"model-provenance\" : {\n",
" \"instance-values\" : { },\n",
- " \"tribuo-version\" : \"4.2.0-SNAPSHOT\",\n",
- " \"java-version\" : \"17\",\n",
+ " \"tribuo-version\" : \"4.2.0\",\n",
+ " \"java-version\" : \"17.0.1\",\n",
" \"trainer\" : {\n",
" \"seed\" : \"12345\",\n",
- " \"tribuo-version\" : \"4.2.0-SNAPSHOT\",\n",
+ " \"tribuo-version\" : \"4.2.0\",\n",
" \"minibatchSize\" : \"1\",\n",
" \"train-invocation-count\" : \"0\",\n",
" \"is-sequence\" : \"false\",\n",
@@ -1577,13 +1577,13 @@
" }\n",
" },\n",
" \"os-arch\" : \"x86_64\",\n",
- " \"trained-at\" : \"2021-11-01T12:52:19.228195-04:00\",\n",
+ " \"trained-at\" : \"2021-12-18T20:31:02.707624-05:00\",\n",
" \"os-name\" : \"Mac OS X\",\n",
" \"dataset\" : {\n",
" \"num-features\" : \"4\",\n",
" \"num-examples\" : \"105\",\n",
" \"num-outputs\" : \"3\",\n",
- " \"tribuo-version\" : \"4.2.0-SNAPSHOT\",\n",
+ " \"tribuo-version\" : \"4.2.0\",\n",
" \"datasource\" : {\n",
" \"train-proportion\" : \"0.7\",\n",
" \"seed\" : \"1\",\n",
@@ -1641,7 +1641,7 @@
" \"file-modified-time\" : \"1999-12-14T15:12:39-05:00\",\n",
" \"quote\" : \"\\\"\",\n",
" \"outputRequired\" : \"true\",\n",
- " \"datasource-creation-time\" : \"2021-11-01T12:52:18.814629-04:00\",\n",
+ " \"datasource-creation-time\" : \"2021-12-18T20:31:02.286464-05:00\",\n",
" \"outputFactory\" : {\n",
" \"class-name\" : \"org.tribuo.classification.LabelFactory\"\n",
" },\n",
@@ -1802,7 +1802,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "17+35-LTS-2724"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/multi-label-tribuo-v4.ipynb b/tutorials/multi-label-tribuo-v4.ipynb
index df14d7b7e..637cc1ea2 100644
--- a/tutorials/multi-label-tribuo-v4.ipynb
+++ b/tutorials/multi-label-tribuo-v4.ipynb
@@ -32,8 +32,8 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-multilabel-sgd-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars ./tribuo-multilabel-sgd-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -172,7 +172,7 @@
"output_type": "stream",
"text": [
"\n",
- "Linear model training took (00:00:00:206)\n"
+ "Linear model training took (00:00:00:245)\n"
]
}
],
@@ -201,7 +201,7 @@
"output_type": "stream",
"text": [
"\n",
- "Tree model training took (00:00:03:805)\n"
+ "Tree model training took (00:00:03:499)\n"
]
}
],
@@ -256,7 +256,7 @@
"output_type": "stream",
"text": [
"\n",
- "Linear model evaluation took (00:00:00:068)\n",
+ "Linear model evaluation took (00:00:00:073)\n",
"Class n tp fn fp recall prec f1\n",
"(LabelSet={12}) 683 677 6 230 0.991 0.746 0.852\n",
"(LabelSet={13}) 13 0 13 0 0.000 0.000 0.000\n",
@@ -307,7 +307,7 @@
"output_type": "stream",
"text": [
"\n",
- "Tree model evaluation took (00:00:00:086)\n",
+ "Tree model evaluation took (00:00:00:085)\n",
"Class n tp fn fp recall prec f1\n",
"(LabelSet={12}) 683 607 76 201 0.889 0.751 0.814\n",
"(LabelSet={13}) 13 0 13 2 0.000 0.000 0.000\n",
@@ -387,8 +387,8 @@
"output_type": "stream",
"text": [
"\n",
- "Classifier Chain model training took (00:00:03:344)\n",
- "Classifier Chain model evaluation took (00:00:00:152)\n",
+ "Classifier Chain model training took (00:00:03:195)\n",
+ "Classifier Chain model evaluation took (00:00:00:146)\n",
"Class n tp fn fp recall prec f1\n",
"(LabelSet={12}) 683 616 67 203 0.902 0.752 0.820\n",
"(LabelSet={13}) 13 0 13 2 0.000 0.000 0.000\n",
@@ -448,8 +448,8 @@
"output_type": "stream",
"text": [
"\n",
- "Classifier Chain Ensemble model training took (00:01:05:893)\n",
- "Classifier Chain Ensemble model evaluation took (00:00:02:475)\n",
+ "Classifier Chain Ensemble model training took (00:01:04:418)\n",
+ "Classifier Chain Ensemble model evaluation took (00:00:02:474)\n",
"Class n tp fn fp recall prec f1\n",
"(LabelSet={12}) 683 629 54 216 0.921 0.744 0.823\n",
"(LabelSet={13}) 13 0 13 1 0.000 0.000 0.000\n",
@@ -494,7 +494,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "As expected the classifier chain ensemble outperformed the binary relevance model and the single classifier chain when using trees as the base learner, at the cost of the greatest runtime. It did this by significantly decreasing the number of false positives, at the cost of a small increase in false negatives. We didn't quite beat the performance of the linear model in terms of Jaccard score, but in general classifier chains are a powerful multi-label approach, and we could always use a the linear model as a base learner (and if you do, then you do improve the Jaccard score above 0.497). We leave the implementation of that as an exercise for the reader.\n",
+ "As expected the classifier chain ensemble outperformed the binary relevance model and the single classifier chain when using trees as the base learner, at the cost of the greatest runtime. It did this by significantly decreasing the number of false positives, at the cost of a small increase in false negatives. We didn't quite beat the performance of the linear model in terms of Jaccard score, but in general classifier chains are a powerful multi-label approach, and we could always use the linear model as a base learner (and if you do, then you do improve the Jaccard score above 0.497). We leave the implementation of that as an exercise for the reader.\n",
"\n",
"## Conclusion\n",
"\n",
@@ -514,7 +514,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "11.0.10+8-LTS-162"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/onnx-export-tribuo-v4.ipynb b/tutorials/onnx-export-tribuo-v4.ipynb
index 77e25c14b..29fee8df0 100644
--- a/tutorials/onnx-export-tribuo-v4.ipynb
+++ b/tutorials/onnx-export-tribuo-v4.ipynb
@@ -37,10 +37,10 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-oci-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-onnx-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-oci-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-onnx-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -150,7 +150,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training factorization machine took (00:00:18:816)\n"
+ "Training factorization machine took (00:00:11:305)\n"
]
}
],
@@ -177,7 +177,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Scoring factorization machine took (00:00:00:475)\n",
+ "Scoring factorization machine took (00:00:00:412)\n",
"Class n tp fn fp recall prec f1\n",
"0 980 959 21 31 0.979 0.969 0.974\n",
"1 1,135 1,120 15 22 0.987 0.981 0.984\n",
@@ -352,7 +352,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Scoring ONNX factorization machine took (00:00:01:578)\n",
+ "Scoring ONNX factorization machine took (00:00:00:810)\n",
"Class n tp fn fp recall prec f1\n",
"0 980 959 21 31 0.979 0.969 0.974\n",
"1 1,135 1,120 15 22 0.987 0.981 0.984\n",
@@ -422,7 +422,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "An important part of a Tribuo model is the provenance. We don't want to lose that information when exporting models to ONNX format, so we encode the provenance in the ONNX protobuf. It uses the marshalled provenance format from OLCUT, and the protos are available in OLCUT so they could be parsed in other systems. As a result when loading in a Tribuo-exported ONNX model the `ONNXExternalModel` class has two provenance objects, one for the `ONNXExternalModel` itself, and one for the original Model object.\n",
+ "An important part of a Tribuo model is the provenance. We don't want to lose that information when exporting models to ONNX format, so we encode the provenance in the ONNX protobuf. It uses the marshalled provenance format from OLCUT, and the protos are available in OLCUT so they could be parsed in other systems. As a result when loading in a Tribuo-exported ONNX model the `ONNXExternalModel` class has two provenance objects, one for the `ONNXExternalModel` itself, and one for the original `Model` object.\n",
"\n",
"Let's examine both of these provenances. First the one for the `ONNXExternalModel`:"
]
@@ -446,7 +446,7 @@
"\t\t\t\t\toutputFactory = LabelFactory(\n",
"\t\t\t\t\t\t\tclass-name = org.tribuo.classification.LabelFactory\n",
"\t\t\t\t\t\t)\n",
- "\t\t\t\t\tdatasource-creation-time = 2021-12-14T15:03:45.571121-05:00\n",
+ "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:36:37.266127-05:00\n",
"\t\t\t\t)\n",
"\t\t\ttransformations = List[]\n",
"\t\t\tis-sequence = false\n",
@@ -454,25 +454,25 @@
"\t\t\tnum-examples = -1\n",
"\t\t\tnum-features = 717\n",
"\t\t\tnum-outputs = 10\n",
- "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n",
+ "\t\t\ttribuo-version = 4.2.0\n",
"\t\t)\n",
"\ttrainer = Trainer(\n",
"\t\t\tclass-name = org.tribuo.Trainer\n",
- "\t\t\tfileModifiedTime = 2021-12-14T15:03:44.423-05:00\n",
- "\t\t\tmodelHash = 5934A79EA0B7A569DF2A42F08BE2DBED1C3E7D25A90C33D811D77502AEEFA431\n",
+ "\t\t\tfileModifiedTime = 2021-12-18T20:36:36.445-05:00\n",
+ "\t\t\tmodelHash = 06071247AEDE7539B899A2D530508D8E2B43304B8A7884A257368AA2CF1C18ED\n",
"\t\t\tlocation = file:/Users/apocock/Development/Tribuo/tutorials/./fm-mnist.onnx\n",
"\t\t)\n",
- "\ttrained-at = 2021-12-14T15:03:45.568284-05:00\n",
+ "\ttrained-at = 2021-12-18T20:36:37.263832-05:00\n",
"\tinstance-values = Map{\n",
"\t\tmodel-domain=org.tribuo.tutorials.onnxexport.fm\n",
"\t\tmodel-graphname=FMClassificationModel\n",
- "\t\tmodel-description=factorization-machine-model - Model(class-name=org.tribuo.classification.sgd.fm.FMClassificationModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=DataSource(class-name=org.tribuo.datasource.IDXDataSource,outputPath=/Users/apocock/Development/Tribuo/tutorials/train-labels-idx1-ubyte.gz,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),featuresPath=/Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz,features-file-modified-time=2000-07-21T14:20:24-04:00,output-resource-hash=SHA-256[3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C],datasource-creation-time=2021-12-14T15:03:23.159717-05:00,output-file-modified-time=2000-07-21T14:20:27-04:00,idx-feature-type=UBYTE,features-resource-hash=SHA-256[440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609],host-short-name=DataSource),transformations=[],is-sequence=false,is-dense=false,num-examples=60000,num-features=717,num-outputs=10,tribuo-version=4.2.0-SNAPSHOT),trainer=Trainer(class-name=org.tribuo.classification.sgd.fm.FMClassificationTrainer,seed=12345,variance=0.1,minibatchSize=1,factorizedDimSize=6,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=0.1,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=30000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0-SNAPSHOT,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-12-14T15:03:43.488204-05:00,instance-values={},tribuo-version=4.2.0-SNAPSHOT,java-version=11.0.10,os-name=Mac OS X,os-arch=x86_64)\n",
+ "\t\tmodel-description=factorization-machine-model - Model(class-name=org.tribuo.classification.sgd.fm.FMClassificationModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=DataSource(class-name=org.tribuo.datasource.IDXDataSource,outputPath=/Users/apocock/Development/Tribuo/tutorials/train-labels-idx1-ubyte.gz,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),featuresPath=/Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz,features-file-modified-time=2000-07-21T14:20:24-04:00,output-resource-hash=SHA-256[3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C],datasource-creation-time=2021-12-18T20:36:23.109293-05:00,output-file-modified-time=2000-07-21T14:20:27-04:00,idx-feature-type=UBYTE,features-resource-hash=SHA-256[440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609],host-short-name=DataSource),transformations=[],is-sequence=false,is-dense=false,num-examples=60000,num-features=717,num-outputs=10,tribuo-version=4.2.0),trainer=Trainer(class-name=org.tribuo.classification.sgd.fm.FMClassificationTrainer,seed=12345,variance=0.1,minibatchSize=1,factorizedDimSize=6,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=0.1,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=30000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-12-18T20:36:35.640663-05:00,instance-values={},tribuo-version=4.2.0,java-version=17.0.1,os-name=Mac OS X,os-arch=x86_64)\n",
"\t\tmodel-producer=Tribuo\n",
"\t\tmodel-version=0\n",
"\t\tinput-name=input\n",
"\t}\n",
- "\ttribuo-version = 4.2.0-SNAPSHOT\n",
- "\tjava-version = 11.0.10\n",
+ "\ttribuo-version = 4.2.0\n",
+ "\tjava-version = 17.0.1\n",
"\tos-name = Mac OS X\n",
"\tos-arch = x86_64\n",
")\n"
@@ -515,7 +515,7 @@
"\t\t\t\t\tfeaturesPath = /Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz\n",
"\t\t\t\t\tfeatures-file-modified-time = 2000-07-21T14:20:24-04:00\n",
"\t\t\t\t\toutput-resource-hash = 3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C\n",
- "\t\t\t\t\tdatasource-creation-time = 2021-12-14T15:03:23.159717-05:00\n",
+ "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:36:23.109293-05:00\n",
"\t\t\t\t\toutput-file-modified-time = 2000-07-21T14:20:27-04:00\n",
"\t\t\t\t\tidx-feature-type = UBYTE\n",
"\t\t\t\t\tfeatures-resource-hash = 440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609\n",
@@ -527,7 +527,7 @@
"\t\t\tnum-examples = 60000\n",
"\t\t\tnum-features = 717\n",
"\t\t\tnum-outputs = 10\n",
- "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n",
+ "\t\t\ttribuo-version = 4.2.0\n",
"\t\t)\n",
"\ttrainer = FMClassificationTrainer(\n",
"\t\t\tclass-name = org.tribuo.classification.sgd.fm.FMClassificationTrainer\n",
@@ -549,15 +549,15 @@
"\t\t\t\t\tclass-name = org.tribuo.classification.sgd.objectives.LogMulticlass\n",
"\t\t\t\t\thost-short-name = LabelObjective\n",
"\t\t\t\t)\n",
- "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n",
+ "\t\t\ttribuo-version = 4.2.0\n",
"\t\t\ttrain-invocation-count = 0\n",
"\t\t\tis-sequence = false\n",
"\t\t\thost-short-name = Trainer\n",
"\t\t)\n",
- "\ttrained-at = 2021-12-14T15:03:43.488204-05:00\n",
+ "\ttrained-at = 2021-12-18T20:36:35.640663-05:00\n",
"\tinstance-values = Map{}\n",
- "\ttribuo-version = 4.2.0-SNAPSHOT\n",
- "\tjava-version = 11.0.10\n",
+ "\ttribuo-version = 4.2.0\n",
+ "\tjava-version = 17.0.1\n",
"\tos-name = Mac OS X\n",
"\tos-arch = x86_64\n",
")\n"
@@ -648,7 +648,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Scoring ensemble took (00:00:00:880)\n",
+ "Scoring ensemble took (00:00:00:675)\n",
"Class n tp fn fp recall prec f1\n",
"0 980 965 15 43 0.985 0.957 0.971\n",
"1 1,135 1,119 16 34 0.986 0.971 0.978\n",
@@ -725,7 +725,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Scoring ONNX ensemble took (00:00:01:901)\n",
+ "Scoring ONNX ensemble took (00:00:01:021)\n",
"Predictions are equal - true\n"
]
}
@@ -762,7 +762,7 @@
"source": [
"// Set these variables appropriately for your OCI account\n",
"var compartmentID = \"your-oci-compartment-id\";\n",
- "var projectID = \"your-oci-ds-project-id\";\n"
+ "var projectID = \"your-oci-ds-project-id\";"
]
},
{
@@ -944,7 +944,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "11.0.10+8-LTS-162"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/regression-tribuo-v4.ipynb b/tutorials/regression-tribuo-v4.ipynb
index 292c6568c..02e8611eb 100644
--- a/tutorials/regression-tribuo-v4.ipynb
+++ b/tutorials/regression-tribuo-v4.ipynb
@@ -23,10 +23,10 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-regression-sgd-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-regression-xgboost-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-regression-tree-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-regression-sgd-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-regression-xgboost-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-regression-tree-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -264,7 +264,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training Linear Regression (SGD) took (00:00:00:123)\n",
+ "Training Linear Regression (SGD) took (00:00:00:070)\n",
"Evaluation (train):\n",
" RMSE 0.979522\n",
" MAE 0.741870\n",
@@ -357,7 +357,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training Linear Regression (AdaGrad) took (00:00:00:091)\n",
+ "Training Linear Regression (AdaGrad) took (00:00:00:041)\n",
"Evaluation (train):\n",
" RMSE 0.735311\n",
" MAE 0.575096\n",
@@ -403,7 +403,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training CART took (00:00:00:060)\n",
+ "Training CART took (00:00:00:071)\n",
"Evaluation (train):\n",
" RMSE 0.544516\n",
" MAE 0.405062\n",
@@ -436,7 +436,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Training XGBoost took (00:00:00:320)\n",
+ "Training XGBoost took (00:00:00:263)\n",
"Evaluation (train):\n",
" RMSE 0.143871\n",
" MAE 0.097167\n",
@@ -477,7 +477,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "17-ea+22-1964"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/reproducibility-tribuo-v4.ipynb b/tutorials/reproducibility-tribuo-v4.ipynb
index a5c6a8565..2f90f645b 100644
--- a/tutorials/reproducibility-tribuo-v4.ipynb
+++ b/tutorials/reproducibility-tribuo-v4.ipynb
@@ -21,10 +21,10 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-onnx-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n",
- "%jars ./tribuo-reproducibility-4.2.0-SNAPSHOT.jar"
+ "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-onnx-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar\n",
+ "%jars ./tribuo-reproducibility-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -68,7 +68,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "linear-sgd-model - Model(class-name=org.tribuo.classification.sgd.linear.LinearSGDModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=SplitDataSourceProvenance(className=org.tribuo.evaluation.TrainTestSplitter,innerSourceProvenance=DataSource(class-name=org.tribuo.data.csv.CSVDataSource,headers=[sepalLength, sepalWidth, petalLength, petalWidth, species],rowProcessor=RowProcessor(class-name=org.tribuo.data.columnar.RowProcessor,metadataExtractors=[],fieldProcessorList=[FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor)],featureProcessors=[],responseProcessor=ResponseProcessor(class-name=org.tribuo.data.columnar.processors.response.FieldResponseProcessor,uppercase=false,fieldNames=[species],defaultValues=[],displayField=false,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),host-short-name=ResponseProcessor),weightExtractor=null,replaceNewlinesWithSpaces=true,regexMappingProcessors={},host-short-name=RowProcessor),quote=\",outputRequired=true,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),separator=,,dataPath=/Users/apocock/Development/Tribuo/tutorials/bezdekIris.data,resource-hash=SHA-256[0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC],file-modified-time=1999-12-14T15:12:39-05:00,datasource-creation-time=2021-11-01T12:52:18.814629-04:00,host-short-name=DataSource),trainProportion=0.7,seed=1,size=150,isTrain=true),transformations=[],is-sequence=false,is-dense=true,num-examples=105,num-features=4,num-outputs=3,tribuo-version=4.2.0-SNAPSHOT),trainer=Trainer(class-name=org.tribuo.classification.sgd.linear.LogisticRegressionTrainer,seed=12345,minibatchSize=1,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=1.0,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=1000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0-SNAPSHOT,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-11-01T12:52:19.228195-04:00,instance-values={},tribuo-version=4.2.0-SNAPSHOT,java-version=17,os-name=Mac OS X,os-arch=x86_64)\n"
+ "linear-sgd-model - Model(class-name=org.tribuo.classification.sgd.linear.LinearSGDModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=SplitDataSourceProvenance(className=org.tribuo.evaluation.TrainTestSplitter,innerSourceProvenance=DataSource(class-name=org.tribuo.data.csv.CSVDataSource,headers=[sepalLength, sepalWidth, petalLength, petalWidth, species],rowProcessor=RowProcessor(class-name=org.tribuo.data.columnar.RowProcessor,metadataExtractors=[],fieldProcessorList=[FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor)],featureProcessors=[],responseProcessor=ResponseProcessor(class-name=org.tribuo.data.columnar.processors.response.FieldResponseProcessor,uppercase=false,fieldNames=[species],defaultValues=[],displayField=false,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),host-short-name=ResponseProcessor),weightExtractor=null,replaceNewlinesWithSpaces=true,regexMappingProcessors={},host-short-name=RowProcessor),quote=\",outputRequired=true,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),separator=,,dataPath=/Users/apocock/Development/Tribuo/tutorials/bezdekIris.data,resource-hash=SHA-256[0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC],file-modified-time=1999-12-14T15:12:39-05:00,datasource-creation-time=2021-12-18T20:31:02.286464-05:00,host-short-name=DataSource),trainProportion=0.7,seed=1,size=150,isTrain=true),transformations=[],is-sequence=false,is-dense=true,num-examples=105,num-features=4,num-outputs=3,tribuo-version=4.2.0),trainer=Trainer(class-name=org.tribuo.classification.sgd.linear.LogisticRegressionTrainer,seed=12345,minibatchSize=1,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=1.0,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=1000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-12-18T20:31:02.707624-05:00,instance-values={},tribuo-version=4.2.0,java-version=17.0.1,os-name=Mac OS X,os-arch=x86_64)\n"
]
}
],
@@ -195,7 +195,7 @@
"\t\t\t\t\tdataPath = /Users/apocock/Development/Tribuo/tutorials/bezdekIris.data\n",
"\t\t\t\t\tresource-hash = 0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC\n",
"\t\t\t\t\tfile-modified-time = 1999-12-14T15:12:39-05:00\n",
- "\t\t\t\t\tdatasource-creation-time = 2021-11-03T09:51:39.561821-04:00\n",
+ "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:38:43.398834-05:00\n",
"\t\t\t\t\thost-short-name = DataSource\n",
"\t\t\t\t)\n",
"\t\t\ttrain-proportion = 0.7\n",
@@ -209,7 +209,7 @@
"\tnum-examples = 105\n",
"\tnum-features = 4\n",
"\tnum-outputs = 3\n",
- "\ttribuo-version = 4.2.0-SNAPSHOT\n",
+ "\ttribuo-version = 4.2.0\n",
")\n"
]
}
@@ -254,7 +254,7 @@
"\t\t\tclass-name = org.tribuo.classification.sgd.objectives.LogMulticlass\n",
"\t\t\thost-short-name = LabelObjective\n",
"\t\t)\n",
- "\ttribuo-version = 4.2.0-SNAPSHOT\n",
+ "\ttribuo-version = 4.2.0\n",
"\ttrain-invocation-count = 0\n",
"\tis-sequence = false\n",
"\thost-short-name = Trainer\n",
@@ -305,15 +305,15 @@
" \"datasource\" : {\n",
" \"source\" : {\n",
" \"datasource-creation-time\" : {\n",
- " \"original\" : \"2021-11-01T12:52:18.814629-04:00\",\n",
- " \"reproduced\" : \"2021-11-03T09:51:39.561821-04:00\"\n",
+ " \"original\" : \"2021-12-18T20:31:02.286464-05:00\",\n",
+ " \"reproduced\" : \"2021-12-18T20:38:43.398834-05:00\"\n",
" }\n",
" }\n",
" }\n",
" },\n",
" \"trained-at\" : {\n",
- " \"original\" : \"2021-11-01T12:52:19.228195-04:00\",\n",
- " \"reproduced\" : \"2021-11-03T09:51:39.842601-04:00\"\n",
+ " \"original\" : \"2021-12-18T20:31:02.707624-05:00\",\n",
+ " \"reproduced\" : \"2021-12-18T20:38:43.655448-05:00\"\n",
" }\n",
"}\n"
]
@@ -433,7 +433,7 @@
"\t\t\t\t\toutputFactory = LabelFactory(\n",
"\t\t\t\t\t\t\tclass-name = org.tribuo.classification.LabelFactory\n",
"\t\t\t\t\t\t)\n",
- "\t\t\t\t\tdatasource-creation-time = 2021-11-03T09:51:50.151668-04:00\n",
+ "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:38:52.702297-05:00\n",
"\t\t\t\t)\n",
"\t\t\ttransformations = List[]\n",
"\t\t\tis-sequence = false\n",
@@ -441,25 +441,25 @@
"\t\t\tnum-examples = -1\n",
"\t\t\tnum-features = 717\n",
"\t\t\tnum-outputs = 10\n",
- "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n",
+ "\t\t\ttribuo-version = 4.2.0\n",
"\t\t)\n",
"\ttrainer = Trainer(\n",
"\t\t\tclass-name = org.tribuo.Trainer\n",
- "\t\t\tfileModifiedTime = 2021-10-26T17:51:36.243-04:00\n",
- "\t\t\tmodelHash = 8DD82B31BD7CFC1C520942590E173AED07AF33C97C32021EE94738FA9FF4CC89\n",
+ "\t\t\tfileModifiedTime = 2021-12-18T20:36:36.445-05:00\n",
+ "\t\t\tmodelHash = 06071247AEDE7539B899A2D530508D8E2B43304B8A7884A257368AA2CF1C18ED\n",
"\t\t\tlocation = file:/Users/apocock/Development/Tribuo/tutorials/./fm-mnist.onnx\n",
"\t\t)\n",
- "\ttrained-at = 2021-11-03T09:51:50.149558-04:00\n",
+ "\ttrained-at = 2021-12-18T20:38:52.700329-05:00\n",
"\tinstance-values = Map{\n",
"\t\tmodel-domain=org.tribuo.tutorials.onnxexport.fm\n",
"\t\tmodel-graphname=FMClassificationModel\n",
- "\t\tmodel-description=factorization-machine-model - Model(class-name=org.tribuo.classification.sgd.fm.FMClassificationModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=DataSource(class-name=org.tribuo.datasource.IDXDataSource,outputPath=/Users/apocock/Development/Tribuo/tutorials/train-labels-idx1-ubyte.gz,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),featuresPath=/Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz,features-file-modified-time=2000-07-21T14:20:24-04:00,output-resource-hash=SHA-256[3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C],datasource-creation-time=2021-10-26T17:51:22.314557-04:00,output-file-modified-time=2000-07-21T14:20:27-04:00,idx-feature-type=UBYTE,features-resource-hash=SHA-256[440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609],host-short-name=DataSource),transformations=[],is-sequence=false,is-dense=false,num-examples=60000,num-features=717,num-outputs=10,tribuo-version=4.2.0-SNAPSHOT),trainer=Trainer(class-name=org.tribuo.classification.sgd.fm.FMClassificationTrainer,seed=12345,variance=0.1,minibatchSize=1,factorizedDimSize=6,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=0.1,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=30000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0-SNAPSHOT,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-10-26T17:51:35.432511-04:00,instance-values={},tribuo-version=4.2.0-SNAPSHOT,java-version=17-ea,os-name=Mac OS X,os-arch=x86_64)\n",
+ "\t\tmodel-description=factorization-machine-model - Model(class-name=org.tribuo.classification.sgd.fm.FMClassificationModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=DataSource(class-name=org.tribuo.datasource.IDXDataSource,outputPath=/Users/apocock/Development/Tribuo/tutorials/train-labels-idx1-ubyte.gz,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),featuresPath=/Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz,features-file-modified-time=2000-07-21T14:20:24-04:00,output-resource-hash=SHA-256[3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C],datasource-creation-time=2021-12-18T20:36:23.109293-05:00,output-file-modified-time=2000-07-21T14:20:27-04:00,idx-feature-type=UBYTE,features-resource-hash=SHA-256[440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609],host-short-name=DataSource),transformations=[],is-sequence=false,is-dense=false,num-examples=60000,num-features=717,num-outputs=10,tribuo-version=4.2.0),trainer=Trainer(class-name=org.tribuo.classification.sgd.fm.FMClassificationTrainer,seed=12345,variance=0.1,minibatchSize=1,factorizedDimSize=6,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=0.1,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=30000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-12-18T20:36:35.640663-05:00,instance-values={},tribuo-version=4.2.0,java-version=17.0.1,os-name=Mac OS X,os-arch=x86_64)\n",
"\t\tmodel-producer=Tribuo\n",
"\t\tmodel-version=0\n",
"\t\tinput-name=input\n",
"\t}\n",
- "\ttribuo-version = 4.2.0-SNAPSHOT\n",
- "\tjava-version = 17\n",
+ "\ttribuo-version = 4.2.0\n",
+ "\tjava-version = 17.0.1\n",
"\tos-name = Mac OS X\n",
"\tos-arch = x86_64\n",
")\n"
@@ -501,7 +501,7 @@
"\t\t\t\t\tfeaturesPath = /Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz\n",
"\t\t\t\t\tfeatures-file-modified-time = 2000-07-21T14:20:24-04:00\n",
"\t\t\t\t\toutput-resource-hash = 3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C\n",
- "\t\t\t\t\tdatasource-creation-time = 2021-10-26T17:51:22.314557-04:00\n",
+ "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:36:23.109293-05:00\n",
"\t\t\t\t\toutput-file-modified-time = 2000-07-21T14:20:27-04:00\n",
"\t\t\t\t\tidx-feature-type = UBYTE\n",
"\t\t\t\t\tfeatures-resource-hash = 440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609\n",
@@ -513,7 +513,7 @@
"\t\t\tnum-examples = 60000\n",
"\t\t\tnum-features = 717\n",
"\t\t\tnum-outputs = 10\n",
- "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n",
+ "\t\t\ttribuo-version = 4.2.0\n",
"\t\t)\n",
"\ttrainer = FMClassificationTrainer(\n",
"\t\t\tclass-name = org.tribuo.classification.sgd.fm.FMClassificationTrainer\n",
@@ -535,15 +535,15 @@
"\t\t\t\t\tclass-name = org.tribuo.classification.sgd.objectives.LogMulticlass\n",
"\t\t\t\t\thost-short-name = LabelObjective\n",
"\t\t\t\t)\n",
- "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n",
+ "\t\t\ttribuo-version = 4.2.0\n",
"\t\t\ttrain-invocation-count = 0\n",
"\t\t\tis-sequence = false\n",
"\t\t\thost-short-name = Trainer\n",
"\t\t)\n",
- "\ttrained-at = 2021-10-26T17:51:35.432511-04:00\n",
+ "\ttrained-at = 2021-12-18T20:36:35.640663-05:00\n",
"\tinstance-values = Map{}\n",
- "\ttribuo-version = 4.2.0-SNAPSHOT\n",
- "\tjava-version = 17-ea\n",
+ "\ttribuo-version = 4.2.0\n",
+ "\tjava-version = 17.0.1\n",
"\tos-name = Mac OS X\n",
"\tos-arch = x86_64\n",
")\n"
@@ -593,18 +593,14 @@
" \"dataset\" : {\n",
" \"datasource\" : {\n",
" \"datasource-creation-time\" : {\n",
- " \"original\" : \"2021-10-26T17:51:22.314557-04:00\",\n",
- " \"reproduced\" : \"2021-11-03T09:51:56.746038-04:00\"\n",
+ " \"original\" : \"2021-12-18T20:36:23.109293-05:00\",\n",
+ " \"reproduced\" : \"2021-12-18T20:38:58.740193-05:00\"\n",
" }\n",
" }\n",
" },\n",
- " \"java-version\" : {\n",
- " \"original\" : \"17-ea\",\n",
- " \"reproduced\" : \"17\"\n",
- " },\n",
" \"trained-at\" : {\n",
- " \"original\" : \"2021-10-26T17:51:35.432511-04:00\",\n",
- " \"reproduced\" : \"2021-11-03T09:52:10.606727-04:00\"\n",
+ " \"original\" : \"2021-12-18T20:36:35.640663-05:00\",\n",
+ " \"reproduced\" : \"2021-12-18T20:39:09.831081-05:00\"\n",
" }\n",
"}\n"
]
@@ -718,18 +714,14 @@
" \"dataset\" : {\n",
" \"datasource\" : {\n",
" \"datasource-creation-time\" : {\n",
- " \"original\" : \"2021-10-26T17:51:22.314557-04:00\",\n",
- " \"reproduced\" : \"2021-11-03T09:51:47.929133-04:00\"\n",
+ " \"original\" : \"2021-12-18T20:36:23.109293-05:00\",\n",
+ " \"reproduced\" : \"2021-12-18T20:38:51.027212-05:00\"\n",
" }\n",
" }\n",
" },\n",
- " \"java-version\" : {\n",
- " \"original\" : \"17-ea\",\n",
- " \"reproduced\" : \"17\"\n",
- " },\n",
" \"trained-at\" : {\n",
- " \"original\" : \"2021-10-26T17:51:35.432511-04:00\",\n",
- " \"reproduced\" : \"2021-11-03T09:52:20.359019-04:00\"\n",
+ " \"original\" : \"2021-12-18T20:36:35.640663-05:00\",\n",
+ " \"reproduced\" : \"2021-12-18T20:39:18.280345-05:00\"\n",
" },\n",
" \"trainer\" : {\n",
" \"class-name\" : {\n",
@@ -795,7 +787,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "17+35-LTS-2724"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,
diff --git a/tutorials/tensorflow-tribuo-v4.ipynb b/tutorials/tensorflow-tribuo-v4.ipynb
index 7b80b21a6..2f3be8b36 100644
--- a/tutorials/tensorflow-tribuo-v4.ipynb
+++ b/tutorials/tensorflow-tribuo-v4.ipynb
@@ -41,7 +41,7 @@
"metadata": {},
"outputs": [],
"source": [
- "%jars ./tribuo-tensorflow-4.2.0-SNAPSHOT-jar-with-dependencies.jar"
+ "%jars ./tribuo-tensorflow-4.2.0-jar-with-dependencies.jar"
]
},
{
@@ -274,7 +274,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Wine quality training took (00:00:02:519)\n"
+ "Wine quality training took (00:00:01:891)\n"
]
}
],
@@ -302,9 +302,9 @@
"output_type": "stream",
"text": [
"Wine quality evaluation:\n",
- " RMSE 0.651519\n",
- " MAE 0.509955\n",
- " R^2 0.347267\n",
+ " RMSE 0.651441\n",
+ " MAE 0.510348\n",
+ " R^2 0.347424\n",
"\n"
]
}
@@ -394,7 +394,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "MNIST MLP training took (00:01:00:660)\n"
+ "MNIST MLP training took (00:01:06:256)\n"
]
}
],
@@ -422,32 +422,32 @@
"output_type": "stream",
"text": [
"Class n tp fn fp recall prec f1\n",
- "0 980 0 980 0 0.000 0.000 0.000\n",
- "1 1,135 1,135 0 8,865 1.000 0.114 0.204\n",
- "2 1,032 0 1,032 0 0.000 0.000 0.000\n",
- "3 1,010 0 1,010 0 0.000 0.000 0.000\n",
- "4 982 0 982 0 0.000 0.000 0.000\n",
- "5 892 0 892 0 0.000 0.000 0.000\n",
- "6 958 0 958 0 0.000 0.000 0.000\n",
- "7 1,028 0 1,028 0 0.000 0.000 0.000\n",
- "8 974 0 974 0 0.000 0.000 0.000\n",
- "9 1,009 0 1,009 0 0.000 0.000 0.000\n",
- "Total 10,000 1,135 8,865 8,865\n",
- "Accuracy 0.114\n",
- "Micro Average 0.114 0.114 0.114\n",
- "Macro Average 0.100 0.011 0.020\n",
- "Balanced Error Rate 0.900\n",
+ "0 980 960 20 94 0.980 0.911 0.944\n",
+ "1 1,135 1,105 30 23 0.974 0.980 0.977\n",
+ "2 1,032 922 110 39 0.893 0.959 0.925\n",
+ "3 1,010 916 94 121 0.907 0.883 0.895\n",
+ "4 982 930 52 61 0.947 0.938 0.943\n",
+ "5 892 813 79 74 0.911 0.917 0.914\n",
+ "6 958 914 44 36 0.954 0.962 0.958\n",
+ "7 1,028 942 86 37 0.916 0.962 0.939\n",
+ "8 974 893 81 107 0.917 0.893 0.905\n",
+ "9 1,009 926 83 87 0.918 0.914 0.916\n",
+ "Total 10,000 9,321 679 679\n",
+ "Accuracy 0.932\n",
+ "Micro Average 0.932 0.932 0.932\n",
+ "Macro Average 0.932 0.932 0.931\n",
+ "Balanced Error Rate 0.068\n",
" 0 1 2 3 4 5 6 7 8 9\n",
- "0 0 980 0 0 0 0 0 0 0 0\n",
- "1 0 1,135 0 0 0 0 0 0 0 0\n",
- "2 0 1,032 0 0 0 0 0 0 0 0\n",
- "3 0 1,010 0 0 0 0 0 0 0 0\n",
- "4 0 982 0 0 0 0 0 0 0 0\n",
- "5 0 892 0 0 0 0 0 0 0 0\n",
- "6 0 958 0 0 0 0 0 0 0 0\n",
- "7 0 1,028 0 0 0 0 0 0 0 0\n",
- "8 0 974 0 0 0 0 0 0 0 0\n",
- "9 0 1,009 0 0 0 0 0 0 0 0\n",
+ "0 960 0 1 1 4 3 5 1 2 3\n",
+ "1 1 1,105 4 4 0 3 3 1 14 0\n",
+ "2 14 5 922 42 12 2 7 4 22 2\n",
+ "3 13 0 9 916 1 34 0 9 22 6\n",
+ "4 3 0 3 0 930 0 11 3 5 27\n",
+ "5 18 0 0 17 5 813 6 4 23 6\n",
+ "6 11 4 1 0 5 16 914 0 6 1\n",
+ "7 10 7 15 8 4 1 0 942 4 37\n",
+ "8 12 2 6 28 10 12 4 2 893 5\n",
+ "9 12 5 0 21 20 3 0 13 9 926\n",
"\n"
]
}
@@ -497,7 +497,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "MNIST CNN training took (00:03:09:806)\n"
+ "MNIST CNN training took (00:02:57:331)\n"
]
}
],
@@ -538,32 +538,32 @@
"output_type": "stream",
"text": [
"Class n tp fn fp recall prec f1\n",
- "0 980 973 7 11 0.993 0.989 0.991\n",
- "1 1,135 1,129 6 14 0.995 0.988 0.991\n",
- "2 1,032 1,024 8 31 0.992 0.971 0.981\n",
- "3 1,010 989 21 17 0.979 0.983 0.981\n",
- "4 982 965 17 14 0.983 0.986 0.984\n",
- "5 892 865 27 22 0.970 0.975 0.972\n",
- "6 958 936 22 2 0.977 0.998 0.987\n",
- "7 1,028 1,003 25 13 0.976 0.987 0.981\n",
- "8 974 948 26 15 0.973 0.984 0.979\n",
- "9 1,009 997 12 32 0.988 0.969 0.978\n",
- "Total 10,000 9,829 171 171\n",
- "Accuracy 0.983\n",
- "Micro Average 0.983 0.983 0.983\n",
- "Macro Average 0.983 0.983 0.983\n",
- "Balanced Error Rate 0.017\n",
+ "0 980 968 12 25 0.988 0.975 0.981\n",
+ "1 1,135 1,123 12 5 0.989 0.996 0.992\n",
+ "2 1,032 1,013 19 39 0.982 0.963 0.972\n",
+ "3 1,010 980 30 12 0.970 0.988 0.979\n",
+ "4 982 963 19 19 0.981 0.981 0.981\n",
+ "5 892 873 19 21 0.979 0.977 0.978\n",
+ "6 958 938 20 17 0.979 0.982 0.981\n",
+ "7 1,028 998 30 14 0.971 0.986 0.978\n",
+ "8 974 937 37 31 0.962 0.968 0.965\n",
+ "9 1,009 988 21 36 0.979 0.965 0.972\n",
+ "Total 10,000 9,781 219 219\n",
+ "Accuracy 0.978\n",
+ "Micro Average 0.978 0.978 0.978\n",
+ "Macro Average 0.978 0.978 0.978\n",
+ "Balanced Error Rate 0.022\n",
" 0 1 2 3 4 5 6 7 8 9\n",
- "0 973 2 0 0 0 0 0 2 3 0\n",
- "1 0 1,129 2 1 1 0 0 0 2 0\n",
- "2 1 3 1,024 0 0 0 0 2 2 0\n",
- "3 0 0 4 989 0 9 0 4 1 3\n",
- "4 0 1 1 0 965 0 1 0 0 14\n",
- "5 1 2 1 10 1 865 1 1 5 5\n",
- "6 6 4 3 1 1 7 936 0 0 0\n",
- "7 0 2 14 0 1 0 0 1,003 1 7\n",
- "8 3 0 6 4 3 5 0 2 948 3\n",
- "9 0 0 0 1 7 1 0 2 1 997\n",
+ "0 968 0 0 0 0 0 6 0 5 1\n",
+ "1 0 1,123 1 3 0 2 1 0 5 0\n",
+ "2 3 1 1,013 2 2 0 3 2 5 1\n",
+ "3 1 0 9 980 0 9 0 4 2 5\n",
+ "4 1 0 1 0 963 0 4 1 3 9\n",
+ "5 1 2 0 6 0 873 1 1 3 5\n",
+ "6 10 1 1 1 2 2 938 0 3 0\n",
+ "7 0 1 13 0 4 0 0 998 4 8\n",
+ "8 7 0 13 0 0 7 2 1 937 7\n",
+ "9 2 0 1 0 11 1 0 5 1 988\n",
"\n"
]
}
@@ -719,7 +719,7 @@
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
- "version": "17+35-LTS-2724"
+ "version": "17.0.1+12-LTS-39"
}
},
"nbformat": 4,