Commit b9cfff3e authored by Eva Zangerle's avatar Eva Zangerle
Browse files

fixed order of watermark cell, added classification notebookg

parent e71ab59e
......@@ -10,30 +10,6 @@
"Eva Zangerle"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "7f813edb-5062-4654-8b92-b518cbae651e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The watermark extension is already loaded. To reload it, use:\n",
" %reload_ext watermark\n",
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-29 09:34:20\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
"cell_type": "code",
"execution_count": null,
......@@ -64,6 +40,30 @@
"data_dir = \"../data\""
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "7f813edb-5062-4654-8b92-b518cbae651e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The watermark extension is already loaded. To reload it, use:\n",
" %reload_ext watermark\n",
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-29 09:34:20\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
"cell_type": "markdown",
"id": "ecd30be6-6645-40c7-8458-d847038f00a0",
......
......@@ -10,30 +10,6 @@
"Eva Zangerle"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "fbb83221-436f-4178-b4e6-e4b0293f3faf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The watermark extension is already loaded. To reload it, use:\n",
" %reload_ext watermark\n",
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-29 09:34:13\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
"cell_type": "code",
"execution_count": 1,
......@@ -80,6 +56,30 @@
"data_dir = \"../data\""
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "fbb83221-436f-4178-b4e6-e4b0293f3faf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The watermark extension is already loaded. To reload it, use:\n",
" %reload_ext watermark\n",
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-29 09:34:13\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
"cell_type": "markdown",
"id": "747aa842-23a2-4659-abdc-3131a07894e2",
......
......@@ -11,30 +11,6 @@
"Eva Zangerle"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "5c366d3c-4f97-48fa-b7fe-cda370045641",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The watermark extension is already loaded. To reload it, use:\n",
" %reload_ext watermark\n",
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-29 09:34:05\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
"cell_type": "code",
"execution_count": 2,
......@@ -74,6 +50,30 @@
"data_dir = \"../data\""
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "5c366d3c-4f97-48fa-b7fe-cda370045641",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The watermark extension is already loaded. To reload it, use:\n",
" %reload_ext watermark\n",
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-29 09:34:05\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
"cell_type": "code",
"execution_count": 5,
......
......@@ -12,30 +12,6 @@
"Eva Zangerle"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "a870c325-706d-4c07-bb57-e3b84322e6e4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The watermark extension is already loaded. To reload it, use:\n",
" %reload_ext watermark\n",
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-29 09:33:54\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
"cell_type": "code",
"execution_count": 1,
......@@ -69,40 +45,36 @@
},
{
"cell_type": "code",
"execution_count": 1,
"id": "e40bcacf-a3ad-4d2d-8114-1979982d6f6f",
"execution_count": 2,
"id": "5406f6f3-1c06-4f3b-aaaf-9ac6f2967729",
"metadata": {},
"outputs": [],
"source": [
"data_dir = \"../data\""
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "a870c325-706d-4c07-bb57-e3b84322e6e4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The watermark extension is already loaded. To reload it, use:\n",
" %reload_ext watermark\n",
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-29 09:28:29\n",
"\n",
"Python implementation: CPython\n",
"Python version : 3.9.7\n",
"IPython version : 7.30.0\n",
"\n",
"Git hash: 32f20dee0a914472fdcdc1781c07a28a9f0d1828\n",
"Last updated: 2021-11-29 09:33:54\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t -g -v"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "5406f6f3-1c06-4f3b-aaaf-9ac6f2967729",
"metadata": {},
"outputs": [],
"source": [
"data_dir = \"../data\""
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
......@@ -12,30 +12,6 @@
"Eva Zangerle"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "29a380d3-d574-47d1-8649-98bbd9c58edf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The watermark extension is already loaded. To reload it, use:\n",
" %reload_ext watermark\n",
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-29 09:33:47\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
"cell_type": "code",
"execution_count": 1,
......@@ -63,6 +39,30 @@
"data_dir = \"../data\""
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "29a380d3-d574-47d1-8649-98bbd9c58edf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The watermark extension is already loaded. To reload it, use:\n",
" %reload_ext watermark\n",
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-29 09:33:47\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
"cell_type": "markdown",
"id": "c4abdb51-195d-40d4-a46e-acacdd63e517",
......
{
"cells": [
{
"cell_type": "markdown",
"id": "3e125f13-6ae0-49a6-8916-bc7715d622e3",
"metadata": {
"tags": []
},
"source": [
"# Classification\n",
"Lecture Data Engineering and Analytics<br>\n",
"Eva Zangerle"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "3bf8eda6-1552-4bcc-bed9-3f42108b751a",
"metadata": {},
"outputs": [],
"source": [
"from pprint import pprint\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import seaborn as sns\n",
"from matplotlib.colors import ListedColormap\n",
"from sklearn import datasets\n",
"from sklearn.metrics import (\n",
" ConfusionMatrixDisplay,\n",
" PrecisionRecallDisplay,\n",
" RocCurveDisplay,\n",
" accuracy_score,\n",
" classification_report,\n",
" confusion_matrix,\n",
")\n",
"from sklearn.model_selection import (\n",
" GridSearchCV,\n",
" KFold,\n",
" StratifiedKFold,\n",
" cross_val_predict,\n",
" cross_val_score,\n",
" cross_validate,\n",
" train_test_split,\n",
")\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.preprocessing import StandardScaler"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "d71d4893-1d48-40db-8f5f-40d706561497",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Author: Eva Zangerle\n",
"\n",
"Last updated: 2021-11-30 16:54:31\n",
"\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a \"Eva Zangerle\" -u -d -t"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "fa37ef66-9adc-43f4-bb87-7815ce6e485e",
"metadata": {},
"outputs": [],
"source": [
"# specify data directory\n",
"data_dir = \"../data\""
]
},
{
"cell_type": "markdown",
"id": "161004a8-3c68-460f-a391-dd16219d2685",
"metadata": {
"tags": []
},
"source": [
"## k Nearest Neighbors"
]
},
{
"cell_type": "markdown",
"id": "125ceb50-1129-4543-ae58-792ed0f91913",
"metadata": {},
"source": [
"The following initial examples are (again) based on the iris datasets (directly loaded via scikit-learn). The dataset consists of 50 samples from three species of the iris flower and describes its sepals (Kelchblatt) and petals (Blütenblatt) (length and width). More information on the dataset can be found here: https://en.wikipedia.org/wiki/Iris_flower_data_set."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "9e66deca-28dc-4c78-8f59-1e6f207d2c78",
"metadata": {},
"outputs": [],
"source": [
"# load iris dataset via sklearn\n",
"def load_iris():\n",
" iris = datasets.load_iris()\n",
" # define X and y as data and target\n",
" # for now, we stick to two features as input: sepal length and width\n",
" X = iris.data[:, :2]\n",
" y = iris.target\n",
" return X, y, iris.target_names"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "a1f5f0d1-0507-4144-a0bd-8a8815ef374b",
"metadata": {},
"outputs": [],
"source": [
"X, y, target_names = load_iris()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "e607a69a-da27-48cb-ab16-e4a29d091c98",
"metadata": {},
"outputs": [],
"source": [
"# preprocess\n",
"scaler = StandardScaler()\n",
"X = scaler.fit_transform(X)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "79c4742e-7048-4f59-b22b-574693bdd9cb",
"metadata": {},
"outputs": [],
"source": [
"# split data into training and test\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)"
]
},
{
"cell_type": "markdown",
"id": "ce50464d-d77b-43fb-8f7a-4c3769bf49bf",
"metadata": {},
"source": [
"The following `plot_decision_boundaries` function is a convenience function to visualize the decision boundaries for the discussed classification algorithms. Code adapted from the official sklearn documentation at https://scikit-learn.org/stable/auto_examples/neighbors/plot_classification.html."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "ebc5f1d9-3f6b-49a1-b5e3-5c4f4f4a5a41",
"metadata": {},
"outputs": [],
"source": [
"def plot_decision_boundaries(X, y, classifier, xlabel, ylabel):\n",
" # Plot the decision boundary. For that, we will assign a color to each\n",
" # point in the mesh [x_min, x_max]x[y_min, y_max].\n",
"\n",
" h = 0.05 # step size in the mesh\n",
"\n",
" # Create color maps\n",
" cmap_light = ListedColormap([\"yellow\", \"red\", \"green\"])\n",
" colors_light = [\"yellow\", \"red\", \"green\"]\n",
"\n",
" x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n",
" y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n",
"\n",
" # define mesh\n",
" xx, yy = np.meshgrid(\n",
" np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)\n",
" )\n",
"\n",
" # classify each point in mesh\n",
" Z = classifier.predict(np.c_[xx.ravel(), yy.ravel()])\n",
"\n",
" # Put the result into a color plot\n",
" Z = Z.reshape(xx.shape)\n",
" plt.figure(figsize=(8, 6))\n",
" plt.contourf(xx, yy, Z, cmap=cmap_light, alpha=0.15)\n",
"\n",
" # plot training points, once for each class\n",
" for label in set(y):\n",
" sns.scatterplot(\n",
" x=X[y == label, 0],\n",
" y=X[y == label, 1],\n",
" color=colors_light[label], # iris.target_names[y],\n",
" alpha=1.0,\n",
" edgecolor=\"black\",\n",
" )\n",
" plt.xlim(xx.min(), xx.max())\n",
" plt.ylim(yy.min(), yy.max())\n",
" plt.title(\"Contour Diagram\")\n",
" plt.xlabel(xlabel)\n",
" plt.ylabel(ylabel)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "c791737c-fce8-4bd2-bd57-00ef9d84d1c7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"KNeighborsClassifier(algorithm='kd_tree', n_neighbors=7, p=1)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# compute kNN with k=5\n",
"# minkowski = generalization of Manhattan and Euclidean distance\n",
"# order p=1 -> Manhattan, p=2 Euclidean\n",
"knn = KNeighborsClassifier(\n",
" n_neighbors=7, algorithm=\"kd_tree\", leaf_size=30, metric=\"minkowski\", p=1\n",
")\n",
"knn.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "024c1726-a79b-4f0e-873b-67fda101bbff",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# inspect decision boundaries for different k\n",
"plot_decision_boundaries(\n",
" X_train, y_train, knn, \"sepal length (cm)\", \"sepal width (cm)\"\n",
")"
]
},
{
"cell_type": "markdown",
"id": "27a57141-8e4b-4418-b7be-6a73489d50b6",
"metadata": {
"tags": []
},
"source": [
"# Evaluation"
]
},
{
"cell_type": "markdown",
"id": "521e975b-cfc5-4873-bb25-f6cb5e7812cd",
"metadata": {},
"source": [
"After a first glimpse at a rather simple, lazy classification approach, we will discuss the systematic evaluation of classification approaches."
]
},
{
"cell_type": "markdown",
"id": "dc21295d-c155-490b-b2b2-98f088049f17",
"metadata": {},
"source": [
"In a first step, we will define a `sklearn.pipeline` to define full workflows for the computation of classifications."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "dad8b8ae-ed3d-46c1-b10b-7ef270a8b3f8",
"metadata": {},
"outputs": [],
"source": [
"# define pipeline (with names)\n",