<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fried Engineers</title>
    <description>The latest articles on DEV Community by Fried Engineers (@friedengineers).</description>
    <link>https://dev.to/friedengineers</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4134177%2F2909f957-a3b2-4fce-b0f2-9a1c0a7180bf.png</url>
      <title>DEV Community: Fried Engineers</title>
      <link>https://dev.to/friedengineers</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/friedengineers"/>
    <language>en</language>
    <item>
      <title>How to Scope an AI Engineering Project That Can Actually Be Finished</title>
      <dc:creator>Fried Engineers</dc:creator>
      <pubDate>Sun, 20 Sep 2026 14:23:11 +0000</pubDate>
      <link>https://dev.to/friedengineers/how-to-scope-an-ai-engineering-project-that-can-actually-be-finished-5cbl</link>
      <guid>https://dev.to/friedengineers/how-to-scope-an-ai-engineering-project-that-can-actually-be-finished-5cbl</guid>
      <description>&lt;p&gt;A lot of AI project ideas sound impressive but are difficult to finish. The problem is usually not the model. It is the scope.&lt;/p&gt;

&lt;p&gt;A strong student project has a clear input, a measurable output, a realistic dataset, and one main technical question. This tutorial shows a practical way to turn a broad idea into a project that can be implemented, tested, and explained.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start with a decision, not a technology
&lt;/h2&gt;

&lt;p&gt;"Build an AI system with deep learning" is not a project objective. It names a technology but does not say what the system should decide.&lt;/p&gt;

&lt;p&gt;Use this format:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Given &lt;strong&gt;input X&lt;/strong&gt;, predict or classify &lt;strong&gt;output Y&lt;/strong&gt; so that &lt;strong&gt;user Z&lt;/strong&gt; can take &lt;strong&gt;action A&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Given vibration and temperature readings from a small motor, predict whether the motor is operating normally or showing an early fault so a lab technician can schedule an inspection.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This statement immediately defines the input, output, user, and practical value.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Choose one primary task
&lt;/h2&gt;

&lt;p&gt;Most unfinished projects try to solve several tasks at once. Pick one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classification: normal vs. faulty equipment&lt;/li&gt;
&lt;li&gt;Regression: remaining useful life in hours&lt;/li&gt;
&lt;li&gt;Anomaly detection: unusual sensor behaviour&lt;/li&gt;
&lt;li&gt;Forecasting: next-day energy demand&lt;/li&gt;
&lt;li&gt;Computer vision: identify a surface defect&lt;/li&gt;
&lt;li&gt;NLP: classify maintenance notes by issue type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Extra features can become stretch goals. They should not be required for the first working version.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Audit the data before choosing the model
&lt;/h2&gt;

&lt;p&gt;Before writing training code, answer these questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Where will the data come from?&lt;/li&gt;
&lt;li&gt;Does each record have the fields needed for the target?&lt;/li&gt;
&lt;li&gt;Are labels available and trustworthy?&lt;/li&gt;
&lt;li&gt;How many examples exist for every class?&lt;/li&gt;
&lt;li&gt;Can the data be used legally and ethically?&lt;/li&gt;
&lt;li&gt;Is the dataset small enough to process with available hardware?&lt;/li&gt;
&lt;li&gt;Could records from the same machine, person, or time period leak into both training and testing sets?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Data leakage is especially common in engineering datasets. A random row split may give the model nearly identical readings from the same machine in both sets. A group-based or time-based split is often more realistic.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Build a baseline first
&lt;/h2&gt;

&lt;p&gt;Do not begin with the most complex neural network.&lt;/p&gt;

&lt;p&gt;For a sensor classification project, useful baselines may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A rule based on an engineering threshold&lt;/li&gt;
&lt;li&gt;Logistic regression&lt;/li&gt;
&lt;li&gt;A decision tree&lt;/li&gt;
&lt;li&gt;Random forest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The baseline gives you something to compare against. If a complex model improves accuracy by only 0.5% but needs ten times more computation, the simpler model may be the better engineering solution.&lt;/p&gt;

&lt;p&gt;A minimal baseline in Python could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sklearn.ensemble&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RandomForestClassifier&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sklearn.metrics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;classification_report&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sklearn.model_selection&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GroupShuffleSplit&lt;/span&gt;

&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rms_vibration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;current&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fault_label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;groups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;machine_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;splitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GroupShuffleSplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_splits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;train_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;splitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RandomForestClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;n_estimators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;class_weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;balanced&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;train_idx&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;train_idx&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;predictions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;test_idx&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;classification_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;test_idx&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important choice is not the number of trees. It is the group-aware split, because it tests the model on machines it did not see during training.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Select a metric that matches the failure cost
&lt;/h2&gt;

&lt;p&gt;Accuracy is not always enough.&lt;/p&gt;

&lt;p&gt;Imagine that only 5% of motor readings represent a fault. A model that predicts "normal" every time reaches 95% accuracy but detects no faults.&lt;/p&gt;

