<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing with OASIS Tables v3.0 20080202//EN" "journalpub-oasis3.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:oasis="http://docs.oasis-open.org/ns/oasis-exchange/table" xml:lang="en" dtd-version="3.0"><?xmltex \makeatother\@nolinetrue\makeatletter?>
  <front>
    <journal-meta><journal-id journal-id-type="publisher">GMD</journal-id><journal-title-group>
    <journal-title>Geoscientific Model Development</journal-title>
    <abbrev-journal-title abbrev-type="publisher">GMD</abbrev-journal-title><abbrev-journal-title abbrev-type="nlm-ta">Geosci. Model Dev.</abbrev-journal-title>
  </journal-title-group><issn pub-type="epub">1991-9603</issn><publisher>
    <publisher-name>Copernicus Publications</publisher-name>
    <publisher-loc>Göttingen, Germany</publisher-loc>
  </publisher></journal-meta>
    <article-meta>
      <article-id pub-id-type="doi">10.5194/gmd-14-1553-2021</article-id><title-group><article-title>MLAir (v1.0) – a tool to enable fast and flexible <?xmltex \hack{\break}?>machine learning on air data time series</article-title><alt-title>MLAir (v1.0)</alt-title>
      </title-group><?xmltex \runningtitle{MLAir (v1.0)}?><?xmltex \runningauthor{L.~H.~Leufen et al.}?>
      <contrib-group>
        <contrib contrib-type="author" corresp="yes" rid="aff1 aff2">
          <name><surname>Leufen</surname><given-names>Lukas Hubert</given-names></name>
          <email>l.leufen@fz-juelich.de</email>
        <ext-link>https://orcid.org/0000-0003-4154-3397</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1 aff2">
          <name><surname>Kleinert</surname><given-names>Felix</given-names></name>
          
        <ext-link>https://orcid.org/0000-0002-0604-3058</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Schultz</surname><given-names>Martin G.</given-names></name>
          
        <ext-link>https://orcid.org/0000-0003-3455-774X</ext-link></contrib>
        <aff id="aff1"><label>1</label><institution>Jülich Supercomputing Centre, Research Centre Jülich, Jülich, Germany</institution>
        </aff>
        <aff id="aff2"><label>2</label><institution>Institute of Geosciences, Rhenish Friedrich Wilhelm University of Bonn, Bonn, Germany</institution>
        </aff>
      </contrib-group>
      <author-notes><corresp id="corr1">Lukas Hubert Leufen  (l.leufen@fz-juelich.de)</corresp></author-notes><pub-date><day>17</day><month>March</month><year>2021</year></pub-date>
      
      <volume>14</volume>
      <issue>3</issue>
      <fpage>1553</fpage><lpage>1574</lpage>
      <history>
        <date date-type="received"><day>9</day><month>October</month><year>2020</year></date>
           <date date-type="rev-request"><day>23</day><month>October</month><year>2020</year></date>
           <date date-type="rev-recd"><day>29</day><month>January</month><year>2021</year></date>
           <date date-type="accepted"><day>2</day><month>February</month><year>2021</year></date>
      </history>
      <permissions>
        <copyright-statement>Copyright: © 2021 Lukas Hubert Leufen et al.</copyright-statement>
        <copyright-year>2021</copyright-year>
      <license license-type="open-access"><license-p>This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this licence, visit <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">https://creativecommons.org/licenses/by/4.0/</ext-link></license-p></license></permissions><self-uri xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021.html">This article is available from https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021.html</self-uri><self-uri xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021.pdf">The full text article is available as a PDF file from https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021.pdf</self-uri>
      <abstract><title>Abstract</title>
    <p id="d1e107">With MLAir (Machine Learning on Air data) we created a software environment that simplifies and accelerates the exploration of new machine learning (ML) models, specifically shallow and deep neural networks, for the analysis and forecasting of meteorological and air quality time series. Thereby MLAir is not developed as an abstract workflow, but hand in hand with actual scientific questions. It thus addresses scientists with either a meteorological or an ML background. Due to their relative ease of use and spectacular results in other application areas, neural networks and other ML methods are also gaining enormous momentum in the weather and air quality research communities. Even though there are already many books and tutorials describing how to conduct an ML experiment, there are many stumbling blocks for a newcomer. In contrast, people familiar with ML concepts and technology often have difficulties understanding the nature of atmospheric data. With MLAir we have addressed a number of these pitfalls so that it becomes easier for scientists of both domains to rapidly start off their ML application. MLAir has been developed in such a way that it is easy to use and is designed from the very beginning as a stand-alone, fully functional experiment. Due to its flexible, modular code base, code modifications are easy and personal experiment schedules can be quickly derived. The package also includes a set of validation tools to facilitate the evaluation of ML results using standard meteorological statistics. MLAir can easily be ported onto different computing environments from desktop workstations to high-end supercomputers with or without graphics processing units (GPUs).</p>
  </abstract>
    </article-meta>
  </front>
<body>
      

<sec id="Ch1.S1" sec-type="intro">
  <label>1</label><title>Introduction</title>
      <p id="d1e119">In times of rising awareness of air quality and climate issues, the investigation of air quality and weather phenomena is moving into focus. Trace substances such as ozone, nitrogen oxides, or particulate matter pose a serious health hazard to humans, animals, and nature <xref ref-type="bibr" rid="bib1.bibx7 bib1.bibx2 bib1.bibx48 bib1.bibx24 bib1.bibx26 bib1.bibx43" id="paren.1"/>. Accordingly, the analysis and prediction of air quality are of great importance in order to be able to initiate appropriate countermeasures or issue warnings. The prediction of weather and air quality has been established operationally in many countries and has become a multi-million dollar industry, creating and selling specialized data products for many different target groups.</p>
      <p id="d1e125">These days, forecasts of weather and air quality are generally made with the help of so-called Eulerian grid point models. This type of model, which solves physical and chemical equations, operates on grid structures. In fact, however, local observations of weather and air quality are strongly influenced by the immediate environment. Such local influences are quite difficult for atmospheric chemistry models to accurately simulate due to the limited grid resolution of these models and because of uncertainties in model parameterizations. Consequently, both global models and so-called small-scale models, whose grid resolution is still in the magnitude of about a kilometre and thus rather coarse in comparison to local-scale phenomena in the vicinity of a measurement site, show a high uncertainty of the results <xref ref-type="bibr" rid="bib1.bibx45 bib1.bibx4" id="paren.2"><named-content content-type="pre">see</named-content></xref>. To enhance the model output, approaches focusing on the individual point measurements<?pagebreak page1554?> at weather and air quality monitoring stations through downscaling methods are applied allowing local effects to be taken into account. Unfortunately, these methods, being optimized for specific locations, cannot be generalized for other regions and need to be re-trained for each measurement site.</p>
      <p id="d1e133">Recently, a variety of machine learning (ML) methods have been developed to complement the traditional downscaling techniques. Such methods (e.g. neural networks, random forest) are able to recognize and reproduce underlying and complex relationships in data sets. Driven in particular by computer vision and speech recognition, technologies like convolutional neural networks <xref ref-type="bibr" rid="bib1.bibx23" id="paren.3"><named-content content-type="pre">CNNs;</named-content></xref>, or recurrent networks variations such as long short-term memory <xref ref-type="bibr" rid="bib1.bibx13" id="paren.4"><named-content content-type="pre">LSTM;</named-content></xref> or gated recurrent units <xref ref-type="bibr" rid="bib1.bibx5" id="paren.5"><named-content content-type="pre">GRUs;</named-content></xref> but also more advanced concepts like variational autoencoders <xref ref-type="bibr" rid="bib1.bibx17 bib1.bibx35" id="paren.6"><named-content content-type="pre">VAEs;</named-content></xref>, or generative adversarial networks <xref ref-type="bibr" rid="bib1.bibx10" id="paren.7"><named-content content-type="pre">GANs;</named-content></xref>, are powerful and widely and successfully used. The application of such methods to weather and air quality data is rapidly gaining momentum.</p>
      <p id="d1e161">Although the scientific areas of ML and atmospheric science have existed for many years, combining both disciplines is still a formidable challenge, because scientists from these areas do not speak the same language. Atmospheric scientists are used to building models on the basis of physical equations and empirical relationships from field experiments, and they evaluate their models with data. In contrast, data scientists use data to build their models on and evaluate them either with additional independent data or physical constraints. This elementary difference can lead to misinterpretation of study results so that, for example, the ability of the network to generalize is misjudged. Another problem of several published studies on ML approaches to weather forecasting is an incomplete reporting of ML parameters, hyperparameters, and data preparation steps that are key to comprehending and reproducing the work that was done. As shown by <xref ref-type="bibr" rid="bib1.bibx31" id="text.8"/> these issues are not limited to meteorological applications of ML only.</p>
      <p id="d1e168">To further advance the application of ML in atmospheric science, easily accessible solutions to run and document ML experiments together with readily available and fully documented benchmark data sets are urgently needed <xref ref-type="bibr" rid="bib1.bibx39" id="paren.9"><named-content content-type="pre">see</named-content></xref>. Such solutions need to be understandable by both communities and help both sides to prevent unconscious blunders. A well-designed workflow embedded in a meteorological and ML-related environment while accomplishing subject-specific requirements will bring forward the usage of ML in this specific research area.</p>
      <p id="d1e176">In this paper, we present a new framework to enable fast and flexible Machine Learning on Air data time series (MLAir). Fast means that MLAir is distributed as full end-to-end framework and thereby simple to deploy. It also allows typical optimization techniques to be deployed in ML workflows and offers further technical features like the use of graphics processing units (GPUs) due to the underlying ML library. MLAir is suitable for ML beginners due to its simple usage but also offers high customization potential for advanced ML users. It can therefore be employed in real-world applications. For example, more complex model architectures can be easily integrated. ML experts who want to explore weather or air quality data will find MLAir helpful as it enforces certain standards of the meteorological community. For example, its data preparation step acknowledges the autocorrelation which is typically seen in meteorological time series, and its validation package reports well-established skill scores, i.e. improvement of the forecast compared to reference models such as persistence and climatology. From a software design perspective, MLAir has been developed according to state-of-the-art software development practices.</p>
      <p id="d1e179">This article is structured as follows. Section <xref ref-type="sec" rid="Ch1.S2"/> introduces MLAir by expounding the general design behind the MLAir workflow. We also share a few more general points about ML and what a typical workflow looks like. This is followed by Sect. <xref ref-type="sec" rid="Ch1.S3"/> showing three application examples to allow the reader to get a general understanding of the tool. Furthermore, we show how the results of an experiment conducted by MLAir are structured and which statistical analysis is applied. Section <xref ref-type="sec" rid="Ch1.S4"/> extends further into the configuration options of an experiment and details on customization. Section <xref ref-type="sec" rid="Ch1.S5"/> delineates the limitations of MLAir and discusses for which applications the tool might not be suitable. Finally, Sect. <xref ref-type="sec" rid="Ch1.S6"/> concludes with an overview and outlook on planned developments for the future.</p>
      <p id="d1e192">At this point we would like to point out that in order to simplify the readability of the paper, highlighting is used. <italic>Frameworks</italic> are highlighted in italics and typewriter font is used for <monospace>code</monospace> elements such as class names or variables. Other expressions that, for example, describe a class but do not explicitly name it, are not highlighted at all in the text. Last but not least, we would like to mention that <italic>MLAir</italic> is an open-source project and contributions from all communities are welcome.</p>
</sec>
<sec id="Ch1.S2">
  <label>2</label><title>MLAir workflow and design</title>
      <p id="d1e212">ML in general is the application of a learning algorithm to a data set whereby a statistical model describing relations within the data is generated. During the so-called training process, the model learns patterns in the data set with the aid of the learning algorithm. Afterwards, this model can be applied to new data. Since there is a large number of learning algorithms and also an arbitrarily large number of different ML architectures, it is generally not possible to determine in advance which approach will deliver the best results under which configuration. Therefore, the optimal setting must be found by trial and error.</p>
      <p id="d1e215">ML experiments usually follow similar patterns. First, data must be obtained, cleaned if necessary, and finally put into a<?pagebreak page1555?> suitable format (preprocessing). Next, an ML model is selected and configured (model setup). Then the learning algorithm can optimize the model under the selected settings on the data. This optimization is an iterative procedure and each iteration is called an epoch (training). The accuracy of the model is then evaluated (validation). If the results are not satisfactory, the experiment is continued with modified settings (i.e. hyperparameters) or started again with a new model. For further details on ML, we refer to <xref ref-type="bibr" rid="bib1.bibx3" id="text.10"/> and <xref ref-type="bibr" rid="bib1.bibx11" id="text.11"/> but would also like to point out that there is a large amount of further introductory literature and freely available blog entries and videos, and that the books mentioned here are only two of many options out there.</p>
      <p id="d1e224">The overall goal of designing <italic>MLAir</italic> was to create a ready-to-run ML application for the task of forecasting weather and air quality time series. The tool should allow many customization options to enable users to easily create a custom ML workflow, while at the same time it should support users in executing ML experiments properly and evaluate their results according to accepted standards of the meteorological community. At this point, it is pertinent to recall that <italic>MLAir</italic>'s current focus is on neural networks.</p>
      <p id="d1e233">In this section we present the general concepts on which <italic>MLAir</italic> is based. We first comment on the choice of the underlying programming language and the packages and frameworks used (Sect. <xref ref-type="sec" rid="Ch1.S2.SS1"/>). We then focus on the design considerations and choices and introduce the general workflow of <italic>MLAir</italic> (Sect. <xref ref-type="sec" rid="Ch1.S2.SS2"/>). Thereafter we explain how the concepts of run modules (Sect. <xref ref-type="sec" rid="Ch1.S2.SS3"/>), model class (Sect. <xref ref-type="sec" rid="Ch1.S2.SS4"/>), and data handler (Sect. <xref ref-type="sec" rid="Ch1.S2.SS5"/>) were conceived and how these modules interact with each other. More detailed information on, for example, how to adapt these modules can be found in the corresponding subsection of the later Sect. <xref ref-type="sec" rid="Ch1.S4"/>.</p>
<sec id="Ch1.S2.SS1">
  <label>2.1</label><title>Coding language</title>
      <p id="d1e263"><italic>Python</italic> <xref ref-type="bibr" rid="bib1.bibx33" id="paren.12"><named-content content-type="post">release 3.6.8</named-content></xref> was used as the underlying coding language for several reasons. <italic>Python</italic> is pretty much independent of the operating system and code does not need to be compiled before a run. <italic>Python</italic> is flexible to handle different tasks like data loading from the web, training of the ML model or plotting. Numerical operations can be executed quite efficiently due to the fact that they are usually performed by highly optimized and compiled mathematical libraries. Furthermore, because of its popularity in science and economics, <italic>Python</italic> has a huge variety of freely available packages to use. Furthermore, <italic>Python</italic> is currently the language of choice in the ML community <xref ref-type="bibr" rid="bib1.bibx8" id="paren.13"/> and has well-developed easy-to-use frameworks like <italic>TensorFlow</italic> <xref ref-type="bibr" rid="bib1.bibx1" id="paren.14"/> or <italic>PyTorch</italic> <xref ref-type="bibr" rid="bib1.bibx32" id="paren.15"/> which are state-of-the-art tools to work on ML problems. Due to the presence of such compiled frameworks, there is for instance no performance loss during the training, which is the biggest part of the ML workflow, by using <italic>Python</italic>.</p>
      <p id="d1e304">Concerning the ML framework, <italic>Keras</italic> <xref ref-type="bibr" rid="bib1.bibx6" id="paren.16"><named-content content-type="post">release 2.2.4</named-content></xref> was chosen for the ML parts using <italic>TensorFlow</italic> (release 1.13.1) as back-end. <italic>Keras</italic> is a framework that abstracts functionality out of its back-end by providing a simpler syntax and implementation. For advanced model architectures and features it is still possible to implement parts or even the entire model in native <italic>TensorFlow</italic> and use the <italic>Keras</italic> front-end for training. Furthermore, <italic>TensorFlow</italic> has GPU support for training acceleration if a GPU device is available on the running system.</p>
      <p id="d1e331">For data handling, we chose a combination of <italic>xarray</italic> <xref ref-type="bibr" rid="bib1.bibx14 bib1.bibx15" id="paren.17"><named-content content-type="post">release 0.15.0</named-content></xref> and <italic>pandas</italic> <xref ref-type="bibr" rid="bib1.bibx46 bib1.bibx34" id="paren.18"><named-content content-type="post">release 1.0.1</named-content></xref>. <italic>pandas</italic> is an open-source tool to analyse and manipulate data primarily designed for tabular data. <italic>xarray</italic> was inspired by <italic>pandas</italic> and has been developed to work with multi-dimensional arrays as simply and efficiently as possible. <italic>xarray</italic> is based on the off-the-shelf <italic>Python</italic> package for scientific computing <italic>NumPy</italic> <xref ref-type="bibr" rid="bib1.bibx44" id="paren.19"><named-content content-type="post">release 1.18.1</named-content></xref> and introduces labels in the form of dimensions, coordinates, and attributes on top of raw <italic>NumPy</italic>-like arrays.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F1" specific-use="star"><?xmltex \currentcnt{1}?><?xmltex \def\figurename{Figure}?><label>Figure 1</label><caption><p id="d1e381">Visualization of the <italic>MLAir</italic> standard setup <monospace>DefaultWorkflow</monospace> including the stages <monospace>ExperimentSetup</monospace>, <monospace>PreProcessing</monospace>, <monospace>ModelSetup</monospace>, <monospace>Training</monospace>, and <monospace>PostProcessing</monospace> (all highlighted in orange) embedded in the <monospace>RunEnvironment</monospace> (sky blue). Each experiment customization (bluish green) like the data handler, model class, and hyperparameter shown as examples, is set during the initial <monospace>ExperimentSetup</monospace> and affects various stages of the workflow.</p></caption>
          <?xmltex \igopts{width=483.69685pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f01.png"/>

        </fig>

</sec>
<sec id="Ch1.S2.SS2">
  <label>2.2</label><title>Design of the MLAir workflow</title>
      <p id="d1e426">According to the goals outlined above, <italic>MLAir</italic> was designed as an end-to-end workflow comprising all required steps of the time series forecasting task. The workflow of <italic>MLAir</italic> is controlled by a run environment, which provides a central data store, performs logging, and ensures the orderly execution of a sequence of individual stages. Different workflows can be defined and executed under the umbrella of this environment. The standard <italic>MLAir</italic> workflow  (described in
Sect. <xref ref-type="sec" rid="Ch1.S2.SS3"/>) contains a sequence of typical steps for ML experiments (Fig. <xref ref-type="fig" rid="Ch1.F1"/>), i.e. experiment setup, preprocessing, model setup, training, and postprocessing.</p>
      <p id="d1e442">Besides the run environment, the experiment setup plays a very important role. During experiment setup, all customization and configuration modules, like the model class (Sect. <xref ref-type="sec" rid="Ch1.S2.SS4"/>), data handler (Sect. <xref ref-type="sec" rid="Ch1.S2.SS5"/>), or hyperparameters, are collected and made available to <italic>MLAir</italic>. Later, during execution of the workflow, these modules are then queried. For example, the hyperparameters are used in training whereas the data handler is already used in the preprocessing. We want to mention that apart from this default workflow, it is also possible to define completely new stages and integrate them into a custom <italic>MLAir</italic> workflow (see Sect. <xref ref-type="sec" rid="Ch1.S4.SS8"/>).</p>
</sec>
<sec id="Ch1.S2.SS3">
  <label>2.3</label><title>Run modules</title>
      <p id="d1e465"><italic>MLAir</italic> models the ML workflow as a sequence of self-contained stages called run modules. Each module handles distinct tasks whose calculations or results are usually required for all subsequent stages. At run time, all run modules can interchange information through a temporary data store. The run modules are executed sequentially in predefined order. A run module is only executed if the previous step was completed without error.  More advanced workflow concepts such as conditional execution of run modules are not implemented in this version of <italic>MLAir</italic>. Also, run modules cannot be run in parallel, although a single run module can very well execute parallel code. In the default setup (Fig. <xref ref-type="fig" rid="Ch1.F1"/>), the <italic>MLAir</italic> workflow constitutes the following run modules:
<list list-type="bullet"><list-item>
      <p id="d1e480"><italic>Run environment.</italic> The run module <monospace>RunEnvironment</monospace> is the base class for all other run modules. By wrapping the <monospace>RunEnvironment</monospace> class around all run modules, parameters are tracked, the workflow logging is centralized, and the temporary data store is initialized. After each run module and at the end of the experiment, <monospace>RunEnvironment</monospace> guarantees a smooth (experiment) closure by providing supplementary information on stage execution and parameter access from the data store.</p></list-item><list-item>
      <p id="d1e495"><italic>Experiment setup.</italic> The initial stage of <italic>MLAir</italic> to set up the experiment workflow is called <monospace>ExperimentSetup</monospace>. Parameters which are not customized are filled with default settings and stored for the experiment workflow. Furthermore, all local paths for the experiment and data are created during experiment setup.</p></list-item><list-item>
      <p id="d1e507"><italic>Preprocessing.</italic> During the run module <monospace>PreProcessing</monospace>, <italic>MLAir</italic> loads all required data and carries out typical ML preparation steps to have the data ready to use for training. If the <monospace>DefaultDataHandler</monospace> is used, this step includes downloading or loading of (locally stored) data, data transformation and interpolation. Finally, data are split into the subsets for training, validation, and testing.</p></list-item><list-item>
      <p id="d1e522"><italic>Model setup.</italic> The <monospace>ModelSetup</monospace> run module builds the raw ML model implemented as a model class (see Sect. <xref ref-type="sec" rid="Ch1.S2.SS4"/>), sets <italic>Keras</italic> and <italic>TensorFlow</italic> callbacks and checkpoints for the training, and finally compiles the model. Additionally, if using a pre-trained model, the weights of this model are loaded during this stage.</p></list-item><list-item>
      <p id="d1e539"><italic>Training.</italic> During the course of the <monospace>Training</monospace> run module, training and validation data are distributed according to the parameter <monospace>batch_size</monospace> to properly feed the ML model. The actual training starts subsequently. After each epoch of training, the model performance is evaluated on validation data. If performance improves as compared to previous cycles, the model is stored as <monospace>best_model</monospace>. This <monospace>best_model</monospace> is then used in the final analysis and evaluation.</p></list-item><list-item>
      <p id="d1e557"><italic>Postprocessing.</italic> In the final stage, <monospace>PostProcessing</monospace>, the trained model is statistically evaluated on the test data set. For comparison, <italic>MLAir</italic> provides two additional forecasts, first an ordinary multi-linear least squared fit trained on the same data as the ML model and second a persistence forecast, where observations of the past represent the forecast for the next steps within the prediction horizon. For daily data, the persistence forecast refers to the last observation of each sample to hold for all forecast steps. Skill scores based on the model training and evaluation metric are calculated for all forecasts and compared with climatological statistics. The evaluation results are saved as publication-ready graphics. Furthermore, a bootstrapping technique can be used to evaluate the importance of each input feature. More details on the statistical analysis that is carried out can be found in Sect. <xref ref-type="sec" rid="Ch1.S3.SS3"/>. Finally, a geographical overview map containing all stations is created for convenience.</p></list-item></list>
Ideally this predefined default workflow should meet the requirements for an entire end-to-end ML workflow on station-wise observational data. Nevertheless, <italic>MLAir</italic> provides options to customize the workflow according to the application needs (see Sect. <xref ref-type="sec" rid="Ch1.S4.SS8"/>).</p>
</sec>
<?pagebreak page1557?><sec id="Ch1.S2.SS4">
  <label>2.4</label><title>Model class</title>
      <p id="d1e585">In order to ensure a proper functioning of ML models, <italic>MLAir</italic> uses a model class, so that all models are created according to the same scheme. Inheriting from the <monospace>AbstractModelClass</monospace> guarantees correct handling during the workflow. The model class is designed to follow an easy plug-and-play behaviour so that within this security mechanism, it is possible to create highly customized models with the frameworks <italic>Keras</italic> and <italic>TensorFlow</italic>. We know that wrapping such a class around each ML model is slightly more complicated compared to building models directly in Keras, but by requiring the user to build their models in the style of a model class, the model structure can be documented more easily. Thus, there is less potential for errors when running through an ML workflow, in particular when this is done many times to find out the best model setup, for example. More details on the model class can be found in Sect. <xref ref-type="sec" rid="Ch1.S4.SS5"/>.</p>
</sec>
<sec id="Ch1.S2.SS5">
  <label>2.5</label><title>Data handler</title>
      <p id="d1e610">In analogy to the model class, the data handler organizes all operations related to data retrieval, preparation and provision of data samples. If a set of observation stations is being examined in the <italic>MLAir</italic> workflow, a new instance of the data handler is created for each station automatically and <italic>MLAir</italic> will take care of the iteration across all stations. As with the creation of a model, it is not necessary to modify <italic>MLAir</italic>'s source code. Instead, every data handler inherits from the <monospace>AbstractDataHandler</monospace> class which provides guidance on which methods need to be adapted to the actual workflow.</p>
      <p id="d1e625">By default, <italic>MLAir</italic> uses the <monospace>DefaultDataHandler</monospace>. It accesses data from Jülich Open Web Interface <xref ref-type="bibr" rid="bib1.bibx37 bib1.bibx38" id="paren.20"><named-content content-type="pre">JOIN,</named-content></xref> as demonstrated in Sect. <xref ref-type="sec" rid="Ch1.S3.SS1"/>. A detailed description of how to use this data handler can be found in Sect. <xref ref-type="sec" rid="Ch1.S4.SS4"/>. However, if a different data source or structure is used for an experiment, the <monospace>DefaultDataHandler</monospace> must be replaced by a custom data handler based on the <monospace>AbstractDataHandler</monospace>. Simply put, such a custom handler requires methods for creating itself at runtime and methods that return the inputs and outputs. Partitioning according to the batch size or suchlike is then handled by <italic>MLAir</italic> at the appropriate moment and does not need to be integrated into the custom data handler. Further information about custom data handlers follows in Sect. <xref ref-type="sec" rid="Ch1.S4.SS3"/>, and we refer to the source code documentation for additional details.</p>
</sec>
</sec>
<sec id="Ch1.S3">
  <label>3</label><title>Conducting an experiment with MLAir</title>
      <p id="d1e664">Before we dive deeper into available features and the actual implementation, we show three basic examples of the <italic>MLAir</italic> usage to demonstrate the underlying ideas and concepts and how first modifications can be made (Sect. <xref ref-type="sec" rid="Ch1.S3.SS1"/>). In Sect. <xref ref-type="sec" rid="Ch1.S3.SS2"/>, we then explain how the output of an <italic>MLAir</italic> experiment is structured and which graphics are created. Finally, we briefly touch on the statistical part of the model evaluation (Sect. <xref ref-type="sec" rid="Ch1.S3.SS3"/>).</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F2" specific-use="star"><?xmltex \currentcnt{2}?><?xmltex \def\figurename{Figure}?><label>Figure 2</label><caption><p id="d1e681">A very simple <italic>Python</italic> script (e.g. written in a <italic>Jupyter Notebook</italic> <xref ref-type="bibr" rid="bib1.bibx19" id="paren.21"/> or <italic>Python</italic> file) calling the <italic>MLAir</italic> package without any modification. Selected parts of the corresponding logging of the running code are shown underneath. Results of this and following code snippets have to be seen as a pure demonstration, because the default neural network is very simple.</p></caption>
        <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f02.png"/>

      </fig>

<sec id="Ch1.S3.SS1">
  <label>3.1</label><title>Running first experiments with MLAir</title>
      <p id="d1e712">To install <italic>MLAir</italic>, the program can be downloaded as described in the <italic>Code availability</italic> section, and the <italic>Python</italic> library dependencies should be installed from the requirements file. To test the installation, <italic>MLAir</italic> can be run in a default configuration with no extra arguments (see Fig. <xref ref-type="fig" rid="Ch1.F2"/>). These two commands will execute the workflow depicted in Fig. <xref ref-type="fig" rid="Ch1.F1"/>. This will perform an ML forecasting experiment of daily maximum ground-level ozone concentrations using a simple feed-forward neural network based on seven input variables consisting of preceding trace gas concentrations of ozone and nitrogen dioxide, and the values of temperature, humidity, wind speed, cloud cover, and the planetary boundary layer height.</p>
      <p id="d1e732"><italic>MLAir</italic> uses the <monospace>DefaultDataHandler</monospace> class (see Sect. <xref ref-type="sec" rid="Ch1.S4.SS4"/>) if not explicitly stated and automatically starts downloading all required air quality and meteorological data from JOIN the first time it is executed after a fresh installation. This web interface provides access to a database of measurements of over 10 000 air quality monitoring stations worldwide, assembled in the context of the Tropospheric Ozone Assessment Report <xref ref-type="bibr" rid="bib1.bibx42" id="paren.22"/>. In the default configuration, 21-year time series of nine variables from five stations are retrieved with a daily aggregated resolution (see Table <xref ref-type="table" rid="Ch1.T3"/> for details on aggregation). The retrieved data are stored locally to save time on the next execution (the data extraction can of course be configured as described in Sect. <xref ref-type="sec" rid="Ch1.S4.SS4"/>).</p>
      <p id="d1e749">After preprocessing of the data, splitting them into training, validation, and test data, and converting them to a <italic>xarray</italic> and <italic>NumPy</italic> format (details in Sect. <xref ref-type="sec" rid="Ch1.S2.SS1"/>), <italic>MLAir</italic> creates a new vanilla feed-forward neural network and starts to train it. The training is finished after a fixed number of epochs. In the default settings, the <monospace>epochs</monospace> parameter is preset to 20. Finally, the results are evaluated according to meteorological standards and a default set of plots is created. The trained model, all results and forecasts, the experiment parameters and log files, and the default plots are pooled in a folder in the current working directory. Thus, in its default configuration, <italic>MLAir</italic> performs a meaningful meteorological ML experiment, which can serve as a benchmark for further developments and baseline for more sophisticated ML architectures.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F3" specific-use="star"><?xmltex \currentcnt{3}?><?xmltex \def\figurename{Figure}?><label>Figure 3</label><caption><p id="d1e773">The <italic>MLAir</italic> experiment has now minor adjustments for the parameters <monospace>stations</monospace> and <monospace>window_history_size</monospace>.</p></caption>
          <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f03.png"/>

        </fig>

      <?pagebreak page1559?><p id="d1e791">In the second example (Fig. <xref ref-type="fig" rid="Ch1.F3"/>), we enlarged the <monospace>window_history_size</monospace> (number of previous time steps) of the input data to provide more contextual information to the vanilla model. Furthermore, we use a different set of observational stations as indicated in the parameter <monospace>stations</monospace>. From a first glance, the output of the experiment run is quite similar to the earlier example. However, there are a couple of aspects in this second experiment which we would like to point out. Firstly, the <monospace>DefaultDataHandler</monospace> keeps track of data available locally and thus reduces the overhead of reloading data from the web if this is not necessary. Therefore, no new data were downloaded for station <monospace>DEBW107</monospace>, which is part of the default configuration, as its data have already been stored locally in our first experiment. Of course the <monospace>DefaultDataHandler</monospace> can be forced to reload all data from their source if needed (see Sect. <xref ref-type="sec" rid="Ch1.S4.SS1"/>). The second key aspect to highlight here is that the parameter <monospace>window_history_size</monospace> could be changed, and the network was trained anew without any problem even though this change affects the shape of the input data and thus the neural network architecture. This is possible because the model class in <italic>MLAir</italic> queries the shape of the input variables and adapts the architecture of the input layer accordingly. Naturally, this procedure does not make perfect sense for every model, as it only affects the first layer of the model. In case the shape of the input data changes drastically, it is advisable to adapt the entire model as well. Concerning the network output, the second experiment overwrites all results from the first run, because without an explicit setting of the file path, <italic>MLAir</italic> always uses the same sandbox directory called <monospace>testrun_network</monospace>. In a real-world sequence of experiments, we recommend always specifying a new experiment path with a reasonably descriptive name (details on the experiment path in Sect. <xref ref-type="sec" rid="Ch1.S4.SS1"/>).</p>
      <p id="d1e829">The third example in this section demonstrates the activation of a partial workflow, namely a re-evaluation of a previously trained neural network. We want to rerun the evaluation part with a different set of stations to perform an independent validation. This partial workflow is also employed if the model is run in production. As we replace the stations for the new evaluation, we need to create a new testing set, but we want to skip the model creation and training steps. Hence, the parameters <monospace>create_new_model</monospace> and <monospace>train_model</monospace> are set to <monospace>False</monospace> (see Fig. <xref ref-type="fig" rid="Ch1.F4"/>). With this setup, the model is loaded from the local file path and the evaluation is performed on the newly provided stations. By combining the stations from the second and third experiment in the <monospace>stations</monospace> parameter the model could be evaluated at all selected stations together. In this setting, <italic>MLAir</italic> will abort to execute the evaluation if parameters pertinent for preprocessing or model compilation changed compared to the training run.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F4" specific-use="star"><?xmltex \currentcnt{4}?><?xmltex \def\figurename{Figure}?><label>Figure 4</label><caption><p id="d1e852">Experiment run without training. For this, it is required to have an already trained model in the experiment path.</p></caption>
          <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f04.png"/>

        </fig>

      <p id="d1e861">It is also possible to continue training of an already trained model. If the <monospace>train_model</monospace> parameter is set to <monospace>True</monospace>, training will be resumed at the last epoch reached previously, if this epoch number is lower than the <monospace>epochs</monospace> parameter. Specific uses for this are either an experiment interruption (for example due to wall clock time limit exceedance on batch systems) or the desire to extend the training if the optimal network weights have not been found yet. Further details on training resumption can be found in Sect. <xref ref-type="sec" rid="Ch1.S4.SS9"/>.</p>

      <?xmltex \floatpos{p}?><fig id="Ch1.F5"><?xmltex \currentcnt{5}?><?xmltex \def\figurename{Figure}?><label>Figure 5</label><caption><p id="d1e878">Default structure of each <italic>MLAir</italic> experiment with the subfolders <monospace>forecasts</monospace>, <monospace>latex_report</monospace>, <monospace>logging</monospace>, <monospace>model</monospace>, and <monospace>plots</monospace>. <monospace>&lt;exp_dir&gt;</monospace> is a placeholder for the actual name of the experiment.</p></caption>
          <?xmltex \igopts{width=236.157874pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f05.png"/>

        </fig>

</sec>
<sec id="Ch1.S3.SS2">
  <label>3.2</label><title>Results of an experiment</title>
      <p id="d1e918">All results of an experiment are stored in the directory, which is defined during the experiment setup stage (see Sect. <xref ref-type="sec" rid="Ch1.S4.SS1"/>). The sub-directory structure is created at the beginning of the experiment. There is no automatic deletion of temporary files in case of aborted runs so that the information that is generated up to the program termination can be inspected to find potential errors or to check on a successful initialization of the model, etc. Figure <xref ref-type="fig" rid="Ch1.F5"/> shows the output file structure. The content of each directory is as follows:
<list list-type="bullet"><list-item>
      <p id="d1e927">All samples used for training and validation are stored in the <monospace>batch_data</monospace> folder.</p></list-item><list-item>
      <p id="d1e934"><monospace>forecasts</monospace> contains the actual predictions of the trained model and the persistence and linear references. All forecasts (model and references) are provided in normalized and original value ranges. Additionally, the optional bootstrap forecasts are stored here (see Sect. <xref ref-type="sec" rid="Ch1.S3.SS3"/>).</p></list-item><list-item>
      <p id="d1e942">In <monospace>latex_report</monospace>, there are publication-ready tables in <italic>Markdown</italic> <xref ref-type="bibr" rid="bib1.bibx12" id="paren.23"/> or <italic>LaTeX</italic> <xref ref-type="bibr" rid="bib1.bibx22" id="paren.24"/> format, which give a summary about the stations used, the number of samples, and the hyperparameters and experiment settings.</p></list-item><list-item>
      <p id="d1e961">The <monospace>logging</monospace> folder contains information about the execution of the experiment. In addition to the console output, <italic>MLAir</italic> also stores messages on the debugging level, which give a better understanding of the internal program sequence. <italic>MLAir</italic> has a tracking functionality, which can be used to trace which data have been stored and pulled from the central data store. In combination with the corresponding tracking plot that is created at the very end of each experiment automatically, it allows visual tracking of which parameters have an effect on which stage. This functionality is most interesting for developers who make modifications to the source code and want to ensure that their changes do not break the data flow.</p></list-item><list-item>
      <p id="d1e974">The folder <monospace>model</monospace> contains everything that is related to the trained model. Besides the file, which contains the model itself <xref ref-type="bibr" rid="bib1.bibx20" id="paren.25"><named-content content-type="pre">stored in the binary hierarchical data format <italic>HDF5</italic>;</named-content></xref>, there is also an overview graphic of the model architecture and all <italic>Keras</italic> callbacks, for example from the learning rate. If a training is not started from the beginning but is either continued or applied to a pre-trained model, all necessary information like the model or required callbacks must be stored in this subfolder.</p></list-item><list-item>
      <p id="d1e992">The <monospace>plots</monospace> directory contains all graphics that are created during an experiment. Which graphics are to be created in postprocessing can be determined using the <monospace>plot_list</monospace> parameter in the experiment setup. In addition, <italic>MLAir</italic> automatically generates monitoring plots, for instance of the evolution of the loss during training.</p></list-item></list>
As described in the last bullet point, all plots which are created during an <italic>MLAir</italic> experiment can be found in the subfolder <monospace>plots</monospace>. By default, all available plot types are created. By explicitly naming individual graphics in the <monospace>plot_list</monospace> parameter, it is possible to override this behaviour and specify which graphics are created during postprocessing. Additional plots are created to monitor the training behaviour. These graphics are always created when a training session is carried out. Most of the plots which are created in the course of postprocessing are publication-ready graphics with complete legend and resolution of 500 dpi. Custom graphics can be added to <italic>MLAir</italic> by attaching an additional run module (see Sect. <xref ref-type="sec" rid="Ch1.S4.SS8"/>) which contains the graphic creation methods.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F6"><?xmltex \currentcnt{6}?><?xmltex \def\figurename{Figure}?><label>Figure 6</label><caption><p id="d1e1022">Map of central Europe showing the locations of some sample measurement stations as blue squares created by <monospace>PlotStationMap</monospace>.</p></caption>
          <?xmltex \igopts{width=236.157874pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f06.png"/>

        </fig>

      <?xmltex \floatpos{t}?><fig id="Ch1.F7" specific-use="star"><?xmltex \currentcnt{7}?><?xmltex \def\figurename{Figure}?><label>Figure 7</label><caption><p id="d1e1036"><monospace>PlotAvailability</monospace> diagram showing the available data for five measurement stations. The different colours denote which period of the time series is used for the training (orange), validation (green), and test (blue) data set. “Data availability” denotes if any of the above-mentioned stations has a data record for a given time.</p></caption>
          <?xmltex \igopts{width=483.69685pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f07.png"/>

        </fig>

      <p id="d1e1048">A general overview of the underlying data can be obtained with the graphics <monospace>PlotStationMap</monospace> and <monospace>PlotAvailability</monospace>. <monospace>PlotStationMap</monospace> (Fig. <xref ref-type="fig" rid="Ch1.F6"/>) marks the geographical position of the stations used on a plain map with a land–sea mask, country boundaries, and major water bodies. The data availability chart created by <monospace>PlotAvailability</monospace> (Fig. <xref ref-type="fig" rid="Ch1.F7"/>) indicates the time periods for which preprocessed data for each measuring station are available. The lowest bar shows whether a station with measurements is available at all for a certain point in time. The three subsets of training, validation, and testing data are highlighted in different colours.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F8"><?xmltex \currentcnt{8}?><?xmltex \def\figurename{Figure}?><label>Figure 8</label><caption><p id="d1e1070">Monitoring plots showing the evolution of train and validation loss as a function of the number of epochs. This plot type is kept very simplistic by choice. The underlying data are saved during the experiment so that it would be easy to create a more advanced plot using the same data.</p></caption>
          <?xmltex \igopts{width=236.157874pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f08.png"/>

        </fig>

      <p id="d1e1079">The monitoring graphics show the course of the loss function as well as the error depending on the epoch for the training and validation data (see Fig. <xref ref-type="fig" rid="Ch1.F8"/>). In addition, the error of the best model state with respect to the validation data is shown in the plot title. If the learning rate is modified during the course of the experiment, another plot is created to show its development. These monitoring graphics are kept as simple as possible and are meant to provide insight into the training process. The underlying data are always stored in the <italic>JavaScript Object Notation</italic> format <xref ref-type="bibr" rid="bib1.bibx16" id="paren.26"><named-content content-type="pre">.json,</named-content></xref> in the subfolder <monospace>model</monospace> and can therefore be used for case-specific analyses and plots.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F9"><?xmltex \currentcnt{9}?><?xmltex \def\figurename{Figure}?><label>Figure 9</label><caption><p id="d1e1097">Graph of <monospace>PlotMonthlySummary</monospace> showing the observations (green) and the predictions for all forecast steps (dark to light blue) separated for each month.</p></caption>
          <?xmltex \igopts{width=236.157874pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f09.png"/>

        </fig>

      <p id="d1e1109">Through the graphs <monospace>PlotMonthlySummary</monospace> and <monospace>PlotTimeSeries</monospace> it is possible to quickly assess the forecast quality of the ML model. The <monospace>PlotMonthlySummary</monospace> (see Fig. <xref ref-type="fig" rid="Ch1.F9"/>) summarizes all predictions of the model covering all stations but considering each month separately as a box-and-whisker diagram. With this graph it is possible to get a general overview of the distribution of the predicted values compared to the distribution of the observed values for each month. Besides, the exact course of the time series compared to the observation can be viewed in the <monospace>PlotTimeSeries</monospace> (not included as a figure in this article). However, since this plot has to scale according to the length of the time series, it should be noted that this last-mentioned graph is kept very simple and is generally not suitable for publication.</p>
</sec>
<?pagebreak page1560?><sec id="Ch1.S3.SS3">
  <label>3.3</label><title>Statistical analysis of results</title>
      <p id="d1e1134">A central element of <italic>MLAir</italic> is the statistical evaluation of the results according to state-of-the-art methods used in meteorology. To obtain specific information on the forecasting model, we treat forecasts and observations as random variables. Therefore, the joint distribution <inline-formula><mml:math id="M1" display="inline"><mml:mrow><mml:mi>p</mml:mi><mml:mo>(</mml:mo><mml:mi>m</mml:mi><mml:mo>,</mml:mo><mml:mi>o</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> of a model <inline-formula><mml:math id="M2" display="inline"><mml:mi>m</mml:mi></mml:math></inline-formula> and an observation <inline-formula><mml:math id="M3" display="inline"><mml:mi>o</mml:mi></mml:math></inline-formula> contains information on <inline-formula><mml:math id="M4" display="inline"><mml:mrow><mml:mi>p</mml:mi><mml:mo>(</mml:mo><mml:mi>m</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M5" display="inline"><mml:mrow><mml:mi>p</mml:mi><mml:mo>(</mml:mo><mml:mi>o</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> (marginal distribution), and the relations <inline-formula><mml:math id="M6" display="inline"><mml:mrow><mml:mi>p</mml:mi><mml:mo>(</mml:mo><mml:mi>o</mml:mi><mml:mo>|</mml:mo><mml:mi>m</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M7" display="inline"><mml:mrow><mml:mi>p</mml:mi><mml:mo>(</mml:mo><mml:mi>m</mml:mi><mml:mo>|</mml:mo><mml:mi>o</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> (conditional distribution) between both of them <xref ref-type="bibr" rid="bib1.bibx29" id="paren.27"/>. Following <xref ref-type="bibr" rid="bib1.bibx30" id="text.28"/>, marginal distribution is shown as a histogram (light grey), while the conditional distribution is shown as percentiles in different line styles. By using <monospace>PlotConditionalQuantiles</monospace>, <italic>MLAir</italic> automatically creates plots for the entire test period (Fig. <xref ref-type="fig" rid="Ch1.F10"/>) that are, as is common in meteorology, separated by seasons.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F10"><?xmltex \currentcnt{10}?><?xmltex \def\figurename{Figure}?><label>Figure 10</label><caption><p id="d1e1254">Conditional quantiles in terms of calibration-refinement factorization for the first lead time and the full test period. The marginal forecasting distribution is shown as a log histogram in light grey (counting on right axis). The conditional distribution (calibration) is shown as percentiles in different line styles. Calculations are done with a bin size of 1 ppb. Moreover, the percentiles are smoothed by a rolling mean of window size three. This kind of plot was originally proposed by <xref ref-type="bibr" rid="bib1.bibx30" id="text.29"/> and can be created using <monospace>PlotConditionalQuantiles</monospace>.</p></caption>
          <?xmltex \igopts{width=236.157874pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f10.png"/>

        </fig>

      <p id="d1e1269">In order to access the genuine added value of a new forecasting model, it is essential to take other existing forecasting models into account instead of reporting only metrics related to the observation. In <italic>MLAir</italic> we implemented three types of basic reference forecasts: (i) a persistence forecast, (ii) an<?pagebreak page1561?> ordinary multi-linear least square model, and (iii) four climatological forecasts.</p>
      <p id="d1e1276">The persistence forecast is based on the last observed time step, which is then used as a prediction for all lead times. The ordinary multi-linear least square model serves as a linear competitor and is derived from the same data the model was trained with. For the climatological references, we follow <xref ref-type="bibr" rid="bib1.bibx27" id="text.30"/> who defined single and multiple valued climatological references based on different timescales. We refer the reader to <xref ref-type="bibr" rid="bib1.bibx27" id="text.31"/> for an in-depth discussion of the climatological reference. Note that this kind of persistence and also the climatological forecast might not be applicable for all temporal resolutions and may therefore need adjustment in different experiment settings. We think here, for example, of a clear diurnal pattern in temperature, for which a persistence of successive observations would not provide a good forecast. In this context, a reference forecast based on the observation of the previous day at the same time might be more suitable.</p>
      <p id="d1e1285">For the comparison, we use a skill score <inline-formula><mml:math id="M8" display="inline"><mml:mi>S</mml:mi></mml:math></inline-formula>, which is naturally defined as the performance of a new forecast compared to a competitive reference with respect to a statistical metric <xref ref-type="bibr" rid="bib1.bibx28" id="paren.32"/>. Applying the mean squared error as the statistical metric, such a skill score <inline-formula><mml:math id="M9" display="inline"><mml:mi>S</mml:mi></mml:math></inline-formula> reduces to unity minus the ratio of the error of the forecast to the reference. A positive skill score can be interpreted as the percentage of improvement of the new model forecast in comparison to the reference. On the other hand, a negative skill score denotes that the forecast of interest is less accurate than the<?pagebreak page1562?> referencing forecast. Consequently, a value of zero denotes that both forecasts perform equally <xref ref-type="bibr" rid="bib1.bibx27" id="paren.33"/>.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F11"><?xmltex \currentcnt{11}?><?xmltex \def\figurename{Figure}?><label>Figure 11</label><caption><p id="d1e1310">Skill scores of different reference models like persistence (persi) and ordinary multi-linear least square (ols). Skill scores are shown separately for all forecast steps (dark to light blue). This graph is generated by invoking <monospace>PlotCompetitiveSkillScore</monospace>.</p></caption>
          <?xmltex \igopts{width=236.157874pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f11.png"/>

        </fig>

      <?xmltex \floatpos{t}?><fig id="Ch1.F12" specific-use="star"><?xmltex \currentcnt{12}?><?xmltex \def\figurename{Figure}?><label>Figure 12</label><caption><p id="d1e1324">Climatological skill scores (cases I to IV) and related terms of the decomposition as proposed in <xref ref-type="bibr" rid="bib1.bibx27" id="text.34"/> created by <monospace>PlotClimatologicalSkillScore</monospace>. Skill scores and terms are shown separately for all forecast steps (dark to light blue). In brief, cases I to IV describe a comparison with climatological reference values evaluated on the test data. Case I is the comparison of the forecast with a single mean value formed on the training and validation data and case II with the (multi-value) monthly mean. The climatological references for cases III and IV are, analogous to cases I and II, the single and the multi-value mean, but on the test data. Cases I to IV are calculated from the terms AI to CIV. For more detailed explanations of the cases, we refer to <xref ref-type="bibr" rid="bib1.bibx27" id="text.35"/>.</p></caption>
          <?xmltex \igopts{width=398.338583pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f12.png"/>

        </fig>

      <p id="d1e1342">The <monospace>PlotCompetitiveSkillScore</monospace> (Fig. <xref ref-type="fig" rid="Ch1.F11"/>) includes the comparison between the trained model, the persistence, and the ordinary multi-linear least squared regression. The climatological skill scores are calculated separately for each forecast step (lead time) and summarized as a box-and-whiskers plot over all stations and forecasts (Fig. <xref ref-type="fig" rid="Ch1.F12"/>), and as a simplified version showing the skill score only (not shown) using <monospace>PlotClimatologicalSkillScore</monospace>.</p>
      <p id="d1e1356">In addition to the statistical model evaluation, <italic>MLAir</italic> also allows the importance of individual input variables to be assessed through bootstrapping of individual input variables. For this, the time series of each individual input variable is resampled <inline-formula><mml:math id="M10" display="inline"><mml:mi>n</mml:mi></mml:math></inline-formula> times (with replacement) and then fed to the trained network. By resampling a single input variable, its temporal information is disturbed, but the general frequency distribution is preserved. The latter is important because it ensures that the model is provided only with values from a known range and does not extrapolate out-of-sample. Afterwards, the skill scores of the bootstrapped predictions are calculated using the original forecast as reference. Input variables that show an overly negative skill score during bootstrapping have a stronger influence on the prediction than input variables with a small negative skill score. In case the bootstrapped skill score even reaches the positive value domain, this could be an indication that the examined variable has no influence on the prediction at all. The result of this approach applied to all input variables is presented in <monospace>PlotBootstrapSkillScore</monospace> (Fig. <xref ref-type="fig" rid="Ch1.F13"/>). A more detailed description of this approach is given in <xref ref-type="bibr" rid="bib1.bibx18" id="text.36"/>.</p><?xmltex \hack{\newpage}?><?xmltex \floatpos{t}?><fig id="Ch1.F13" specific-use="star"><?xmltex \currentcnt{13}?><?xmltex \def\figurename{Figure}?><label>Figure 13</label><caption><p id="d1e1379">Skill score of bootstrapped model input predictions separated for each input variable (<inline-formula><mml:math id="M11" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula> axis) and forecast steps (dark to light blue) with the original (non-bootstrapped) predictions as reference. <monospace>PlotBootstrapSkillScore</monospace> is only executed if bootstrap analysis is enabled.</p></caption>
          <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f13.png"/>

        </fig>

</sec>
</sec>
<?pagebreak page1563?><sec id="Ch1.S4">
  <label>4</label><title>Configuration of experiment, data handler, and model class in the MLAir workflow</title>
      <p id="d1e1407">As well as the already described workflow adjustments, <italic>MLAir</italic> offers a large number of configuration options. Instead of defining parameters at different locations inside the code, all parameters are centrally set in the experiment setup. In this section, we describe all parameters that can be modified and the authors' choices for default settings when using the default workflow of <italic>MLAir</italic>.</p>

<?xmltex \floatpos{t}?><table-wrap id="Ch1.T1" specific-use="star"><?xmltex \currentcnt{1}?><label>Table 1</label><caption><p id="d1e1419">Summary of all parameters related to the host system that are required, recommended, or optional to adjust for a custom experiment workflow.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="3">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="left"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Host system</oasis:entry>
         <oasis:entry colname="col2"/>
         <oasis:entry colname="col3"/>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Parameter</oasis:entry>
         <oasis:entry colname="col2">Default</oasis:entry>
         <oasis:entry colname="col3">Adjustment</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>experiment_date</monospace></oasis:entry>
         <oasis:entry colname="col2">testrun</oasis:entry>
         <oasis:entry colname="col3">recommended</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>experiment_name</monospace></oasis:entry>
         <oasis:entry colname="col2">{<monospace>experiment_date</monospace>}_network</oasis:entry>
         <oasis:entry colname="col3">–<inline-formula><mml:math id="M14" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>experiment_path</monospace></oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M15" display="inline"><mml:mo>〈</mml:mo></mml:math></inline-formula>cwd<inline-formula><mml:math id="M16" display="inline"><mml:mrow><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup><mml:mo>〉</mml:mo><mml:mo>/</mml:mo></mml:mrow></mml:math></inline-formula>{<monospace>experiment_name</monospace>}</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>data_path</monospace></oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M17" display="inline"><mml:mo>〈</mml:mo></mml:math></inline-formula>cwd<inline-formula><mml:math id="M18" display="inline"><mml:mrow><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup><mml:mo>〉</mml:mo><mml:mo>/</mml:mo></mml:mrow></mml:math></inline-formula><monospace>data</monospace></oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>bootstrap_path</monospace></oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M19" display="inline"><mml:mo>〈</mml:mo></mml:math></inline-formula><monospace>data_path</monospace><inline-formula><mml:math id="M20" display="inline"><mml:mrow><mml:mo>〉</mml:mo><mml:mo>/</mml:mo></mml:mrow></mml:math></inline-formula><monospace>bootstraps</monospace></oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>forecast_path</monospace></oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M21" display="inline"><mml:mo>〈</mml:mo></mml:math></inline-formula><monospace>experiment_path</monospace><inline-formula><mml:math id="M22" display="inline"><mml:mrow><mml:mo>〉</mml:mo><mml:mo>/</mml:mo></mml:mrow></mml:math></inline-formula><monospace>forecasts</monospace></oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>plot_path</monospace></oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M23" display="inline"><mml:mo>〈</mml:mo></mml:math></inline-formula><monospace>experiment_path</monospace><inline-formula><mml:math id="M24" display="inline"><mml:mrow><mml:mo>〉</mml:mo><mml:mo>/</mml:mo></mml:mrow></mml:math></inline-formula><monospace>plots</monospace></oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table><table-wrap-foot><p id="d1e1422"><inline-formula><mml:math id="M12" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula> Only adjustable via the <monospace>experiment_date</monospace> parameter.<?xmltex \hack{\\}?><inline-formula><mml:math id="M13" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula> Refers to the Linux command to get the path name of the current working directory.</p></table-wrap-foot></table-wrap>

<sec id="Ch1.S4.SS1">
  <label>4.1</label><title>Host system and processing units</title>
      <p id="d1e1693">The <italic>MLAir</italic> workflow can be adjusted to the hosting system. For that, the local paths for experiment and data are adjustable (see Table <xref ref-type="table" rid="Ch1.T1"/> for all options). Both paths are separated by choice. This has the advantage that the same data can be used multiple times for different experiment setups if stored outside the experiment path. Contrary to the data path placement, all created plots and forecasts are saved in the <monospace>experiment_path</monospace> by default, but this can be adjusted through the <monospace>plot_path</monospace> and <monospace>forecast_path</monospace> parameter.</p>
      <p id="d1e1710">Concerning the processing units, <italic>MLAir</italic> supports both central processing units (CPUs) and GPUs. Due to their bandwidth optimization and efficiency on matrix operations, GPUs have become popular for ML applications <xref ref-type="bibr" rid="bib1.bibx21" id="paren.37"><named-content content-type="pre">see</named-content></xref>. Currently, the sample models implemented in <italic>MLAir</italic> are based on <italic>TensorFlow</italic> v1.13.1, which has distinct branches: the <italic>tensorflow-1.13.1</italic> package for CPU computation and the <italic>tensorflow-gpu-1.13.1</italic> package for GPU devices. Depending on the operating system, the user needs to install the appropriate library if using <italic>TensorFlow</italic> releases 1.15 and older <xref ref-type="bibr" rid="bib1.bibx41" id="paren.38"/>. Apart from this installation issue, <italic>MLAir</italic> is able to detect and handle both <italic>TensorFlow</italic> versions during run time. An <italic>MLAir</italic> version to support <italic>TensorFlow</italic> v2 is planned for the future (see Sect. <xref ref-type="sec" rid="Ch1.S5"/>).</p>
</sec>
<sec id="Ch1.S4.SS2">
  <label>4.2</label><title>Preprocessing</title>
      <p id="d1e1764">In the course of preprocessing, the data are prepared to allow immediate use in training and evaluation without further preparation. In addition to the general data acquisition and formatting, which will be discussed in Sect. <xref ref-type="sec" rid="Ch1.S4.SS3"/> and <xref ref-type="sec" rid="Ch1.S4.SS4"/>, preprocessing also handles the split into training, validation, and test data. All parameters discussed in this section are listed in Table <xref ref-type="table" rid="Ch1.T2"/>.</p>

<?xmltex \floatpos{t}?><table-wrap id="Ch1.T2" specific-use="star"><?xmltex \currentcnt{2}?><label>Table 2</label><caption><p id="d1e1776">Summary of all parameters related to the preprocessing that are required, recommended, or optional to adjust for a custom experiment workflow.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="3">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="left"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Preprocessing</oasis:entry>
         <oasis:entry colname="col2"/>
         <oasis:entry colname="col3"/>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Parameter</oasis:entry>
         <oasis:entry colname="col2">Default</oasis:entry>
         <oasis:entry colname="col3">Adjustment</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>stations</monospace></oasis:entry>
         <oasis:entry colname="col2">default stations<inline-formula><mml:math id="M27" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">recommended</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>data_handler</monospace></oasis:entry>
         <oasis:entry colname="col2"><monospace>DefaultDataHandler</monospace></oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>fraction_of_training</monospace></oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M28" display="inline"><mml:mn mathvariant="normal">0.8</mml:mn></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">optional<inline-formula><mml:math id="M29" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>use_all_stations_on_all_data_sets</monospace></oasis:entry>
         <oasis:entry colname="col2">True</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table><table-wrap-foot><p id="d1e1779"><inline-formula><mml:math id="M25" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula> Default stations: DEBW107, DEBY081, DEBW013, DEBW076, DEBW087.<?xmltex \hack{\\}?><inline-formula><mml:math id="M26" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula> Not used in the default setup because <monospace>use_all_stations_on_all_data_sets</monospace> is True.</p></table-wrap-foot></table-wrap>

      <p id="d1e1916">Data are split into subsets along the temporal axis and station between a hold-out data set (called test data) and the data that are used for training (training data) and model tuning (validation data). For each subset, a <monospace>{train,val,test}_start</monospace> and <monospace>{train,val,test}_end</monospace> date not exceeding the overall time span (see Sect. <xref ref-type="sec" rid="Ch1.S4.SS4"/>) can be set. Additionally, for each subset it is possible to define a minimal number of samples per station <monospace>{train,val,test}_min_length</monospace> to remove very short time series that potentially cause misleading results especially in the validation and test phase. A spatial split of the data is achieved by assigning each station to one of the three subsets of data. The parameter <monospace>fraction_of_training</monospace> determines the ratio between hold-out data and data for training and validation, where the latter two are always split with a ratio of <inline-formula><mml:math id="M30" display="inline"><mml:mrow><mml:mn mathvariant="normal">80</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="italic">%</mml:mi></mml:mrow></mml:math></inline-formula> to <inline-formula><mml:math id="M31" display="inline"><mml:mrow><mml:mn mathvariant="normal">20</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="italic">%</mml:mi></mml:mrow></mml:math></inline-formula>, which is a typical choice for these subsets.</p>
      <?pagebreak page1564?><p id="d1e1957">To achieve absolute statistical data subset independence, data should ideally be split along both temporal and spatial dimensions. Since the spatial dependency of two distinct stations may vary due to weather regimes, season, and time of day  <xref ref-type="bibr" rid="bib1.bibx47" id="paren.39"/>, a spatial and temporal division of the data might be useful, as otherwise a trained model can presumably lead to over-confident results. On the other hand, by applying a spatial split in combination with a temporal division, the amount of utilizable data can drop massively. In <italic>MLAir</italic>, it is therefore up to the user to split data either in the temporal dimension or along both dimensions by using the <monospace>use_all_stations_on_all_data_sets</monospace> parameter.</p>
</sec>
<?pagebreak page1565?><sec id="Ch1.S4.SS3">
  <label>4.3</label><title>Custom data handler</title>
      <p id="d1e1977">The integration of a custom data handler into the <italic>MLAir</italic> workflow is done by inheritance from the <monospace>AbstractDataHandler</monospace> class and implementation of at least the constructor <monospace>__init__()</monospace>, and the accessors <monospace>get_X()</monospace>, and <monospace>get_Y()</monospace>. The custom data handler is added to the <italic>MLAir</italic> workflow as a parameter without initialization. At runtime, <italic>MLAir</italic> then queries all the required parameters of this custom data handler from its arguments and keyword arguments, loads them from the data store and finally calls the constructor. If data need to be downloaded or preprocessed, this should be executed inside the constructor. It is sufficient to load the data in the accessor methods if the data can be used without conversion. Note that a data handler is only responsible for preparing data from a single origin, while the iteration and distribution into batches is taken care of while <italic>MLAir</italic> is running.</p>
      <p id="d1e2005">The accessor methods for input and target data form a clearly defined interface between <italic>MLAir</italic>'s run modules and the custom data handler. During training the data are needed as a <italic>NumPy</italic> array; for preprocessing and evaluation the data are partly used as <italic>xarray</italic>. Therefore the accessor methods have the parameter <monospace>as_numpy</monospace> and should be able to return both formats. Furthermore it is possible to use a custom upsampling technique for training. To activate this feature the parameter <monospace>upsampling</monospace> can be enabled. If such a technique is not used and therefore not implemented, the parameter has no further effect.</p>
      <p id="d1e2023">The abstract data handler provides two additional placeholder methods that can support data preparation, training, and validation. Depending on the case, it may be helpful to<?pagebreak page1566?> define these methods within a custom data handler. With the method <monospace>transformation</monospace> it is possible to either define or calculate the transformation properties of the data handler before initialization. The returned properties are then applied to all subdata sets, namely training, validation, and testing. Another supporting class method is <monospace>get_coordinates</monospace>. This method is currently used only for the map plot for geographical overview (see Sect. <xref ref-type="sec" rid="Ch1.S3.SS2"/>). To feed the overview map, this method must return a dictionary with the geographical coordinates indicated by the keys <monospace>lat</monospace> and <monospace>lon</monospace>.</p>

<?xmltex \floatpos{t}?><table-wrap id="Ch1.T3"><?xmltex \currentcnt{3}?><label>Table 3</label><caption><p id="d1e2044">Summary of all parameters related to the default data handler that are required, recommended, or optional to adjust for a custom experiment workflow.</p></caption><oasis:table frame="topbot"><?xmltex \begin{scaleboxenv}{.93}[.93]?><oasis:tgroup cols="3">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="left"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Default data handler</oasis:entry>
         <oasis:entry colname="col2"/>
         <oasis:entry colname="col3"/>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Parameter</oasis:entry>
         <oasis:entry colname="col2">Default</oasis:entry>
         <oasis:entry colname="col3">Adjustment</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>data_path</monospace></oasis:entry>
         <oasis:entry colname="col2">see Table <xref ref-type="table" rid="Ch1.T1"/></oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>stations</monospace></oasis:entry>
         <oasis:entry colname="col2">default stations<inline-formula><mml:math id="M37" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">recommended</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>network</monospace></oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>station_type</monospace></oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>variables</monospace></oasis:entry>
         <oasis:entry colname="col2">default variables<inline-formula><mml:math id="M38" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">recommended</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>statistics_per_var</monospace></oasis:entry>
         <oasis:entry colname="col2">default statistics<inline-formula><mml:math id="M39" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">recommended</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>target_var</monospace></oasis:entry>
         <oasis:entry colname="col2">o3</oasis:entry>
         <oasis:entry colname="col3">recommended</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>start</monospace></oasis:entry>
         <oasis:entry colname="col2">1997-01-01</oasis:entry>
         <oasis:entry colname="col3">recommended</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>end</monospace></oasis:entry>
         <oasis:entry colname="col2">2017-12-31</oasis:entry>
         <oasis:entry colname="col3">recommended</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>sampling</monospace></oasis:entry>
         <oasis:entry colname="col2">daily</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>window_history_size</monospace></oasis:entry>
         <oasis:entry colname="col2">13</oasis:entry>
         <oasis:entry colname="col3">recommended</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>interpolation_method</monospace></oasis:entry>
         <oasis:entry colname="col2">linear</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>limit_nan_fill</monospace></oasis:entry>
         <oasis:entry colname="col2">1</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>min_length</monospace><inline-formula><mml:math id="M40" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">c</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">0</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>window_lead_time</monospace></oasis:entry>
         <oasis:entry colname="col2">3</oasis:entry>
         <oasis:entry colname="col3">recommended</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>overwrite_local_data</monospace></oasis:entry>
         <oasis:entry colname="col2">False</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup><?xmltex \end{scaleboxenv}?></oasis:table><table-wrap-foot><p id="d1e2047"><inline-formula><mml:math id="M32" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula> Default stations: DEBW107, DEBY081, DEBW013, DEBW076, DEBW087.<?xmltex \hack{\\}?><inline-formula><mml:math id="M33" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula> Default variables (statistics): o3 (dma8eu), relhum (average_values), temp (maximum), <inline-formula><mml:math id="M34" display="inline"><mml:mi>u</mml:mi></mml:math></inline-formula> (average_values), <inline-formula><mml:math id="M35" display="inline"><mml:mi>v</mml:mi></mml:math></inline-formula> (average_values), no (dma8eu), no2 (dma8eu), cloudcover (average_values), pblheight (maximum).<?xmltex \hack{\\}?><inline-formula><mml:math id="M36" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">c</mml:mi></mml:msup></mml:math></inline-formula> Indicates the required minimum number of samples per station.</p></table-wrap-foot></table-wrap>

</sec>
<sec id="Ch1.S4.SS4">
  <label>4.4</label><title>Default data handler</title>
      <p id="d1e2382">In this section we describe a concrete implementation of a data handler, namely the <monospace>DefaultDataHandler</monospace>, using data from the JOIN interface.</p>
      <p id="d1e2388">Regarding the data handling and preprocessing, several parameters can be set to control the choice of inputs, size of data, etc. in the data handler (see Table <xref ref-type="table" rid="Ch1.T3"/>). First, the underlying raw data must be downloaded from the web. The current version of the <monospace>DefaultDataHandler</monospace> is configured for use with the REST API of the JOIN interface <xref ref-type="bibr" rid="bib1.bibx36" id="paren.40"/>. Alternatively, data could be already available on the local machine in the directory <monospace>data_path</monospace>, e.g. from a previous experiment run. Additionally, a user can force <italic>MLAir</italic> to load fresh data from the web by enabling the <monospace>overwrite_local_data</monospace> parameter. According to the design structure of a data handler, data are handled separately for each observational station indicated by its ID. By default, the <monospace>DefaultDataHandler</monospace> uses all German air quality stations provided by the German Environment Agency (Umweltbundesamt, UBA) that are indicated as “background” stations according to the European Environmental Agency (EEA) AirBase classification <xref ref-type="bibr" rid="bib1.bibx9" id="paren.41"/>. Using the <monospace>stations</monospace> parameter, a user-defined data collection can be created. To filter the stations, the parameters <monospace>network</monospace> and <monospace>station_type</monospace> can be used as described in <xref ref-type="bibr" rid="bib1.bibx37" id="text.42"/> and the documentation of JOIN <xref ref-type="bibr" rid="bib1.bibx36" id="paren.43"/>.</p>
      <p id="d1e2431">For the <monospace>DefaultDataHandler</monospace>, it is recommended to specify at least
<list list-type="bullet"><list-item>
      <p id="d1e2439">the number of preceding time steps to use for a single input sample (<monospace>window_history_size</monospace>),</p></list-item><list-item>
      <p id="d1e2446">if and which interpolation should be used (<monospace>interpolation_method</monospace>),</p></list-item><list-item>
      <p id="d1e2453">if and how many missing values are allowed to be filled by interpolation (<monospace>limit_nan_fill</monospace>),</p></list-item><list-item>
      <p id="d1e2460">and how many time steps the forecast model should predict (<monospace>window_lead_time</monospace>).</p></list-item></list>
Regarding the data content itself, each requested variable must be added to the <monospace>variables</monospace> list and be part of the <monospace>statistics_per_var</monospace> dictionary together with a proper statistic abbreviation <xref ref-type="bibr" rid="bib1.bibx36" id="paren.44"><named-content content-type="pre">see documentation of</named-content></xref>. If not provided, both parameters are chosen from a standard set of variables and statistics.  Similar actions are required for the target variable. Firstly, target variables are defined in <monospace>target_var</monospace>, and secondly, the target variable must also be part of the <monospace>statistics_per_var</monospace> parameter. Note that the JOIN REST API calculates these statistics online from hourly values, thereby taking into account a minimum data coverage criterion. Finally, the overall time span the data shall cover can be defined via <monospace>start</monospace> and <monospace>end</monospace>, and the temporal resolution of the data is set by a string like <monospace>"daily"</monospace> passed to the <monospace>sampling</monospace> parameter. At this point, we want to refer to Sect. <xref ref-type="sec" rid="Ch1.S5"/>, where we discuss the temporal resolution currently available.</p>
</sec>
<sec id="Ch1.S4.SS5">
  <label>4.5</label><title>Defining a model class</title>
      <p id="d1e2508">The motivation behind using model classes was already explained in Sect. <xref ref-type="sec" rid="Ch1.S2.SS4"/>. Here, we show more details on the implementation and customization.</p>
      <?pagebreak page1567?><p id="d1e2513">To achieve the goal of an easy plug-and-play behaviour, each ML model implemented in <italic>MLAir</italic> must inherit from the <monospace>AbstractModelClass</monospace>, and the methods <monospace>set_model</monospace> and <monospace>set_compile_options</monospace> are required to be overwritten for the custom model. Inside <monospace>set_model</monospace>, the entire model from inputs to outputs is created. Thereby it has to be ensured that the model is compatible with <italic>Keras</italic> to be compiled. <italic>MLAir</italic> supports both the functional and sequential <italic>Keras</italic> application programming interfaces. For details on how to create a model with  <italic>Keras</italic>, we refer to the official <italic>Keras</italic> documentation <xref ref-type="bibr" rid="bib1.bibx6" id="paren.45"/>. All options for the model compilation should be set in the <monospace>set_compile_options</monospace> method. This method should at least include information on the training algorithm (<monospace>optimizer</monospace>), and the loss to measure performance during training and optimize the model for (<monospace>loss</monospace>). Users can add other compile options like the learning rate (<monospace>learning_rate</monospace>), <monospace>metrics</monospace> to report additional informative performance metrics, or options regarding the weighting as <monospace>loss_weights</monospace>, <monospace>sample_weight_mode</monospace>, or <monospace>weighted_metrics</monospace>. Finally, methods that are not part of <italic>Keras</italic> or <italic>TensorFlow</italic> like customized loss functions or self-made model extensions are required to be added as so-called <monospace>custom_objects</monospace> to the model so that <italic>Keras</italic> can properly use these custom objects. For that, it is necessary to call the <monospace>set_custom_objects</monospace> method with all custom objects as key value pairs. See also the official <italic>Keras</italic> documentation for further information on custom objects.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F14" specific-use="star"><?xmltex \currentcnt{14}?><?xmltex \def\figurename{Figure}?><label>Figure 14</label><caption><p id="d1e2597">Example how to create a custom ML model implemented as a model class. <monospace>MyCustomisedModel</monospace> has a single <inline-formula><mml:math id="M41" display="inline"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>×</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:math></inline-formula> convolution layer followed by two fully connected layers with a neuron size of 16, and the number of forecast steps. The model itself is defined in the <monospace>set_model</monospace> method, whereas compile options such as the optimizer, loss, and error metrics are defined in <monospace>set_compile_options</monospace>. Additionally, for demonstration, the loss is added as custom object which is not required because a <italic>Keras</italic> built-in function is used as loss.</p></caption>
          <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f14.png"/>

        </fig>

      <p id="d1e2631">An example implementation of a small model using a single convolution and three fully connected layers is shown in Fig. <xref ref-type="fig" rid="Ch1.F14"/>. By inheriting from the <monospace>AbstractModelClass</monospace> (l. 9), invoking its constructor (l. 15), defining the methods <monospace>set_model</monospace> (l. 25–35) and <monospace>set_compile_options</monospace> (l. 37–41), and calling these two methods (l. 21–22), the custom model is immediately usable for <italic>MLAir</italic>. Additionally, the loss is added to the custom objects (l. 23). This last step would not be necessary in this case, because an error function incorporated in <italic>Keras</italic> is used (l. 2/40). For the purpose of demonstrating how to use a customized loss, it is added nevertheless.</p>
      <p id="d1e2652">A more elaborate example is described in <xref ref-type="bibr" rid="bib1.bibx18" id="text.46"/>, who used extensions to the standard <italic>Keras</italic> library in their workflow. So-called inception blocks <xref ref-type="bibr" rid="bib1.bibx40" id="paren.47"/> and a modification of the two-dimensional padding layers were implemented as <italic>Keras</italic> layers and could be used in the model afterwards.</p>

<?xmltex \floatpos{t}?><table-wrap id="Ch1.T4" specific-use="star"><?xmltex \currentcnt{4}?><label>Table 4</label><caption><p id="d1e2670">Summary of all parameters related to the training that are required, recommended, or optional to adjust for a custom experiment workflow.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="3">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="left"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Training</oasis:entry>
         <oasis:entry colname="col2"/>
         <oasis:entry colname="col3"/>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Parameter</oasis:entry>
         <oasis:entry colname="col2">Default</oasis:entry>
         <oasis:entry colname="col3">Adjustment</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>train_model</monospace></oasis:entry>
         <oasis:entry colname="col2">False</oasis:entry>
         <oasis:entry colname="col3">recommended<inline-formula><mml:math id="M45" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>create_new_model</monospace></oasis:entry>
         <oasis:entry colname="col2">False</oasis:entry>
         <oasis:entry colname="col3">recommended<inline-formula><mml:math id="M46" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>batch_size</monospace></oasis:entry>
         <oasis:entry colname="col2">512</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>epochs</monospace></oasis:entry>
         <oasis:entry colname="col2">20</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>loss</monospace><inline-formula><mml:math id="M47" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">required</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>metrics</monospace><inline-formula><mml:math id="M48" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>model</monospace></oasis:entry>
         <oasis:entry colname="col2">vanilla model<inline-formula><mml:math id="M49" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">c</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">required</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>learning_rate</monospace><inline-formula><mml:math id="M50" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">required</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>optimizer</monospace><inline-formula><mml:math id="M51" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">required</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>extreme_values</monospace></oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>extremes_on_right_tail_only</monospace></oasis:entry>
         <oasis:entry colname="col2">False</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>permute_data</monospace></oasis:entry>
         <oasis:entry colname="col2">False</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table><table-wrap-foot><p id="d1e2673"><inline-formula><mml:math id="M42" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula> Note: both parameters are disabled per default to prevent unintended overwriting of a model. If, upon reversion, these parameters are not enabled on the first execution of a new experiment without providing a suitable and trained ML model, the <italic>MLAir</italic> workflow is going to fail.<?xmltex \hack{\\}?><inline-formula><mml:math id="M43" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula> These parameters are set in the model class.<?xmltex \hack{\\}?><inline-formula><mml:math id="M44" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">c</mml:mi></mml:msup></mml:math></inline-formula> As default, a vanilla feed-forward neural network architecture will be loaded for workflow testing. The usage of such a simple network for a real application is at least questionable.</p></table-wrap-foot></table-wrap>

</sec>
<sec id="Ch1.S4.SS6">
  <label>4.6</label><title>Training</title>
      <p id="d1e2968">The parameter <monospace>create_new_model</monospace> instructs <italic>MLAir</italic> to create a new model and use it in the training. This is necessary, for example, for the very first training run in a new experiment. However, it must be noted that already existing training progress within the experiment will be overwritten by activating <monospace>create_new_model</monospace>. Independent of using a new or already existing model, <monospace>train_model</monospace> can be used to set whether the model is to be trained or not. Further notes on the continuation of an already started training or the use of a pre-trained model can be found in Sect. <xref ref-type="sec" rid="Ch1.S4.SS9"/>.</p>
      <p id="d1e2985">Most parameters to set for the training stage are related to hyperparameter tuning (see Table <xref ref-type="table" rid="Ch1.T4"/>). Firstly, the <monospace>batch_size</monospace> can be set. Furthermore, the number of <monospace>epochs</monospace> to train needs to be adjusted. Last but not least, the <monospace>model</monospace> used itself must be provided to <italic>MLAir</italic> including additional hyperparameters like the <monospace>learning_rate</monospace>, the algorithm to train the model (<monospace>optimizer</monospace>), and the <monospace>loss</monospace> function to measure model performance. For more details on how to implement an ML model properly we refer to Sect. <xref ref-type="sec" rid="Ch1.S4.SS5"/>.</p>
      <p id="d1e3014">Due to its application focus on meteorological time series and therefore on solving a regression problem, <italic>MLAir</italic> offers a particular handling of training data. A popular technique in ML, especially in the image recognition field, is to augment and randomly shuffle data to produce a larger number of input samples with a broader variety. This method requires independent and identically distributed data. For meteorological applications, these techniques cannot be applied out of the box, because of the lack of statistical independence of most data and autocorrelation <xref ref-type="bibr" rid="bib1.bibx39" id="paren.48"><named-content content-type="pre">see also</named-content></xref>. To avoid generating over-confident forecasts, training and test data are split into blocks so that little or no overlap remains between the data sets. Another common problem in ML, not only in the meteorological context, is the natural under-representation of extreme values, i.e. an imbalance problem. To address this issue, <italic>MLAir</italic> allows more emphasis to be placed on such data points. The weighting of data samples is conducted by an over-representation of values that can be considered as extreme regarding the deviation from a mean state in the output space. This can be applied during training by using the <monospace>extreme_values</monospace> parameter, which defines a threshold value at which a value is considered extreme. Training samples with target values that exceed this limit are then used a second time in each epoch. It is also possible to enter more than one value for the parameter. In this case, samples with values that exceed several limits are duplicated according to the number of limits exceeded. For positively skewed distributions, it could be helpful to apply this over-representation only on the right tail of the distribution (<monospace>extremes_on_right_tail_only</monospace>). Furthermore, it is possible to shuffle data within, and only within, the training subset randomly by enabling <monospace>permute_data</monospace>.</p>
</sec>
<sec id="Ch1.S4.SS7">
  <label>4.7</label><title>Validation</title>
      <p id="d1e3046">The configuration of the ML model validation is related to the postprocessing stage. As mentioned in Sect. <xref ref-type="sec" rid="Ch1.S2.SS3"/>, in the default configuration there are three major validation steps undertaken after each run besides the creation of graphics: first, the trained model is opposed to the two reference models, a simple linear regression and a persistence prediction. Second, these models are compared with climatological statistics. Lastly, the influence of each input variable is estimated by a bootstrap procedure.</p>

<?xmltex \floatpos{t}?><table-wrap id="Ch1.T5"><?xmltex \currentcnt{5}?><label>Table 5</label><caption><p id="d1e3054">Summary of all parameters related to the evaluation that are required, recommended, or optional to adjust for a custom experiment workflow.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="3">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="left"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Evaluation</oasis:entry>
         <oasis:entry colname="col2"/>
         <oasis:entry colname="col3"/>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Parameter</oasis:entry>
         <oasis:entry colname="col2">Default</oasis:entry>
         <oasis:entry colname="col3">Adjustment</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>plot_list</monospace></oasis:entry>
         <oasis:entry colname="col2">default plots<inline-formula><mml:math id="M54" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>evaluate_bootstraps</monospace></oasis:entry>
         <oasis:entry colname="col2">True</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>number_of_bootstraps</monospace></oasis:entry>
         <oasis:entry colname="col2">20</oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>create_new_bootstraps</monospace></oasis:entry>
         <oasis:entry colname="col2">False<inline-formula><mml:math id="M55" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">optional</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table><table-wrap-foot><p id="d1e3057"><inline-formula><mml:math id="M52" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">a</mml:mi></mml:msup></mml:math></inline-formula> Default plots are <monospace>PlotMonthlySummary</monospace>, <monospace>PlotStationMap</monospace>, <monospace>PlotClimatologicalSkillScore</monospace>, <monospace>PlotTimeSeries</monospace>, <monospace>PlotCompetitiveSkillScore</monospace>, <monospace>PlotBootstrapSkillScore</monospace>, <monospace>PlotConditionalQuantiles</monospace>, and <monospace>PlotAvailability</monospace>.<?xmltex \hack{\\}?><inline-formula><mml:math id="M53" display="inline"><mml:msup><mml:mi/><mml:mi mathvariant="normal">b</mml:mi></mml:msup></mml:math></inline-formula> Is automatically enabled if parameter <monospace>train_model</monospace> (see Table <xref ref-type="table" rid="Ch1.T4"/>) is enabled.</p></table-wrap-foot></table-wrap>

      <?pagebreak page1568?><p id="d1e3216">Due to the computational burden the calculation of the input variable sensitivity can be skipped and the graphics creation part can be shortened. To perform the sensitivity study, the parameter <monospace>evaluate_bootstraps</monospace> must be enabled and the <monospace>number_of_bootstraps</monospace> defines how many samples shall be drawn for the evaluation (see Table <xref ref-type="table" rid="Ch1.T5"/>). If such a sensitivity study was already performed and the training stage was skipped, the <monospace>create_new_bootstraps</monospace> parameter should be set to <monospace>False</monospace> to reuse already preprocessed samples if possible. To control the creation of graphics, the parameter <monospace>plot_list</monospace> can be adjusted. If not specified, a default selection of graphics is generated. When using <monospace>plot_list</monospace>, each graphic to be drawn must be specified individually. More details about all possible graphics have already been provided in Sect. <xref ref-type="sec" rid="Ch1.S3.SS2"/> and <xref ref-type="sec" rid="Ch1.S3.SS3"/>. In the current version, extending the validation as part of <italic>MLAir</italic>'s default postprocessing stage is somewhat complicated, but it is possible to append another run module to the workflow to perform additional validations.</p>
</sec>
<?pagebreak page1569?><sec id="Ch1.S4.SS8">
  <label>4.8</label><title>Custom run modules and workflow adaptions</title>
      <p id="d1e3256"><italic>MLAir</italic> offers the possibility to define and execute a custom workflow for situations in which special calculations or data evaluation procedures not available in the standard version are needed. For this purpose it is not necessary to modify the program code of <italic>MLAir</italic>, but instead user-defined run modules can be included in a new workflow. This is done in analogy to the procedure of defining new model classes by inheritance from the base class <monospace>RunEnvironment</monospace>. Compared to the very simple examples from Sect. <xref ref-type="sec" rid="Ch1.S3"/>, such a use of <italic>MLAir</italic> requires a slightly increased effort. The implementation of the run module is done straightforwardly by a constructor method, which initializes the module and executes all desired calculation steps when called. To execute the custom workflow, the <italic>MLAir</italic> <monospace>Workflow</monospace> class must be loaded and then each run module must be registered. The order in which the individual stages are added determines the execution sequence.</p>
      <p id="d1e3279">As custom workflows will generally be necessary if a custom run module is to be defined, we briefly describe how the central data store mentioned in Sect. <xref ref-type="sec" rid="Ch1.S2.SS3"/> interacts with the workflow module. With the data store it is possible to share any kind of information from previous or subsequent stages. By invoking the constructor of the super class during the initialization of a custom run module, the data store is automatically connected with this module. Information can then be set or queried using the accessor methods <monospace>get</monospace> and <monospace>set</monospace>. For each saved information object a separate namespace called <monospace>scope</monospace> can be assigned. If not specified, the object is always stored in the general scope. If the scope is specified, a separate sub-scope is created. Information stored in this scope memory cannot be accessed from the general scope memory, but conversely all sub-scopes have access to the general scope. For example, more general objects can be set in the general scope and objects specific to a sub-data set, such as test data, can be stored under the scope <monospace>test</monospace>. If some objects for the keyword <monospace>test</monospace> are retrieved from the data store, then for non-existent objects in the <monospace>test</monospace> namespace attributes from the general scope are used if available.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F15" specific-use="star"><?xmltex \currentcnt{15}?><?xmltex \def\figurename{Figure}?><label>Figure 15</label><caption><p id="d1e3305">Embedding of a custom run module in a modified <italic>MLAir</italic> workflow. In comparison to Figs. <xref ref-type="fig" rid="Ch1.F2"/>, <xref ref-type="fig" rid="Ch1.F3"/>, and <xref ref-type="fig" rid="Ch1.F4"/>, this code example works on a single step deeper regarding the level of abstraction. Instead of calling the run method of <italic>MLAir</italic>, the user needs to add all stages individually and is responsible for all dependencies between the stages. By using the <monospace>Workflow</monospace> class as context manager, all stages are automatically connected with the result that all stages can easily be plugged in.</p></caption>
          <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://gmd.copernicus.org/articles/14/1553/2021/gmd-14-1553-2021-f15.png"/>

        </fig>

      <p id="d1e3331">An example for the implementation of a custom run module embedded in a custom workflow can be found in Fig. <xref ref-type="fig" rid="Ch1.F15"/>. The custom run module named <monospace>CustomStage</monospace> inherits from the base class <monospace>RunEnvironment</monospace> (l. 4) and calls its constructor (l. 8) on initialization. The <monospace>CustomStage</monospace> expects a single parameter (<monospace>test_string</monospace>, l. 7), which<?pagebreak page1570?> is used during the <monospace>run</monospace> method (l. 11–15). The <monospace>run</monospace> method first logs two information messages by using the <monospace>test_string</monospace> parameter (l. 12–13). Then it extracts the value of the parameter <monospace>epochs</monospace> (l. 14) that has been set in the <monospace>ExperimentSetup</monospace> (l. 21) from the data store and logs the value of this parameter too. To run this custom run module is has to be included in a workflow. First an empty workflow is created (l. 19) and then individual run modules are attached (l. 21–23). As last step, this new defined workflow is executed by calling the <monospace>run</monospace> method (l. 25).</p>
</sec>
<sec id="Ch1.S4.SS9">
  <label>4.9</label><title>How to continue an experiment?</title>
      <?pagebreak page1571?><p id="d1e3375">There can be different reasons for the continuation of an experiment. First of all, by looking at the monitoring graphs, it could be discovered that training has not yet converged and the number of epochs should be increased. Instead of training a new network from scratch, the training can be resumed from the latest epoch to save time. To do so, the parameter <monospace>epochs</monospace> must be increased accordingly and <monospace>create_new_model</monospace> must be set to <monospace>False</monospace>. If the <monospace>model</monospace> output folder has not been touched, the intermediate results and the history of the previous training are usually available in full, so that <italic>MLAir</italic> can continue the training as if it had never been interrupted. Another reason for a continuation would be the interruption of the training for unexpected reasons such as runtime exceedance on batch systems. By keeping the same number of epochs and switching off the creation of a new model, the training continues at the last checkpoint (see model setup in Sect. <xref ref-type="sec" rid="Ch1.S2.SS3"/>). Finally, <italic>MLAir</italic> can also be used in the context of transfer learning. By providing a pre-trained model and having <monospace>train_model</monospace> enabled and <monospace>create_new_model</monospace> disabled, a transfer learning task can be performed.</p>
</sec>
</sec>
<sec id="Ch1.S5">
  <label>5</label><title>Limitations</title>
      <p id="d1e3415">Even though <italic>MLAir</italic> addresses a wide range of ML-related problems and allows many different ML architectures and customized workflows to be embedded, it is still no universal Swiss Army knife but rather focuses on the application of neural networks for the task of station time series forecasting. In this section we will explain the limitations of <italic>MLAir</italic> and why <italic>MLAir</italic> ends at these points.</p>
      <p id="d1e3427">Due to the scientifically oriented development of <italic>MLAir</italic> starting from a specific research question <xref ref-type="bibr" rid="bib1.bibx18" id="paren.49"/>, <italic>MLAir</italic> could initially only use data from the REST API of JOIN. This binding has already been revoked in the current version, however, the <monospace>DefaultDataHandler</monospace> still uses this data source. Furthermore, <italic>MLAir</italic> always expects a particular structure in the data and especially considers the data as a collection of time series data from various stations. We are currently investigating the possibility of integrating grid data, which could be taken from a weather model, and time-constant data such as topography into the <italic>MLAir</italic> workflow, but we cannot yet present any results on how easy such an integration would be.</p>
      <p id="d1e3449">While <italic>MLAir</italic> can technically handle data in different time resolutions, it has been tested primarily on daily aggregated data due to the specific science case which served as the seed for its development. The use of different temporal resolutions was spot-checked and could be successfully confirmed without obvious errors, but we cannot guarantee that the results will be meaningful if data in other temporal resolutions are used as inputs. In particular, most of the evaluation routines may not make sense for data in less than hourly or greater than daily resolution. Note also that <italic>MLAir</italic> does not perform explicit error checking or missing value handling. Such functionality must be implemented within the data handler. <italic>MLAir</italic> expects a ready-to-use data set without missing values provided by the data handler during training.</p>
      <p id="d1e3461">Another limitation is the choice of the underlying libraries and their versions. Due to the selection of <italic>TensorFlow</italic> as back-end, it is not possible to use <italic>PyTorch</italic> or other frameworks in combination with <italic>MLAir</italic>. Specifically, <italic>MLAir</italic> was developed and tested with <italic>TensorFlow</italic> version 1.13.1, as the HPC systems on which our experiments are performed supported this version at the time of writing. We have already tested <italic>MLAir</italic> occasionally with the <italic>TensorFlow</italic> version 1.15 and could not find any errors. Please check the code repository for updates concerning the support of newer  <italic>TensorFlow</italic> versions, which we hope to make available in the coming months.</p><?xmltex \hack{\newpage}?>
</sec>
<sec id="Ch1.S6" sec-type="conclusions">
  <label>6</label><title>Summary</title>
      <p id="d1e3498"><italic>MLAir</italic> is an innovative software package intended to facilitate high-quality meteorological studies using ML. By providing an end-to-end solution based on a specific scientific workflow of time series prediction, <italic>MLAir</italic> enables a transparent and reproducible conduction of ML experiments in this domain. Due to the plug-and-play behaviour it is straightforward to explore different model architectures and change various aspects of the workflow or model evaluation. Although <italic>MLAir</italic> is focusing on neural networks, it should be possible to include other ML techniques. Since <italic>MLAir</italic> is based on a pure <italic>Python</italic> environment, and it is highly portable. It has been tested on various computing systems from desktop workstations to high-end supercomputers.</p>
      <p id="d1e3515"><italic>MLAir</italic> is under continuous development. Further enhancements of the program are already planned and can be found in the issue tracker (see Code availability). Ongoing developments concern the extension of the statistical evaluation methods, the graphical presentation of the results, and the flawless support of temporal resolutions other than daily aggregated data. Through further code refactoring, <italic>MLAir</italic> will become even more versatile as the decoupling of individual components is being pushed forward. In particular, it is planned to structure the data handling in a more modular way so that varying structured data sources can be connected and used without much effort. We invite the community of meteorological ML scientists to participate in the further development of <italic>MLAir</italic> through comments and contributions to code and documentation. A good starting point for contributions is the issue tracker of <italic>MLAir</italic>.</p>
      <p id="d1e3529">We hope that <italic>MLAir</italic> can serve as a blueprint for the development of reusable ML applications in the fields of meteorology and air quality, as it seeks to combine the best practices from ML with the best practices of meteorological model evaluation and data preprocessing. <italic>MLAir</italic> is thus a contribution to strengthen cooperation between the communities of ML and meteorology or air quality researchers.</p>
</sec>

      
      </body>
    <back><notes notes-type="codeavailability"><title>Code availability</title>

      <p id="d1e3542">The current version of <italic>MLAir</italic> is available from the project website <uri>https://gitlab.version.fz-juelich.de/toar/mlair</uri> (last access: 10 March 2021) under the MIT licence. The exact version v1.0.0 of <italic>MLAir</italic> described in this paper and used to produce the code examples shown is archived on <italic>B2SHARE</italic> <xref ref-type="bibr" rid="bib1.bibx25" id="paren.50"><named-content content-type="post"><ext-link xlink:href="https://doi.org/10.34730/5a6c3533512541a79c5c41061743f5e3" ext-link-type="DOI">10.34730/5a6c3533512541a79c5c41061743f5e3</ext-link></named-content></xref>. Detailed installation instructions are provided in the project page readme file. There is also a <italic>Jupyter notebook</italic> with all code snippets to reproduce the examples highlighted in this paper.</p>
  </notes><notes notes-type="dataavailability"><title>Data availability</title>

      <p id="d1e3570"><italic>MLAir</italic> is not directly linked to any specific data. Data used in the examples are extracted from the corresponding databases at runtime, as described and cited in the text.</p>
  </notes><notes notes-type="authorcontribution"><title>Author contributions</title>

      <?pagebreak page1572?><p id="d1e3578">The concept of MLAir was developed by LHL. Detailed investigations on methodological approaches were carried out by LHL and FK. FK contributed the first use case. The actual implementation of the software and its validation and visualization were done by LHL and FK. LHL was responsible for the code structure and test developments. MGS contributed to the concept discussions and provided supervision and funding. LHL wrote the original draft, all authors reviewed the manuscript and helped in the preparation of the final paper as well as drafting the responses to the reviewers' comments.</p>
  </notes><notes notes-type="competinginterests"><title>Competing interests</title>

      <p id="d1e3584">The authors declare that they have no conflict of interest.</p>
  </notes><ack><title>Acknowledgements</title><p id="d1e3590">The authors gratefully acknowledge the Jülich Supercomputing Centre for providing the infrastructure and resources to develop this software.</p></ack><notes notes-type="financialsupport"><title>Financial support</title>

      <p id="d1e3595">This research has been supported by the European Research Council, H2020 Research Infrastructures (IntelliAQ (grant no. 787576).<?xmltex \hack{\newline}?><?xmltex \hack{\newline}?>The article processing charges for this open-access <?xmltex \hack{\newline}?> publication  were covered by a Research <?xmltex \hack{\newline}?> Centre of the Helmholtz Association.</p>
  </notes><notes notes-type="reviewstatement"><title>Review statement</title>

      <p id="d1e3608">This paper was edited by Christoph Knote and reviewed by two anonymous referees.</p>
  </notes><ref-list>
    <title>References</title>

      <ref id="bib1.bibx1"><?xmltex \def\ref@label{{Abadi et~al.(2015)}}?><label>Abadi et al.(2015)</label><?label tensorflow_2015_whitepaper?><mixed-citation>Abadi, M., Agarwal, A., Barham, P., Brevdo, E., Chen, Z., Citro, C., Corrado,
G. S., Davis, A., Dean, J., Devin, M., Ghemawat, S., Goodfellow, I., Harp,
A., Irving, G., Isard, M., Jia, Y., Jozefowicz, R., Kaiser, L., Kudlur, M.,
Levenberg, J., Mané, D., Monga, R., Moore, S., Murray, D., Olah, C.,
Schuster, M., Shlens, J., Steiner, B., Sutskever, I., Talwar, K., Tucker, P.,
Vanhoucke, V., Vasudevan, V., Viégas, F., Vinyals, O., Warden, P.,
Wattenberg, M., Wicke, M., Yu, Y., and Zheng, X.: TensorFlow: Large-Scale
Machine Learning on Heterogeneous Systems,
available at: <uri>https://www.tensorflow.org/</uri> (last access: 10 March 2021), 2015.</mixed-citation></ref>
      <ref id="bib1.bibx2"><?xmltex \def\ref@label{{Bentayeb et~al.(2015)}}?><label>Bentayeb et al.(2015)</label><?label bentayeb_2015_long-term-exposure?><mixed-citation>Bentayeb, M., Wagner, V., Stempfelet, M., Zins, M., Goldberg, M., Pascal, M.,
Larrieu, S., Beaudeau, P., Cassadou, S., Eilstein, D., Filleul, L., Le
Tertre, A., Medina, S., Pascal, L., Prouvost, H., Quénel, P., Zeghnoun, A.,
and Lefranc, A.: Association between long-term exposure to air pollution and
mortality in France: a 25-year follow-up study, Environ. Int.,
85, 5–14, <ext-link xlink:href="https://doi.org/10.1016/j.envint.2015.08.006" ext-link-type="DOI">10.1016/j.envint.2015.08.006</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx3"><?xmltex \def\ref@label{{Bishop(2006)}}?><label>Bishop(2006)</label><?label bishop_2006?><mixed-citation>
Bishop, C. M.: Pattern recognition and machine learning, Springer, New York, 2006.</mixed-citation></ref>
      <ref id="bib1.bibx4"><?xmltex \def\ref@label{{Brunner et~al.(2015)}}?><label>Brunner et al.(2015)</label><?label brunner_comparative_2015?><mixed-citation>Brunner, D., Savage, N., Jorba, O., Eder, B., Giordano, L., Badia, A.,
Balzarini, A., Baró, R., Bianconi, R., Chemel, C., Curci, G., Forkel, R.,
Jiménez-Guerrero, P., Hirtl, M., Hodzic, A., Honzak, L., Im, U., Knote, C.,
Makar, P., Manders-Groot, A., van Meijgaard, E., Neal, L., Pérez, J. L.,
Pirovano, G., San Jose, R., Schröder, W., Sokhi, R. S., Syrakov, D., Torian,
A., Tuccella, P., Werhahn, J., Wolke, R., Yahya, K., Zabkar, R., Zhang, Y.,
Hogrefe, C., and Galmarini, S.: Comparative analysis of meteorological
performance of coupled chemistry-meteorology models in the context of
AQMEII phase 2, Atmos. Environ., 115, 470–498,
<ext-link xlink:href="https://doi.org/10.1016/j.atmosenv.2014.12.032" ext-link-type="DOI">10.1016/j.atmosenv.2014.12.032</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx5"><?xmltex \def\ref@label{{Cho et~al.(2014)}}?><label>Cho et al.(2014)</label><?label cho_learning_2014?><mixed-citation>Cho, K., van Merrienboer, B., Gulcehre, C., Bahdanau, D., Bougares, F.,
Schwenk, H., and Bengio, Y.: Learning Phrase Representations using RNN
Encoder-Decoder for Statistical Machine Translation, arXiv:
1406.1078, available at: <uri>http://arxiv.org/abs/1406.1078</uri> (last access: 10 March 2021), 2014.</mixed-citation></ref>
      <ref id="bib1.bibx6"><?xmltex \def\ref@label{{Chollet et~al.(2015)}}?><label>Chollet et al.(2015)</label><?label chollet_2015_keras?><mixed-citation>Chollet, F., et al.: Keras, available at: <uri>https://keras.io</uri> (last access: 10 March 2021), 2015.</mixed-citation></ref>
      <ref id="bib1.bibx7"><?xmltex \def\ref@label{{Cohen et~al.(2005)}}?><label>Cohen et al.(2005)</label><?label cohen_2005_air-pollution?><mixed-citation>Cohen, A. J., Anderson, H. R., Ostro, B., Pandey, K. D., Krzyzanowski, M.,
Künzli, N., Gutschmidt, K., Pope, A., Romieu, I., Samet, J. M., and Smith,
K.: The Global Burden of Disease Due to Outdoor Air Pollution, J.
Toxicol. Env. Hea. A, 68, 1301–1307,
<ext-link xlink:href="https://doi.org/10.1080/15287390590936166" ext-link-type="DOI">10.1080/15287390590936166</ext-link>, 2005.</mixed-citation></ref>
      <ref id="bib1.bibx8"><?xmltex \def\ref@label{{Elliott(2019)}}?><label>Elliott(2019)</label><?label github_2019_ml?><mixed-citation>Elliott, T.: The State of the Octoverse: machine learning, The GitHub Blog,
available at: <uri>https://github.blog/2019-01-24-the-state-of-the-octoverse-machine-learning/</uri>,
(last access: 23 June 2020), 2019.</mixed-citation></ref>
      <ref id="bib1.bibx9"><?xmltex \def\ref@label{{{European Parliament} and {Council of the European
Union}(2008)}}?><label>European Parliament and Council of the European
Union(2008)</label><?label eu_2008_airquality?><mixed-citation>European Parliament and Council of the European Union: Directive 2008/50/EC
of the European Parliament and of the Council of 21 May 2008 on ambient air
quality and cleaner air for Europe, Official Journal of the European Union,
available at: <uri>http://data.europa.eu/eli/dir/2008/50/oj</uri> (last access: 10 March 2021), 2008.</mixed-citation></ref>
      <ref id="bib1.bibx10"><?xmltex \def\ref@label{{Goodfellow et~al.(2014)}}?><label>Goodfellow et al.(2014)</label><?label goodfellow_2014_gan?><mixed-citation>Goodfellow, I., Pouget-Abadie, J., Mirza, M., Xu, B., Warde-Farley, D., Ozair,
S., Courville, A., and Bengio, Y.: Generative Adversarial Nets, in: Advances
in Neural Information Processing Systems 27, edited by: Ghahramani, Z.,
Welling, M., Cortes, C., Lawrence, N. D., and Weinberger, K. Q., pp.
2672–2680, Curran Associates, Inc.,
available at: <uri>http://papers.nips.cc/paper/5423-generative-adversarial-nets.pdf</uri> (last access: 10 March 2021),
2014.</mixed-citation></ref>
      <ref id="bib1.bibx11"><?xmltex \def\ref@label{{Goodfellow et~al.(2016)}}?><label>Goodfellow et al.(2016)</label><?label Goodfellow_2016?><mixed-citation>Goodfellow, I., Bengio, Y., and Courville, A.: Deep Learning, MIT Press,
<uri>http://www.deeplearningbook.org</uri> (last access: 10 March 2021), 2016.</mixed-citation></ref>
      <ref id="bib1.bibx12"><?xmltex \def\ref@label{{Gruber(2004)}}?><label>Gruber(2004)</label><?label markdown?><mixed-citation>Gruber, J.: Markdown,
available at: <uri>https://daringfireball.net/projects/markdown/license</uri>,
(last access: 7 January 2021), 2004.</mixed-citation></ref>
      <ref id="bib1.bibx13"><?xmltex \def\ref@label{{Hochreiter and Schmidhuber(1997)}}?><label>Hochreiter and Schmidhuber(1997)</label><?label hochreiter_LSTM_1997?><mixed-citation>Hochreiter, S. and Schmidhuber, J.: Long Short-Term Memory, Neural
Computation, 9, 1735–1780, <ext-link xlink:href="https://doi.org/10.1162/neco.1997.9.8.1735" ext-link-type="DOI">10.1162/neco.1997.9.8.1735</ext-link>, 1997.</mixed-citation></ref>
      <ref id="bib1.bibx14"><?xmltex \def\ref@label{{Hoyer and Hamman(2017)}}?><label>Hoyer and Hamman(2017)</label><?label hoyer_2017_xarray?><mixed-citation>Hoyer, S. and Hamman, J.: xarray: N-D labeled arrays and datasets in
Python, J. Open Res. Softw., 5, 10, <ext-link xlink:href="https://doi.org/10.5334/jors.148" ext-link-type="DOI">10.5334/jors.148</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx15"><?xmltex \def\ref@label{{Hoyer et~al.(2020)}}?><label>Hoyer et al.(2020)</label><?label hoyer_2020_xarray-release-0-15-0?><mixed-citation>Hoyer, S., Hamman, J., Roos, M., Fitzgerald, C., Cherian, D., Fujii, K.,
Maussion, F., crusaderky, Kleeman, A., Kluyver, T., Clark, S., Munroe, J.,
keewis, Hatfield-Dodds, Z., Nicholas, T., Abernathey, R., Wolfram, P. J.,
MaximilianR, Hauser, M., Markel, Gundersen, G., Signell, J., Helmus, J. J.,
Sinai, Y. B., Cable, P., Amici, A., lumbric, Rocklin, M., Rivera, G., and
Barna, A.: pydata/xarray v0.15.0, Zenodo, <ext-link xlink:href="https://doi.org/10.5281/zenodo.3631851" ext-link-type="DOI">10.5281/zenodo.3631851</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx16"><?xmltex \def\ref@label{{{ISO Central Secretary}(2017)}}?><label>ISO Central Secretary(2017)</label><?label json?><mixed-citation>ISO Central Secretary: Information technology – The JSON data interchange<?pagebreak page1573?>
syntax, Standard ISO/IEC 21778:2017, International Organization for
Standardization, Geneva, Switzerland,
available at: <uri>https://www.iso.org/standard/71616.html</uri> (last access: 10 March 2021), 2017.</mixed-citation></ref>
      <ref id="bib1.bibx17"><?xmltex \def\ref@label{{Kingma and Welling(2014)}}?><label>Kingma and Welling(2014)</label><?label kingma_2014_autoencoding?><mixed-citation>Kingma, D. P. and Welling, M.: Auto-Encoding Variational Bayes, arXiv:
1312.6114, available at: <uri>https://arxiv.org/abs/1312.6114</uri> (last access: 10 March 2021), 2014.</mixed-citation></ref>
      <ref id="bib1.bibx18"><?xmltex \def\ref@label{{Kleinert et~al.(2021)}}?><label>Kleinert et al.(2021)</label><?label Kleinert2021?><mixed-citation>Kleinert, F., Leufen, L. H., and Schultz, M. G.: IntelliO3-ts v1.0: a neural network approach to predict near-surface ozone concentrations in Germany, Geosci. Model Dev., 14, 1–25, <ext-link xlink:href="https://doi.org/10.5194/gmd-14-1-2021" ext-link-type="DOI">10.5194/gmd-14-1-2021</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx19"><?xmltex \def\ref@label{{Kluyver et~al.(2016)}}?><label>Kluyver et al.(2016)</label><?label jupyter?><mixed-citation>Kluyver, T., Ragan-Kelley, B., Pérez, F., Granger, B., Bussonnier, M.,
Frederic, J., Kelley, K., Hamrick, J., Grout, J., Corlay, S., Ivanov, P.,
Avila, D., Abdalla, S., Willing, C., and development team, J.: Jupyter
Notebooks – a publishing format for reproducible computational workflows, in:
Positioning and Power in Academic Publishing: Players, Agents and Agendas,
edited by: Loizides, F. and Scmidt, B., IOS Press, the Netherlands, 87–90,
available at: <uri>https://eprints.soton.ac.uk/403913/</uri> (last access: 10 March 2021), 2016.</mixed-citation></ref>
      <ref id="bib1.bibx20"><?xmltex \def\ref@label{{Koranne(2011)}}?><label>Koranne(2011)</label><?label hdf5?><mixed-citation>Koranne, S.: Hierarchical data format 5: HDF5, in: Handbook of Open Source
Tools, 191–200, Springer,  Boston, MA, HDF5 is maintained by The HDF Group,
<uri>http://www.hdfgroup.org/HDF5</uri> (last access: 10 March 2021), 2011.</mixed-citation></ref>
      <ref id="bib1.bibx21"><?xmltex \def\ref@label{{Krizhevsky et~al.(2012)}}?><label>Krizhevsky et al.(2012)</label><?label krizhevsky_2012_imagenet?><mixed-citation>Krizhevsky, A., Sutskever, I., and Hinton, G. E.: ImageNet Classification with
Deep Convolutional Neural Networks, in: Advances in Neural Information
Processing Systems 25, edited by: Bartlett, P. L., Pereira, F. C. N., Burges,
C. J. C., Bottou, L., and Weinberger, K. Q., Curran
Associates, Inc., 1106–1114,
available at: <ext-link xlink:href="http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks">http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks</ext-link> (last access: 10 March 2021),
2012.</mixed-citation></ref>
      <ref id="bib1.bibx22"><?xmltex \def\ref@label{{{LaTeX Project}(2005)}}?><label>LaTeX Project(2005)</label><?label latex?><mixed-citation>LaTeX Project: LaTeX, available at: <uri>https://www.latex-project.org/</uri>,
(last access: 7 January 2021), 2005.</mixed-citation></ref>
      <ref id="bib1.bibx23"><?xmltex \def\ref@label{{Lecun et~al.(1998)}}?><label>Lecun et al.(1998)</label><?label lecun_CNN_1998?><mixed-citation>Lecun, Y., Bottou, L., Bengio, Y., and Haffner, P.: Gradient-based learning
applied to document recognition, Proceedings of the IEEE, 86, 2278–2324,
<ext-link xlink:href="https://doi.org/10.1109/5.726791" ext-link-type="DOI">10.1109/5.726791</ext-link>, 1998.</mixed-citation></ref>
      <ref id="bib1.bibx24"><?xmltex \def\ref@label{{Lefohn et~al.(2018)}}?><label>Lefohn et al.(2018)</label><?label lefohn_2018_toar?><mixed-citation>Lefohn, A. S.,
Malley, C. S.,
Smith, L.,
Wells, B.,
Hazucha, M.,
Simon, H.,
Naik, V.,
Mills, G.,
Schultz, M. G.,
Paoletti, E.,
De Marco, A.,
Xu, X.,
Zhang, L.,
Wang, T.,
Neufeld, H. S.,
Musselman, R. C.,
Tarasick, D.,
Brauer, M.,
Feng, Z.,
Tang, H.,
Kobayashi, K.,
Sicard, P.,
Solberg, S., and
Gerosa, G.: Tropospheric ozone
assessment report: Global ozone metrics for climate change, human health, and
crop/ecosystem research, Elementa: Science of the Anthropocene, 1, 1,
<ext-link xlink:href="https://doi.org/10.1525/elementa.279" ext-link-type="DOI">10.1525/elementa.279</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx25"><?xmltex \def\ref@label{{Leufen et~al.(2020)}}?><label>Leufen et al.(2020)</label><?label mlair_b2share?><mixed-citation>Leufen, L. H., Kleinert, F., and Schultz, M. G.: MLAir (v1.0.0) – a tool to
enable fast and flexible machine learning on air data time series – Source
Code, EUDAT Collaborative Data Infrastructure,
<ext-link xlink:href="https://doi.org/10.34730/fcc6b509d5394dad8cfdfc6e9fff2bec" ext-link-type="DOI">10.34730/fcc6b509d5394dad8cfdfc6e9fff2bec</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx26"><?xmltex \def\ref@label{{Mills et~al.(2018)}}?><label>Mills et al.(2018)</label><?label mills_2018_toar?><mixed-citation>Mills, G., Pleijel, H., Malley, C., Sinha, B., Cooper, O., Schultz, M.,
Neufeld, H., Simpson, D., Sharps, K., Feng, Z., Gerosa, G., Harmens, H.,
Kobayashi, K., Saxena, P., Paoletti, E., Sinha, V., and Xu, X.: Tropospheric
Ozone Assessment Report: Present-day tropospheric ozone distribution and
trends relevant to vegetation, Elementa: Science of the Anthropocene, 6, 47,
<ext-link xlink:href="https://doi.org/10.1525/elementa.302" ext-link-type="DOI">10.1525/elementa.302</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx27"><?xmltex \def\ref@label{{Murphy(1988)}}?><label>Murphy(1988)</label><?label Murphy1988?><mixed-citation>Murphy, A. H.: Skill Scores Based on the Mean Square Error and Their
Relationships to the Correlation Coefficient, Mon. Weather Rev., 116,
2417–2424, <ext-link xlink:href="https://doi.org/10.1175/1520-0493(1988)116&lt;2417:SSBOTM&gt;2.0.CO;2" ext-link-type="DOI">10.1175/1520-0493(1988)116&lt;2417:SSBOTM&gt;2.0.CO;2</ext-link>, 1988.</mixed-citation></ref>
      <ref id="bib1.bibx28"><?xmltex \def\ref@label{{Murphy and Daan(1985)}}?><label>Murphy and Daan(1985)</label><?label MurphyDaan1985?><mixed-citation>
Murphy, A. H. and Daan, H.: Forecast evaluation, in: Probability, statistics,
and decision making in the atmospheric sciences, edited by: Murphy, A. H. and
Katz, R. W., Westview Press, Boulder, USA, 379–437, 1985.</mixed-citation></ref>
      <ref id="bib1.bibx29"><?xmltex \def\ref@label{{Murphy and Winkler(1987)}}?><label>Murphy and Winkler(1987)</label><?label Murphy1987?><mixed-citation>Murphy, A. H. and Winkler, R. L.: A General Framework for Forecast
Verification, Mon. Weather Rev., 115, 1330–1338,
<ext-link xlink:href="https://doi.org/10.1175/1520-0493(1987)115&lt;1330:AGFFFV&gt;2.0.CO;2" ext-link-type="DOI">10.1175/1520-0493(1987)115&lt;1330:AGFFFV&gt;2.0.CO;2</ext-link>, 1987.</mixed-citation></ref>
      <ref id="bib1.bibx30"><?xmltex \def\ref@label{{Murphy et~al.(1989)}}?><label>Murphy et al.(1989)</label><?label murphy1989?><mixed-citation>Murphy, A. H., Brown, B. G., and Chen, Y.-S.: Diagnostic Verification of
Temperature Forecasts, Weather Forecast., 4, 485–501,
<ext-link xlink:href="https://doi.org/10.1175/1520-0434(1989)004&lt;0485:DVOTF&gt;2.0.CO;2" ext-link-type="DOI">10.1175/1520-0434(1989)004&lt;0485:DVOTF&gt;2.0.CO;2</ext-link>, 1989.</mixed-citation></ref>
      <ref id="bib1.bibx31"><?xmltex \def\ref@label{{Musgrave et~al.(2020)}}?><label>Musgrave et al.(2020)</label><?label musgrave_2020_metric-check?><mixed-citation>Musgrave, K., Belongie, S., and Lim, S.-N.: A Metric Learning Reality Check,
arXiv: 2003.08505, available at: <uri>https://arxiv.org/abs/2003.08505</uri> (last access: 10 March 2021), 2020.</mixed-citation></ref>
      <ref id="bib1.bibx32"><?xmltex \def\ref@label{{Paszke et~al.(2019)}}?><label>Paszke et al.(2019)</label><?label pytorch_2019?><mixed-citation>Paszke, A., Gross, S., Massa, F., Lerer, A., Bradbury, J., Chanan, G., Killeen,
T., Lin, Z., Gimelshein, N., Antiga, L., Desmaison, A., Kopf, A., Yang, E.,
DeVito, Z., Raison, M., Tejani, A., Chilamkurthy, S., Steiner, B., Fang, L.,
Bai, J., and Chintala, S.: PyTorch: An Imperative Style, High-Performance
Deep Learning Library, in: Advances in Neural Information Processing Systems
32, edited by: Wallach, H., Larochelle, H., Beygelzimer, A., d'Alché-Buc, F., Fox, E., and Garnett, R., Curran
Associates, Inc., Vancouver, Canada, 8024–8035,
available at: <ext-link xlink:href="http://papers.neurips.cc/paper/9015-pytorch-an-imperative-style-high-performance-deep-learning-library.pdf">http://papers.neurips.cc/paper/9015-pytorch-an-imperative-style-high-performance-deep-learning-library.pdf</ext-link> (last access: 10 March 2021),
2019.</mixed-citation></ref>
      <ref id="bib1.bibx33"><?xmltex \def\ref@label{{{Python Software Foundation}(2018)}}?><label>Python Software Foundation(2018)</label><?label python?><mixed-citation>Python Software Foundation: Python Language Reference, release 3.6.8, PEP
494, available at: <uri>https://www.python.org/dev/peps/pep-0494/</uri> (last access: 10 March 2021), 2018.</mixed-citation></ref>
      <ref id="bib1.bibx34"><?xmltex \def\ref@label{{Reback et~al.(2020)}}?><label>Reback et al.(2020)</label><?label pandas_2020?><mixed-citation>Reback, J., McKinney, W., jbrockmendel, Van den Bossche, J., Augspurger, T.,
Cloud, P., gfyoung, Sinhrks, Klein, A., Roeschke, M., Tratner, J., She, C.,
Hawkins, S., Ayd, W., Petersen, T., Schendel, J., Hayden, A., Garcia, M.,
MomIsBestFriend, Jancauskas, V., Battiston, P., Seabold, S., chris-b1,
h-vetinari, Hoyer, S., Overmeire, W., alimcmaster1, Mehyar, M., Dong, K.,
and Whelan, C.: pandas-dev/pandas: Pandas v1.0.1, Zenodo,
<ext-link xlink:href="https://doi.org/10.5281/zenodo.3644238" ext-link-type="DOI">10.5281/zenodo.3644238</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx35"><?xmltex \def\ref@label{{Rezende et~al.(2014)}}?><label>Rezende et al.(2014)</label><?label rezende_2014_stochastic?><mixed-citation>Rezende, D. J., Mohamed, S., and Wierstra, D.: Stochastic Backpropagation and
Approximate Inference in Deep Generative Models, arXiv: 1401.4082,
available at: <uri>https://arxiv.org/abs/1401.4082</uri> (last access: 10 March 2021), 2014.</mixed-citation></ref>
      <ref id="bib1.bibx36"><?xmltex \def\ref@label{{Schultz and Schr\"{o}der(2017)}}?><label>Schultz and Schröder(2017)</label><?label join_docu?><mixed-citation>Schultz, M. G. and Schröder, S.: Documentation of the JOIN REST interface, Juelich,
Germany,
available at: <uri>https://join.fz-juelich.de/services/rest/surfacedata/</uri>,
(last access: 18 September 2020), 2017.</mixed-citation></ref>
      <ref id="bib1.bibx37"><?xmltex \def\ref@label{{Schultz et~al.(2017a)}}?><label>Schultz et al.(2017a)</label><?label schultz_2017_join?><mixed-citation>Schultz, M. G.,
Schröder, S.,
Lyapina, O.,
Cooper, O. R.,
Galbally, I.,
Petropavlovskikh, I.,
von Schneidemesser, E.,
Tanimoto, H.,
Elshorbany, Y.,
Naja, M.,
Seguel, R. J.,
Dauert, U.,
Eckhardt, P.,
Feigenspan, S.,
Fiebig, M.,
Hjellbrekke, A.-G.,
Hong, Y.-D.,
Kjeld, P. C.,
Koide, H.,
Lear, G.,
Tarasick, D.,
Ueno, M.,
Wallasch, M.,
Baumgardner, D.,
Chuang, M.-T.,
Gillett, R.,
Lee, M.,
Molloy, S.,
Moolla, R.,
Wang, T.,
Sharps, K.,
Adame, J. A.,
Ancellet, G.,
Apadula, F.,
Artaxo, P.,
Barlasina, M. E.,
Bogucka, M.,
Bonasoni, P.,
Chang, L.,
Colomb, A.,
Cuevas-Agulló, E.,
Cupeiro, M.,
Degorska, A.,
Ding, A.,
Fröhlich, M.,
Frolova, M.,
Ga<?pagebreak page1574?>dhavi, H.,
Gheusi, F.,
Gilge, S.,
Gonzalez, M. Y.,
Gros, V.,
Hamad, S. H.,
Helmig, D.,
Henriques, D.,
Hermansen, O.,
Holla, R.,
Hueber, J.,
Im, U.,
Jaffe, D. A.,
Komala, N.,
Kubistin, D.,
Lam, K.-S.,
Laurila, T.,
Lee, H.,
Levy, I.,
Mazzoleni, C.,
Mazzoleni, L. R.,
McClure-Begley, A.,
Mohamad, M.,
Murovec, M.,
Navarro-Comas, M.,
Nicodim, F.,
Parrish, D.,
Read, K. A.,
Reid, N.,
Ries, L.,
Saxena, P.,
Schwab, J. J.,
Scorgie, Y.,
Senik, I.,
Simmonds, P.,
Sinha, V.,
Skorokhod, A. I.,
Spain, G.,
Spangl, W.,
Spoor, R.,
Springston, S. R.,
Steer, K.,
Steinbacher, M.,
Suharguniyawan, E.,
Torre, P.,
Trickl, T.,
Weili, L.,
Weller, R.,
Xiaobin, X.,
Xue, L., and
Zhiqiang, M.: Tropospheric Ozone Assessment Report: Database and metrics
data of global surface ozone observations, Elementa: Science of the
Anthropocene, 5, 58, <ext-link xlink:href="https://doi.org/10.1525/elementa.244" ext-link-type="DOI">10.1525/elementa.244</ext-link>, 2017a.</mixed-citation></ref>
      <ref id="bib1.bibx38"><?xmltex \def\ref@label{{Schultz et~al.(2017b)}}?><label>Schultz et al.(2017b)</label><?label schultz_2017_toar_supplementary?><mixed-citation>Schultz, M. G., Schröder, S.,Lyapina, O., Cooper, O. R., Galbally, I., Petropavlovskikh, I., von Schneidemesser, E., Tanimoto, H., Elshorbany, Y., Naja, M., Seguel, R. J., Dauert, U., Eckhardt, P., Feigenspan, S., Fiebig, M., Hjellbrekke, A.-G., Hong, Y.-D., Kjeld, P. C., Koide, H., Lear, G., Tarasick, D., Ueno, M., Wallasch, M., Baumgardner, D., Chuang, M.-T., Gillett, R., Lee, M., Molloy, S., Moolla, R., Wang, T., Sharps, K., Adame, J. A., Ancellet, G.., Apadula, F., Artaxo, P., Barlasina, M. E., Bogucka, M., Bonasoni, P., Chang, L., Colomb, A., Cuevas-Agulló, E., Cupeiro, M., Degorska, A., Ding, A., Fröhlich, M., Frolova, M., Gadhavi, H., Gheusi, F., Gilge, S., Gonzalez, M. Y., Gros, V., Hamad, S. H., Helmig, D., Henriques, D., Hermansen, O., Holla, R., Hueber, J., Im, U., Jaffe, D. A., Komala, N., Kubistin, D., Lam, K.-S., Laurila, T., Lee, H.,Levy, I., Mazzoleni, C., Mazzoleni, L. R., McClure-Begley, A., Mohamad, M., Murovec, M., Navarro-Comas, M., Nicodim, F., Parrish, D., Read, K. A., Reid, N., Ries, L., Saxena, P., Schwab, J. J.,Scorgie, Y., Senik, I., Simmonds, P., Sinha, V., Skorokhod, A. I., Spain, G., Spangl, W., Spoor, R., Springston, S. R., Steer, K., Steinbacher, M., Suharguniyawan, E., Torre, P., Trickl, T., Weili, L., Weller, R., Xu, X., Xue, L., and Zhiqiang, M.: Tropospheric Ozone Assessment Report, links to Global
surface ozone datasets, PANGAEA, <ext-link xlink:href="https://doi.org/10.1594/PANGAEA.876108" ext-link-type="DOI">10.1594/PANGAEA.876108</ext-link>, 2017b.</mixed-citation></ref>
      <ref id="bib1.bibx39"><?xmltex \def\ref@label{{Schultz et~al.(2021)}}?><label>Schultz et al.(2021)</label><?label schultz_2020_dl-vs-nwp?><mixed-citation>Schultz, M. G., Betancourt, C., Gong, B., Kleinert, F., Langguth, M., Leufen,
L. H., Mozaffari, A., and Stadtler, S.: Can deep learning beat numerical
weather prediction?, Philos. T. Roy. Soc. A, 379, 2194,
<ext-link xlink:href="https://doi.org/10.1098/rsta.2020.0097" ext-link-type="DOI">10.1098/rsta.2020.0097</ext-link>, 2021.
</mixed-citation></ref><?xmltex \hack{\newpage}?>
      <ref id="bib1.bibx40"><?xmltex \def\ref@label{{Szegedy et~al.(2015)}}?><label>Szegedy et al.(2015)</label><?label szegedy_2015_inception-blocks?><mixed-citation>Szegedy, C., Wei Liu, Yangqing Jia, Sermanet, P., Reed, S., Anguelov, D.,
Erhan, D., Vanhoucke, V., and Rabinovich, A.: Going deeper with convolutions,
in: 2015 IEEE Conference on Computer Vision and Pattern
Recognition (CVPR), IEEE, Boston, MA, USA, 1–9,
<ext-link xlink:href="https://doi.org/10.1109/CVPR.2015.7298594" ext-link-type="DOI">10.1109/CVPR.2015.7298594</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx41"><?xmltex \def\ref@label{{TensorFlow(2020)}}?><label>TensorFlow(2020)</label><?label tensorflow_2020_gpu?><mixed-citation>TensorFlow: GPU support,
available at: <uri>https://www.tensorflow.org/install/gpu</uri>, last access: 6 June 2020.</mixed-citation></ref>
      <ref id="bib1.bibx42"><?xmltex \def\ref@label{{TOAR(2014--2021)}}?><label>TOAR(2014–2021)</label><?label toar?><mixed-citation>TOAR: Tropospheric Ozone Assessment Report (TOAR): Global metrics for climate
change, human health and crop/ecosystem research, International Global
Atmospheric Chemistry (IGAC),
available at: <uri>https://igacproject.org/activities/TOAR</uri> (last access: 29 January
2021), 2014–2021.</mixed-citation></ref>
      <ref id="bib1.bibx43"><?xmltex \def\ref@label{{{US Environmental Protection Agency}(2020)}}?><label>US Environmental Protection Agency(2020)</label><?label usepa_2020_ozone?><mixed-citation>
US Environmental Protection Agency: Integrated science assessment for ozone
and related photochemical oxidants, US Environmental
Protection Agency, Washington, D.C., ePA-HQ-ORD-2018-0274, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx44"><?xmltex \def\ref@label{{{van der Walt} et~al.(2011)}}?><label>van der Walt et al.(2011)</label><?label numpy_2011?><mixed-citation>van der Walt, S., Colbert, S. C., and Varoquaux, G.: The NumPy Array: A
Structure for Efficient Numerical Computation, Comput. Sci.
Eng., 13, 22–30, <ext-link xlink:href="https://doi.org/10.1109/MCSE.2011.37" ext-link-type="DOI">10.1109/MCSE.2011.37</ext-link>, 2011.</mixed-citation></ref>
      <ref id="bib1.bibx45"><?xmltex \def\ref@label{{Vautard(2012)}}?><label>Vautard(2012)</label><?label vautard_evaluation_2012?><mixed-citation>Vautard, R.: Evaluation of the meteorological forcing used for the Air
Quality Model Evaluation International Initiative (AQMEII) air
quality simulations, Atmos. Environ., 53, 15–37,
<ext-link xlink:href="https://doi.org/10.1016/j.atmosenv.2011.10.065" ext-link-type="DOI">10.1016/j.atmosenv.2011.10.065</ext-link>, 2012.</mixed-citation></ref>
      <ref id="bib1.bibx46"><?xmltex \def\ref@label{{{W}es {M}c{K}inney(2010)}}?><label>Wes McKinney(2010)</label><?label mckinney-proc-scipy-2010?><mixed-citation>Wes McKinney: Data Structures for Statistical Computing in
Python, in: Proceedings of the 9th Python in Science Conference,
edited by: Stéfan van der Walt and Jarrod Millman, SciPy Organizers, Austin, Texas, 56–61,
<ext-link xlink:href="https://doi.org/10.25080/Majora-92bf1922-00a" ext-link-type="DOI">10.25080/Majora-92bf1922-00a</ext-link>, 2010.</mixed-citation></ref>
      <ref id="bib1.bibx47"><?xmltex \def\ref@label{{Wilks(2011)}}?><label>Wilks(2011)</label><?label wilks_2011_stat-methods?><mixed-citation>
Wilks, D. S. (Ed.): Statistical methods in the atmospheric sciences, pp.
178–186, International Geophysics Series, Elsevier Academic Press,
Amsterdam, 3rd edn., 2011.</mixed-citation></ref>
      <ref id="bib1.bibx48"><?xmltex \def\ref@label{{{World Health Organization}(2013)}}?><label>World Health Organization(2013)</label><?label who_2013_health-risk?><mixed-citation>World Health Organization: Health risks of air pollution in Europe – HRAPIE
project recommendations for concentration–response functions for
cost–benefit analysis of particulate matter, ozone and nitrogen dioxide,
Ozone and Nitrogen Dioxide,
available at: <uri>https://www.euro.who.int/__data/assets/pdf_file/0006/238956/Health_risks_air_pollution_HRAPIE_project.pdf</uri> (last access: 10 March 2021),
2013.</mixed-citation></ref>

  </ref-list></back>
    <!--<article-title-html>MLAir (v1.0) – a tool to enable fast and flexible machine learning on air data time series</article-title-html>
<abstract-html><p>With MLAir (Machine Learning on Air data) we created a software environment that simplifies and accelerates the exploration of new machine learning (ML) models, specifically shallow and deep neural networks, for the analysis and forecasting of meteorological and air quality time series. Thereby MLAir is not developed as an abstract workflow, but hand in hand with actual scientific questions. It thus addresses scientists with either a meteorological or an ML background. Due to their relative ease of use and spectacular results in other application areas, neural networks and other ML methods are also gaining enormous momentum in the weather and air quality research communities. Even though there are already many books and tutorials describing how to conduct an ML experiment, there are many stumbling blocks for a newcomer. In contrast, people familiar with ML concepts and technology often have difficulties understanding the nature of atmospheric data. With MLAir we have addressed a number of these pitfalls so that it becomes easier for scientists of both domains to rapidly start off their ML application. MLAir has been developed in such a way that it is easy to use and is designed from the very beginning as a stand-alone, fully functional experiment. Due to its flexible, modular code base, code modifications are easy and personal experiment schedules can be quickly derived. The package also includes a set of validation tools to facilitate the evaluation of ML results using standard meteorological statistics. MLAir can easily be ported onto different computing environments from desktop workstations to high-end supercomputers with or without graphics processing units (GPUs).</p></abstract-html>
<ref-html id="bib1.bib1"><label>Abadi et al.(2015)</label><mixed-citation>
Abadi, M., Agarwal, A., Barham, P., Brevdo, E., Chen, Z., Citro, C., Corrado,
G. S., Davis, A., Dean, J., Devin, M., Ghemawat, S., Goodfellow, I., Harp,
A., Irving, G., Isard, M., Jia, Y., Jozefowicz, R., Kaiser, L., Kudlur, M.,
Levenberg, J., Mané, D., Monga, R., Moore, S., Murray, D., Olah, C.,
Schuster, M., Shlens, J., Steiner, B., Sutskever, I., Talwar, K., Tucker, P.,
Vanhoucke, V., Vasudevan, V., Viégas, F., Vinyals, O., Warden, P.,
Wattenberg, M., Wicke, M., Yu, Y., and Zheng, X.: TensorFlow: Large-Scale
Machine Learning on Heterogeneous Systems,
available at: <a href="https://www.tensorflow.org/" target="_blank"/> (last access: 10 March 2021), 2015.
</mixed-citation></ref-html>
<ref-html id="bib1.bib2"><label>Bentayeb et al.(2015)</label><mixed-citation>
Bentayeb, M., Wagner, V., Stempfelet, M., Zins, M., Goldberg, M., Pascal, M.,
Larrieu, S., Beaudeau, P., Cassadou, S., Eilstein, D., Filleul, L., Le
Tertre, A., Medina, S., Pascal, L., Prouvost, H., Quénel, P., Zeghnoun, A.,
and Lefranc, A.: Association between long-term exposure to air pollution and
mortality in France: a 25-year follow-up study, Environ. Int.,
85, 5–14, <a href="https://doi.org/10.1016/j.envint.2015.08.006" target="_blank">https://doi.org/10.1016/j.envint.2015.08.006</a>, 2015.
</mixed-citation></ref-html>
<ref-html id="bib1.bib3"><label>Bishop(2006)</label><mixed-citation>
Bishop, C. M.: Pattern recognition and machine learning, Springer, New York, 2006.
</mixed-citation></ref-html>
<ref-html id="bib1.bib4"><label>Brunner et al.(2015)</label><mixed-citation>
Brunner, D., Savage, N., Jorba, O., Eder, B., Giordano, L., Badia, A.,
Balzarini, A., Baró, R., Bianconi, R., Chemel, C., Curci, G., Forkel, R.,
Jiménez-Guerrero, P., Hirtl, M., Hodzic, A., Honzak, L., Im, U., Knote, C.,
Makar, P., Manders-Groot, A., van Meijgaard, E., Neal, L., Pérez, J. L.,
Pirovano, G., San Jose, R., Schröder, W., Sokhi, R. S., Syrakov, D., Torian,
A., Tuccella, P., Werhahn, J., Wolke, R., Yahya, K., Zabkar, R., Zhang, Y.,
Hogrefe, C., and Galmarini, S.: Comparative analysis of meteorological
performance of coupled chemistry-meteorology models in the context of
AQMEII phase 2, Atmos. Environ., 115, 470–498,
<a href="https://doi.org/10.1016/j.atmosenv.2014.12.032" target="_blank">https://doi.org/10.1016/j.atmosenv.2014.12.032</a>, 2015.
</mixed-citation></ref-html>
<ref-html id="bib1.bib5"><label>Cho et al.(2014)</label><mixed-citation>
Cho, K., van Merrienboer, B., Gulcehre, C., Bahdanau, D., Bougares, F.,
Schwenk, H., and Bengio, Y.: Learning Phrase Representations using RNN
Encoder-Decoder for Statistical Machine Translation, arXiv:
1406.1078, available at: <a href="http://arxiv.org/abs/1406.1078" target="_blank"/> (last access: 10 March 2021), 2014.
</mixed-citation></ref-html>
<ref-html id="bib1.bib6"><label>Chollet et al.(2015)</label><mixed-citation>
Chollet, F., et al.: Keras, available at: <a href="https://keras.io" target="_blank"/> (last access: 10 March 2021), 2015.
</mixed-citation></ref-html>
<ref-html id="bib1.bib7"><label>Cohen et al.(2005)</label><mixed-citation>
Cohen, A. J., Anderson, H. R., Ostro, B., Pandey, K. D., Krzyzanowski, M.,
Künzli, N., Gutschmidt, K., Pope, A., Romieu, I., Samet, J. M., and Smith,
K.: The Global Burden of Disease Due to Outdoor Air Pollution, J.
Toxicol. Env. Hea. A, 68, 1301–1307,
<a href="https://doi.org/10.1080/15287390590936166" target="_blank">https://doi.org/10.1080/15287390590936166</a>, 2005.
</mixed-citation></ref-html>
<ref-html id="bib1.bib8"><label>Elliott(2019)</label><mixed-citation>
Elliott, T.: The State of the Octoverse: machine learning, The GitHub Blog,
available at: <a href="https://github.blog/2019-01-24-the-state-of-the-octoverse-machine-learning/" target="_blank"/>,
(last access: 23 June 2020), 2019.
</mixed-citation></ref-html>
<ref-html id="bib1.bib9"><label>European Parliament and Council of the European
Union(2008)</label><mixed-citation>
European Parliament and Council of the European Union: Directive 2008/50/EC
of the European Parliament and of the Council of 21 May 2008 on ambient air
quality and cleaner air for Europe, Official Journal of the European Union,
available at: <a href="http://data.europa.eu/eli/dir/2008/50/oj" target="_blank"/> (last access: 10 March 2021), 2008.
</mixed-citation></ref-html>
<ref-html id="bib1.bib10"><label>Goodfellow et al.(2014)</label><mixed-citation>
Goodfellow, I., Pouget-Abadie, J., Mirza, M., Xu, B., Warde-Farley, D., Ozair,
S., Courville, A., and Bengio, Y.: Generative Adversarial Nets, in: Advances
in Neural Information Processing Systems 27, edited by: Ghahramani, Z.,
Welling, M., Cortes, C., Lawrence, N. D., and Weinberger, K. Q., pp.
2672–2680, Curran Associates, Inc.,
available at: <a href="http://papers.nips.cc/paper/5423-generative-adversarial-nets.pdf" target="_blank"/> (last access: 10 March 2021),
2014.
</mixed-citation></ref-html>
<ref-html id="bib1.bib11"><label>Goodfellow et al.(2016)</label><mixed-citation>
Goodfellow, I., Bengio, Y., and Courville, A.: Deep Learning, MIT Press,
<a href="http://www.deeplearningbook.org" target="_blank"/> (last access: 10 March 2021), 2016.
</mixed-citation></ref-html>
<ref-html id="bib1.bib12"><label>Gruber(2004)</label><mixed-citation>
Gruber, J.: Markdown,
available at: <a href="https://daringfireball.net/projects/markdown/license" target="_blank"/>,
(last access: 7 January 2021), 2004.
</mixed-citation></ref-html>
<ref-html id="bib1.bib13"><label>Hochreiter and Schmidhuber(1997)</label><mixed-citation>
Hochreiter, S. and Schmidhuber, J.: Long Short-Term Memory, Neural
Computation, 9, 1735–1780, <a href="https://doi.org/10.1162/neco.1997.9.8.1735" target="_blank">https://doi.org/10.1162/neco.1997.9.8.1735</a>, 1997.
</mixed-citation></ref-html>
<ref-html id="bib1.bib14"><label>Hoyer and Hamman(2017)</label><mixed-citation>
Hoyer, S. and Hamman, J.: xarray: N-D labeled arrays and datasets in
Python, J. Open Res. Softw., 5, 10, <a href="https://doi.org/10.5334/jors.148" target="_blank">https://doi.org/10.5334/jors.148</a>, 2017.
</mixed-citation></ref-html>
<ref-html id="bib1.bib15"><label>Hoyer et al.(2020)</label><mixed-citation>
Hoyer, S., Hamman, J., Roos, M., Fitzgerald, C., Cherian, D., Fujii, K.,
Maussion, F., crusaderky, Kleeman, A., Kluyver, T., Clark, S., Munroe, J.,
keewis, Hatfield-Dodds, Z., Nicholas, T., Abernathey, R., Wolfram, P. J.,
MaximilianR, Hauser, M., Markel, Gundersen, G., Signell, J., Helmus, J. J.,
Sinai, Y. B., Cable, P., Amici, A., lumbric, Rocklin, M., Rivera, G., and
Barna, A.: pydata/xarray v0.15.0, Zenodo, <a href="https://doi.org/10.5281/zenodo.3631851" target="_blank">https://doi.org/10.5281/zenodo.3631851</a>, 2020.
</mixed-citation></ref-html>
<ref-html id="bib1.bib16"><label>ISO Central Secretary(2017)</label><mixed-citation>
ISO Central Secretary: Information technology – The JSON data interchange
syntax, Standard ISO/IEC 21778:2017, International Organization for
Standardization, Geneva, Switzerland,
available at: <a href="https://www.iso.org/standard/71616.html" target="_blank"/> (last access: 10 March 2021), 2017.
</mixed-citation></ref-html>
<ref-html id="bib1.bib17"><label>Kingma and Welling(2014)</label><mixed-citation>
Kingma, D. P. and Welling, M.: Auto-Encoding Variational Bayes, arXiv:
1312.6114, available at: <a href="https://arxiv.org/abs/1312.6114" target="_blank"/> (last access: 10 March 2021), 2014.
</mixed-citation></ref-html>
<ref-html id="bib1.bib18"><label>Kleinert et al.(2021)</label><mixed-citation>
Kleinert, F., Leufen, L. H., and Schultz, M. G.: IntelliO3-ts v1.0: a neural network approach to predict near-surface ozone concentrations in Germany, Geosci. Model Dev., 14, 1–25, <a href="https://doi.org/10.5194/gmd-14-1-2021" target="_blank">https://doi.org/10.5194/gmd-14-1-2021</a>, 2021.
</mixed-citation></ref-html>
<ref-html id="bib1.bib19"><label>Kluyver et al.(2016)</label><mixed-citation>
Kluyver, T., Ragan-Kelley, B., Pérez, F., Granger, B., Bussonnier, M.,
Frederic, J., Kelley, K., Hamrick, J., Grout, J., Corlay, S., Ivanov, P.,
Avila, D., Abdalla, S., Willing, C., and development team, J.: Jupyter
Notebooks – a publishing format for reproducible computational workflows, in:
Positioning and Power in Academic Publishing: Players, Agents and Agendas,
edited by: Loizides, F. and Scmidt, B., IOS Press, the Netherlands, 87–90,
available at: <a href="https://eprints.soton.ac.uk/403913/" target="_blank"/> (last access: 10 March 2021), 2016.
</mixed-citation></ref-html>
<ref-html id="bib1.bib20"><label>Koranne(2011)</label><mixed-citation>
Koranne, S.: Hierarchical data format 5: HDF5, in: Handbook of Open Source
Tools, 191–200, Springer,  Boston, MA, HDF5 is maintained by The HDF Group,
<a href="http://www.hdfgroup.org/HDF5" target="_blank"/> (last access: 10 March 2021), 2011.
</mixed-citation></ref-html>
<ref-html id="bib1.bib21"><label>Krizhevsky et al.(2012)</label><mixed-citation>
Krizhevsky, A., Sutskever, I., and Hinton, G. E.: ImageNet Classification with
Deep Convolutional Neural Networks, in: Advances in Neural Information
Processing Systems 25, edited by: Bartlett, P. L., Pereira, F. C. N., Burges,
C. J. C., Bottou, L., and Weinberger, K. Q., Curran
Associates, Inc., 1106–1114,
available at: <a href="http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks" target="_blank">http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks</a> (last access: 10 March 2021),
2012.
</mixed-citation></ref-html>
<ref-html id="bib1.bib22"><label>LaTeX Project(2005)</label><mixed-citation>
LaTeX Project: LaTeX, available at: <a href="https://www.latex-project.org/" target="_blank"/>,
(last access: 7 January 2021), 2005.
</mixed-citation></ref-html>
<ref-html id="bib1.bib23"><label>Lecun et al.(1998)</label><mixed-citation>
Lecun, Y., Bottou, L., Bengio, Y., and Haffner, P.: Gradient-based learning
applied to document recognition, Proceedings of the IEEE, 86, 2278–2324,
<a href="https://doi.org/10.1109/5.726791" target="_blank">https://doi.org/10.1109/5.726791</a>, 1998.
</mixed-citation></ref-html>
<ref-html id="bib1.bib24"><label>Lefohn et al.(2018)</label><mixed-citation>
Lefohn, A. S.,
Malley, C. S.,
Smith, L.,
Wells, B.,
Hazucha, M.,
Simon, H.,
Naik, V.,
Mills, G.,
Schultz, M. G.,
Paoletti, E.,
De Marco, A.,
Xu, X.,
Zhang, L.,
Wang, T.,
Neufeld, H. S.,
Musselman, R. C.,
Tarasick, D.,
Brauer, M.,
Feng, Z.,
Tang, H.,
Kobayashi, K.,
Sicard, P.,
Solberg, S., and
Gerosa, G.: Tropospheric ozone
assessment report: Global ozone metrics for climate change, human health, and
crop/ecosystem research, Elementa: Science of the Anthropocene, 1, 1,
<a href="https://doi.org/10.1525/elementa.279" target="_blank">https://doi.org/10.1525/elementa.279</a>, 2018.
</mixed-citation></ref-html>
<ref-html id="bib1.bib25"><label>Leufen et al.(2020)</label><mixed-citation>
Leufen, L. H., Kleinert, F., and Schultz, M. G.: MLAir (v1.0.0) – a tool to
enable fast and flexible machine learning on air data time series – Source
Code, EUDAT Collaborative Data Infrastructure,
<a href="https://doi.org/10.34730/fcc6b509d5394dad8cfdfc6e9fff2bec" target="_blank">https://doi.org/10.34730/fcc6b509d5394dad8cfdfc6e9fff2bec</a>, 2020.
</mixed-citation></ref-html>
<ref-html id="bib1.bib26"><label>Mills et al.(2018)</label><mixed-citation>
Mills, G., Pleijel, H., Malley, C., Sinha, B., Cooper, O., Schultz, M.,
Neufeld, H., Simpson, D., Sharps, K., Feng, Z., Gerosa, G., Harmens, H.,
Kobayashi, K., Saxena, P., Paoletti, E., Sinha, V., and Xu, X.: Tropospheric
Ozone Assessment Report: Present-day tropospheric ozone distribution and
trends relevant to vegetation, Elementa: Science of the Anthropocene, 6, 47,
<a href="https://doi.org/10.1525/elementa.302" target="_blank">https://doi.org/10.1525/elementa.302</a>, 2018.
</mixed-citation></ref-html>
<ref-html id="bib1.bib27"><label>Murphy(1988)</label><mixed-citation>
Murphy, A. H.: Skill Scores Based on the Mean Square Error and Their
Relationships to the Correlation Coefficient, Mon. Weather Rev., 116,
2417–2424, <a href="https://doi.org/10.1175/1520-0493(1988)116&lt;2417:SSBOTM&gt;2.0.CO;2" target="_blank">https://doi.org/10.1175/1520-0493(1988)116&lt;2417:SSBOTM&gt;2.0.CO;2</a>, 1988.
</mixed-citation></ref-html>
<ref-html id="bib1.bib28"><label>Murphy and Daan(1985)</label><mixed-citation>
Murphy, A. H. and Daan, H.: Forecast evaluation, in: Probability, statistics,
and decision making in the atmospheric sciences, edited by: Murphy, A. H. and
Katz, R. W., Westview Press, Boulder, USA, 379–437, 1985.
</mixed-citation></ref-html>
<ref-html id="bib1.bib29"><label>Murphy and Winkler(1987)</label><mixed-citation>
Murphy, A. H. and Winkler, R. L.: A General Framework for Forecast
Verification, Mon. Weather Rev., 115, 1330–1338,
<a href="https://doi.org/10.1175/1520-0493(1987)115&lt;1330:AGFFFV&gt;2.0.CO;2" target="_blank">https://doi.org/10.1175/1520-0493(1987)115&lt;1330:AGFFFV&gt;2.0.CO;2</a>, 1987.
</mixed-citation></ref-html>
<ref-html id="bib1.bib30"><label>Murphy et al.(1989)</label><mixed-citation>
Murphy, A. H., Brown, B. G., and Chen, Y.-S.: Diagnostic Verification of
Temperature Forecasts, Weather Forecast., 4, 485–501,
<a href="https://doi.org/10.1175/1520-0434(1989)004&lt;0485:DVOTF&gt;2.0.CO;2" target="_blank">https://doi.org/10.1175/1520-0434(1989)004&lt;0485:DVOTF&gt;2.0.CO;2</a>, 1989.
</mixed-citation></ref-html>
<ref-html id="bib1.bib31"><label>Musgrave et al.(2020)</label><mixed-citation>
Musgrave, K., Belongie, S., and Lim, S.-N.: A Metric Learning Reality Check,
arXiv: 2003.08505, available at: <a href="https://arxiv.org/abs/2003.08505" target="_blank"/> (last access: 10 March 2021), 2020.
</mixed-citation></ref-html>
<ref-html id="bib1.bib32"><label>Paszke et al.(2019)</label><mixed-citation>
Paszke, A., Gross, S., Massa, F., Lerer, A., Bradbury, J., Chanan, G., Killeen,
T., Lin, Z., Gimelshein, N., Antiga, L., Desmaison, A., Kopf, A., Yang, E.,
DeVito, Z., Raison, M., Tejani, A., Chilamkurthy, S., Steiner, B., Fang, L.,
Bai, J., and Chintala, S.: PyTorch: An Imperative Style, High-Performance
Deep Learning Library, in: Advances in Neural Information Processing Systems
32, edited by: Wallach, H., Larochelle, H., Beygelzimer, A., d'Alché-Buc, F., Fox, E., and Garnett, R., Curran
Associates, Inc., Vancouver, Canada, 8024–8035,
available at: <a href="http://papers.neurips.cc/paper/9015-pytorch-an-imperative-style-high-performance-deep-learning-library.pdf" target="_blank">http://papers.neurips.cc/paper/9015-pytorch-an-imperative-style-high-performance-deep-learning-library.pdf</a> (last access: 10 March 2021),
2019.
</mixed-citation></ref-html>
<ref-html id="bib1.bib33"><label>Python Software Foundation(2018)</label><mixed-citation>
Python Software Foundation: Python Language Reference, release 3.6.8, PEP
494, available at: <a href="https://www.python.org/dev/peps/pep-0494/" target="_blank"/> (last access: 10 March 2021), 2018.
</mixed-citation></ref-html>
<ref-html id="bib1.bib34"><label>Reback et al.(2020)</label><mixed-citation>
Reback, J., McKinney, W., jbrockmendel, Van den Bossche, J., Augspurger, T.,
Cloud, P., gfyoung, Sinhrks, Klein, A., Roeschke, M., Tratner, J., She, C.,
Hawkins, S., Ayd, W., Petersen, T., Schendel, J., Hayden, A., Garcia, M.,
MomIsBestFriend, Jancauskas, V., Battiston, P., Seabold, S., chris-b1,
h-vetinari, Hoyer, S., Overmeire, W., alimcmaster1, Mehyar, M., Dong, K.,
and Whelan, C.: pandas-dev/pandas: Pandas v1.0.1, Zenodo,
<a href="https://doi.org/10.5281/zenodo.3644238" target="_blank">https://doi.org/10.5281/zenodo.3644238</a>, 2020.
</mixed-citation></ref-html>
<ref-html id="bib1.bib35"><label>Rezende et al.(2014)</label><mixed-citation>
Rezende, D. J., Mohamed, S., and Wierstra, D.: Stochastic Backpropagation and
Approximate Inference in Deep Generative Models, arXiv: 1401.4082,
available at: <a href="https://arxiv.org/abs/1401.4082" target="_blank"/> (last access: 10 March 2021), 2014.
</mixed-citation></ref-html>
<ref-html id="bib1.bib36"><label>Schultz and Schröder(2017)</label><mixed-citation>
Schultz, M. G. and Schröder, S.: Documentation of the JOIN REST interface, Juelich,
Germany,
available at: <a href="https://join.fz-juelich.de/services/rest/surfacedata/" target="_blank"/>,
(last access: 18 September 2020), 2017.
</mixed-citation></ref-html>
<ref-html id="bib1.bib37"><label>Schultz et al.(2017a)</label><mixed-citation>
Schultz, M. G.,
Schröder, S.,
Lyapina, O.,
Cooper, O. R.,
Galbally, I.,
Petropavlovskikh, I.,
von Schneidemesser, E.,
Tanimoto, H.,
Elshorbany, Y.,
Naja, M.,
Seguel, R. J.,
Dauert, U.,
Eckhardt, P.,
Feigenspan, S.,
Fiebig, M.,
Hjellbrekke, A.-G.,
Hong, Y.-D.,
Kjeld, P. C.,
Koide, H.,
Lear, G.,
Tarasick, D.,
Ueno, M.,
Wallasch, M.,
Baumgardner, D.,
Chuang, M.-T.,
Gillett, R.,
Lee, M.,
Molloy, S.,
Moolla, R.,
Wang, T.,
Sharps, K.,
Adame, J. A.,
Ancellet, G.,
Apadula, F.,
Artaxo, P.,
Barlasina, M. E.,
Bogucka, M.,
Bonasoni, P.,
Chang, L.,
Colomb, A.,
Cuevas-Agulló, E.,
Cupeiro, M.,
Degorska, A.,
Ding, A.,
Fröhlich, M.,
Frolova, M.,
Gadhavi, H.,
Gheusi, F.,
Gilge, S.,
Gonzalez, M. Y.,
Gros, V.,
Hamad, S. H.,
Helmig, D.,
Henriques, D.,
Hermansen, O.,
Holla, R.,
Hueber, J.,
Im, U.,
Jaffe, D. A.,
Komala, N.,
Kubistin, D.,
Lam, K.-S.,
Laurila, T.,
Lee, H.,
Levy, I.,
Mazzoleni, C.,
Mazzoleni, L. R.,
McClure-Begley, A.,
Mohamad, M.,
Murovec, M.,
Navarro-Comas, M.,
Nicodim, F.,
Parrish, D.,
Read, K. A.,
Reid, N.,
Ries, L.,
Saxena, P.,
Schwab, J. J.,
Scorgie, Y.,
Senik, I.,
Simmonds, P.,
Sinha, V.,
Skorokhod, A. I.,
Spain, G.,
Spangl, W.,
Spoor, R.,
Springston, S. R.,
Steer, K.,
Steinbacher, M.,
Suharguniyawan, E.,
Torre, P.,
Trickl, T.,
Weili, L.,
Weller, R.,
Xiaobin, X.,
Xue, L., and
Zhiqiang, M.: Tropospheric Ozone Assessment Report: Database and metrics
data of global surface ozone observations, Elementa: Science of the
Anthropocene, 5, 58, <a href="https://doi.org/10.1525/elementa.244" target="_blank">https://doi.org/10.1525/elementa.244</a>, 2017a.
</mixed-citation></ref-html>
<ref-html id="bib1.bib38"><label>Schultz et al.(2017b)</label><mixed-citation>
Schultz, M. G., Schröder, S.,Lyapina, O., Cooper, O. R., Galbally, I., Petropavlovskikh, I., von Schneidemesser, E., Tanimoto, H., Elshorbany, Y., Naja, M., Seguel, R. J., Dauert, U., Eckhardt, P., Feigenspan, S., Fiebig, M., Hjellbrekke, A.-G., Hong, Y.-D., Kjeld, P. C., Koide, H., Lear, G., Tarasick, D., Ueno, M., Wallasch, M., Baumgardner, D., Chuang, M.-T., Gillett, R., Lee, M., Molloy, S., Moolla, R., Wang, T., Sharps, K., Adame, J. A., Ancellet, G.., Apadula, F., Artaxo, P., Barlasina, M. E., Bogucka, M., Bonasoni, P., Chang, L., Colomb, A., Cuevas-Agulló, E., Cupeiro, M., Degorska, A., Ding, A., Fröhlich, M., Frolova, M., Gadhavi, H., Gheusi, F., Gilge, S., Gonzalez, M. Y., Gros, V., Hamad, S. H., Helmig, D., Henriques, D., Hermansen, O., Holla, R., Hueber, J., Im, U., Jaffe, D. A., Komala, N., Kubistin, D., Lam, K.-S., Laurila, T., Lee, H.,Levy, I., Mazzoleni, C., Mazzoleni, L. R., McClure-Begley, A., Mohamad, M., Murovec, M., Navarro-Comas, M., Nicodim, F., Parrish, D., Read, K. A., Reid, N., Ries, L., Saxena, P., Schwab, J. J.,Scorgie, Y., Senik, I., Simmonds, P., Sinha, V., Skorokhod, A. I., Spain, G., Spangl, W., Spoor, R., Springston, S. R., Steer, K., Steinbacher, M., Suharguniyawan, E., Torre, P., Trickl, T., Weili, L., Weller, R., Xu, X., Xue, L., and Zhiqiang, M.: Tropospheric Ozone Assessment Report, links to Global
surface ozone datasets, PANGAEA, <a href="https://doi.org/10.1594/PANGAEA.876108" target="_blank">https://doi.org/10.1594/PANGAEA.876108</a>, 2017b.
</mixed-citation></ref-html>
<ref-html id="bib1.bib39"><label>Schultz et al.(2021)</label><mixed-citation>
Schultz, M. G., Betancourt, C., Gong, B., Kleinert, F., Langguth, M., Leufen,
L. H., Mozaffari, A., and Stadtler, S.: Can deep learning beat numerical
weather prediction?, Philos. T. Roy. Soc. A, 379, 2194,
<a href="https://doi.org/10.1098/rsta.2020.0097" target="_blank">https://doi.org/10.1098/rsta.2020.0097</a>, 2021.

</mixed-citation></ref-html>
<ref-html id="bib1.bib40"><label>Szegedy et al.(2015)</label><mixed-citation>
Szegedy, C., Wei Liu, Yangqing Jia, Sermanet, P., Reed, S., Anguelov, D.,
Erhan, D., Vanhoucke, V., and Rabinovich, A.: Going deeper with convolutions,
in: 2015 IEEE Conference on Computer Vision and Pattern
Recognition (CVPR), IEEE, Boston, MA, USA, 1–9,
<a href="https://doi.org/10.1109/CVPR.2015.7298594" target="_blank">https://doi.org/10.1109/CVPR.2015.7298594</a>, 2015.
</mixed-citation></ref-html>
<ref-html id="bib1.bib41"><label>TensorFlow(2020)</label><mixed-citation>
TensorFlow: GPU support,
available at: <a href="https://www.tensorflow.org/install/gpu" target="_blank"/>, last access: 6 June 2020.
</mixed-citation></ref-html>
<ref-html id="bib1.bib42"><label>TOAR(2014–2021)</label><mixed-citation>
TOAR: Tropospheric Ozone Assessment Report (TOAR): Global metrics for climate
change, human health and crop/ecosystem research, International Global
Atmospheric Chemistry (IGAC),
available at: <a href="https://igacproject.org/activities/TOAR" target="_blank"/> (last access: 29 January
2021), 2014–2021.
</mixed-citation></ref-html>
<ref-html id="bib1.bib43"><label>US Environmental Protection Agency(2020)</label><mixed-citation>
US Environmental Protection Agency: Integrated science assessment for ozone
and related photochemical oxidants, US Environmental
Protection Agency, Washington, D.C., ePA-HQ-ORD-2018-0274, 2020.
</mixed-citation></ref-html>
<ref-html id="bib1.bib44"><label>van der Walt et al.(2011)</label><mixed-citation>
van der Walt, S., Colbert, S. C., and Varoquaux, G.: The NumPy Array: A
Structure for Efficient Numerical Computation, Comput. Sci.
Eng., 13, 22–30, <a href="https://doi.org/10.1109/MCSE.2011.37" target="_blank">https://doi.org/10.1109/MCSE.2011.37</a>, 2011.
</mixed-citation></ref-html>
<ref-html id="bib1.bib45"><label>Vautard(2012)</label><mixed-citation>
Vautard, R.: Evaluation of the meteorological forcing used for the Air
Quality Model Evaluation International Initiative (AQMEII) air
quality simulations, Atmos. Environ., 53, 15–37,
<a href="https://doi.org/10.1016/j.atmosenv.2011.10.065" target="_blank">https://doi.org/10.1016/j.atmosenv.2011.10.065</a>, 2012.
</mixed-citation></ref-html>
<ref-html id="bib1.bib46"><label>Wes McKinney(2010)</label><mixed-citation>
Wes McKinney: Data Structures for Statistical Computing in
Python, in: Proceedings of the 9th Python in Science Conference,
edited by: Stéfan van der Walt and Jarrod Millman, SciPy Organizers, Austin, Texas, 56–61,
<a href="https://doi.org/10.25080/Majora-92bf1922-00a" target="_blank">https://doi.org/10.25080/Majora-92bf1922-00a</a>, 2010.
</mixed-citation></ref-html>
<ref-html id="bib1.bib47"><label>Wilks(2011)</label><mixed-citation>
Wilks, D. S. (Ed.): Statistical methods in the atmospheric sciences, pp.
178–186, International Geophysics Series, Elsevier Academic Press,
Amsterdam, 3rd edn., 2011.
</mixed-citation></ref-html>
<ref-html id="bib1.bib48"><label>World Health Organization(2013)</label><mixed-citation>
World Health Organization: Health risks of air pollution in Europe – HRAPIE
project recommendations for concentration–response functions for
cost–benefit analysis of particulate matter, ozone and nitrogen dioxide,
Ozone and Nitrogen Dioxide,
available at: <a href="https://www.euro.who.int/__data/assets/pdf_file/0006/238956/Health_risks_air_pollution_HRAPIE_project.pdf" target="_blank"/> (last access: 10 March 2021),
2013.
</mixed-citation></ref-html>--></article>
