mirror of
https://github.com/gsi-upm/sitc
synced 2024-11-22 14:32:28 +00:00
550 lines
78 KiB
Plaintext
550 lines
78 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"![](files/images/EscUpmPolit_p.gif \"UPM\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Course Notes for Learning Intelligent Systems"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Department of Telematic Engineering Systems, Universidad Politécnica de Madrid, © 2016 Carlos A. Iglesias"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## [Introduction to Machine Learning](2_0_0_Intro_ML.ipynb)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Table of Contents\n",
|
|
"* [kNN Model](#kNN-Model)\n",
|
|
"* [Load data and preprocessing](#Load-data-and-preprocessing)\n",
|
|
"* [Train classifier](#Train-classifier)\n",
|
|
"* [Evaluating the algorithm](#Evaluating-the-algorithm)\n",
|
|
" * [Precision, recall and f-score](#Precision,-recall-and-f-score)\n",
|
|
"\t* [Confusion matrix](#Confusion-matrix)\n",
|
|
"\t* [K-Fold validation](#K-Fold-validation)\n",
|
|
"* [Tuning the algorithm](#Tuning-the-algorithm)\n",
|
|
"* [References](#References)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# kNN Model"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"The goal of this notebook is to learn how to train a model, make predictions with that model and evaluate these predictions.\n",
|
|
"\n",
|
|
"The notebook uses the [kNN (k nearest neighbors) algorithm](https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm)."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Loading data and preprocessing\n",
|
|
"\n",
|
|
"The first step is loading and preprocessing the data as explained in the previous notebooks."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# library for displaying plots\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# display plots in the notebook \n",
|
|
"%matplotlib inline"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"## First, we repeat the load and preprocessing steps\n",
|
|
"\n",
|
|
"# Load data\n",
|
|
"from sklearn import datasets\n",
|
|
"iris = datasets.load_iris()\n",
|
|
"\n",
|
|
"# Training and test spliting\n",
|
|
"from sklearn.model_selection import train_test_split\n",
|
|
"\n",
|
|
"x_iris, y_iris = iris.data, iris.target\n",
|
|
"\n",
|
|
"# Test set will be the 25% taken randomly\n",
|
|
"x_train, x_test, y_train, y_test = train_test_split(x_iris, y_iris, test_size=0.25, random_state=33)\n",
|
|
"\n",
|
|
"# Preprocess: normalize\n",
|
|
"from sklearn import preprocessing\n",
|
|
"scaler = preprocessing.StandardScaler().fit(x_train)\n",
|
|
"x_train = scaler.transform(x_train)\n",
|
|
"x_test = scaler.transform(x_test)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"source": [
|
|
"## Train classifier"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"The usual steps for creating a classifier are:\n",
|
|
"1. Create classifier object\n",
|
|
"2. Call *fit* to train the classifier\n",
|
|
"3. Call *predict* to obtain predictions\n",
|
|
"\n",
|
|
"Once the model is created, the most relevant methods are:\n",
|
|
"* model.fit(x_train, y_train): train the model\n",
|
|
"* model.predict(x): predict\n",
|
|
"* model.score(x, y): evaluate the prediction"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
|
|
" metric_params=None, n_jobs=1, n_neighbors=15, p=2,\n",
|
|
" weights='uniform')"
|
|
]
|
|
},
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"from sklearn.neighbors import KNeighborsClassifier\n",
|
|
"import numpy as np\n",
|
|
"\n",
|
|
"# Create kNN model\n",
|
|
"model = KNeighborsClassifier(n_neighbors=15)\n",
|
|
"\n",
|
|
"# Train the model using the training sets\n",
|
|
"model.fit(x_train, y_train) "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Prediction [1 0 1 1 1 0 0 1 0 2 0 0 1 2 0 1 2 2 1 1 0 0 1 0 0 2 1 1 2 2 2 2 0 0 1 1 0\n",
|
|
" 1 2 1 2 0 2 0 1 0 2 1 0 2 2 0 0 2 0 0 0 2 2 0 1 0 1 0 1 1 1 1 1 0 1 0 1 2\n",
|
|
" 0 0 0 0 2 2 0 1 1 2 1 0 0 2 1 1 0 1 1 0 2 1 2 1 2 0 2 0 0 0 2 1 2 1 2 1 2\n",
|
|
" 0]\n",
|
|
"Expected [1 0 1 1 1 0 0 1 0 2 0 0 1 2 0 1 2 2 1 1 0 0 2 0 0 2 1 1 2 2 2 2 0 0 1 1 0\n",
|
|
" 1 2 1 2 0 2 0 1 0 2 1 0 2 2 0 0 2 0 0 0 2 2 0 1 0 1 0 1 1 1 1 1 0 1 0 1 2\n",
|
|
" 0 0 0 0 2 2 0 1 1 2 1 0 0 1 1 1 0 1 1 0 2 2 2 1 2 0 1 0 0 0 2 1 2 1 2 1 2\n",
|
|
" 0]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(\"Prediction \", model.predict(x_train))\n",
|
|
"print(\"Expected \", y_train)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Accuracy in training 0.964285714286\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Evaluate Accuracy in training\n",
|
|
"\n",
|
|
"from sklearn import metrics\n",
|
|
"y_train_pred = model.predict(x_train)\n",
|
|
"print(\"Accuracy in training\", metrics.accuracy_score(y_train, y_train_pred))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Accuracy in testing 0.921052631579\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Now we evaluate error in testing\n",
|
|
"y_test_pred = model.predict(x_test)\n",
|
|
"print(\"Accuracy in testing \", metrics.accuracy_score(y_test, y_test_pred))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Now we are going to visualize the Nearest Neighbors classification. It will plot the decision boundaries for each class.\n",
|
|
"\n",
|
|
"We are going to import a function defined in the file [util_knn.py](files/util_knn.py) using the *magic command* **%run**."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x7fc7cb622908>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\nRK5CYII=\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x7fc7cb632518>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"%run util_knn.py\n",
|
|
"plot_classification_iris()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Evaluating the algorithm"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Precision, recall and f-score"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"For evaluating classification algorithms, we usually calculate three metrics: precision, recall and F1-score\n",
|
|
"\n",
|
|
"* **Precision**: This computes the proportion of instances predicted as positives that were correctly evaluated (it measures how right our classifier is when it says that an instance is positive).\n",
|
|
"* **Recall**: This counts the proportion of positive instances that were correctly evaluated (measuring how right our classifier is when faced with a positive instance).\n",
|
|
"* **F1-score**: This is the harmonic mean of precision and recall, and tries to combine both in a single number."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" precision recall f1-score support\n",
|
|
"\n",
|
|
" setosa 1.00 1.00 1.00 8\n",
|
|
" versicolor 0.79 1.00 0.88 11\n",
|
|
" virginica 1.00 0.84 0.91 19\n",
|
|
"\n",
|
|
"avg / total 0.94 0.92 0.92 38\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(metrics.classification_report(y_test, y_test_pred, target_names=iris.target_names))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Confusion matrix"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Another useful metric is the confusion matrix"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[[ 8 0 0]\n",
|
|
" [ 0 11 0]\n",
|
|
" [ 0 3 16]]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(metrics.confusion_matrix(y_test, y_test_pred))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"We see we classify well all the 'setosa' and 'versicolor' samples. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### K-Fold validation"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"In order to avoid bias in the training and testing dataset partition, it is recommended to use **k-fold validation**."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[ 0.93333333 0.8 1. 0.93333333 0.93333333 0.93333333\n",
|
|
" 1. 1. 0.86666667 1. ]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from sklearn.model_selection import cross_val_score, KFold\n",
|
|
"from sklearn.pipeline import Pipeline\n",
|
|
"from sklearn.preprocessing import StandardScaler\n",
|
|
"\n",
|
|
"# create a composite estimator made by a pipeline of preprocessing and the KNN model\n",
|
|
"model = Pipeline([\n",
|
|
" ('scaler', StandardScaler()),\n",
|
|
" ('kNN', KNeighborsClassifier())\n",
|
|
"])\n",
|
|
"\n",
|
|
"# create a k-fold cross validation iterator of k=10 folds\n",
|
|
"cv = KFold(10, shuffle=True, random_state=33)\n",
|
|
"\n",
|
|
"# by default the score used is the one returned by score method of the estimator (accuracy)\n",
|
|
"scores = cross_val_score(model, x_iris, y_iris, cv=cv)\n",
|
|
"print(scores)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"source": [
|
|
"We get an array of k scores. We can calculate the mean and the standard error to obtain a final figure"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Mean score: 0.940 (+/- 0.021)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from scipy.stats import sem\n",
|
|
"def mean_score(scores):\n",
|
|
" return (\"Mean score: {0:.3f} (+/- {1:.3f})\").format(np.mean(scores), sem(scores))\n",
|
|
"print(mean_score(scores))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"So, we get an average accuracy of 0.940."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Tuning the algorithm"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"We are going to tune the algorithm, and calculate which is the best value for the k parameter."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 18,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<matplotlib.text.Text at 0x7fc7cb526160>"
|
|
]
|
|
},
|
|
"execution_count": 18,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\nTkSuQmCC\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x7fc7cb726ac8>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"k_range = range(1, 21)\n",
|
|
"accuracy = []\n",
|
|
"for k in k_range:\n",
|
|
" m = KNeighborsClassifier(k)\n",
|
|
" m.fit(x_train, y_train)\n",
|
|
" y_test_pred = m.predict(x_test)\n",
|
|
" accuracy.append(metrics.accuracy_score(y_test, y_test_pred))\n",
|
|
"plt.plot(k_range, accuracy)\n",
|
|
"plt.xlabel('k value')\n",
|
|
"plt.ylabel('Accuracy')\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"The result is very dependent of the input data. Execute again the train_test_split and test again how the result changes with k."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## References"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"* [KNeighborsClassifier API scikit-learn](http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html)\n",
|
|
"* [Learning scikit-learn: Machine Learning in Python](http://proquest.safaribooksonline.com/book/programming/python/9781783281930/1dot-machine-learning-a-gentle-introduction/ch01s02_html), Raúl Garreta; Guillermo Moncecchi, Packt Publishing, 2013.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Licence\n",
|
|
"The notebook is freely licensed under under the [Creative Commons Attribution Share-Alike license](https://creativecommons.org/licenses/by/2.0/). \n",
|
|
"\n",
|
|
"© 2016 Carlos A. Iglesias, Universidad Politécnica de Madrid."
|
|
]
|
|
}
|
|
],
|
|
"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.6.3"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
}
|