{
"cells": [
{
"cell_type": "markdown",
"id": "ols-cv-title",
"metadata": {},
"source": [
"# OLS cross-validation and model selection\n",
"\n",
"This notebook uses NumPy to build K-fold splits for ordinary least squares (OLS). We compare pre-specified variable combinations using out-of-sample mean squared error (MSE), then discuss two limits of cross-validation: target leakage and the optimistic bias that can arise when the same scores are used to select and report a model."
]
},
{
"cell_type": "markdown",
"id": "ols-cv-data-description",
"metadata": {},
"source": [
"## The data\n",
"\n",
"The `statecrime` dataset is bundled with `statsmodels` and contains 51 state-level observations. We predict `murder`, the murder rate per 100,000 people. The candidate predictors are socioeconomic and urbanization measures. The `white` column is not used here because it is not needed for the model-selection lesson.\n",
"\n",
"The `violent` column is kept for a later warning: the violent-crime rate includes murder by definition, so using it to predict `murder` leaks information from the target into the predictors."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "ols-cv-load-data",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T09:48:46.272783Z",
"iopub.status.busy": "2026-10-15T09:48:46.272586Z",
"iopub.status.idle": "2026-10-15T09:48:51.586530Z",
"shell.execute_reply": "2026-10-15T09:48:51.586018Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(51, 7)\n",
" murder poverty hs_grad single urban\n",
"state \n",
"Alabama 7.1 17.5 82.1 29.0 48.65\n",
"Alaska 3.2 9.0 91.4 25.5 44.46\n",
"Arizona 5.5 16.5 84.2 25.7 80.07\n",
"Arkansas 6.3 18.8 82.4 26.3 39.54\n",
"California 5.4 14.2 80.6 27.8 89.73\n"
]
}
],
"source": [
"from IPython.display import display\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"import statsmodels.api as sm\n",
"from statsmodels.datasets import statecrime\n",
"\n",
"data = statecrime.load_pandas().data.copy()\n",
"target = \"murder\"\n",
"predictors = [\"poverty\", \"hs_grad\", \"single\", \"urban\"]\n",
"\n",
"print(data.shape)\n",
"print(data[[target, *predictors]].head())"
]
},
{
"cell_type": "markdown",
"id": "ols-cv-folds-description",
"metadata": {},
"source": [
"## Create the folds with NumPy\n",
"\n",
"We use one fixed random permutation for every candidate model. Each observation appears in exactly one validation fold, and the same folds are reused across models so that their MSEs are directly comparable."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "ols-cv-create-folds",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T09:48:51.589487Z",
"iopub.status.busy": "2026-10-15T09:48:51.589130Z",
"iopub.status.idle": "2026-10-15T09:48:51.601500Z",
"shell.execute_reply": "2026-10-15T09:48:51.601021Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[11, 10, 10, 10, 10]\n"
]
}
],
"source": [
"n_splits = 5\n",
"rng = np.random.default_rng(20260919)\n",
"permuted_indices = rng.permutation(len(data))\n",
"folds = np.array_split(permuted_indices, n_splits)\n",
"\n",
"assert len(folds) == n_splits\n",
"assert np.array_equal(np.sort(np.concatenate(folds)), np.arange(len(data)))\n",
"assert all(len(np.intersect1d(folds[i], folds[j])) == 0 for i in range(n_splits) for j in range(i))\n",
"\n",
"print([len(fold) for fold in folds])"
]
},
{
"cell_type": "markdown",
"id": "ols-cv-helper-description",
"metadata": {},
"source": [
"## A small OLS cross-validation helper\n",
"\n",
"The helper below fits a fresh OLS model on each training fold, predicts only the held-out fold, and returns one MSE per fold. It does not use any information from a validation fold while fitting."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "ols-cv-helper",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T09:48:51.606623Z",
"iopub.status.busy": "2026-10-15T09:48:51.606416Z",
"iopub.status.idle": "2026-10-15T09:48:51.618735Z",
"shell.execute_reply": "2026-10-15T09:48:51.618013Z"
}
},
"outputs": [],
"source": [
"def design_matrix(frame, variable_names):\n",
" if not variable_names:\n",
" return np.ones((len(frame), 1))\n",
" return sm.add_constant(frame[variable_names], has_constant=\"add\")\n",
"\n",
"\n",
"def cross_validate_ols(frame, target_name, variable_names, fold_indices):\n",
" y = frame[target_name].to_numpy(dtype=float)\n",
" fold_mse = []\n",
" all_indices = np.arange(len(frame))\n",
"\n",
" for validation_indices in fold_indices:\n",
" training_indices = np.setdiff1d(all_indices, validation_indices, assume_unique=True)\n",
" x_train = design_matrix(frame.iloc[training_indices], variable_names)\n",
" x_validation = design_matrix(frame.iloc[validation_indices], variable_names)\n",
" fitted = sm.OLS(y[training_indices], x_train).fit()\n",
" predictions = fitted.predict(x_validation)\n",
" fold_mse.append(np.mean((y[validation_indices] - predictions) ** 2))\n",
"\n",
" return np.asarray(fold_mse)"
]
},
{
"cell_type": "markdown",
"id": "ols-cv-model-description",
"metadata": {},
"source": [
"## Compare pre-specified legal models\n",
"\n",
"These model specifications are chosen before looking at the cross-validation scores. The intercept-only model is a baseline; the other models represent progressively different variable groups rather than a search over every possible subset."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "ols-cv-models",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T09:48:51.620699Z",
"iopub.status.busy": "2026-10-15T09:48:51.620486Z",
"iopub.status.idle": "2026-10-15T09:48:51.760979Z",
"shell.execute_reply": "2026-10-15T09:48:51.759691Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
model
\n",
"
mean_mse
\n",
"
std_mse
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Intercept only
\n",
"
14.392368
\n",
"
20.851558
\n",
"
\n",
"
\n",
"
1
\n",
"
Socioeconomic
\n",
"
11.699279
\n",
"
17.558921
\n",
"
\n",
"
\n",
"
2
\n",
"
Household structure
\n",
"
5.024984
\n",
"
5.058611
\n",
"
\n",
"
\n",
"
3
\n",
"
Full legal model
\n",
"
4.795125
\n",
"
5.707941
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" model mean_mse std_mse\n",
"0 Intercept only 14.392368 20.851558\n",
"1 Socioeconomic 11.699279 17.558921\n",
"2 Household structure 5.024984 5.058611\n",
"3 Full legal model 4.795125 5.707941"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model_specs = {\n",
" \"Intercept only\": [],\n",
" \"Socioeconomic\": [\"poverty\", \"hs_grad\"],\n",
" \"Household structure\": [\"single\"],\n",
" \"Full legal model\": predictors,\n",
"}\n",
"\n",
"fold_records = []\n",
"for model_name, variable_names in model_specs.items():\n",
" fold_mse = cross_validate_ols(data, target, variable_names, folds)\n",
" for fold_number, mse in enumerate(fold_mse, start=1):\n",
" fold_records.append({\"model\": model_name, \"fold\": fold_number, \"mse\": mse})\n",
"\n",
"fold_scores = pd.DataFrame(fold_records)\n",
"summary = (\n",
" fold_scores.groupby(\"model\", sort=False)[\"mse\"]\n",
" .agg(mean_mse=\"mean\", std_mse=\"std\")\n",
" .reset_index()\n",
")\n",
"display(summary)"
]
},
{
"cell_type": "markdown",
"id": "ols-cv-interpretation",
"metadata": {},
"source": [
"The smallest mean CV MSE among the legal candidates is a useful selection criterion. The standard deviation shows how much the estimate changes across the five validation folds."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "ols-cv-plot",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T09:48:51.763748Z",
"iopub.status.busy": "2026-10-15T09:48:51.762922Z",
"iopub.status.idle": "2026-10-15T09:48:52.324834Z",
"shell.execute_reply": "2026-10-15T09:48:52.323028Z"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxIAAAG4CAYAAADR3NFqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAfB1JREFUeJzt3XlYVOXbB/DvDAzDDoIoIAjuIrhi7mZumallrrngnmVaLq3mlmVZatriWqZluZaae1qaueWeuwiKOyIiwrAzzNzvH7ycXyOgjMoMy/dzXXPBec5zztxnYODc82wqEREQERERERGZQW3tAIiIiIiIqPhhIkFERERERGZjIkFERERERGZjIkFERERERGZjIkFERERERGZjIkFERERERGZjIkFERERERGZjIkFERERERGZjIkFERERERGZjIkFEJUKLFi3wzDPPWO35Fy1ahGrVqkGj0cDd3d2sY82J/eWXX0ZgYKDZ8ZVUeb12ReH1tPbvIxGRJTCRIKIib9q0aVCpVHk++vfvb+3wcOTIEbz22mt45513kJaWhoSEBGuHBAAQEaxevRrt2rWDp6cntFotAgICMGTIEISHh+eq37lzZ9jb2z/wnFlZWfjuu+/QuHFjeHp6wt3dHQ0bNsRHH32E6OjowrqUIqlhw4Zo166dtcMgIrIaJhJEVGz8+++/EBGTx88//wwA2LdvH3bv3m2VuPbs2QMA6NOnD2xtba0Sw/0MBgP69u2LgQMHon379jh16hR0Oh1+++03xMXFoX79+li3bp3Z5w0LC8Prr7+Ofv364ezZs7h58yYmTZqEZcuWYciQIYVwJeaz5u9CUYqBiKiwMZEgInpMcXFxAAAHBwcrR/I/n3zyCVatWoUff/wR7733HipUqACtVov69evjt99+Q5s2bdC/f39EREQU+JxRUVFYtWoVhg4dijfffBPe3t5wcnLCiy++iOPHj6NVq1aFeEVERFTUMJEgohLh/j7pL730EsqVKwe9Xp+r7oABA+Du7o60tDSlbOvWrXjmmWfg6uoKBwcHNG3aFL///vtDn9fW1hafffYZAECj0UClUuH9999X9i9atAh169aFvb093N3d0blzZ/z7778PPa/RaMSnn36KgIAAODg4oHnz5jh27NhDjwOA1NRUzJo1C40bN0bv3r1z7Ver1Zg1axbS0tIwY8aMAp0TAOLj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p044deoUfHx8Cv9CiKwsKytLGY8HAKdPn8b8+fNx8OBBjBw5Ej169MC7776LP//8E1u2bAEA9O/fHxcuXMCRI0eU45ycnNC1a1f89NNPAAAXFxesX78e0dHR+Pfff3H58mV0797dshdHZEFBQUGoUKECqlWrhueeew42NjYm+/v374/169cjJSVFKWvevDkqVaqkjINwcXFB165dsWzZMqVOWFgYVq1ahaysLMtcCBU9j5qBPPvss9K+fXtle/jw4SbbRKXZW2+9JSqVSkJDQ6V27dri6OgoAMTR0VHee+89EfnfYnG//PKLctyVK1fE1tZW9u3bZ63Qiazu+PHj8uyzz4q9vb34+voq/bS/+eYbadWqlVy8eFGmTJkilStXllq1asn06dNNWuny+pQ0p/tSYmKiRa+FqKiYNGmSeHp6KitJ79y5UwYNGiR//fWXJCUliZOTU67xDO+8845Ur15d2d66datoNBq5c+eOiGSP13vjjTc4TX8p9siJxE8//SRqtVpu3rwpIiI3b97kuAei/2c0GuXXX3+VDz/8UObMmSObN2+WAwcOyDvvvCMAZOvWrSIiMnLkSLG3t5eJEyfK7NmzpXLlyrn6dxOVdP/tZnH58mVxc3OTuXPnKgtX5dykLF68WGxtbaV8+fIyevRoOXbsWJ7nW7hwoXh5eZksfJWVlcUugVSqRURECADp3r27+Pn5SYMGDWTOnDlKUtCvX79ck4J89dVXAkAOHTokItnvo8DAQOV/GJFK5D9z4JkhJSUFs2fPxogRI1C2bNkn2EZCVLJ5eXlh2LBhmD59OkQEP/30EzZv3gwnJyf06NHDZCplopIuKioKTZo0wfHjx+Hn54dly5bhs88+w7lz53LVvXTpEqpVq4ZVq1ahV69eJvvmzZuHl156Cb6+vrh37x5CQ0OxZcsWBAUFWepSiIq8Jk2a4O7du9iwYQNq1aplsm/37t1o06YNjh49igYNGiA1NRWtW7fGrVu38OKLL+Kbb74BkD017P1do6j0euREgojMFx4ejpCQEKxevZp9sqlUunz5Mnx8fGBvbw8AEBFUrlwZr776Kt5//31EREQgODgYw4YNg5eXF27evIn09HS0bdsWQ4YMQe/evbFnzx5s2bIFDRo0QEpKCj7//HPs2LEDf/75J5ydna18hURF1/z58zF27FjExMTkuRZKt27dsGfPHrRv3x579+7F8OHD0blzZ5QtWzbXeg9EAPBIg62J6OGMRiPCw8MRGxuLw4cP49NPP0XLli0xbtw4JhFUKqWlpSEkJAS//fabUqZSqdC3b19lIHT16tWxfft22NnZISMjAyEhIahUqRJeeeUV7Ny5E9999x0aNWqE0NBQ+Pv7w8vLC9HR0di6dSuTCKKH6N27N0QEa9asyXP/mjVrMGfOHDRu3Bjbtm3D5MmT0aBBAyYRlC+2SBAVopdffhnnzp2Do6MjGjZsiKFDh6J+/frWDouo0IkIYmJiULZsWWg0GqW8T58+0Ol0yixLQHZLXVBQEI4dO4YGDRrkeb5atWph5MiRGDlyJADg+vXriImJQbVq1eDu7l6o10JUknTt2hVxcXHYt2+ftUOhEoAtEkSFaNWqVTh16hQOHjyIuXPnMomgEuP69euYOnWqyZTGORYtWgQfHx9UrFgRZcuWxVdffaXs69+/P3bs2IHY2FilrGbNmggNDVVaJQAgOjoaIoJr167hgw8+gE6nM2nJ8/f3x1NPPcUkgshMYWFh2L9/P6KioqwdCpUATCSIiMhst2/fxocffog///zTpHz+/Pn49NNP8fvvvyMtLQ3Tp0/HuHHjlCShQ4cO8PDwwKpVq0yOa9asGVauXKkkJqNHj0b58uXRsmVL3L17FwcPHoS3t7dlLo6oBOvSpQs++eQTuLi4WDsUKgHYtYmIiPKVlpaGP//8E126dMm1Lzg4GPXr11cWrAKyWwreffddvPHGG0rZq6++iu3bt+Py5ctQqVQYM2YMdu3ahZMnT0KlUgEA2rdvjz///BNbt25Fx44dC//CiIjosbFFgoiI8rV371688MILOHXqVK59YWFhWL9+PZKTk5WyuLg4uLm5mdR77bXXcPXqVZw8eRIAMHbsWFy4cAFjxozB7t27MXToUDg5OWHMmDFcIZeIqBhhIkFERPlq164dfH19sWzZMpNyg8GAcuXKITU1FWvXrlXKg4KCsH//fpO6ISEhAIAbN24AAAICArB+/Xrs2bMHb775Jry9vbFixQrMmTMnz5YPIiIqmti1iYiIHuidd97B8uXLcf36dZw+fRo//fQTVqxYgYCAACQlJcHHx0cZKzFr1ixMmTIFkZGR8PX1BQCcPXsWISEhOH/+PGrWrGnNSyEioieIiQQRET3Q6dOnUadOHQQEBECtVqN///4ICwtDtWrV8OOPP2LIkCG4evUq/Pz8kJaWhoYNG0KlUmHWrFkwGAz44IMPULdu3VytGkREVLwxkSAiooeqV68efHx8sHXrVmWANAAkJSXB29sbkydPxnvvvQcAiI2NxXvvvYc9e/agXLlyCAsLw2uvvQa1mr1piYhKEiYSRET0UF988QUmT56M27dv51pBum/fvjh16hTOnDljpeiIiMga+PEQERE9VN++fZGRkWEysDpHWFgYoqKicPXqVStERkRE1sIWCSIiKpAOHTrAaDTijz/+MCk3GAxITU3lAldERKUMWySIiKhABgwYgF27diEmJsak3MbGhkkEEVEpxBYJIiIqkNTUVJw/fx6hoaHWDoWIiIoAJhJERERERGQ2dm0iIiIiIiKzMZEgIiIiIiKzMZEgIiIiIiKzMZEgIiIiIiKzMZEgIiIiIiKzMZEgIiIiIiKzMZEgIiIiIiKzMZEgIiIiIiKzMZEgIiIiIiKzMZEgIiIiIiKzMZEgIiIiIiKzMZEgIiIiIiKz/R8owOnvLcO3mwAAAABJRU5ErkJggg==",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(figsize=(8, 4.5))\n",
"for position, model_name in enumerate(model_specs):\n",
" values = fold_scores.loc[fold_scores[\"model\"] == model_name, \"mse\"].to_numpy()\n",
" ax.scatter(np.full(len(values), position), values, alpha=0.75, label=\"fold MSE\" if position == 0 else None)\n",
" ax.scatter(position, values.mean(), marker=\"D\", color=\"black\", zorder=3, label=\"mean MSE\" if position == 0 else None)\n",
"ax.set_xticks(range(len(model_specs)), model_specs, rotation=20, ha=\"right\")\n",
"ax.set_ylabel(\"Validation MSE\")\n",
"ax.set_title(\"Five-fold OLS validation scores\")\n",
"ax.legend()\n",
"fig.tight_layout()"
]
},
{
"cell_type": "markdown",
"id": "ols-cv-leakage-description",
"metadata": {},
"source": [
"## A target-leakage warning\n",
"\n",
"Now we intentionally fit an invalid model that adds `violent`. The dataset defines violent crime as a rate that includes murder, so this predictor contains information from the target. The code still performs the folds correctly; the problem is the data definition, not the splitting algorithm."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "ols-cv-leaky-model",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T09:48:52.330388Z",
"iopub.status.busy": "2026-10-15T09:48:52.329568Z",
"iopub.status.idle": "2026-10-15T09:48:52.396489Z",
"shell.execute_reply": "2026-10-15T09:48:52.396013Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
model
\n",
"
mean_mse
\n",
"
std_mse
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Intercept only
\n",
"
14.392368
\n",
"
20.851558
\n",
"
\n",
"
\n",
"
1
\n",
"
Socioeconomic
\n",
"
11.699279
\n",
"
17.558921
\n",
"
\n",
"
\n",
"
2
\n",
"
Household structure
\n",
"
5.024984
\n",
"
5.058611
\n",
"
\n",
"
\n",
"
3
\n",
"
Full legal model
\n",
"
4.795125
\n",
"
5.707941
\n",
"
\n",
"
\n",
"
4
\n",
"
Invalid: includes violent
\n",
"
4.240788
\n",
"
4.993137
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" model mean_mse std_mse\n",
"0 Intercept only 14.392368 20.851558\n",
"1 Socioeconomic 11.699279 17.558921\n",
"2 Household structure 5.024984 5.058611\n",
"3 Full legal model 4.795125 5.707941\n",
"4 Invalid: includes violent 4.240788 4.993137"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"leaky_variables = [*predictors, \"violent\"]\n",
"leaky_mse = cross_validate_ols(data, target, leaky_variables, folds)\n",
"leaky_summary = pd.DataFrame(\n",
" {\n",
" \"model\": [\"Invalid: includes violent\"],\n",
" \"mean_mse\": [leaky_mse.mean()],\n",
" \"std_mse\": [leaky_mse.std(ddof=1)],\n",
" }\n",
")\n",
"pd.concat([summary, leaky_summary], ignore_index=True)"
]
},
{
"cell_type": "markdown",
"id": "ols-cv-leakage-interpretation",
"metadata": {},
"source": [
"The invalid model may look attractive because `violent` is closely related to `murder`. That does not make it a valid forecasting model: at prediction time, a variable that already includes the outcome would not be available without using the outcome itself. Cross-validation cannot detect this kind of target leakage automatically."
]
},
{
"cell_type": "markdown",
"id": "ols-cv-selection-bias",
"metadata": {},
"source": [
"## Model selection is not final evaluation\n",
"\n",
"The legal model with the smallest mean CV MSE is selected using the same scores that were just inspected. This is appropriate for choosing a candidate, but the minimum score is no longer an untouched estimate of future performance: among several candidates, random fold noise tends to favor the one that happened to look best.\n",
"\n",
"For a final performance claim, reserve an independent test set or use nested cross-validation. This notebook focuses on the selection step, so it does not present the selected CV score as an unbiased final estimate."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "ols-cv-selection",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T09:48:52.399076Z",
"iopub.status.busy": "2026-10-15T09:48:52.398830Z",
"iopub.status.idle": "2026-10-15T09:48:52.406113Z",
"shell.execute_reply": "2026-10-15T09:48:52.405598Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Selected legal candidate by mean CV MSE: Full legal model\n"
]
}
],
"source": [
"selected_model = summary.loc[summary[\"mean_mse\"].idxmin(), \"model\"]\n",
"print(f\"Selected legal candidate by mean CV MSE: {selected_model}\")"
]
},
{
"cell_type": "markdown",
"id": "ols-cv-takeaways",
"metadata": {},
"source": [
"## Takeaways\n",
"\n",
"- Keep the validation fold separate from model fitting.\n",
"- Reuse the same folds when comparing candidate models.\n",
"- Check how every predictor is defined; cross-validation does not prevent target leakage.\n",
"- Treat the best score used for selection as optimistic until it is checked with an independent test set or nested cross-validation."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.14.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}