{"id":3404,"date":"2026-04-15T04:50:42","date_gmt":"2026-04-15T02:50:42","guid":{"rendered":"https:\/\/neuraldesigner.com\/blog\/milk-quality\/"},"modified":"2026-08-05T14:58:40","modified_gmt":"2026-08-05T12:58:40","slug":"milk-quality","status":"publish","type":"blog","link":"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/","title":{"rendered":"Inspect milk quality using machine learning"},"content":{"rendered":"\n<style>\n.ndb{width:100vw;margin-left:calc(50% - 50vw);padding:22px 24px 14px;background:#eee;color:#1b2635;font-family:\"Outfit\",\"Roboto\",Arial,sans-serif}.ndb *{box-sizing:border-box}.ndb-wrap{width:min(100%,1200px);margin:0 auto}.ndb a{text-decoration:none;color:#2d799f;font-weight:600}\n.ndb-executive{margin:0 0 34px;padding:32px;border-radius:20px;background:linear-gradient(135deg,#12354b,#245e80);color:#fff;box-shadow:0 16px 36px rgba(0,18,51,.18)}.ndb-executive h2{margin:0 0 12px;padding:0;border:0;color:#fff;font-size:30px;line-height:1.2}.ndb-executive p{margin:0;color:#eaf5fb;font-size:18px;line-height:1.55}.ndb-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-top:22px}.ndb-kpi{padding:18px;border:1px solid rgba(255,255,255,.18);border-radius:14px;background:rgba(255,255,255,.1)}.ndb-kpi strong{display:block;color:#fff;font-size:25px;line-height:1.1}.ndb-kpi span{display:block;margin-top:6px;color:#d9edf7;font-size:13px}\n.ndb-actions,.ndb-audience,.ndb-downloads{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin:22px 0}.ndb-actions a,.ndb-downloads a{display:inline-flex;align-items:center;justify-content:center;padding:12px 20px;border-radius:24px;background:#245e80;color:#fff!important;font-weight:700}.ndb-executive .ndb-actions a{background:#fff;color:#12354b!important}.ndb-executive .ndb-actions a:last-child{background:transparent;color:#fff!important;border:1px solid rgba(255,255,255,.55)}\n.ndb-lead{margin:0 0 28px;color:#3a4a5a;font-size:18px;line-height:1.6}.ndb-toc{display:flex;flex-wrap:wrap;justify-content:center;gap:10px;margin:0 0 42px;padding:0;list-style:none}.ndb-toc a,.ndb-audience span{display:block;padding:9px 14px;border-radius:20px;background:#e9f2f8;color:#12354b;font-size:14px;font-weight:600}\n.ndb-card{margin:0 0 54px;scroll-margin-top:90px}.ndb-card h2{position:relative;margin:0 0 20px;padding-bottom:12px;border-bottom:1px solid #dbe5ec;color:#001233;font-size:24px}.ndb-card h2:after{content:\"\";position:absolute;bottom:-1px;left:0;width:62px;height:3px;border-radius:2px;background:#56a1c8}.ndb-card h3{margin:28px 0 12px;color:#12354b;font-size:20px}.ndb-card p{margin:0 0 14px;color:#33424f;font-size:16.5px;line-height:1.62}.ndb-card li{margin:5px 0;color:#33424f;font-size:16px;line-height:1.5}.ndb-card code{padding:2px 5px;border-radius:4px;background:#e8eef2;color:#12354b}\n.ndb-value-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin:22px 0}.ndb-value{padding:20px;border:1px solid #dce8ef;border-radius:14px;background:#f8fbfd}.ndb-value strong{display:block;margin-bottom:6px;color:#12354b;font-size:17px}.ndb-value span{color:#4a5d6b;line-height:1.45}\n.ndb-note{margin:20px 0;padding:18px 20px;border-left:4px solid #56a1c8;border-radius:0 12px 12px 0;background:#f6fafc;color:#33424f;line-height:1.55}.ndb-note--warning{border-left-color:#e39b36;background:#fff9ef}\n.ndb-card img{display:block;width:auto;max-width:min(680px,100%);height:auto;margin:24px auto;border-radius:12px;box-shadow:0 12px 28px rgba(0,18,51,.12)}.ndb-card img.ndb-architecture{width:min(820px,100%);max-width:100%}.ndb-figure-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;margin:24px 0}.ndb-figure-grid figure{margin:0;padding:16px;border:1px solid #dce8ef;border-radius:15px;background:#f8fbfd}.ndb-figure-grid img{width:100%;max-width:100%;margin:0 auto 12px;box-shadow:none}.ndb-figure-grid figcaption{color:#405361;font-size:14px;line-height:1.45}\n.ndb-card table{width:auto;max-width:100%;margin:24px auto;border-collapse:separate;border-spacing:0;overflow:hidden;border-radius:12px;background:#fff;box-shadow:0 10px 24px rgba(0,18,51,.08)}.ndb-card th,.ndb-card td{padding:11px 16px;border-bottom:1px solid #e2e9ee;text-align:left}.ndb-card thead th{background:#12354b!important;color:#fff!important}.ndb-card tbody th{background:#eaf2f6!important;color:#12354b!important;text-align:left}.ndb-card tbody tr:nth-child(even) th{background:#f4f8fa!important}.ndb-card tbody td{color:#33424f!important}.ndb-card td{color:#33424f}.ndb-card tbody tr:last-child td{border-bottom:0}\n.ndb-flow{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin:24px 0}.ndb-flow div{position:relative;padding:18px 16px;border-radius:13px;background:#12354b;color:#fff;text-align:center;font-weight:600}.ndb-flow div:not(:last-child):after{content:\"\u2192\";position:absolute;right:-17px;top:50%;z-index:2;transform:translateY(-50%);color:#56a1c8;font-size:22px}\n.ndb-calculator{margin:26px 0;padding:26px;border:1px solid #cfe0ea;border-radius:18px;background:#f8fbfd;box-shadow:0 12px 28px rgba(0,18,51,.08)}.ndb-calculator h3{margin-top:0}.ndb-calculator-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.ndb-field label{display:block;margin-bottom:6px;color:#33424f;font-size:13px;font-weight:700}.ndb-field input{width:100%;padding:10px 11px;border:1px solid #bdcfda;border-radius:8px;background:#fff;color:#1b2635;font:inherit}.ndb-field small{display:block;margin-top:4px;color:#71818d;font-size:11px}.ndb-calc-actions{display:flex;justify-content:center;gap:10px;margin:18px 0}.ndb-calc-actions button{padding:11px 18px;border:0;border-radius:22px;background:#245e80;color:#fff;font:inherit;font-weight:700;cursor:pointer}.ndb-calc-actions button[type=button]{background:#e4edf2;color:#12354b}.ndb-output{max-width:360px;margin:0 auto;padding:20px;border:1px solid #d8e4eb;border-radius:12px;background:#fff;text-align:center}.ndb-output span{display:block;color:#5e707d;font-size:13px}.ndb-output strong{display:block;margin-top:5px;color:#12354b;font-size:28px}.ndb-calc-status{text-align:center;color:#60727f!important;font-size:13px!important}\n.ndb-card details{margin:22px 0;padding:16px 18px;border:1px solid #dce8ef;border-radius:12px;background:#f8fbfd}.ndb-card summary{cursor:pointer;color:#12354b;font-weight:700}.ndb-card pre{overflow-x:auto;margin:15px 0 0;padding:18px;border-radius:10px;background:#edf2f5;color:#1b2635;font:12px\/1.5 Consolas,monospace;white-space:pre}\n@media(max-width:900px){.ndb-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}.ndb-value-grid{grid-template-columns:1fr}.ndb-flow{grid-template-columns:1fr 1fr}.ndb-flow div:after{display:none}}\n@media(max-width:680px){.ndb{padding:12px 14px}.ndb-executive{padding:24px 20px}.ndb-executive h2{font-size:24px}.ndb-kpis,.ndb-figure-grid,.ndb-calculator-grid,.ndb-flow{grid-template-columns:1fr}.ndb-calculator{padding:20px 16px}.ndb-card table{font-size:13px}.ndb-card th,.ndb-card td{padding:9px 8px}}\n<\/style>\n\n<style>\n.ndb-table-scroll{max-width:100%;overflow-x:auto}.ndb-card table.ndb-confusion{font-variant-numeric:tabular-nums}.ndb-card table.ndb-confusion td:not(:first-child){text-align:right}.ndb-card table.ndb-confusion td.ndb-hit{background:#e9f5ed;color:#215d3b;font-weight:800}\n.ndb-card .ndb-kpi{border-color:#dce8ef;background:#f8fbfd}.ndb-card .ndb-kpi strong{color:#12354b}.ndb-card .ndb-kpi span{color:#5e707d}\n.ndb-case{margin:26px 0;padding:24px;border:1px solid #cfe0ea;border-radius:16px;background:#f8fbfd}.ndb-case h3{margin-top:0}.ndb-case-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.ndb-case-grid table{margin:0 auto!important;width:100%!important}\n.ndb-prob-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:20px 0}.ndb-prob{padding:17px;border:1px solid #d8e4eb;border-radius:12px;background:#fff}.ndb-prob span{display:block;color:#5e707d;font-size:13px}.ndb-prob strong{display:block;margin-top:5px;color:#12354b;font-size:23px}\n.ndb-architecture--initial{width:min(720px,100%)!important}.ndb-architecture--final{width:min(800px,100%)!important}.ndb-card img.ndb-chart-wide{max-width:min(780px,100%)}.ndb-figure-grid--dataset img{aspect-ratio:auto;object-fit:contain}\n.ndb-code-sample{max-width:100%;margin:18px 0;padding:18px 20px;overflow-x:auto;border:1px solid #d5e2e9;border-radius:12px;background:#f7fafc;box-shadow:0 8px 20px rgba(0,18,51,.06)}.ndb-code-sample code{display:block;padding:0!important;background:transparent!important;color:#173447!important;font:14px\/1.65 Consolas,\"Courier New\",monospace;white-space:pre-wrap}\n@media(max-width:760px){.ndb-case-grid,.ndb-prob-grid{grid-template-columns:1fr}}\n<\/style>\n\n<div class=\"ndb\"><div class=\"ndb-wrap\">\n<section class=\"ndb-executive\"><h2>Screen milk quality from routine product observations<\/h2>\n<p>This three-class model combines pH, temperature, colour and four binary quality observations to estimate whether a sample matches the dataset&#8217;s high-, medium- or low-quality patterns. The example shows how classification can support triage in a dairy quality workflow while keeping release decisions with validated laboratory and food-safety procedures.<\/p>\n<div class=\"ndb-kpis\"><div class=\"ndb-kpi\"><strong>1,059<\/strong><span>labelled records<\/span><\/div><div class=\"ndb-kpi\"><strong>3<\/strong><span>quality classes<\/span><\/div><div class=\"ndb-kpi\"><strong>96.7%<\/strong><span>testing accuracy<\/span><\/div><div class=\"ndb-kpi\"><strong>83<\/strong><span>unique input combinations<\/span><\/div><\/div>\n<div class=\"ndb-actions\"><a href=\"#7-model-deployment\">See the screening case<\/a><a href=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/10\/milkquality.csv\">Download the dataset<\/a><\/div><\/section>\n<div class=\"ndb-lead\"><p>Dairy plants need rapid, consistent ways to prioritize samples for review, but product release and food-safety decisions require validated measurement methods and traceable quality procedures. This example demonstrates a compact classifier that converts seven recorded attributes into three probabilities and a suggested quality class.<\/p><\/div>\n<ul class=\"ndb-toc\"><li><a href=\"#1-industrial-challenge\">Industrial challenge<\/a><\/li><li><a href=\"#2-data-set\">Data set<\/a><\/li><li><a href=\"#3-model\">Model<\/a><\/li><li><a href=\"#4-training\">Training<\/a><\/li><li><a href=\"#5-selection\">Model selection<\/a><\/li><li><a href=\"#6-testing\">Testing<\/a><\/li><li><a href=\"#7-model-deployment\">Deployment<\/a><\/li><li><a href=\"#8-limitations\">Limitations<\/a><\/li><li><a href=\"#references\">References<\/a><\/li><\/ul>\n\n<section id=\"1-industrial-challenge\" class=\"ndb-card\"><h2>1. Industrial challenge<\/h2>\n<p>This is a multiclass <a href=\"https:\/\/www.neuraldesigner.com\/learning\/tutorials\/neural-networks-applications#Classification\">classification<\/a> problem. For each sample, the network returns probabilities for <code>high_quality<\/code>, <code>medium_quality<\/code> and <code>low_quality<\/code>; the largest probability determines the suggested class.<\/p>\n<div class=\"ndb-value-grid\"><div class=\"ndb-value\"><strong>Prioritize quality checks<\/strong><span>Use a consistent preliminary score to identify samples that deserve faster confirmatory analysis.<\/span><\/div><div class=\"ndb-value\"><strong>Standardize triage<\/strong><span>Combine several recorded attributes through one documented classification rule.<\/span><\/div><div class=\"ndb-value\"><strong>Support traceability<\/strong><span>Store input values, class probabilities and the model version alongside each screening decision.<\/span><\/div><\/div>\n<p>Potential users include dairy quality managers, food technologists, laboratory supervisors, production managers, process engineers and digital-quality teams.<\/p>\n<div class=\"ndb-audience\"><span>Dairy quality<\/span><span>Food technology<\/span><span>Laboratory operations<\/span><span>Production management<\/span><span>Digital quality<\/span><\/div>\n<div class=\"ndb-note\"><strong>Scope of this example.<\/strong> The model is a demonstration classifier for preliminary screening. It does not measure microbiological safety, adulteration, shelf life or regulatory compliance and must not be used as an automatic batch-release system.<\/div><\/section>\n\n<section id=\"2-data-set\" class=\"ndb-card\"><h2>2. Data set<\/h2>\n<p>The downloadable <a href=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/10\/milkquality.csv\">milkquality.csv<\/a> contains <strong>1,059 observations<\/strong>, seven inputs and the categorical target <code>grade<\/code>. There are no missing values in the published file.<\/p>\n<div class=\"ndb-downloads\"><a href=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/10\/milkquality.csv\">Download milkquality.csv<\/a><\/div>\n<table><thead><tr><th>Variable<\/th><th>Meaning in the dataset<\/th><th>Type \/ unit<\/th><th>Observed range<\/th><\/tr><\/thead><tbody>\n<tr><td><code>pH<\/code><\/td><td>Measured acidity\/alkalinity<\/td><td>pH<\/td><td>3.0 to 9.5<\/td><\/tr>\n<tr><td><code>temperature<\/code><\/td><td>Sample temperature<\/td><td>\u00b0C<\/td><td>34 to 90<\/td><\/tr>\n<tr><td><code>taste<\/code><\/td><td>Dataset quality flag: 1 acceptable, 0 not acceptable<\/td><td>Binary<\/td><td>0 or 1<\/td><\/tr>\n<tr><td><code>odor<\/code><\/td><td>Dataset quality flag: 1 acceptable, 0 not acceptable<\/td><td>Binary<\/td><td>0 or 1<\/td><\/tr>\n<tr><td><code>fat<\/code><\/td><td>Dataset quality flag: 1 acceptable, 0 not acceptable<\/td><td>Binary<\/td><td>0 or 1<\/td><\/tr>\n<tr><td><code>turbidity<\/code><\/td><td>Dataset quality flag: 1 acceptable, 0 not acceptable<\/td><td>Binary<\/td><td>0 or 1<\/td><\/tr>\n<tr><td><code>colour<\/code><\/td><td>Colour value on the dataset scale<\/td><td>Numeric<\/td><td>240 to 255<\/td><\/tr>\n<tr><td><code>grade<\/code><\/td><td>Milk quality class<\/td><td>Target<\/td><td>High, medium or low<\/td><\/tr>\n<\/tbody><\/table>\n<div class=\"ndb-figure-grid ndb-figure-grid--dataset\"><figure><img decoding=\"async\" src=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2026\/08\/milk-grade-distribution-2026.png\" alt=\"Distribution of high, medium and low milk quality classes\"><figcaption><strong>Class balance.<\/strong> Low quality accounts for 40.5%, medium quality for 35.3% and high quality for 24.2%.<\/figcaption><\/figure><figure><img decoding=\"async\" src=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2026\/08\/milk-grade-correlations-2026.png\" alt=\"Pearson correlations between milk attributes and the encoded quality grade\"><figcaption><strong>Indicative associations.<\/strong> Turbidity and temperature show the largest coefficients, but Pearson correlation with an encoded multiclass target depends on the class coding and is not a causal importance measure.<\/figcaption><\/figure><\/div>\n<p>The configured random split contains 637 training, 211 selection and 211 testing records.<\/p>\n<\/section>\n\n<section id=\"3-model\" class=\"ndb-card\"><h2>3. Neural network<\/h2>\n<p>The baseline network scales seven inputs, uses three tanh neurons in one hidden layer and applies a softmax output for the three classes. Continuous inputs use mean-and-standard-deviation scaling, while the four binary flags use minimum\u2013maximum scaling.<\/p>\n<img decoding=\"async\" class=\"ndb-architecture ndb-architecture--initial\" src=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2026\/08\/milk-network-initial-2026.png\" alt=\"Initial milk quality neural network with seven inputs and three hidden neurons\">\n<p>Neural Designer displays <code>grade<\/code> as one logical categorical output. The exported model evaluates three logits internally and normalizes them into probabilities that sum to one.<\/p><\/section>\n\n<section id=\"4-training\" class=\"ndb-card\"><h2>4. Training strategy<\/h2>\n<p>The classifier minimizes multiclass cross-entropy with the quasi-Newton method. Training and selection losses fall quickly during the first epochs and then stabilize, with the selection curve remaining above the training curve as expected when performance is evaluated on held-out rows.<\/p>\n<img decoding=\"async\" class=\"ndb-chart-wide\" src=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2026\/08\/milk-training-history-2026.png\" alt=\"Quasi-Newton training and selection cross-entropy history for the milk quality classifier\">\n<p>The curve supports convergence for the configured split. Because duplicate input vectors can occur across subsets, the selection loss should not be treated as an independent estimate of performance on a new batch or plant.<\/p><\/section>\n\n<section id=\"5-selection\" class=\"ndb-card\"><h2>5. Model selection<\/h2>\n<p>The growing-neurons task compares hidden layers from one to ten neurons. Most of the cross-entropy reduction occurs by three neurons, after which the selection curve changes only slightly. The final exported network contains <strong>10 hidden neurons<\/strong>.<\/p>\n<div class=\"ndb-figure-grid\"><figure><img decoding=\"async\" src=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2026\/08\/milk-neuron-selection-2026.png\" alt=\"Training and selection cross-entropy as hidden neurons increase from one to ten\"><figcaption>The selection curve reaches a broad plateau, so repeated grouped validation is needed to determine whether the larger network delivers a meaningful generalization gain.<\/figcaption><\/figure><figure><img decoding=\"async\" src=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2026\/08\/milk-network-final-2026.png\" alt=\"Final milk quality neural network with seven inputs and ten hidden neurons\"><figcaption>The deployed 7\u201310\u20133 classifier matches the exported Python model used in the deployment example.<\/figcaption><\/figure><\/div><\/section>\n\n<section id=\"6-testing\" class=\"ndb-card\"><h2>6. Testing analysis<\/h2>\n<p>The confusion matrix below is reproduced from the regenerated Neural Designer output. Rows are observed classes and columns are model predictions.<\/p>\n<div class=\"ndb-kpis\"><div class=\"ndb-kpi\"><strong>96.7%<\/strong><span>testing accuracy<\/span><\/div><div class=\"ndb-kpi\"><strong>96.3%<\/strong><span>macro-F1<\/span><\/div><div class=\"ndb-kpi\"><strong>211<\/strong><span>testing records<\/span><\/div><div class=\"ndb-kpi\"><strong>40.3%<\/strong><span>testing majority baseline<\/span><\/div><\/div>\n<h3>Confusion matrix<\/h3><div class=\"ndb-table-scroll\"><table class=\"ndb-confusion\"><thead><tr><th>Actual \/ predicted<\/th><th>High quality<\/th><th>Low quality<\/th><th>Medium quality<\/th><th>Total<\/th><\/tr><\/thead><tbody>\n<tr><td>High quality<\/td><td class=\"ndb-hit\">47<\/td><td>0<\/td><td>6<\/td><td>53<\/td><\/tr>\n<tr><td>Low quality<\/td><td>0<\/td><td class=\"ndb-hit\">84<\/td><td>1<\/td><td>85<\/td><\/tr>\n<tr><td>Medium quality<\/td><td>0<\/td><td>0<\/td><td class=\"ndb-hit\">73<\/td><td>73<\/td><\/tr>\n<tr><td>Total<\/td><td>47<\/td><td>84<\/td><td>80<\/td><td>211<\/td><\/tr><\/tbody><\/table><\/div>\n<h3>Per-class metrics<\/h3><table><thead><tr><th>Class<\/th><th>Testing support<\/th><th>Precision<\/th><th>Recall<\/th><th>F1<\/th><\/tr><\/thead><tbody>\n<tr><td>High quality<\/td><td>53<\/td><td>100.0%<\/td><td>88.7%<\/td><td>94.0%<\/td><\/tr>\n<tr><td>Low quality<\/td><td>85<\/td><td>100.0%<\/td><td>98.8%<\/td><td>99.4%<\/td><\/tr>\n<tr><td>Medium quality<\/td><td>73<\/td><td>91.3%<\/td><td>100.0%<\/td><td>95.4%<\/td><\/tr><\/tbody><\/table>\n<p>In this split, no low-quality sample is classified as high quality. Six high-quality samples and one low-quality sample are assigned to the medium class. That error pattern is useful for triage, but it must be re-estimated on genuinely independent batches before defining operational thresholds.<\/p>\n<div class=\"ndb-note ndb-note--warning\"><strong>Interpretation.<\/strong> The 96.7% result is substantially above the 40.3% majority-class baseline, but duplicate leakage makes it unsuitable as a claim of expected factory performance.<\/div><\/section>\n\n<section id=\"7-model-deployment\" class=\"ndb-card\"><h2>7. Model deployment<\/h2>\n<p>A practical screening workflow should capture the sample identifier and batch, validate measurement ranges and sensor status, calculate the three probabilities, and send the result to the laboratory information or quality-management system for review.<\/p>\n<div class=\"ndb-flow\"><div>Sample and batch record<\/div><div>Measurement and range checks<\/div><div>Three-class probability model<\/div><div>Review, confirm or place on hold<\/div><\/div>\n<div class=\"ndb-case\"><h3>Representative incoming-lot screening case<\/h3>\n<p>The following row is present in the published dataset and is evaluated with the final exported Python model. Binary values retain the dataset&#8217;s own acceptable\/not-acceptable convention.<\/p>\n<div class=\"ndb-case-grid\"><table><thead><tr><th>Input<\/th><th>Value<\/th><\/tr><\/thead><tbody>\n<tr><td>pH<\/td><td>6.6<\/td><\/tr><tr><td>Temperature<\/td><td>37 \u00b0C<\/td><\/tr><tr><td>Taste flag<\/td><td>1 \u2014 acceptable<\/td><\/tr><tr><td>Odor flag<\/td><td>0 \u2014 not acceptable<\/td><\/tr><tr><td>Fat flag<\/td><td>1 \u2014 acceptable<\/td><\/tr><tr><td>Turbidity flag<\/td><td>0 \u2014 not acceptable<\/td><\/tr><tr><td>Colour<\/td><td>255<\/td><\/tr>\n<\/tbody><\/table><table><thead><tr><th>Model output<\/th><th>Probability<\/th><\/tr><\/thead><tbody>\n<tr><td>High quality<\/td><td>97.04%<\/td><\/tr><tr><td>Medium quality<\/td><td>2.96%<\/td><\/tr><tr><td>Low quality<\/td><td>&lt;0.01%<\/td><\/tr>\n<\/tbody><\/table><\/div>\n<p><strong>Result:<\/strong> the model suggests <code>high_quality<\/code> with 97.04% probability. However, the two non-acceptable binary flags show why a professional implementation should preserve the raw measurements and apply documented business rules: this output can prioritize review, but it should not release the lot without the required confirmatory checks.<\/p><\/div>\n<h3>Integrate the exported model<\/h3>\n<p>The deployment package contains the exact Neural Designer Python export and a README with the input order and example call. The returned probability order is <code>high_quality<\/code>, <code>low_quality<\/code>, <code>medium_quality<\/code>.<\/p>\n<div class=\"ndb-code-sample\"><code>from model import NeuralNetwork<br><br>model = NeuralNetwork()<br>probabilities = model.calculate_outputs([6.6, 37, 1, 0, 1, 0, 255])<\/code><\/div>\n<div class=\"ndb-downloads\"><a href=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2026\/08\/milk-quality-python-model-2026.zip\">Download Python model (ZIP)<\/a><a href=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/10\/milkquality.csv\">Download milkquality.csv<\/a><\/div>\n<div class=\"ndb-note ndb-note--warning\"><strong>Deployment boundary.<\/strong> Add schema validation, batch-level traceability, probability monitoring, drift detection and a low-confidence\/manual-review policy. The classifier is not a microbiological test, certified analyser or regulatory release function.<\/div><\/section>\n\n<section id=\"8-limitations\" class=\"ndb-card\"><h2>8. Scope and limitations<\/h2><ul>\n<li>The 1,059 records collapse to only 83 unique input combinations, so random row validation is vulnerable to duplicate leakage.<\/li>\n<li>The dataset does not identify farms, suppliers, plants, production batches, collection dates, instruments or operators; transfer across these groups is untested.<\/li>\n<li>Taste, odor, fat and turbidity are already encoded as \u201cacceptable\u201d or \u201cnot acceptable\u201d, which can make the model partly reproduce prior human or rule-based judgement rather than infer quality from raw sensor measurements.<\/li>\n<li>Colour is provided on a 240\u2013255 dataset scale without an instrument definition or calibration procedure.<\/li>\n<li>Inputs inside their individual ranges can still form combinations that were never represented among the 83 unique vectors.<\/li>\n<li>The target is a broad three-level quality label. Microbiological hazards, contaminants, adulteration, allergens and shelf-life behaviour are outside the model.<\/li>\n<li>Production use requires an independent, batch-grouped validation set, calibrated instruments, documented sampling procedures and periodic monitoring for class, data and concept drift.<\/li>\n<li>Final release, rejection and food-safety decisions must remain within the plant&#8217;s validated quality system and applicable laboratory or regulatory procedures.<\/li><\/ul><\/section>\n\n<section id=\"references\" class=\"ndb-card\"><h2>References<\/h2><ul><li>Kaggle. <a href=\"https:\/\/www.kaggle.com\/datasets\/cpluzshrijayan\/milkquality?resource=download\" target=\"_blank\" rel=\"noopener\">Milk Quality Prediction dataset<\/a>.<\/li><li><a href=\"https:\/\/www.neuraldesigner.com\/learning\/tutorials\/testing-analysis\/\">Neural Designer testing analysis<\/a>: confusion matrices and classification metrics.<\/li><li><a href=\"https:\/\/www.neuraldesigner.com\/learning\/tutorials\/model-deployment\/\">Neural Designer model deployment<\/a>: output calculation and Python export.<\/li><\/ul><\/section>\n<\/div><\/div>","protected":false},"author":24,"featured_media":4720,"template":"","categories":[],"tags":[49,43],"class_list":["post-3404","blog","type-blog","status-publish","has-post-thumbnail","hentry","tag-food","tag-industry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Inspect milk quality using machine learning<\/title>\n<meta name=\"description\" content=\"Build a machine learning model to inspect milk quality into three groups by seven observable milk variables.\" \/>\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.neuraldesigner.com\/blog\/milk-quality\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Inspect milk quality using machine learning\" \/>\n<meta property=\"og:description\" content=\"Build a machine learning model to inspect milk quality into three groups by seven observable milk variables.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/\" \/>\n<meta property=\"og:site_name\" content=\"Neural Designer\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-05T12:58:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/06\/portada_leche.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@NeuralDesigner\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/\",\"url\":\"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/\",\"name\":\"Inspect milk quality using machine learning\",\"isPartOf\":{\"@id\":\"https:\/\/www.neuraldesigner.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/06\/portada_leche.png\",\"datePublished\":\"2026-04-15T02:50:42+00:00\",\"dateModified\":\"2026-08-05T12:58:40+00:00\",\"description\":\"Build a machine learning model to inspect milk quality into three groups by seven observable milk variables.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/#primaryimage\",\"url\":\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/06\/portada_leche.png\",\"contentUrl\":\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/06\/portada_leche.png\",\"width\":1200,\"height\":628,\"caption\":\"Milk quality\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.neuraldesigner.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\/\/www.neuraldesigner.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Inspect milk quality using machine learning\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.neuraldesigner.com\/#website\",\"url\":\"https:\/\/www.neuraldesigner.com\/\",\"name\":\"Neural Designer\",\"description\":\"Explanable AI Platform\",\"publisher\":{\"@id\":\"https:\/\/www.neuraldesigner.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.neuraldesigner.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.neuraldesigner.com\/#organization\",\"name\":\"Neural Designer\",\"url\":\"https:\/\/www.neuraldesigner.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.neuraldesigner.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/05\/logo-neural-1.png\",\"contentUrl\":\"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/05\/logo-neural-1.png\",\"width\":1024,\"height\":223,\"caption\":\"Neural Designer\"},\"image\":{\"@id\":\"https:\/\/www.neuraldesigner.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/NeuralDesigner\",\"https:\/\/es.linkedin.com\/showcase\/neuraldesigner\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Inspect milk quality using machine learning","description":"Build a machine learning model to inspect milk quality into three groups by seven observable milk variables.","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.neuraldesigner.com\/blog\/milk-quality\/","og_locale":"en_US","og_type":"article","og_title":"Inspect milk quality using machine learning","og_description":"Build a machine learning model to inspect milk quality into three groups by seven observable milk variables.","og_url":"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/","og_site_name":"Neural Designer","article_modified_time":"2026-08-05T12:58:40+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/06\/portada_leche.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@NeuralDesigner","twitter_misc":{"Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/","url":"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/","name":"Inspect milk quality using machine learning","isPartOf":{"@id":"https:\/\/www.neuraldesigner.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/#primaryimage"},"image":{"@id":"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/#primaryimage"},"thumbnailUrl":"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/06\/portada_leche.png","datePublished":"2026-04-15T02:50:42+00:00","dateModified":"2026-08-05T12:58:40+00:00","description":"Build a machine learning model to inspect milk quality into three groups by seven observable milk variables.","breadcrumb":{"@id":"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/#primaryimage","url":"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/06\/portada_leche.png","contentUrl":"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/06\/portada_leche.png","width":1200,"height":628,"caption":"Milk quality"},{"@type":"BreadcrumbList","@id":"https:\/\/www.neuraldesigner.com\/blog\/milk-quality\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.neuraldesigner.com\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.neuraldesigner.com\/blog\/"},{"@type":"ListItem","position":3,"name":"Inspect milk quality using machine learning"}]},{"@type":"WebSite","@id":"https:\/\/www.neuraldesigner.com\/#website","url":"https:\/\/www.neuraldesigner.com\/","name":"Neural Designer","description":"Explanable AI Platform","publisher":{"@id":"https:\/\/www.neuraldesigner.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.neuraldesigner.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.neuraldesigner.com\/#organization","name":"Neural Designer","url":"https:\/\/www.neuraldesigner.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.neuraldesigner.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/05\/logo-neural-1.png","contentUrl":"https:\/\/www.neuraldesigner.com\/wp-content\/uploads\/2023\/05\/logo-neural-1.png","width":1024,"height":223,"caption":"Neural Designer"},"image":{"@id":"https:\/\/www.neuraldesigner.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/NeuralDesigner","https:\/\/es.linkedin.com\/showcase\/neuraldesigner\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.neuraldesigner.com\/api\/wp\/v2\/blog\/3404","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.neuraldesigner.com\/api\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.neuraldesigner.com\/api\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.neuraldesigner.com\/api\/wp\/v2\/users\/24"}],"version-history":[{"count":9,"href":"https:\/\/www.neuraldesigner.com\/api\/wp\/v2\/blog\/3404\/revisions"}],"predecessor-version":[{"id":23073,"href":"https:\/\/www.neuraldesigner.com\/api\/wp\/v2\/blog\/3404\/revisions\/23073"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.neuraldesigner.com\/api\/wp\/v2\/media\/4720"}],"wp:attachment":[{"href":"https:\/\/www.neuraldesigner.com\/api\/wp\/v2\/media?parent=3404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.neuraldesigner.com\/api\/wp\/v2\/categories?post=3404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.neuraldesigner.com\/api\/wp\/v2\/tags?post=3404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}