Saved locally. It will merge when you sign in.
| Task type | The 2026-27 cycle qualifier: AI Fundamentals Challenge followed by Applied Problem Solving. |
|---|---|
| Dataset | Supplied with the Round 2 Colab notebook. |
| I/O format | Round 1 answers on the exam platform; Round 2 submits a trained model and code. |
| Metric | Round 1 marked out of 100. Round 2 judged on performance metrics and code quality. |
| Limits | 90 minutes per round, Python, Google Colab for Round 2. |
The National Qualifier for the 2026-27 cycle is on 22 November 2026, with registration open from 1 June to 5 November 2026. The format follows 2025: two 90-minute rounds on the same day.
Any student enrolled full time in a secondary school in Grades 9-12 may sit the qualifier, from any country. Only students enrolled full time at a Canadian secondary school may advance to the National Training Camp and represent Canada.
That distinction is worth reading carefully. International students can take the paper and earn the honour-roll certificates; the Team Canada pathway is Canadian-only.
The top 30 participants are invited to the National Training Camp.
The syllabus is the ten IAIO domains: data preparation; supervised learning; unsupervised learning; reinforcement learning; AI search; logical reasoning; model evaluation; constraint satisfaction; kernel methods and SVM; and recommender systems.
Note how much of that is not deep learning. Search, logic and constraint satisfaction alone are three of the ten domains, and they are the material most entrants have never studied. They are also entirely hand-workable, which makes them the most reliable marks on the paper for anyone who prepares.
Three problems in the shape of the applied round. None needs a dataset; each rehearses a decision you will have to make inside the ninety minutes.
You fit HistGradientBoostingClassifier(early_stopping=True, validation_fraction=0.15) on a training set of 2,000 rows. How many rows does the estimator set aside to decide when to stop?
validation_fraction=0.15 holds out 15% of the rows passed to fit: 0.15 × 2,000 = 300. Those rows are not trained on, so if your own validation split is small, remember the model is seeing even less of the data than you think.
A dataset has 1,000 rows and 10% of them are positive. You use StratifiedKFold(n_splits=5). How many positive rows are in each validation fold?
Stuck? There are 2 hints for this problem.
Hints cost no marks, but the real paper has none. Try first.
Each validation fold has 1,000 / 5 = 200 rows, and stratification keeps 10% of them positive: 20. Plain KFold on the same data could leave a fold with a handful of positives, which is why stratified is the default for classification.
Write the first complete pipeline you would fit on a tabular dataset with numeric and categorical columns, a possibly imbalanced binary target, and ninety minutes on the clock. It must impute, encode, fit, and be saveable with joblib.
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder
import joblib
pre = ColumnTransformer([
("num", SimpleImputer(strategy="median", add_indicator=True), num_cols),
("cat", Pipeline([
("imp", SimpleImputer(strategy="most_frequent")),
("oh", OneHotEncoder(handle_unknown="ignore")),
]), cat_cols),
])
model = Pipeline([
("pre", pre),
("clf", HistGradientBoostingClassifier(
max_iter=300, learning_rate=0.08,
early_stopping=True, validation_fraction=0.15, random_state=0,
)),
])
model.fit(X_train, y_train)
joblib.dump(model, "model.joblib")
No scaler, because the boosted trees do not need one. handle_unknown="ignore" so a test-only category cannot break prediction. A fixed random_state so the marker can reproduce it. Fit this, save it, then start improving.