Skip to content

Instantly share code, notes, and snippets.

@bmmalone
Created August 15, 2018 08:39
Show Gist options
  • Save bmmalone/db368c73e1c8c915f3d9f11056aba26e to your computer and use it in GitHub Desktop.
Save bmmalone/db368c73e1c8c915f3d9f11056aba26e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%load_ext autoreload\n",
"%autoreload 2\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import joblib\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"import sklearn.datasets\n",
"import sklearn.linear_model\n",
"import sklearn.metrics\n",
"import sklearn.model_selection\n",
"import sklearn.pipeline\n",
"import sklearn.preprocessing\n",
"\n",
"# extras\n",
"\n",
"# progress bar\n",
"import tqdm\n",
"\n",
"# make things look a little nicer\n",
"import seaborn as sns; sns.set(style='white', color_codes=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Load the data"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((506, 13), (506,))"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X, y = sklearn.datasets.load_boston(return_X_y=True)\n",
"\n",
"X.shape, y.shape"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[6.3200e-03, 1.8000e+01, 2.3100e+00, 0.0000e+00, 5.3800e-01,\n",
" 6.5750e+00, 6.5200e+01, 4.0900e+00, 1.0000e+00, 2.9600e+02,\n",
" 1.5300e+01, 3.9690e+02, 4.9800e+00],\n",
" [2.7310e-02, 0.0000e+00, 7.0700e+00, 0.0000e+00, 4.6900e-01,\n",
" 6.4210e+00, 7.8900e+01, 4.9671e+00, 2.0000e+00, 2.4200e+02,\n",
" 1.7800e+01, 3.9690e+02, 9.1400e+00],\n",
" [2.7290e-02, 0.0000e+00, 7.0700e+00, 0.0000e+00, 4.6900e-01,\n",
" 7.1850e+00, 6.1100e+01, 4.9671e+00, 2.0000e+00, 2.4200e+02,\n",
" 1.7800e+01, 3.9283e+02, 4.0300e+00],\n",
" [3.2370e-02, 0.0000e+00, 2.1800e+00, 0.0000e+00, 4.5800e-01,\n",
" 6.9980e+00, 4.5800e+01, 6.0622e+00, 3.0000e+00, 2.2200e+02,\n",
" 1.8700e+01, 3.9463e+02, 2.9400e+00],\n",
" [6.9050e-02, 0.0000e+00, 2.1800e+00, 0.0000e+00, 4.5800e-01,\n",
" 7.1470e+00, 5.4200e+01, 6.0622e+00, 3.0000e+00, 2.2200e+02,\n",
" 1.8700e+01, 3.9690e+02, 5.3300e+00]])"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X[:5]"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([24. , 21.6, 34.7, 33.4, 36.2])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y[:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create a helper to return our pipeline.\n",
"\n",
"We will use the same type of pipeline for all folds."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def _keep_columns(X, columns_to_keep):\n",
" return X[:,columns_to_keep]\n",
"\n",
"def get_pipeline(columns_to_keep):\n",
" \n",
" column_selector = sklearn.preprocessing.FunctionTransformer(\n",
" _keep_columns, kw_args={'columns_to_keep':columns_to_keep}\n",
" )\n",
" \n",
" pipeline = sklearn.pipeline.Pipeline([\n",
" ('column_selector', column_selector),\n",
" ('scaler', sklearn.preprocessing.RobustScaler()),\n",
" ('estimator', sklearn.linear_model.BayesianRidge())\n",
" ])\n",
" \n",
" return pipeline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Split the data into 10-folds using cross-validation, train, and make predictions\n",
"\n",
"We will not use a validation set to optimize hyperparameters. We could further split the training set if we desired to create a validation set.\n",
"\n",
"For classification, we should use stratified cross-validation, but the sklearn implementation of stratified cross-validation does not work."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"num_folds = 10"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def get_fname(fold):\n",
" fname = \"model-and-predictions.fold-{}.jpkl\".format(fold)\n",
" return fname\n",
"\n",
"def train_fold(X_train, X_test, y_train, y_test, fold):\n",
" \n",
" # we could read this from a file or something\n",
" columns_to_keep = np.array([1,3,5,7,9,11])\n",
" \n",
" p = get_pipeline(columns_to_keep)\n",
" p.fit(X_train, y_train)\n",
" y_pred = p.predict(X_test)\n",
" \n",
" # we could also compute summary statistics here, but I will just\n",
" # save the results so we can do this later.\n",
" fname = get_fname(fold)\n",
" \n",
" # we could also extract other things and save it here. For example,\n",
" # if column 0 in X contains some identity index, we could exclude it\n",
" # using the `columns_to_keep` but still save it in the joblib pickle\n",
" # file here\n",
" \n",
" # right now, save the trained model, the predictions, and the true values\n",
" joblib.dump((p, y_pred, y_test), fname)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 10/10 [00:00<00:00, 130.27it/s]\n"
]
}
],
"source": [
"# sequentially train models for each fold\n",
"kf = sklearn.model_selection.KFold(n_splits=num_folds, random_state=8675309)\n",
"for fold, (train, test) in tqdm.tqdm(enumerate(kf.split(X)), total=num_folds):\n",
" X_train, X_test = X[train], X[test]\n",
" y_train, y_test = y[train], y[test]\n",
" \n",
" train_fold(X_train, X_test, y_train, y_test, fold)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Evaluate the results\n",
"\n",
"In particular, we want to look at the predictions for all instances in the dataset. However, we only want to look at a particualr instance when it was in the testing set.\n",
"\n",
"We saved the predictions and true values in the pickle files, so we can just read them back in.\n",
"\n",
"In principle, we could also inspect other things, such as the properties of the learned models."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 10/10 [00:00<00:00, 321.83it/s]\n"
]
}
],
"source": [
"# first, collect all of the predictions\n",
"all_y_pred = []\n",
"all_y_true = []\n",
"\n",
"for fold in tqdm.trange(num_folds):\n",
" fname = get_fname(fold)\n",
" (p, y_pred, y_test) = joblib.load(fname)\n",
" \n",
" all_y_pred.extend(y_pred)\n",
" all_y_true.extend(y_test)\n",
" \n",
"all_y_pred = np.array(all_y_pred)\n",
"all_y_true = np.array(all_y_true)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"6.414604257746351"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# now, calcualte RMSE\n",
"\n",
"# importantly, the lists include predictions for *each* sample,\n",
"# but only when that sample was in the test set\n",
"np.sqrt(sklearn.metrics.mean_squared_error(all_y_true, all_y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# we can plot predicted vs. actual\n",
"\n",
"fig, ax = plt.subplots()\n",
"\n",
"ax.scatter(all_y_pred, all_y_true, color='b', alpha=0.4)\n",
"\n",
"ax.set_xlabel(\"Predicted\", fontsize=20)\n",
"ax.set_ylabel(\"True\", fontsize=20)\n",
"\n",
"# i just looked at the data to pick these\n",
"min_ = 0\n",
"max_ = 55\n",
"\n",
"ax.plot((min_, max_), (min_, max_), ls='--', c='0.5')\n",
"\n",
"ax.set_xlim(min_, max_)\n",
"ax.set_ylim(min_, max_)\n",
"\n",
"ax.set_aspect('equal')\n",
"sns.despine()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "automl",
"language": "python",
"name": "automl"
},
"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.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment