diff --git a/05_preprocessing_pipelines_and_hyperparameter_optimization.ipynb b/05_preprocessing_pipelines_and_hyperparameter_optimization.ipynb index a169eb0b9aa69b0fb8cec0df3e2d006976ba4f0d..e3a613722853b2718d25a3712cb4105e638ef87d 100644 --- a/05_preprocessing_pipelines_and_hyperparameter_optimization.ipynb +++ b/05_preprocessing_pipelines_and_hyperparameter_optimization.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 163, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -113,7 +113,7 @@ "<IPython.core.display.HTML object>" ] }, - "execution_count": 163, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -204,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 164, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -264,7 +264,7 @@ }, { "cell_type": "code", - "execution_count": 165, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -292,7 +292,7 @@ }, { "cell_type": "code", - "execution_count": 166, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -314,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 167, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -341,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 168, + "execution_count": 6, "metadata": { "scrolled": true }, @@ -469,7 +469,7 @@ }, { "cell_type": "code", - "execution_count": 169, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -486,12 +486,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Such a pipeline now \"behaves\" like a single classifier, as it implements `.fit` and `.predict`:" + "<div class=\"alert alert-block alert-warning\">\n", + "<p><i class=\"fa fa-info-circle\"></i>\n", + "A pipeline \"behaves\" like a single classifier - it implements <code>.fit()</code> and <code>.predict()</code> methods.</p>\n", + "</div>\n" ] }, { "cell_type": "code", - "execution_count": 170, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -517,7 +520,7 @@ }, { "cell_type": "code", - "execution_count": 171, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -566,7 +569,7 @@ }, { "cell_type": "code", - "execution_count": 172, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -624,7 +627,7 @@ }, { "cell_type": "code", - "execution_count": 173, + "execution_count": 11, "metadata": { "tags": [ "solution" @@ -665,7 +668,7 @@ }, { "cell_type": "code", - "execution_count": 174, + "execution_count": 12, "metadata": { "tags": [ "solution" @@ -725,7 +728,7 @@ }, { "cell_type": "code", - "execution_count": 175, + "execution_count": 13, "metadata": { "tags": [ "solution" @@ -767,7 +770,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "<Figure size 720x504 with 4 Axes>" ] @@ -884,7 +887,7 @@ }, { "cell_type": "code", - "execution_count": 176, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -931,7 +934,7 @@ }, { "cell_type": "code", - "execution_count": 177, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -953,7 +956,7 @@ }, { "cell_type": "code", - "execution_count": 178, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -975,7 +978,7 @@ }, { "cell_type": "code", - "execution_count": 179, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -1003,7 +1006,7 @@ }, { "cell_type": "code", - "execution_count": 180, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -1045,7 +1048,7 @@ }, { "cell_type": "code", - "execution_count": 181, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -1062,12 +1065,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We run now 30 iterations" + "We run now 30 iterations." ] }, { "cell_type": "code", - "execution_count": 182, + "execution_count": 20, "metadata": { "scrolled": true }, @@ -1076,8 +1079,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Best parameter (CV score=0.982):\n", - "{'logisticregression__C': 4.672288322013504, 'polynomialfeatures__degree': 3, 'standardscaler__with_mean': True, 'standardscaler__with_std': True}\n" + "Best parameter (CV score=0.978):\n", + "{'logisticregression__C': 3.219890406724053, 'polynomialfeatures__degree': 3, 'standardscaler__with_mean': True, 'standardscaler__with_std': False}\n" ] } ], @@ -1086,13 +1089,70 @@ "\n", "\n", "\n", - "search = RandomizedSearchCV(p, param_dist, cv=4, n_jobs=2, n_iter=30)\n", + "search = RandomizedSearchCV(p, param_dist, cv=4, n_jobs=2, n_iter=30,\n", + " random_state=42) # fix randomization for reproduciblity\n", "\n", "search.fit(features, labels)\n", "print(\"Best parameter (CV score=%0.3f):\" % search.best_score_)\n", "print(search.best_params_)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + "<p><i class=\"fa fa-info-circle\"></i>\n", + "Hyperparameter search methods also \"behave\" like a single classifier - they implement <code>.fit()</code> and <code>.predict()</code> methods (*).</p>\n", + "</div>\n", + "\n", + "(\\*) Predicition is done with the best parameters found. The underlying model or pipeline with the best parameters is available via `.best_estimator_` property. Importantly, the **refit** with the best parameters is done at the end of the CV-based search, **using a whole training data set**.\n", + "\n", + "The automatic refitting can be disabled by passing `refit=False` argument when specifying the search method. Then neither `.predict()`, nor `.best_estimator_` won't be available.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best estimator:\n", + "Pipeline(memory=None,\n", + " steps=[('polynomialfeatures',\n", + " PolynomialFeatures(degree=3, include_bias=True,\n", + " interaction_only=False, order='C')),\n", + " ('standardscaler',\n", + " StandardScaler(copy=True, with_mean=True, with_std=False)),\n", + " ('logisticregression',\n", + " LogisticRegression(C=3.219890406724053, class_weight=None,\n", + " dual=False, fit_intercept=True,\n", + " intercept_scaling=1, l1_ratio=None,\n", + " max_iter=100, multi_class='warn',\n", + " n_jobs=None, penalty='l2',\n", + " random_state=None, solver='warn',\n", + " tol=0.0001, verbose=0, warm_start=False))],\n", + " verbose=False)\n", + "\n", + "\n", + "Training set accuracy: 0.9911111111111112\n" + ] + } + ], + "source": [ + "print(\"Best estimator:\")\n", + "print(search.best_estimator_)\n", + "print()\n", + "print()\n", + "print(\"Training set accuracy:\", sum(search.predict(features) == labels)/len(labels))" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1106,14 +1166,14 @@ }, { "cell_type": "code", - "execution_count": 192, + "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'logisticregression__C': 4.672288322013504, 'polynomialfeatures__degree': 3, 'standardscaler__with_mean': True, 'standardscaler__with_std': True}\n", + "{'logisticregression__C': 3.219890406724053, 'polynomialfeatures__degree': 3, 'standardscaler__with_mean': True, 'standardscaler__with_std': False}\n", "\n", "[0 0 1 1 0 0 1 1 0 1]\n" ] @@ -1150,7 +1210,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 23, "metadata": { "tags": [ "solution" @@ -1163,8 +1223,8 @@ "text": [ "Best parameter (CV score=0.978):\n", "{'standardscaler__with_mean': True, 'standardscaler__with_std': True, 'svc__C': 15, 'svc__gamma': 0.1}\n", - "Best parameter (CV score=0.973):\n", - "{'pca__n_components': 9, 'polynomialfeatures__degree': 2}\n" + "Best parameter (CV score=0.978):\n", + "{'pca__n_components': 10, 'polynomialfeatures__degree': 2}\n" ] } ], @@ -1200,7 +1260,8 @@ " 'pca__n_components': randint(4, 15)\n", " }\n", "\n", - "search = RandomizedSearchCV(p, param_grid, cv=5, scoring=\"accuracy\", n_jobs=5)\n", + "search = RandomizedSearchCV(p, param_grid, cv=5, scoring=\"accuracy\", n_jobs=5,\n", + " random_state=42) # fix randomization for reproduciblity\n", "search.fit(features, labels)\n", "print(\"Best parameter (CV score=%0.3f):\" % search.best_score_)\n", "print(search.best_params_)\n" @@ -1220,7 +1281,7 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": 24, "metadata": { "tags": [ "solution" @@ -1231,8 +1292,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Best parameter (CV score=0.905):\n", - "{'C': 59.85495947411998, 'gamma': 1.4553652628933988}\n" + "Best parameter (CV score=0.920):\n", + "{'C': 12.827747704497042, 'gamma': 1.8440450985343382}\n" ] }, { @@ -1258,6 +1319,7 @@ "data = pd.read_csv(\"data/spiral.csv\")\n", "\n", "features = data.iloc[:, :-1]\n", + "labels = data.iloc[:, -1]\n", "\n", "import matplotlib.pyplot as plt\n", "\n", @@ -1272,7 +1334,8 @@ " 'gamma': uniform(0.01, 10),\n", " }\n", "\n", - "search = RandomizedSearchCV(clf, param_grid, cv=5, scoring=\"accuracy\", n_jobs=5)\n", + "search = RandomizedSearchCV(clf, param_grid, cv=5, scoring=\"accuracy\", n_jobs=5,\n", + " random_state=42) # fix randomization for reproduciblity\n", "search.fit(features, labels)\n", "print(\"Best parameter (CV score=%0.3f):\" % search.best_score_)\n", "print(search.best_params_)" @@ -1280,7 +1343,7 @@ }, { "cell_type": "code", - "execution_count": 157, + "execution_count": 25, "metadata": { "tags": [ "solution" @@ -1292,7 +1355,7 @@ "output_type": "stream", "text": [ "Best parameter (CV score=0.964):\n", - "{'pca__n_components': 15, 'svc__C': 18.851242451312373, 'svc__gamma': 0.13103264635586054}\n" + "{'pca__n_components': 22, 'svc__C': 22.62496259847715, 'svc__gamma': 0.016632480579933266}\n" ] } ], @@ -1326,7 +1389,8 @@ "p = make_pipeline(PCA(), StandardScaler(), SVC())\n", "\n", "\n", - "search = RandomizedSearchCV(p, param_grid, cv=5, scoring=\"accuracy\", n_jobs=5, n_iter=20)\n", + "search = RandomizedSearchCV(p, param_grid, cv=5, scoring=\"accuracy\", n_jobs=5, n_iter=20,\n", + " random_state=42) # fix randomization for reproduciblity\n", "search.fit(features, labels)\n", "\n", "print(\"Best parameter (CV score=%0.3f):\" % search.best_score_)\n", @@ -1391,7 +1455,7 @@ "height": "calc(100% - 180px)", "left": "10px", "top": "150px", - "width": "230.188px" + "width": "246.183px" }, "toc_section_display": true, "toc_window_display": true