From 3b29f34b22803838a728c3f693e5d4eefcac0b80 Mon Sep 17 00:00:00 2001 From: Vladislav Chumak Date: Sun, 24 Feb 2019 21:05:44 +0100 Subject: [PATCH] Improvement of howto for model training --- wiki/howto/windestimation.md | 28 +++--- wiki/howto/windestimationAdvanced.md | 80 ++++++++++++++++++ ...logAfterDataCleansingDurationDimension.jpg | Bin 0 -> 12695 bytes ...stingDataCleansingForDurationDimension.jpg | Bin 0 -> 20355 bytes 4 files changed, 94 insertions(+), 14 deletions(-) create mode 100644 wiki/howto/windestimationAdvanced.md create mode 100644 wiki/images/windestimation/confirmationDialogAfterDataCleansingDurationDimension.jpg create mode 100644 wiki/images/windestimation/dialogRequestingDataCleansingForDurationDimension.jpg diff --git a/wiki/howto/windestimation.md b/wiki/howto/windestimation.md index 25c9812657f..83412cc7104 100644 --- a/wiki/howto/windestimation.md +++ b/wiki/howto/windestimation.md @@ -1,29 +1,29 @@ # Training of internal Wind Estimation models -This document describes the generation process of Machine Learning (ML) models which are used internally by wind estimation. It is highly recommended to proceed this howto step by step considering the order of sections. +This document describes the generation process of Machine Learning (ML) models which are used internally by wind estimation. It is highly recommended to proceed this howto step by step considering the order of sections. At the end of this howto, you will generate a file containing the representation of internal models used by ``com.sap.sailing.windestimation`` bundle. You can use this file to update the wind estimation models of a running server instance. If you are interested in a more advanced tutorial which requires all the execution steps contained in ``SimpleModelsTrainingPart...`` classes to be executed manually, then you might be interested in [Advanced Guide for training of internal Wind Estimation models](./windestimationAdvanced.md) ## Prerequisites To complete the training process successfully, you need to make sure that you have the following stuff: * A complete onboarding setup for SAP Sailing Analytics development -* MongoDB (**3.4 or higher!**) is up and running (same MongoDB instance as required in onboarding howto) +* MongoDB (**3.4 or higher!**) is up and running (can be the same MongoDB instance as required in onboarding howto) * At least 100 GB free space on the partition, where MongoDB is operating * Installed graphical MongoDB client such as MongoDB Compass (Community version) * 16 GB RAM -* ~24 operation hours of your computer +* 24+ operating hours of your computer ## Model training process -1. Run ``com.sap.sailing.windestimation.model.SimpleModelsTraining`` as normal Java Application. This program downloads all the necessary maneuver and wind data, pre-processes them and initiates training of maneuver classifiers. -2. Make sure that the launched program does not get termined by an uncaught exception. Wait until graphical info dialog shows up which requests you to perform data cleansing for duration dimension and press OK. - ![Screenshot of graphical info dialog requesting to perform data cleansing for duration dimension](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Screenshot of graphical info dialog requesting to perform data cleansing for duration dimension") - A Swing-based GUI-Window must open with two charts, one XY-chart where the x-axis represents **seconds**, and the y-axis represents TWD delta-based series measures (e.g. standard deviation or mean). Below the chart, a histogram for the data points of the XY-Chart is provided. You can zoom-in and zoom-out in each of the chart by mouse dragging. Be aware that currently, the zoom level of both charts is not synchronizing. +1. Run ``com.sap.sailing.windestimation.model.SimpleModelsTrainingPart1`` as a normal Java Application. After this, all the necessary maneuver and wind data will be downloaded, pre-processed and maneuver classifiers get trained. +2. Make sure that the launched program does not get termined by an uncaught exception. Wait until graphical info dialog shows up which requests you to perform data cleansing for duration dimension. + ![Screenshot of graphical info dialog requesting to perform data cleansing for duration dimension](../images/windestimation/dialogRequestingDataCleansingForDurationDimension.jpg "Screenshot of graphical info dialog requesting to perform data cleansing for duration dimension") + Press OK. Afterwards, a graphical window must open with two charts. The top chart is an XY-chart where the x-axis represents **seconds** and the y-axis represents various TWD delta-based measures (e.g. standard deviation or mean). Below the XY-chart, a histogram for the data points of the XY-Chart is provided. You can zoom-in and zoom-out in each of the charts by mouse dragging. Be aware that currently, the zoom level of both charts is not synchronizing. ![Screenshot of graphical wind data visualization tool for duration dimension](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Screenshot of graphical wind data visualization tool for duration dimension") -3. Open your graphical MongoDB client and connect to ``windEstimation`` database hosted by your local MongoDB. Open the collection with name ``aggregatedDurationTwdTransition``. Within the collection you will see all the instances/data points visualized in the previous step. The attribute used for the x-axis is represented by ``value``. +3. Open your graphical MongoDB client and connect to ``windEstimation`` database hosted within your local MongoDB. Open the collection with name ``aggregatedDurationTwdTransition``. Within the collection, you will see all the instances/data points visualized in the previous step. The attribute used for the x-axis is ``value``. ![Screenshot of MongoDB Compass with opened aggregatedDurationTwdTransition collection](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Screenshot of MongoDB Compass with opened aggregatedDurationTwdTransition collection") -4. Delete all the instances within the collection which do not make sense. For this, use the data visualization tool from step 2 to identify such instances. Some of the instances are not representative due to the small number of supporting instances which is visualized in the histogram. Such instances can produce unreasonable bumps in the XY-chart. The desired output of this step is that the series curve ``Zero mean sigma`` looks smooth and always growing, like depicted below: +4. Delete all the instances within the collection which do not make sense. For this, use the data visualization tool from step 2 to identify such instances. Some of the instances are not representative due to the small number of supporting instances which is visualized in the histogram. Such instances can produce unreasonable bumps in the XY-chart. The desired output of this step is that the curve ``Zero mean sigma`` looks smooth and always growing, e.g. as depicted below: ![Screenshot of graphical visualization tool of duration dimension with after data cleansing](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Screenshot of graphical visualization tool of duration dimension with after data cleansing") - Use the ``Refresh charts`` button as often as needed to update the charts with the modified data in MongoDB. Close the graphical visualization tool window after you are done with data cleansing to resume the training process. Confirm the confirmation dialog after you have finished the data cleansing of duration dimension: - ![Screenshot of confirmation dialog for finishing the data cleansing](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Screenshot of confirmation dialog for finishing the data cleansing") -5. A new information dialog shows up (do not press OK yet!) requesting you to open the source code of the class ``com.sap.sailing.windestimation.model.regressor.twdtransition.DurationBasedTwdTransitionRegressorModelContext``. Open it and scroll down to the definition of the inner enum ``DurationValueRange``. The enum defines the intervals for which a separate regressor model will be trained. Read the Javadoc of ``DurationValueRange`` and adjust the intervals accordingly in order to allow the regressor model to learn the ``Zero mean sigma`` curve with minimal error. You can also configurate the polynomial which will be used for regressor training. Make sure that there are at least 2 data points available within each interval. The datapoint with x = 0, y = 0 will be created automatically. Press OK in information dialog after you are done. -6. A graphical info dialog shows up which requests you to perform data cleansing for *distance* dimension. Press OK. All steps for data cleansing for the distance dimension are very similar to the data cleansing steps step 2. until step 5. for the duration dimension. Thus, consult these steps to complete data cleansing and models configuration for the distance duration. The unit used for distance representation is **meters**. The collection name required in step 3. is ``aggregatedDistanceTwdTransition``. The class required in step 5. is ``com.sap.sailing.windestimation.model.regressor.twdtransition.DistanceBasedTwdTransitionRegressorModelContext`` and its inner enum is ``DistanceValueRange``. -7. Wait until model training finishes and the program terminates normally. A new file with serialized representation of internal wind estimation models should be located in ``./windEstimationModels.dat``. The absolute path of the file must be printed in the console output of the program. You can upload the file via HTTP POST to http://sapsailing.com/windestimation/api/windestimation_data (see ``com.sap.sailing.windestimation.jaxrs.api.WindEstimationDataResource``) to update the wind estimation of a server instance. + Use the ``Refresh charts`` button as often as needed to update the charts with the modified data in MongoDB. Close the graphical visualization tool window after you are done with data cleansing to resume the training process. A confirmation dialog shows up. Confirm it by pressing *"Continue with model training"* button. + ![Screenshot of confirmation dialog for finishing the data cleansing](../images/windestimation/confirmationDialogAfterDataCleansingDurationDimension.jpg "Screenshot of confirmation dialog for finishing the data cleansing") +5. A new information dialog shows up (**do not press OK yet!**) requesting you to open the source code of the class ``com.sap.sailing.windestimation.model.regressor.twdtransition.DurationBasedTwdTransitionRegressorModelContext``. Open it and scroll down to the definition of the inner enum ``DurationValueRange``. The enum defines the intervals for which a separate regressor model will be trained. Read the Javadoc of ``DurationValueRange`` and adjust the intervals accordingly in order to allow the regressor model to learn the ``Zero mean sigma`` curve with minimal error. You can also configure the polynomial which will be used for regressor training. Make sure that there are at least 2 data points contained within each configured interval. The data point with x = 0, y = 0 will be created automatically within model training procedure. Press OK in information dialog after you are done. +6. A graphical info dialog shows up which requests you to perform data cleansing for the *distance* dimension. Press OK. All steps for data cleansing for the distance dimension are analogous to the steps of the duration dimension described from step 2. until step 5. Thus, consult these steps in order to complete the data cleansing for the distance dimension. The unit used for the distance representation is **meters**. The collection name required in step 3. is ``aggregatedDistanceTwdTransition``. The class required in step 5. is ``com.sap.sailing.windestimation.model.regressor.twdtransition.DistanceBasedTwdTransitionRegressorModelContext`` and its inner enum is ``DistanceValueRange``. +7. Run ``com.sap.sailing.windestimation.model.SimpleModelsTrainingPart2`` as a normal Java Application. Wait until the model training finishes and the program terminates normally. A new file with serialized representation of internal wind estimation models should be located in ``./windEstimationModels.dat``. The absolute path of the file must be printed in the console output of the program. You can upload the file via HTTP POST to http://sapsailing.com/windestimation/api/windestimation_data (see ``com.sap.sailing.windestimation.jaxrs.api.WindEstimationDataResource``) to update the wind estimation of a server instance. If you changed the source files of ``DurationValueRange`` or ``DistanceValueRange``, then you will need to update ``com.sap.sailing.windestimation`` bundle of the server instance which is meant to receive the new wind estimation models. 8. Optionally, run ``com.sap.sailing.windestimation.evaluation.WindEstimatorManeuverNumberDependentEvaluationRunner`` as normal Java Application to evaluate the wind estimation with the new trained models. The evaluation score will be stored as CSV in ``./maneuverNumberDependentEvaluation.csv``. \ No newline at end of file diff --git a/wiki/howto/windestimationAdvanced.md b/wiki/howto/windestimationAdvanced.md new file mode 100644 index 00000000000..54dc2538b05 --- /dev/null +++ b/wiki/howto/windestimationAdvanced.md @@ -0,0 +1,80 @@ +# Training of internal Wind Estimation models + +This document describes the generation process of Machine Learning (ML) models which are used internally by wind estimation. It is highly recommended to proceed this howto step by step considering the order of sections. At the end of this howto, you will generate a file containing the representation of internal models used by ``com.sap.sailing.windestimation`` bundle. You can use this file to update the wind estimation models of a running server instance. If you are interested in a simpler tutorial with less execution steps thanks to automation, then you might be interested in [Simple Guide for training of internal Wind Estimation models](./windestimation.md) + +## Overview +In total, there are the following three categories of ML models used by wind estimation: +1. **Maneuver Classifiers** +2. **Regressors** of TWD delta standard deviation for the dimension **duration** +3. **Regressors** of TWD delta standard deviation for the dimension **distance** + +Each of the model categories are composed of multiple models where each model targets a specific context. A context for a maneuver classifier is determined by the following attributes: +* Maneuver features + * Polar features enabled: yes/no + * Mark features enabled: yes/no + * Scaled speed features enabled: yes/no +* Boat class filtering for the data on which the classifier is trained, such as a specific boat class, or with all boat classes included + +The context of regressor models is represented by its assigned input interval responsibility, e.g. [0 seconds; 62 seconds) for duration, or [80 meters; 1368 meters) for distance. + +Each of the ML model categories must be trained individually. The common workflow looks as follows: +1. Get the training data from REST API of sapsailing.com +2. Preprocess data +3. Train the model category + +For each of the steps, appropriate Java classes must be executed per *Run with...->Java Application*. All referenced classes are located in *com.sap.sailing.windestimation.lab* Java project. Each class execution must finish without termination due to uncaught exceptions before proceeding to next instruction. You can skip the training of a model category if you do not want to update the models on server of that category. After model training, A new file with serialized representation of internal wind estimation models should be located in ``./windEstimationModels.dat``, which is normally */path/to/workspace/com.sap.sailing.windestimation/trained_wind_estimation_models* if you start the training classes in Eclipse per *Run with...->Java Application*. + +The details of the training process for each model category are described in the following sections. + +## Prerequisites +To complete the training process successfully, you need to make sure that you have the following stuff: +* A complete onboarding setup for SAP Sailing Analytics development +* MongoDB (**3.4 or higher!**) is up and running +* At least 100 GB free space on the partition, where MongoDB is operating +* Installed graphical MongoDB client such as MongoDB Compass (Community version) + +## Get the training data from sapsailing.com +The following steps import all the data required from sapsailing.com into the local MongoDB. These steps constitute a preprequisite for training of all ML model categories: +1. Run *com.sap.sailing.windestimation.data.importer.ManeuverAndWindImporter* +2. Run *com.sap.sailing.windestimation.data.importer.PolarDataImporter* + +## Maneuver classifiers training +1. Run *com.sap.sailing.windestimation.model.classifier.maneuver.ManeuverClassifierTrainer*. Within the this step, the maneuver data is preprocessed and all maneuver classifiers are trained for each supported context. +2. Optionally run *com.sap.sailing.windestimation.model.classifier.maneuver.ManeuverClassifierScoring* to print the performance of the trained classifiers. After this step, a list with macro-averaged F2-score of each trained classifier will be stored in *./maneuverClassifierScores.csv* + +## Duration-based TWD delta standard deviation regressor + +1. Run *com.sap.sailing.windestimation.data.importer.DurationBasedTwdTransitionImporter* +2. Run *com.sap.sailing.windestimation.data.importer.AggregatedDurationBasedTwdTransitionImporter* +3. Run *com.sap.sailing.windestimation.datavisualization.AggregatedDurationDimensionPlot* to visualize the wind data. A Swing-based GUI-Window must open with two charts, one XY-chart where the x-axis represents **seconds**, and the y-axis represents TWD delta-based series measures (e.g. standard deviation or mean). Below the chart, a histogram for data points of the XY-Chart is provided. You can zoom-in and zoom-out in each of the chart by mouse dragging. Be aware that currently the zoom level of both charts is not synchronized +4. Open your graphical MongoDB client and connect to *windEstimation* database hosted by your local MongoDB. Open the collection with name *aggregatedDurationTwdTransition*. Within the collection you will see all the instances/data points visualized in the previous step. The total number of the points must not exceed 100. +5. Delete all the instances within the collection which do not make sense. For this, use the data visualization tool from step 3 to identify such instances. Some of the instances are not representative due to the small number of supporting instances which is visualized in the histogram. Such instances can produce unreasonable bumps in the XY-chart. The desired output of this step is that the curve ``Zero mean sigma`` looks smooth and always growing. Use the ``Refresh charts`` button as often as needed to update the charts with the modified data in MongoDB. +6. Open the source code of the class ``com.sap.sailing.windestimation.model.regressor.twdtransition.DurationBasedTwdTransitionRegressorModelContext``. Open it and scroll down to the definition of the inner enum ``DurationValueRange``. The enum defines the intervals for which a separate regressor model will be trained. Read the Javadoc of ``DurationValueRange`` and adjust the intervals accordingly in order to allow the regressor model to learn the ``Zero mean sigma`` curve with minimal error. You can also configure the polynomial which will be used for regressor training. Make sure that there are at least 2 data points contained within each configured interval. The data point with x = 0, y = 0 will be created automatically within model training procedure. +7. Run *com.sap.sailing.windestimation.model.regressor.twdtransition.DurationBasedTwdTransitionStdRegressorTrainer* +8. Verify the trained regressor functions. They are printed in the console output of the previous step. For instance, you can visualize the polynoms by means of https://www.wolframalpha.com/ + +## Distance-based TWD delta standard deviation regressor + +The steps of this sections are similar to the steps of the previous section. It is recommended to traverse through the previous section before starting with this one, because due to similarity of the steps, the similar steps in this section are described with less details and hints. + +1. Run *com.sap.sailing.windestimation.data.importer.DistanceBasedTwdTransitionImporter* +2. Run *com.sap.sailing.windestimation.data.importer.AggregatedDistanceBasedTwdTransitionImporter* with at least 10 GB JVM memory. +3. Run *com.sap.sailing.windestimation.datavisualization.AggregatedDistanceDimensionPlot* to visualize the wind data. Here, the x-axis of the XY-chart represents **meters** +4. Open your graphical MongoDB client and connect to *windEstimation* database hosted by your local MongoDB. Open collection *aggregatedDistanceTwdTransition* collection. Within the collection you will see all the instances/data points visualized in the previous step. The total number of the points must not exceed 100. +5. Delete all the instances within the collection which do not make sense. +6. Open the source code of the class *com.sap.sailing.windestimation.model.regressor.twdtransition.DistanceBasedTwdTransitionRegressorModelContext*. Scroll down to the definition of the inner class/enum *DistanceValueRange*. The enum defines the intervals for which a separate regressor model will be trained. Adjust the intervals accordingly in order to allow the regressor model to learn the data curve with minimal error. +7. Run *com.sap.sailing.windestimation.model.regressor.twdtransition.DistanceBasedTwdTransitionStdRegressorTrainer* +8. Verify the trained regressor functions. They are printed in the console output of the previous step. + +## Generate the models file + +Within this section, all the trained models produce within previous sections are aggregated and stored as one single file. + +1. Run ``com.sap.sailing.windestimation.model.ExportedModelsGenerator``. Wait until the model training finishes and the program terminates normally. A new file with serialized representation of internal wind estimation models should be located in ``./windEstimationModels.dat``. The absolute path of the file must be printed in the console output of the program. You can upload the file via HTTP POST to http://sapsailing.com/windestimation/api/windestimation_data (see ``com.sap.sailing.windestimation.jaxrs.api.WindEstimationDataResource``) to update the wind estimation of a server instance. If you changed the source files of ``DurationValueRange`` or ``DistanceValueRange``, then you will need to update ``com.sap.sailing.windestimation`` bundle of the server instance which is meant to receive the new wind estimation models. + + +## Model Evaluation + +This step is optional. However, it is recommended, to evaluate the performance of wind estimation with new trained models. + +1. Run ``com.sap.sailing.windestimation.evaluation.WindEstimatorManeuverNumberDependentEvaluationRunner`` to evaluate the wind estimation with the new trained models. The evaluation score will be stored as CSV in ``./maneuverNumberDependentEvaluation.csv``. \ No newline at end of file diff --git a/wiki/images/windestimation/confirmationDialogAfterDataCleansingDurationDimension.jpg b/wiki/images/windestimation/confirmationDialogAfterDataCleansingDurationDimension.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8250cb2201fb4765d939f14f8a9f26dafc35ffa3 GIT binary patch literal 12695 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 PtB-?uhi>8Aujc*-i8$RB literal 0 HcmV?d00001 diff --git a/wiki/images/windestimation/dialogRequestingDataCleansingForDurationDimension.jpg b/wiki/images/windestimation/dialogRequestingDataCleansingForDurationDimension.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ffe69f2ac9d6f9bd789869e7a328f7e23586f149 GIT binary patch literal 20355 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 literal 0 HcmV?d00001