When we closed module 3 we left a promise hanging: instead of programming the algorithm that solves the problem ourselves, we would hand the system historical data and let it learn the rule on its own. This lesson keeps that promise and opens module 4. We will see exactly what "learning from data" means (using Tom Mitchell's classic definition), fix the vocabulary we will use throughout the module (dataset, feature, label, model, parameters, loss, generalisation...), draw the complete workflow of a machine learning project as a map of the lessons to come, and discuss when ML is worth using and when a fixed rule is better. We will finish by training the first "real" model of the course with scikit-learn: a NovaMarket returns predictor that we will compare with Diego's manual rule ("risk if the amount exceeds €300") and with the threshold we learned by hand in 01-02. This matters because everything that follows (types of learning, data preparation, algorithms, evaluation, neural networks) rests on the ideas and vocabulary of this lesson.
Contents
- What learning from data means: Mitchell's definition
- From
learn_thresholdto machine learning: nothing new under the sun - Essential vocabulary
- The workflow of an ML project: map of the module
- When to use ML and when not to
- Python example: NovaMarket's data and the first model with scikit-learn
- Common Mistakes and Tips
- Exercises
- Conclusion
- What learning from data means: Mitchell's definition
In 01-02 we saw that a traditional program receives data + rules and produces results, whereas machine learning receives data + results and produces rules (a model). That picture is useful, but we need an operational definition, one that tells us when a program "has learned". The most widely quoted is Tom Mitchell's (1997):
A program learns from experience E with respect to a task T and a performance measure P if its performance on T, as measured by P, improves with E.
Applied to NovaMarket's use case 3 (predicting whether an order will be returned):
| Element | General meaning | At NovaMarket |
|---|---|---|
| Task T | What the system has to do | Given an order that has just been placed, say whether it will be returned (yes/no) |
| Experience E | The data it learns from | The history in orders.csv: past orders with their features and whether they were eventually returned |
| Performance P | How we measure whether it does the job well | Percentage of correct answers on orders the system has not seen (and, later on, better measures that we will meet in 04-05) |
The definition has two practical consequences worth internalising from day one:
- No performance measure, no learning. "The model seems to work" means nothing; P has to be defined before you start. It is the same demand as the performance measure of the rational agent in 02-01.
- The improvement must be measured on new data. A system that memorises the history and gets 100 % of the orders it has already seen right has learned nothing useful: what matters is what it does with tomorrow's order. We will call that ability generalisation, and it will be the thread running through 04-05 and 04-06.
Notice that Mitchell says nothing about "intelligence", nor about how learning happens. It is a functional definition: if performance improves with experience, there is learning. This fits the "acting rationally" view we adopted in 01-02.
- From
learn_threshold to machine learning: nothing new under the sun
learn_threshold to machine learning: nothing new under the sunYou already did machine learning in 01-02 without calling it that. Remember the function learn_threshold(data): it walked through the 13 historical orders, tried each amount as a candidate threshold for the rule amount > threshold, counted the hits of each one and kept the best (€120, which got 11 of 13 right, against 7 of 13 for Diego's rule). In Mitchell's terms:
- T: decide whether an order is at risk of being returned.
- E: the 13 orders with their actual outcome.
- P: number of hits.
And in module 3 terms, learn_threshold was an exhaustive search (03-01) over a space of 13 candidates with an objective function (the hits) to be maximised (03-04). That is exactly what any machine learning algorithm does, with three differences of degree:
- The family of candidate rules is far richer than "one threshold on one column": combinations of many columns, trees of questions, weighted sums, networks of neurons.
- The search space is so large (often infinite) that it cannot be walked in full; the strategies of 03-04 are used, such as climbing along the gradient, instead of brute force.
- The performance measure is computed on held-out data the algorithm has not seen, to measure generalisation rather than memory.
That is why we closed 03-04 with the sentence "learning is optimising": training a model means searching, in an enormous space of possible models, for the one that minimises an error function on the training data, and trusting that this model will also work on new data. The whole of module 4 is the grown-up version of learn_threshold.
- Essential vocabulary
These are the terms that will appear in every lesson of the module. The examples are taken from the returns predictor we will build in section 6.
| Term | What it is | In the returns predictor |
|---|---|---|
| Dataset | Table with the examples that are learned from | The 3,000 orders of one NovaMarket day |
| Instance / example / sample | One row of the dataset | A specific order |
| Feature (attribute, input variable) | A column that describes the instance and that the model can use | amount, num_items, delivery_days, new_customer, category |
| Label / target (output variable) | What we want to predict | returned (1 = it was returned, 0 = it was not) |
| Model | The rule (function) that goes from the features to the label | "If amount > €195 and new customer → returned", or a weighted sum of columns |
| Parameters | The internal numbers of the model that the algorithm fits from the data | The €195 threshold, the weights of each column |
| Hyperparameters | The algorithm's settings that a person fixes before training | Maximum depth of the tree, number of neighbours, regularisation strength |
| Training (fitting, fit) | The process of searching for the parameters that best explain the data | model.fit(X_train, y_train) |
| Inference / prediction | Using the trained model on new instances | model.predict(tomorrows_order) |
| Loss function (cost, error) | The number that training tries to minimise: it measures how wrong the model is on the training data | Number of misclassified orders; in logistic regression, the "log loss" |
| Generalisation | The model working well on data it has not seen | Getting tomorrow's orders right, not just yesterday's |
Two clarifications that head off frequent confusions:
- Parameters versus hyperparameters. In
learn_threshold, the threshold was the parameter (the data chose it); had we decided "we will only try thresholds that are multiples of 10", that would have been a hyperparameter (we chose it). Parameters are learned; hyperparameters are tuned by trying and validating (04-06). - Loss versus performance measure. The loss is what the algorithm minimises internally during training; the performance measure (P) is what we care about in the end (hits, euros saved). Sometimes they coincide and sometimes they do not: a mathematically convenient loss is minimised and the business metric is used for evaluation (04-05).
One last notational convention you will see across the literature and in scikit-learn: the table of features is called X (upper case, because it is a matrix of rows × columns) and the vector of labels is called y (lower case, because it is a single column).
- The workflow of an ML project: map of the module
Training the model is only one step, and not even the longest, of a machine learning project. The complete workflow looks a lot like the agent cycle of 02-01, but applied to building the model:
flowchart LR
A[1. Define the problem<br/>T, E, P] --> B[2. Obtain the data]
B --> C[3. Prepare data and<br/>features]
C --> D[4. Train the model]
D --> E[5. Evaluate and validate]
E -->|not good enough| C
E -->|not good enough| D
E -->|good enough| F[6. Deploy]
F --> G[7. Monitor]
G -->|the data change| B
Each step has its lesson in this module or elsewhere in the course:
| Step | What is done | Where it is covered in depth |
|---|---|---|
| 1. Define the problem | Translate the business need into T, E, P; decide whether it is classification, regression, clustering... | This lesson and 04-02 (types of learning) |
| 2. Obtain the data | Locate the sources, join them, check volume, quality, bias and legal aspects | 02-03 (already covered) |
| 3. Prepare data and features | Clean, encode, scale, create new variables, avoid data leakage | 04-03 |
| 4. Train the model | Choose an algorithm and fit it to the data | 04-04 (classical algorithms), module 5 (neural networks) |
| 5. Evaluate and validate | Measure performance on unseen data with the right metrics; compare with a baseline | 04-05 |
| 5 bis. Tune | Detect overfitting, regularise, tune hyperparameters, retrain | 04-06 |
| 6. Deploy | Integrate the model into the system (the website, the order manager), with human review where appropriate | 08-01 and 09-04 |
| 7. Monitor | Watch that performance does not degrade when the data change (new products, new season) | 08-01 |
Two remarks about the diagram:
- It is a cycle, not a line. You almost never get it right first time: evaluation reveals that features are missing, that there is data leakage or that the model overfits, and you go back. Marta must plan for iterations.
- Training is the small part. In a real project, step 3 takes most of the time, and step 7 is the one most often forgotten and the most expensive to forget. Lesson 08-01 walks through this same workflow as a complete project, with roles, deliverables and decisions.
- When to use ML and when not to
Diego, quite reasonably, asks why NovaMarket needs a model when it already has a rule that "works". Machine learning is not always the answer; sometimes a fixed rule (or an SQL query) is better. These are the signals:
| Situation | Fixed rules (traditional programming) | Machine learning |
|---|---|---|
| The rule is known, simple and stable | Yes. "If the order weighs more than 30 kg, it goes by carrier" needs no learning | Adds nothing and introduces uncertainty |
| The rule is hard to write but there are plenty of examples | Hundreds of fragile ifs |
Yes: spotting fraud, classifying a review, forecasting demand |
| The patterns change over time | The rule has to be rewritten every time | Yes: it is retrained with new data |
| Many variables interact | Unmanageable by hand | Yes: the model combines dozens of columns |
| There is little data, or poor-quality data | Yes, backed by expert knowledge (module 6) | High risk: it will learn noise |
| An exact explanation of every decision is required (legal, contractual) | Yes, or ML with interpretable models and human review (02-04) | Depends on the model: a tree can be explained; a deep network, far less so |
| The cost of a mistake is catastrophic | Verifiable rules, or ML only as support | Only with very rigorous validation and a human in the loop |
Applied to the nine NovaMarket use cases we catalogued in 01-03: returns prediction (3), demand forecasting (2), recommendation (1) and review classification (4) are clear ML candidates (many examples, patterns that are hard to write, changing over time). Routes (5) and assignment (6) we solved in module 3 with optimisation, without learning anything. The returns and warranty rules (8) are, precisely, fixed rules: they are handled with logic and expert systems (module 6). Choosing the tool well is the first decision of step 1 of the workflow.
A practical golden rule: always start from the simplest possible rule as a baseline (Diego's, for example) and demand that the model beat it measurably. We will do exactly that right now.
- Python example: NovaMarket's data and the first model with scikit-learn
As in the rest of the course, we do not have the real orders.csv, so we will generate fictional orders with code. What matters is that the generating function is reproducible (same seed, same data) and that it encodes a realistic but noisy relationship, as happens in reality: expensive orders, from new customers, with slow deliveries and in electronics are returned more often, but no rule is right every time. We will reuse this function in every lesson of the module, so save it in a file novamarket_ml.py.
6.1 The generating function generate_orders_ml
import numpy as np
import pandas as pd
def generate_orders_ml(n=3000, seed=42):
"""Generates n fictional NovaMarket orders with the label 'returned' (1 = returned)."""
rng = np.random.default_rng(seed) # reproducible generator
amount = np.round(rng.gamma(shape=2.0, scale=60.0, size=n) + 5, 2) # euros, long tail
num_items = rng.integers(1, 6, size=n) # from 1 to 5 items
delivery_days = rng.integers(1, 8, size=n) # from 1 to 7 days
new_customer = rng.random(n) < 0.30 # 30 % are new customers
category = rng.choice(["electronics", "home", "computing", "accessories"],
size=n, p=[0.35, 0.30, 0.20, 0.15])
zone = rng.choice(["A", "B", "C"], size=n, p=[0.40, 0.35, 0.25])
# "Hidden truth": return probability that the model will have to discover
z = (-3.4
+ 0.010 * (amount - 100) # higher amount, higher risk
+ 1.6 * new_customer # new customers return more
+ 0.35 * (delivery_days - 4) # slow deliveries are returned more
+ 1.0 * (category == "electronics")
+ 0.5 * (category == "computing")
- 0.2 * (num_items - 2) # large orders, slightly less
+ 1.2 * new_customer * (amount - 100) / 100) # new + expensive: extra risk
prob = 1 / (1 + np.exp(-z)) # sigmoid: from z to probability
returned = (rng.random(n) < prob).astype(int) # draw with that probability (noise)
return pd.DataFrame({
"amount": amount,
"num_items": num_items,
"delivery_days": delivery_days,
"new_customer": new_customer.astype(int),
"category": category,
"postcode_zone": zone, # does NOT influence the return
"returned": returned,
})
orders = generate_orders_ml(3000, 42)
print(orders.head())
print(orders["returned"].value_counts(normalize=True).round(3))Output:
amount num_items delivery_days new_customer category postcode_zone returned 0 130.51 4 4 1 home B 0 1 175.12 5 7 0 computing B 0 2 115.23 2 2 1 electronics A 0 3 103.70 3 2 1 home C 0 4 189.76 3 6 0 accessories A 0 returned 0 0.836 1 0.164
Line-by-line explanation:
np.random.default_rng(seed)creates a random number generator with a fixed seed: every time you call the function with the same seed you will get exactly the same orders. This is essential for your results and those in this lesson to match (barring small differences between NumPy versions).- Each column is generated with a sensible distribution: amounts follow a gamma distribution (many small orders and a tail of expensive ones, mean around €125), items and delivery days are uniform integers, 30 % of customers are new, and category and zone are drawn with fixed probabilities.
- The variable
zis the hidden truth: a risk score that combines the columns with weights we have chosen. In the real world that formula does not exist, or nobody knows it; here we write it so that we can check afterwards whether the model discovers it. Notice thatpostcode_zonedoes not appear inz: the zone does not influence the return. We do this on purpose, remembering the postcode bias of 02-04; in 04-03 we will check that a good model gives it practically zero importance. prob = 1 / (1 + np.exp(-z))converts the score into a probability between 0 and 1 (this function, the sigmoid, reappears in 04-04 with logistic regression and in module 5).returnedis decided by a random draw according to that probability. This introduces noise: two identical orders can end up one returned and the other not. No model, however good, will get 100 % right; it is worth knowing before chasing the impossible.- The result is a pandas
DataFrame(a table), with 16.4 % of orders returned. In 04-05 we will see that this imbalance (many more "no" than "yes") shapes how evaluation must be done.
6.2 The first model: fit, predict, score
We are going to train a decision tree with scikit-learn. We will not go into how it works internally (that is 04-04); for now we care about the usage pattern, which is identical for every model in the library. We will use only the numeric columns; the text ones (category, postcode_zone) need a prior transformation that we will see in 04-03.
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
columns = ["amount", "num_items", "delivery_days", "new_customer"]
X = orders[columns] # features (matrix of 3000 rows x 4 columns)
y = orders["returned"] # label (vector of 3000 values 0/1)
# 1) Hold out 25 % of the orders: the model will NOT see them during training
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42, stratify=y)
# 2) Choose the algorithm and its hyperparameters
model = DecisionTreeClassifier(max_depth=3, random_state=42)
# 3) Train: the algorithm searches for the parameters (the tree's questions)
model.fit(X_train, y_train)
# 4) Measure performance P: proportion of hits
print(f"Training accuracy: {model.score(X_train, y_train):.3f}")
print(f"Test accuracy: {model.score(X_test, y_test):.3f}")
# 5) Inference on new orders
new_orders = pd.DataFrame({"amount": [45.0, 350.0, 180.0],
"num_items": [2, 1, 3],
"delivery_days": [2, 6, 5],
"new_customer": [0, 1, 1]})
print(model.predict(new_orders)) # 0 = will not be returned, 1 = will
print(model.predict_proba(new_orders).round(2)) # probability of each classOutput:
Step by step:
train_test_splitshuffles the orders and splits them into training (2,250) and test (750).random_state=42fixes the shuffle so that it is reproducible;stratify=yguarantees that both parts have the same proportion of returns (16.4 %). The test set is the "future experience" with which we will measure generalisation; it is not touched until the end. The underlying reason is developed in 04-05.DecisionTreeClassifier(max_depth=3)creates the still-empty model.max_depth=3is a hyperparameter: at most three chained questions. We choose it; in 04-06 we will learn to choose it with data.model.fit(X_train, y_train)is the training: the search for the parameters (which column to ask about at each node and with what threshold) that best separate returned orders from non-returned ones. It is the sophisticated version oflearn_threshold, and in 04-04 we will see exactly what it optimises.model.score(X, y)computes the proportion of hits (accuracy). On training it gets 87.3 % right and on test 86.8 %: similar figures, a sign that the model generalises rather than memorises (in 04-06 we will see what happens when that is not the case).predictreturns the class (0 or 1) of each new order, andpredict_probathe estimated probability of each class. The €350 order from a new customer has a 95 % probability of being returned; the €180 one is almost at 50 %, a clear case for the human review band of 02-04.
This pattern (fit → predict/predict_proba → score) is the same for a logistic regression, a random forest or a support vector machine: the algorithm changes, the interface does not. It is one of the reasons for scikit-learn's success, which is presented as a tool in 07-03.
6.3 Comparison with Diego's rule and with the rule from 01-02
We evaluate the earlier rules on the same test set, to compare on equal terms:
def rule_accuracy(threshold):
prediction = (X_test["amount"] > threshold).astype(int) # 1 if above the threshold
return (prediction == y_test).mean() # proportion of hits
print(f"Diego's rule (> 300 €): {rule_accuracy(300):.3f}")
print(f"Rule learned in 01-02 (> 120 €): {rule_accuracy(120):.3f}")
print(f"'Never returned': {(y_test == 0).mean():.3f}")
print(f"Decision tree: {model.score(X_test, y_test):.3f}")
tree_pred = model.predict(X_test)
diego_pred = (X_test["amount"] > 300).astype(int)
for name, pred in [("tree", tree_pred), ("Diego", diego_pred)]:
detected = ((pred == 1) & (y_test == 1)).sum()
print(f"{name}: flags {pred.sum()} orders, {detected} of them actually returned "
f"(there are {y_test.sum()} returns in test)")Output:
Diego's rule (> 300 €): 0.843 Rule learned in 01-02 (> 120 €): 0.627 'Never returned': 0.836 Decision tree: 0.868 tree: flags 52 orders, 38 of them actually returned (there are 123 returns in test) Diego: flags 37 orders, 21 of them actually returned (there are 123 returns in test)
Reading the results:
- Diego's rule gets 84.3 % right... but the rule "no order is ever returned" gets 83.6 %. Since only 16 % of orders are returned, getting a lot right is easy: just always say no. Diego barely improves on that triviality. This accuracy trap with imbalanced classes is the starting point of 04-05; for now, hold on to the idea that the accuracy figure, on its own, misleads.
- The rule from 01-02 (threshold €120) does far worse here (62.7 %). It is not that that learning was wrong: it is that it was learned from 13 carefully chosen examples and does not generalise to a realistic history of 3,000 orders, in which most orders above €120 are not returned. It is the lesson of section 1: little data, unreliable model.
- The tree gets 86.8 % right, the best figure, and above all it does something qualitatively different: it combines the amount with whether the customer is new and with the delivery days. It flags 52 orders and is right on 38 (73 %), whereas Diego flags 37 and is right on 21 (57 %). It detects almost twice as many returns with fewer false alarms. Even so, 85 of the 123 returns slip past it: the improvement is real, but a lot of work remains, and that work is the rest of the module (more features in 04-03, better algorithms in 04-04, a threshold tuned to cost in 04-05, hyperparameters in 04-06).
Diego, sceptical, will ask the right question: "and what exactly has the tree learned?". You can see it with from sklearn.tree import export_text; print(export_text(model, feature_names=columns)). You will see rules of the kind "if amount > €195 and new customer → returned; if amount > €358 → returned". In other words, the tree has discovered that Diego was not far off (very expensive orders are indeed returned), but that for new customers the risk threshold drops to about €195. In 04-04 we will read trees in detail.
Common Mistakes and Tips
- Evaluating on the same data used for training. It is the number one mistake of beginners. A model that memorises gets 100 % of what it has already seen right and fails spectacularly on anything new. Always hold out a test set before training and do not look at it until the end.
- Confusing parameters with hyperparameters. Parameters are fitted by
fit; hyperparameters you fix when creating the model (max_depth=3). If you find yourself "trying values by hand" for something, it is a hyperparameter, and 04-06 will give you the method to do it properly. - Forgetting the baseline. Always compare with the dumbest reasonable rule ("never returned", "last week's average") and with the manual rule currently in force. A model that does not clearly beat them does not deserve to be deployed.
- Trusting the accuracy figure. With imbalanced classes, the 84 % of Diego's rule and the 83.6 % of "never" are almost the same thing. Wait until 04-05 before drawing strong conclusions from a single figure.
- Jumping straight to the algorithm. The workflow of section 4 starts by defining T, E and P and by getting to know the data. Marta will spend far more time preparing the data (04-03) than calling
fit. - Fixing the seed and forgetting about it.
random_state=42makes your experiments reproducible, but it does not mean the result is "the right one": try several seeds before claiming that one model is better than another. The outputs in this lesson may vary slightly depending on the version of NumPy or scikit-learn.
Exercises
Exercise 1. Formulate, using Mitchell's definition (T, E, P), two NovaMarket use cases other than returns: demand forecasting (case 2) and review classification (case 4). For each one, state what the features, the label and an instance would be.
Exercise 2. Change the tree's max_depth hyperparameter to 1 and retrain. Display the rules with export_text and compare the test accuracy with the "never returned" rule. What threshold has the single-question tree chosen? Why does a single threshold on amount fail to beat "never" on this dataset, when in 01-02 it did beat Diego?
Exercise 3. Generate a second dataset with another seed (generate_orders_ml(3000, 7)) and evaluate the already-trained tree on it (without calling fit again), as if it were the following week's orders. Does the accuracy hold up? What does that tell you about generalisation? Then repeat, evaluating Diego's rule on those same data.
Solutions
Solution 1.
- Demand forecasting. T: predict how many units of a product will be sold next week. E: the weekly sales history (
orders.csvaggregated by product and week), with calendar and promotions. P: mean error in units between forecast and actual sales (in 04-05 we will call it MAE). An instance is "product X, week Y"; the features, the week of the year, the sales of the previous weeks, whether there is a promotion; the label, the units sold that week (a number, not a category: it is a regression problem, 04-02). - Review classification. T: decide whether a review in
reviews.csvis positive, neutral or negative (or whether it mentions a shipping problem). E: past reviews labelled by hand. P: percentage of correctly classified reviews, or better, per-class measures (04-05). An instance is a review; the features, the text (turned into numbers, 04-03) and the star rating; the label, the assigned class.
Solution 2. With max_depth=1 the tree chooses the question amount <= 195.65 and in both branches predicts class 0, so its test accuracy is 0.836, identical to "never returned". Even above €195 most orders are not returned (the rate there is around 40 %), so if only one question can be asked and the aim is to maximise hits, the best thing is to always say "no". In 01-02 the history of 13 orders was balanced (almost half returned), and that is why a threshold did win. Moral: the same family of models behaves differently depending on the class proportions; and to detect returns you need to combine variables (depth 3 already manages it) and use better measures than accuracy (04-05).
Solution 3. With new_orders = generate_orders_ml(3000, 7) and model.score(new_orders[columns], new_orders["returned"]) you will get around 0.88, even slightly above the 0.868 on test: the model generalises to orders it has never seen because the new data follow the same "hidden truth". Diego's rule again stays close to 0.85 (and "never" around 0.84). If in reality the conditions changed (a campaign with many new customers, a new supplier with more defects), generalisation would no longer be guaranteed: that is why step 7 of the workflow, monitoring, exists.
Conclusion
In this lesson we have defined machine learning with Mitchell's formula (task, experience, performance), we have checked that learn_threshold from 01-02 already met that definition and that "learning is optimising" (03-04) is literally what fit does, we have fixed the module's vocabulary (dataset, instance, feature, label, model, parameters versus hyperparameters, training, inference, loss function, generalisation), we have drawn the complete workflow as a map of the lessons to come and we have discussed when ML pays off compared with a fixed rule. In the code we have created the function generate_orders_ml, which will accompany us throughout the module, and we have trained the first scikit-learn model with the fit/predict/score pattern, which beats Diego's rule by combining several columns, although it still lets many returns slip through and has taught us that the accuracy figure, on its own, misleads.
In the next lesson, Types of Machine Learning, we will classify the problems ML can solve: the returns predictor is an example of supervised classification; demand forecasting will be supervised regression; customer segmentation for the recommender will be unsupervised; and we will also look at reinforcement learning, which connects with the agents of 02-01 and with AlphaGo. Marta and Diego will thus have a map to decide, for each of the nine use cases, what type of learning they need.
Fundamentals of Artificial Intelligence (AI)
Module 1: Introduction to Artificial Intelligence
Module 2: Basic Principles of AI
- Fundamental Concepts: Agents, Environments and Rationality
- Types of Artificial Intelligence
- Data as the Raw Material of AI
- Ethics and Considerations in AI
Module 3: Algorithms in AI
- Introduction to Algorithms
- Search Algorithms
- Adversarial Search: Games and Minimax
- Optimization Algorithms
Module 4: Machine Learning
- Basic Concepts of Machine Learning
- Types of Machine Learning
- Data Preparation and Feature Engineering
- Machine Learning Algorithms
- Model Evaluation and Validation
- Overfitting, Regularization and Hyperparameter Tuning
Module 5: Neural Networks and Deep Learning
- Introduction to Neural Networks
- Neural Network Architecture
- How a Network Learns: Gradient Descent and Backpropagation
- Deep Learning and Its Applications
- Transformers, Large Language Models and Generative AI
Module 6: Logic and Expert Systems
- Logic in AI
- Expert Systems
- Reasoning under Uncertainty: Probability and Bayesian Networks
- Applications of Expert Systems
Module 7: Tools and Programming Languages in AI
- Programming Languages for AI
- Scientific Python: NumPy, pandas and Matplotlib
- Popular Tools and Libraries
- Development Environments
Module 8: Projects and Case Studies
Module 9: Exercises and Practice
- Algorithm Exercises
- Machine Learning Practice
- Neural Network Projects
- Capstone Project: from Idea to Prototype
