mirror of
https://github.com/gsi-upm/sitc
synced 2024-11-05 07:31:41 +00:00
568 lines
79 KiB
Plaintext
568 lines
79 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 and make and evaluate 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": [
|
|
"## Load 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": 3,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# library for displaying plots\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# display plots in the notebook \n",
|
|
"%matplotlib inline\n",
|
|
"\n",
|
|
"## 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.cross_validation 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": 4,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"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": 4,
|
|
"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": 5,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"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": 6,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"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": 7,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"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": 8,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\nrkJggg==\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x7f21a42a1ef0>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\nJ4sltD0AAAAASUVORK5CYII=\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x7f21a42a1c88>"
|
|
]
|
|
},
|
|
"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": 9,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"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": 10,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"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": {
|
|
"collapsed": false
|
|
},
|
|
"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": 15,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"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.cross_validation 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",
|
|
"\n",
|
|
"cv = KFold(x_iris.shape[0], 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": 16,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"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": 14,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<matplotlib.text.Text at 0x7f21711a9cc0>"
|
|
]
|
|
},
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x7f21711cc6d8>"
|
|
]
|
|
},
|
|
"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.5.1"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0
|
|
}
|