{"id":21104,"date":"2018-10-22T10:09:06","date_gmt":"2018-10-22T08:09:06","guid":{"rendered":"https:\/\/www.inovex.de\/blog\/?p=13233"},"modified":"2022-11-24T10:49:25","modified_gmt":"2022-11-24T09:49:25","slug":"how-to-manage-machine-learning-models","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/","title":{"rendered":"How to Manage Machine Learning Models"},"content":{"rendered":"<p>Developing a good machine learning model is not straight forward, but rather an iterative process which involves many steps. Mostly Data Scientists start by building a so called baseline, which can be used as a reference point to compare other models. This baseline can be created\u00a0by just calculating the average or using some simple models. After that a data scientist will probably try different models to see how they perform before doing some kind of hyper-parameter tuning to improve the most promising ones. Even if those models achieve good results, there will still be plenty of options to improve such as using more data (pre-)processing steps, creating additional features, using some form of dimensionality reduction or even applying stacking strategies.<\/p>\n<div class=\"bg-color-blue\">\n<p>Have a look at our 2022 update comparing <a href=\"https:\/\/www.inovex.de\/de\/blog\/machine-learning-experiment-tracking\/\">frameworks for machine learning experiment tracking<\/a> and see how MLflow, ClearML, neptune.ai and DAGsHub hold up!<\/p>\n<\/div>\n<p>Clearly this is an explorative process, which requires expertise and flexibility in tooling. Therefore data scientists mostly use notebooks to quickly try new ideas, rapidly train models and compare them, most of the times using simple print statements. This works well first, but will become confusing as the number of models and parameters increases. A common approach is\u00a0write the prediction results to a table or dataframe, but even so it is difficult to track all important information such as used hyper-parameters, datasources, time of execution etc.<\/p>\n<p>While big companies such as Google, Facebook and Uber develop custom machine learning platforms to support data scientists in this challenge, also smaller projects arose within the last months, for example\u00a0<a href=\"https:\/\/dvc.org\/\">DVC<\/a>,\u00a0\u00a0<a href=\"https:\/\/github.com\/IDSIA\/sacred\">Sacred<\/a>\u00a0or Databricks&#8216; <a href=\"https:\/\/github.com\/mlflow\/mlflow\/\">mlFlow<\/a>. While we currently evaluate these, we also tested another alternative named\u00a0<a href=\"https:\/\/github.com\/mitdbg\/modeldb\/\">ModelDB<\/a>\u00a0 earlier this year. The following blog article was created during this evaluation in May this year. While ModelDB might not be the best choice at this point of time, its evaluation explains the concept of machine learning model management and will be used as baseline in another article to follow in this series.\u00a0<!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#ModelDB-Architecture-and-installation\" >ModelDB: Architecture and installation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#Train-a-Regression-model\" >Train a Regression model<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#Add-additional-regressors-to-ModelDB\" >Add additional regressors to ModelDB<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#Compare-multiple-models\" >Compare multiple models<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#Summary\" >Summary<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"ModelDB-Architecture-and-installation\"><\/span>ModelDB: Architecture and installation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a href=\"https:\/\/github.com\/mitdbg\/modeldb\/\">ModelDB<\/a>\u00a0was developed at the computer science and artificial intelligence laboratory at MIT, integrates tightly with scikit-learn or SparkML and offers additional visualisation tools to evaluate model performance.\u00a0It consists of a backend which stores the data, a frontend for visualisation purposes and some client libraries. For installation it\u2019s easiest to clone the <a href=\"https:\/\/github.com\/mitdbg\/modeldb\/\">git repo<\/a> and use docker-compose to set up the infrastructure. Beside the backend- and the\u00a0frontend container you will find one which includes\u00a0a MongoDB instance, but at the point of writing this is not really used, instead all data is stored in a SQLite database within the backend container.<\/p>\n<p>The Backend service is implemented using the\u00a0interface definition language\u00a0<a href=\"https:\/\/thrift.apache.org\/\">Apache Thrift<\/a>\u00a0and compiled to Java. This way the backend service provides REST endpoints to access the data within the SQLite database. The Frontend-Service is provided by NodeJS using the Express-framework and Backbone as well as\u00a0<a href=\"https:\/\/github.com\/vega\/vega\">Vega<\/a>\u00a0to display charts.<\/p>\n<p>To interact with these services modelDB provides clients for two ML-Frameworks: scikit-learn and SparkML. Sadly the <a href=\"https:\/\/github.com\/mitdbg\/modeldb\/issues\/292#issuecomment-394959476\">compilation with Scala 2.13 does not work<\/a>.<\/p>\n<p>The installation of the scikit-learn client instead works via pip: <code>pip install modeldb<\/code>\u00a0. However, if you want to follow this tutorial, you will need to build it from source until my pull request gets accepted. So clone the modeldb repo and run <code>client\/python\/setup.py<\/code>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Train-a-Regression-model\"><\/span>Train a Regression model<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>ModelDB already provides some <a href=\"https:\/\/github.com\/mitdbg\/modeldb\/tree\/master\/client\/python\/samples\/sklearn\">examples <\/a>which mostly do classification tasks, so let&#8217;s try some regression. We will use the <a href=\"https:\/\/www.cs.toronto.edu\/~delve\/data\/boston\/bostonDetail.html\">Boston Housing Dataset<\/a>\u00a0which is contained within scikit-learn. If you want to run the notebook yourself, you can find it at <a href=\"https:\/\/github.com\/inovex\/modeldb-evaluation\">github<\/a>. I&#8217;ll walk you through it below.<\/p>\n<p>First, let&#8217;s make some imports and check the data:<\/p>\n<pre class=\"lang:python decode:true\">import pandas as pd\r\n\r\nfrom IPython.display import display as ipd\r\n\r\nfrom sklearn.datasets import load_boston\r\n\r\nboston = load_boston()\r\n\r\ndata = pd.DataFrame(boston.data,columns=boston.feature_names)\r\n\r\ndata['target'] = pd.Series(boston.target)\r\n\r\nipd(data.sample(5))\r\n\r\n\tCRIM\tZN\tINDUS\tCHAS\tNOX\tRM\tAGE\tDIS\tRAD\tTAX\tPTRATIO\tB\tLSTAT\ttarget\r\n\r\n447\t9.92485\t0.0\t18.10\t0.0\t0.740\t6.251\t96.6\t2.1980\t24.0\t666.0\t20.2\t388.52\t16.44\t12.6\r\n\r\n307\t0.04932\t33.0\t2.18\t0.0\t0.472\t6.849\t70.3\t3.1827\t7.0\t222.0\t18.4\t396.90\t7.53\t28.2\r\n\r\n356\t8.98296\t0.0\t18.10\t1.0\t0.770\t6.212\t97.4\t2.1222\t24.0\t666.0\t20.2\t377.73\t17.60\t17.8\r\n\r\n272\t0.11460\t20.0\t6.96\t0.0\t0.464\t6.538\t58.7\t3.9175\t3.0\t223.0\t18.6\t394.96\t7.73\t24.4\r\n\r\n308\t0.49298\t0.0\t9.90\t0.0\t0.544\t6.635\t82.5\t3.3175\t4.0\t304.0\t18.4\t396.90\t4.54\t22.8<\/pre>\n<p>The dataset has 14 columns, where 13 are attributes and one is the target variable. They do not contain any nulls and are formatted numerically, even that CHAS actually is a Boolean value.<\/p>\n<p>Let&#8217;s see, how a simple linear regression without ModelDB would look like:<\/p>\n<pre class=\"lang:python decode:true\">from sklearn.cross_validation import train_test_split\r\n\r\nfrom sklearn.linear_model import LinearRegression\r\n\r\nfrom sklearn.metrics import mean_absolute_error\r\n\r\n# Do a train_test_split\r\n\r\nx_train, x_test, y_train, y_test = train_test_split(data.iloc[:,:-1], data.iloc[:,-1], test_size=10, random_state=42)\r\n\r\n# Create and fit regression\r\n\r\nlinreg = LinearRegression()\r\n\r\nlinreg.fit(x_train, y_train)\r\n\r\n# Do prediction and calculate mean absolute error\r\n\r\ntest_pred = linreg.predict(x_test)\r\n\r\nmean_absolute_error(y_test, test_pred)<\/pre>\n<p>We get an absolute error of\u00a02.499. To do the same using ModelDB, we first need to import the library and then create a syncer object by providing a project, an experiment and and an experiment-run object (If you get an error, make sure your docker-containers are up and running).<\/p>\n<pre class=\"lang:default decode:true\">import modeldb.sklearn_native.ModelDbSyncer as mdb\r\n\r\nproject = mdb.NewOrExistingProject(name=\"ModelDB Evaluation\", author=\"Nico\", description=\"using Bosten Housing Dataset\")\r\n\r\nexperiment = mdb.NewOrExistingExperiment(name=\"Simple model training\", description=\"\")\r\n\r\nsyncer = mdb.Syncer(\r\n\r\n    project,\r\n\r\n    experiment,\r\n\r\n    mdb.NewExperimentRun(\"Linear Regression\"))<\/pre>\n<p>After that, we can reuse the linear regression\u00a0code from above with a few minor changes: We do not use the scikit-learn classes directly, but through modelDB which extends them with a function called *_sync. This function tells the syncer object to keep track of the calculated object. You could even minimise the changes by simply overwriting the default scikit-learn objects using an import like<\/p>\n<pre class=\"lang:default decode:true\">import modeldb.sklearn_native.ModelDbSyncer as *<\/pre>\n<p>, but we will stay with the mdb prefix to make clear which feature gets used. Finally we calculate the absolute and the squared mean error and tell the syncer to synchronize these changes to the backend-service.<\/p>\n<pre class=\"lang:python decode:true\">from modeldb.sklearn_native import SyncableMetrics\r\n\r\n# Do a train_test_split\r\n\r\nx_train, x_test, y_train, y_test = mdb.cross_validation.train_test_split_sync(data.iloc[:,:-1], data.iloc[:,-1], test_size=10, random_state=42)\r\n\r\n# Create and fit regression\r\n\r\nlinreg = mdb.linear_model.LinearRegression()\r\n\r\nlinreg.fit_sync(x_train, y_train)\r\n\r\n# Do prediction and calculate mean absolute error\r\n\r\ntest_pred = linreg.predict_sync(x_test)\r\n\r\nmae = SyncableMetrics.compute_metrics(linreg, mean_absolute_error, y_test, test_pred, data.iloc[:,:-1].values,\"predictionCol\", 'target')\r\n\r\nmse = SyncableMetrics.compute_metrics(linreg, mean_squared_error, y_test, test_pred, data.iloc[:,:-1].values,\"predictionCol\", 'target')\r\n\r\n# Sync with the backend service\r\n\r\nsyncer.sync()<\/pre>\n<p>After that the modelDB frontend should show you a project called <em>ModelDB Evaluation\u00a0<\/em>probably at\u00a0http:\/\/127.0.0.1:3000. Within this project, you will find a simple diagram, which shows two dots, representing the two error scores we just calculated. You can also click on those and see further information about the model on the sidebar on the right. Feel free to adapt the code and try some other parameters and models to see what happens.<\/p>\n<p><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-04-at-18.23.23.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13262 size-medium\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-04-at-18.23.23-300x68.png\" alt=\"ModelDB Projects overview\" width=\"300\" height=\"68\" \/><\/a><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-05-at-08.02.23.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13271 size-medium\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-05-at-08.02.23-300x159.png\" alt=\"ModelDB Evaluation showing error points\" width=\"300\" height=\"159\" \/><\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Add-additional-regressors-to-ModelDB\"><\/span>Add additional regressors to ModelDB<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>If you played a bit around and tried to exchange the linear regression for some alternative with regularisation such as Ridge or Lasso, you will have found an error such as:<\/p>\n<pre class=\"\"><span class=\"ansi-red-fg\">ImportError<\/span>: No module named 'Ridge'<\/pre>\n<p>This happens because ModelDB does not support any regressors\u00a0other than linear regression yet. Luckily it is really easy to add those. To do so open the file `client\/python\/modeldb\/sklearn_native\/ModelDbSyncer.py` and find the `enable_sklearn_sync_functions` function. Within that, you find an array containing all models that the fit_sync and the predict_sync functionality should get added to. Just add `ElasticNet, Ridge, Lasso,` and any other model you want to use. After that, we can increment the version number of the library since we did add a new feature. You&#8217;ll find it in `client\/python\/setup.py`.<\/p>\n<p>Now we will run `client\/python\/build_client.sh` to package the new version and import it into our notebook using:<\/p>\n<pre class=\"lang:python decode:true\">import pkg_resources\r\n\r\npkg_resources.require(\"modeldb==0.0.1a31\")<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Compare-multiple-models\"><\/span>Compare multiple models<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Using modelDB for only a few models is like cracking a nut with a sledge hammer. To become useful we will need some more model-parameter combinations. So let&#8217;s apply grid search using ModelDB.<\/p>\n<pre class=\"lang:python decode:true\">experiment = mdb.NewOrExistingExperiment(name=\"Grid Search\", description=\"\")\r\n\r\nsyncer = mdb.Syncer(project,experiment,mdb.NewExperimentRun(\"ElasticNet\"))\r\n\r\nmodel = mdb.linear_model.ElasticNet()\r\n\r\nparameters = {\r\n\r\n    'alpha': (10,5,2,1,0.5,0.2,0.1,0)\r\n\r\n}\r\n\r\nscorer = sklearn.metrics.make_scorer(mean_absolute_error)\r\n\r\nclf = mdb.GridSearchCV(model, parameters, cv=2, scoring=scorer,error_score=100)\r\n\r\n# Fit the gridsearch\r\n\r\nclf.fit_sync(x_train, y_train)\r\n\r\ntest_pred = clf.predict(x_test)\r\n\r\n# Compute various metrics on the testing set\r\n\r\n#mae = SyncableMetrics.compute_metrics(clf, mean_absolute_error, y_test, test_pred, data.iloc[:,:-1].values,\"predictionCol\", 'target')\r\n\r\n#mse = SyncableMetrics.compute_metrics(clf, mean_squared_error, y_test, test_pred, data.iloc[:,:-1].values,\"predictionCol\", 'target')\r\n\r\nsyncer.sync()<\/pre>\n<p>We are going to use <a href=\"http:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.linear_model.ElasticNet.html\">ElasticNet<\/a>, which is a regularized version of a linear regression and applies both, l1 and l2 regularization. The parameter alpha defines the absolute factor of the regularization, while l1_ratio defines the mixture between l1 and l2 regularization. We use a couple of different values and\u00a0 4-fold cross validation. The following steps are similar to before, before we finally compute mean average and squared error of the best predictor on the test-set. After the code got completed the ModelDB UI should look something like this:<\/p>\n<p><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-05-at-08.05.03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13269 size-large\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-05-at-08.05.03-1024x447.png\" alt=\"Linear regression with l1 and l2 regularization\" width=\"1024\" height=\"447\" \/><\/a><\/p>\n<p>We find a point per parameter k-fold combination, so 5*5*5 = 125 points. These are quite some models to compare and ModelDB supports us doing so with an additional tool just below the default chart. In the select fields choose continuous as metric to display on the y-axis and the parameters alpha and l1_ratio as x-axis and group-by values. With compare you should receive a bar-chart comparing the average model performance across the calculated folds.<\/p>\n<p><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-05-at-08.05.27.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13268\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-05-at-08.05.27-300x120.png\" alt=\"ModelDB Example Visualisation\" width=\"593\" height=\"237\" \/><\/a><\/p>\n<p>If you are more of a numbers type you can also compare your models using a table. To do so switch from the &#8222;Models and Charts&#8220; to the &#8222;Models&#8220; page. You will find a table of all stored models which can be filtered and grouped using the same drag and drop mechanism. However it is difficult to compare results using this view, since parameters don&#8217;t get their own column. Just use &#8222;create table&#8220; and add all columns you&#8217;re interested in to generate a customized table. First, drag the experiment_run_id to the filter section on the left sidebar reduce the set of values. Then place the fields you are are interested in in the Customize panel to generate a table based on these. However you should not place too many combinations there, since the HTML table lacks scrolling functionality.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13265\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-05-at-08.08.07-291x300.png\" alt=\"\" width=\"291\" height=\"300\" \/> <img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13266\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/06\/Screen-Shot-2018-06-05-at-08.08.01-219x300.png\" alt=\"\" width=\"219\" height=\"300\" \/><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Summary\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>ModelDB makes it easy to structure your models and helps you to analyze them to find the best combination. It is limited to scikit-learn (and SparkML algorithms), but provides an easy and minimally invasive way to integrate for implemented methods. However, only a subset of scikit-learn features are supported and ModelDB does neither support complex models nor randomSearch instead of gridSearch. Even the regularized versions of linear regressions haven&#8217;t been supported until recently, even though it is easy to add such functionality.<\/p>\n<p>But the concept of the tightly integrated clients struggles by design: ModelDB overwrites scitkit-learn&#8217;s native functionality with custom extensions which are likely to break as scikit learn releases new versions. Without adaptions this will prevent modelDB users from updating to scikit-learn versions later then 17.2. The extension of an independent and changing framework is troublesome in general, especially if there is no powerful vendor behind it. ModelDB did not progress too much this year, even though there are definitely areas that could use improvement, such as a more intuitive UI, missing components in the library and the lack of an extensive documentation.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The concept of a framework which provides structure to machine learning experiments looks really promising. ModelDB uses a modern technology stack and provides many features for model comparison but lacks maturity and documentation. The project works as inspiration and for experiments, but will need some more supporters to stay alive, especially since the clients will need continuous work to stay in sync with the machine learning libraries supported. Therefore be careful using it in a production environment or be prepared to contribute some work. Luckily there have been some similar projects popping up recently such as <a href=\"https:\/\/github.com\/datmo\/datmo\">datmo<\/a>, <a href=\"https:\/\/dvc.org\/\">dvc<\/a> or <a href=\"https:\/\/github.com\/IDSIA\/sacred\">Sacred<\/a>. We\u00a0we&#8217;ll probably have a look at those in the future.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Developing a good machine learning model is not straight forward, but rather an iterative process which involves many steps. Mostly Data Scientists start by building a so called baseline, which can be used as a reference point to compare other models. This baseline can be created\u00a0by just calculating the average or using some simple models. [&hellip;]<\/p>\n","protected":false},"author":75,"featured_media":14120,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[206,226],"service":[431],"coauthors":[{"id":75,"display_name":"Nico Kreiling","user_nicename":"nkreiling"}],"class_list":["post-21104","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-data-science","tag-model-management","service-data-science"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Manage Machine Learning Models - inovex GmbH<\/title>\n<meta name=\"description\" content=\"In the past few moths a slew of Machine Learning management platforms arose. In this article we have a look at ModelDB which supports data scientists by keeping track of models, datasources and parameters. If you use scikit-learn or SparkML it promises easy integration and offers additional visualisation tools.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Manage Machine Learning Models - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"In the past few moths a slew of Machine Learning management platforms arose. In this article we have a look at ModelDB which supports data scientists by keeping track of models, datasources and parameters. If you use scikit-learn or SparkML it promises easy integration and offers additional visualisation tools.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2018-10-22T08:09:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-11-24T09:49:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nico Kreiling\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero-1024x576.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nico Kreiling\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"13\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Nico Kreiling\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/\"},\"author\":{\"name\":\"Nico Kreiling\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/445f04b88618788ea0fd469ab9363ce6\"},\"headline\":\"How to Manage Machine Learning Models\",\"datePublished\":\"2018-10-22T08:09:06+00:00\",\"dateModified\":\"2022-11-24T09:49:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/\"},\"wordCount\":1692,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero.png\",\"keywords\":[\"Data Science\",\"Model Management\"],\"articleSection\":[\"Analytics\",\"English Content\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/\",\"url\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/\",\"name\":\"How to Manage Machine Learning Models - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero.png\",\"datePublished\":\"2018-10-22T08:09:06+00:00\",\"dateModified\":\"2022-11-24T09:49:25+00:00\",\"description\":\"In the past few moths a slew of Machine Learning management platforms arose. In this article we have a look at ModelDB which supports data scientists by keeping track of models, datasources and parameters. If you use scikit-learn or SparkML it promises easy integration and offers additional visualisation tools.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#primaryimage\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero.png\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero.png\",\"width\":1920,\"height\":1080,\"caption\":\"ModelDB being fed data from spark and scikit learn.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.inovex.de\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Manage Machine Learning Models\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.inovex.de\/de\/#website\",\"url\":\"https:\/\/www.inovex.de\/de\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.inovex.de\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\/\/www.inovex.de\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/inovexde\",\"https:\/\/x.com\/inovexgmbh\",\"https:\/\/www.instagram.com\/inovexlife\/\",\"https:\/\/www.linkedin.com\/company\/inovex\",\"https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/445f04b88618788ea0fd469ab9363ce6\",\"name\":\"Nico Kreiling\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/23148f0bf8e343c0425edf8bd9582674\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/668c761da41e2273f8b8c1ff2abd8c941ee173645c87c6e9f992e0912baa5549?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/668c761da41e2273f8b8c1ff2abd8c941ee173645c87c6e9f992e0912baa5549?s=96&d=retro&r=g\",\"caption\":\"Nico Kreiling\"},\"url\":\"https:\/\/www.inovex.de\/de\/blog\/author\/nkreiling\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Manage Machine Learning Models - inovex GmbH","description":"In the past few moths a slew of Machine Learning management platforms arose. In this article we have a look at ModelDB which supports data scientists by keeping track of models, datasources and parameters. If you use scikit-learn or SparkML it promises easy integration and offers additional visualisation tools.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/","og_locale":"de_DE","og_type":"article","og_title":"How to Manage Machine Learning Models - inovex GmbH","og_description":"In the past few moths a slew of Machine Learning management platforms arose. In this article we have a look at ModelDB which supports data scientists by keeping track of models, datasources and parameters. If you use scikit-learn or SparkML it promises easy integration and offers additional visualisation tools.","og_url":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2018-10-22T08:09:06+00:00","article_modified_time":"2022-11-24T09:49:25+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero.png","type":"image\/png"}],"author":"Nico Kreiling","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero-1024x576.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Nico Kreiling","Gesch\u00e4tzte Lesezeit":"13\u00a0Minuten","Written by":"Nico Kreiling"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/"},"author":{"name":"Nico Kreiling","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/445f04b88618788ea0fd469ab9363ce6"},"headline":"How to Manage Machine Learning Models","datePublished":"2018-10-22T08:09:06+00:00","dateModified":"2022-11-24T09:49:25+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/"},"wordCount":1692,"commentCount":2,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero.png","keywords":["Data Science","Model Management"],"articleSection":["Analytics","English Content","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/","url":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/","name":"How to Manage Machine Learning Models - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero.png","datePublished":"2018-10-22T08:09:06+00:00","dateModified":"2022-11-24T09:49:25+00:00","description":"In the past few moths a slew of Machine Learning management platforms arose. In this article we have a look at ModelDB which supports data scientists by keeping track of models, datasources and parameters. If you use scikit-learn or SparkML it promises easy integration and offers additional visualisation tools.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/10\/modeldb-hero.png","width":1920,"height":1080,"caption":"ModelDB being fed data from spark and scikit learn."},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/how-to-manage-machine-learning-models\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"How to Manage Machine Learning Models"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/445f04b88618788ea0fd469ab9363ce6","name":"Nico Kreiling","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/23148f0bf8e343c0425edf8bd9582674","url":"https:\/\/secure.gravatar.com\/avatar\/668c761da41e2273f8b8c1ff2abd8c941ee173645c87c6e9f992e0912baa5549?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/668c761da41e2273f8b8c1ff2abd8c941ee173645c87c6e9f992e0912baa5549?s=96&d=retro&r=g","caption":"Nico Kreiling"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/nkreiling\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/75"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=21104"}],"version-history":[{"count":2,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21104\/revisions"}],"predecessor-version":[{"id":33976,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21104\/revisions\/33976"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/14120"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=21104"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=21104"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=21104"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=21104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}