&lt;p&gt;Choose metrics based on the project risk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precision matters when false alarms are costly.&lt;/li&gt;
&lt;li&gt;Recall matters when missing a real fault is dangerous.&lt;/li&gt;
&lt;li&gt;F1 score is useful when both error types matter.&lt;/li&gt;
&lt;li&gt;Mean absolute error works well for understandable regression error.&lt;/li&gt;
&lt;li&gt;A confusion matrix shows which classes the model mixes up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write the success condition before training. For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The first version should achieve at least 80% recall for the fault class while keeping precision above 70% on machines excluded from training.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now the evaluation has a clear meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Define the minimum viable demonstration
&lt;/h2&gt;

&lt;p&gt;A finished AI engineering project needs more than a notebook. The minimum demonstration should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A documented dataset and data dictionary&lt;/li&gt;
&lt;li&gt;Reproducible preprocessing&lt;/li&gt;
&lt;li&gt;A baseline model&lt;/li&gt;
&lt;li&gt;A final model&lt;/li&gt;
&lt;li&gt;An evaluation report&lt;/li&gt;
&lt;li&gt;One working input-to-output demo&lt;/li&gt;
&lt;li&gt;Limitations and failure cases&lt;/li&gt;
&lt;li&gt;A README with setup and run steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The demo can be a small Streamlit interface, a FastAPI endpoint, or a script that accepts a CSV file. Choose the lightest interface that proves the system works.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Plan milestones around evidence
&lt;/h2&gt;

&lt;p&gt;A realistic eight-week plan might be:&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1: Problem and data feasibility
&lt;/h3&gt;

&lt;p&gt;Write the decision statement, identify users, confirm data access, and define the target variable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 2: Data audit
&lt;/h3&gt;

&lt;p&gt;Check missing values, label balance, sampling frequency, leakage risks, and ethical constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 3: Baseline
&lt;/h3&gt;

&lt;p&gt;Create the split strategy, train a simple model, and save initial metrics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Weeks 4–5: Improvement
&lt;/h3&gt;

&lt;p&gt;Engineer features, test one or two model families, and track experiments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 6: Evaluation
&lt;/h3&gt;

&lt;p&gt;Run the final test, inspect errors, and document limitations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 7: Demonstration
&lt;/h3&gt;

&lt;p&gt;Connect preprocessing and inference to a minimal interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 8: Documentation
&lt;/h3&gt;

&lt;p&gt;Finish the README, architecture diagram, results table, setup guide, and presentation.&lt;/p&gt;

&lt;p&gt;Each milestone should produce evidence. "Worked on model" is vague. "Compared random forest and gradient boosting on a held-out machine group" is verifiable.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Control the scope with a cut list
&lt;/h2&gt;

&lt;p&gt;Before development, create three lists:&lt;/p&gt;

&lt;h3&gt;
  
  
  Must have
&lt;/h3&gt;

&lt;p&gt;The smallest system that proves the main objective.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should have
&lt;/h3&gt;

&lt;p&gt;Useful improvements that can be added after the baseline works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Could have
&lt;/h3&gt;

&lt;p&gt;Dashboard polish, mobile deployment, real-time streaming, multiple models, cloud infrastructure, or extra sensors.&lt;/p&gt;

&lt;p&gt;When time becomes limited, remove items from "Could have" first. Do not weaken the core evaluation.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Document limitations honestly
&lt;/h2&gt;

&lt;p&gt;A credible project explains where it may fail.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The dataset contains only laboratory conditions.&lt;/li&gt;
&lt;li&gt;Some fault classes have few examples.&lt;/li&gt;
&lt;li&gt;Sensor calibration differs between machines.&lt;/li&gt;
&lt;li&gt;The model has not been tested in real-time operation.&lt;/li&gt;
&lt;li&gt;The output supports inspection and does not replace a qualified engineer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Limitations do not make a project weak. They show that the developer understands the boundary between a prototype and a production system.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical project-scoping checklist
&lt;/h2&gt;

&lt;p&gt;Before committing to an idea, verify that you can answer "yes" to most of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the user and decision clear?&lt;/li&gt;
&lt;li&gt;Can the main task be described in one sentence?&lt;/li&gt;
&lt;li&gt;Is a legitimate dataset available?&lt;/li&gt;
&lt;li&gt;Is there a suitable baseline?&lt;/li&gt;
&lt;li&gt;Is the evaluation split realistic?&lt;/li&gt;
&lt;li&gt;Does the chosen metric reflect the cost of errors?&lt;/li&gt;
&lt;li&gt;Can a working demo be built with available time and hardware?&lt;/li&gt;
&lt;li&gt;Can another person reproduce the result?&lt;/li&gt;
&lt;li&gt;Are limitations documented?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a wider set of starting points across computer science and engineering, explore these &lt;a href="https://friedengineers.com/resource_category/artificial-intelligence-machine-learning-computer-science-engineering-b-tech-project-ideas/" rel="noopener noreferrer"&gt;AI and machine learning project ideas&lt;/a&gt; and then apply the scoping method above to reduce one idea to a testable first version.&lt;/p&gt;

&lt;p&gt;A smaller project with trustworthy evaluation is more valuable than a large project that never reaches a reproducible result.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>python</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
