"We should stop training radiologists now. It’s just completely obvious that within five years, deep learning is going to do better than radiologists." (Hinton, 2016)
"We should stop training radiologists now. It’s just completely obvious that within five years, deep learning is going to do better than radiologists." (Hinton, 2016)
The freshest wave of the narrative is Agentic AI: autonomous agents, tool use, and orchestration. The pattern matches earlier hype: bold claims, compressed timelines, a rush to product, and ignoring previous communities like the Multi-Agent Systems (MAS) one.
The same structure is taking shape around quantum computing: early narratives mix real progress with expectations to capture investment.
"It seems to me what is called for is an exquisite balance between two conflicting needs: the most skeptical scrutiny of all hypotheses that are served up to us and at the same time a great openness to new ideas. Obviously those two modes of thought are in some tension. But if you are able to exercise only one of these modes, whichever one it is, you're in deep trouble. (The Burden of Skepticism, Sagan, 1987)
Big tech companies have a direct economic interest in sustaining the narrative. They create value bubbles by investing in each other, inflating expectations and market valuations.
The hype cycle is not only an intellectual phenomenon, it is also an economic one.
| Learning Model | Accuracy |
|---|---|
| Model v1 | 88% |
| Model v2 | 90% |
| Model v3 | 98% |
| Learning Model | Accuracy |
|---|---|
| Model v1 | 88% |
| Model v2 | 90% |
| Model v3 | 98% |
| Learning Model | Accuracy |
|---|---|
| Model v1 | 88% |
| Model v2 | 90% |
| Model v3 | 98% |
Does Model v3 satisfy users' requirements?
| Learning Model | Accuracy |
|---|---|
| Model v1 | 88% |
| Model v2 | 90% |
| Model v3 | 98% |
Does Model v3 satisfy users' requirements?
For example:
Threat to AI applications and promises
"Grok referenced the debunked conspiracy theory of “white genocide” in South Africa in reply to unrelated prompts, such as questions about baseball or humorous requests to talk like a pirate. " (May, 2025)
"ChatGPT suggested a dangerous route to tourists hiking in the mountains in Poland and resulted in the hikers having to be rescued." (January, 2025)
"Steve Talley, a financial adviser in Denver, Colorado, was wrongfully arrested twice for bank robberies he did not commit, based on flawed facial recognition technology and questionable identification procedures." (September, 2014)
Learn more at the AIAAIC Repository
The systems engineering approach is better equipped than the ML community to facilitate the adoption of this technology by prioritising the problems and their context before any other aspects.
We start with access: getting the data in front of us before we judge it or model it.
Does the data even exist?
Primary Data Collection
No, it does not exist!
Primary Data Collection
Secondary Data Collection
Yes, it does exist!
Secondary Data Collection
Crash Map Kampala
The dataset creation is a critical process that cannot be skipped. We can assume datasets exist, but they will likely enable toy projects not relevant for our society
Accessing data via APIs
import requests
url = "<url_of_the_dataset>"
response = requests.get(url, timeout=60)
response.raise_for_status()
The USGS earthquake catalog
base = "https://earthquake.usgs.gov/fdsnws/event/1/query"
parameters = {
"format": "csv",
"starttime": "2024-01-01",
"endtime": "2025-01-01",
"minmagnitude": "4.5",
}
query = "&".join(f"{k}={v}" for k, v in parameters.items())
url = f"{base}?{query}"
With the data in hand we move to assess: deciding whether it is fit for the question.
After collecting the data (i.e., data access), we need to perform a data assessment process to understand the data, identify and mitigate data quality issues, uncover patterns, and gain insights.
Four families of methods sit inside this stage: cleaning, preprocessing, augmentation, and feature engineering.
Process of detecting and correcting (or removing) corrupt or inaccurate records.
Missing Values
Missing data points in the dataset
Missing Values
A missing value is not always empty. It can also be a placeholder that looks like data.
features = ['Pclass', 'SibSp', 'Parch', 'Fare']
known = titanic.dropna(subset=['Age'])
imputer = LinearRegression()
imputer.fit(known[features], known['Age'])
unknown = titanic['Age'].isnull()
titanic.loc[unknown, 'Age'] = imputer.predict(
titanic[unknown][features]
)
Outliers
Data points that significantly deviate from the rest of the data: measurement errors, data entry mistakes, system malfunctions, or rare but valid observations
def cap_outliers(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
df[column + '_capped'] = df[column].clip(
lower=lower, upper=upper
)
return df
Process of transforming raw data into a format suitable for machine learning while ensuring data quality and consistency.
Feature Scaling
Transforming numerical features to a common scale
Standardisation (Z-score) centres data around 0 with unit variance
Min-Max scaling maps data to a fixed range [0,1]
scaler = StandardScaler()
cols = [col + '_st' for col in num_feat]
data[cols] = scaler.fit_transform(data[num_feat])
scaler = MinMaxScaler()
cols = [col + '_minmax' for col in num_feat]
data[cols] = scaler.fit_transform(data[num_feat])
Process of increasing the size and diversity of our datasets.
More diversity makes models more robust
More size improves generalisation
SMOTE interpolates between a point and its k-nearest neighbours
def numerical_smote(data, k=5):
aug_data = []
for i in range(len(data)):
uniq = np.unique(data[data != data[i]])
dists = np.abs(uniq - data[i])
k_neigs = uniq[np.argsort(dists)[:k]]
for neig in k_neigs:
step = np.random.random() * (neig - data[i])
aug_data.append(data[i] + step)
return np.array(aug_data)
Process of creating, transforming, and selecting features in our data, combining domain knowledge and creativity.
Creating new features can capture important patterns or relations in the data
data['AgeGroup'] = pd.cut(
data['Age'],
bins=[0, 12, 18, 35, 60],
labels=['Child',
'Teenager',
'Young Adult',
'Adult'],
)
Selecting the most important features reduces dimensionality, prevents overfitting, improves interpretability, and reduces training time
corr_matrix = data.corr()
sns.heatmap(corr_matrix, annot=True, center=0)
plt.show()
Decision trees rank features by information gain
PCA turns correlated features into uncorrelated components that capture most of the variance
Every method above answers the same question: is the data fit for a purpose?
Data quality is multi-dimensional
Poor data quality can lead to:
For a post-earthquake review, ask of each row:
The answer depends on the decision, not on the table alone. The same rows can be fit for one question and unfit for another.
Only now do we reach address: using the data we trust to answer the question we started from.
After assessing the data (i.e., data assess), we need to use the data to address the problem in question. This process includes implementing a Machine Learning algorithm that creates a Machine Learning model.
A Machine Learning algorithm is a set of instructions that are used to train a machine learning model. It defines how the model learns from data and makes predictions or decisions. Linear regression, decision trees, and neural networks are examples of machine learning algorithms.
A Machine Learning model is a program that is trained on a dataset and used to make predictions or decisions. The goal is to create a trained model that can generalise well to new, unseen data.
A Machine Learning algorithm uses the training process that goes from a specific set of observations to a general rule (i.e., induction). This process adjusts the model internal parameters to minimise prediction errors. In a linear regression model, the algorithm adjusts the slope and the intercept.
In classification problems, the prediction is one of a finite set of values (e.g., safe / unsafe). In regression problems, the model's output is a number.
Prediction errors are quantified by a loss function that tells the algorithm how far the prediction is from the target. Mean Squared Error is the common choice for regression.
Our address step today
from sklearn.linear_model import LinearRegression
usable = catalog[["gap", "horizontalError"]].dropna()
X = usable[["gap"]].to_numpy()
y = usable["horizontalError"].to_numpy()
model = LinearRegression().fit(X, y)
_script: true
This script will only execute in HTML slides
_script: true