Machine Learning in Engineering Science | NCKU + LAiMM | Fall 2026
Purpose: a fully worked, self-paced in-class practice with an optional extension. Weeks 11 and 18 are optional examination-readiness materials. These notebooks do not create weekly graded assignments.
Before running: choose a Python 3 kernel in Jupyter or a CPU runtime in Colab. Run every cell from top to bottom with Shift+Enter. Setup installs missing free packages. No API key or external dataset download is required.
Learning target: complete the calculation, inspect intermediate values, and explain why the protocol supports a limited claim.
Time: about 25-45 minutes including reading, prediction, execution, and explain-back.
Keep the seed fixed for the first run. Record actual outputs and package versions rather than copying a claimed performance number.
import sys, subprocess, importlib.util, platform, json, random, hashlib
from pathlib import Path
required = {"numpy": "numpy", "matplotlib": "matplotlib", "sklearn": "scikit-learn"}
missing = [package for module, package in required.items() if importlib.util.find_spec(module) is None]
if missing:
subprocess.check_call([sys.executable, "-m", "pip", "install", *missing])
import numpy as np
import matplotlib.pyplot as plt
SEED = 2026
random.seed(SEED)
np.random.seed(SEED)
rng = np.random.default_rng(SEED)
ARTIFACTS = Path("artifacts")
ARTIFACTS.mkdir(exist_ok=True)
print("Python:", platform.python_version(), "NumPy:", np.__version__, "Seed:", SEED)
Checkpoint. The environment cell must finish before any analysis cell. Restart and run all if a variable is missing.
Use six original teaching statements with stable IDs. Retrieval finds relevant text; it does not verify whether that text is true.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
docs={"S1":"LSTM uses input forget and output gates to update memory.",
"S2":"Causal attention masks future token positions before softmax.",
"S3":"A chronological split prevents training on later target times.",
"S4":"Precision divides true positives by predicted positives.",
"S5":"Recall divides true positives by actual positives.",
"S6":"A seed and data hash help reproduce an experiment."}
vectorizer=TfidfVectorizer().fit(list(docs.values()))
matrix=vectorizer.transform(list(docs.values()))
Checkpoint. Document IDs are provenance anchors, not evidence that an LLM has cited faithfully.
Define an abstention rule when every similarity is zero. TF-IDF is a lexical baseline and can miss paraphrases.
def retrieve(query):
scores=cosine_similarity(vectorizer.transform([query]),matrix)[0]
if scores.max()<=0: return {"status":"abstain","sources":[]}
order=scores.argsort()[::-1][:2]
return {"status":"retrieved","sources":[{"id":list(docs)[i],"text":list(docs.values())[i],"score":float(scores[i])} for i in order if scores[i]>0]}
answer=retrieve("How does causal attention hide future positions?")
print(json.dumps(answer,indent=2))
Checkpoint. The causal attention statement should rank highly. Similarity is not a confidence probability.
One unit test expects a source ID and another expects no answer. This example returns extracted evidence, not model-generated prose.
assert retrieve("causal attention future")["sources"][0]["id"]=="S2"
assert retrieve("zirconium spectroscopy")["status"]=="abstain"
summary={"retrieval":answer,"abstention":retrieve("zirconium spectroscopy"),"generator":"none; extractive teaching baseline"}
print(summary["abstention"])
Checkpoint. A production RAG system must additionally test corpus quality, generated claims, and citation entailment.
Export a JSON record with a seed, package version, and measured result. Download the artifacts directory before leaving Colab; runtime storage is temporary.
record={"week":13,"seed":SEED,"numpy":np.__version__,"python":platform.python_version(),"result":summary}
(ARTIFACTS/"week-13-evidence.json").write_text(json.dumps(record,indent=2))
print(json.dumps(record,indent=2))
Checkpoint. The evidence file must match the result you actually obtained. A saved screenshot alone does not permit rerunning the calculation.
1. Predict the effect of one change before editing code. Change one parameter, input, or boundary condition only.
2. Rerun all cells in a fresh kernel. Keep the original evidence record and compare the observed difference.
3. Explain the result using the mechanism, not just the final number.
4. Name one assumption that limits the claim, and a new test that could challenge it.
Troubleshooting: if installation fails, restore network access; if a variable is undefined, run earlier cells; if your output differs, compare package versions, seed, and data construction. Do not repeatedly edit code until a preferred score appears.
Completion criterion: one executed notebook, one evidence JSON, and a brief claim/evidence/limitation statement.