Newer
Older
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img width=\"800px\" src=\"../fidle/img/00-Fidle-header-01.svg\"></img>\n",
"\n",
"# <!-- TITLE --> [PER57] - Perceptron Model 1957\n",
"<!-- DESC --> Example of use of a Perceptron, with sklearn and IRIS dataset of 1936 !\n",
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
"<!-- AUTHOR : Jean-Luc Parouty (CNRS/SIMaP) -->\n",
"\n",
"## Objectives :\n",
" - Implement a historical linear classifier with a historical dataset !\n",
" - The objective is to predict the type of Iris from the size of the leaves.\n",
" - Identifying its limitations \n",
"\n",
"The [IRIS dataset](https://archive.ics.uci.edu/ml/datasets/Iris) is probably one of the oldest datasets, dating back to 1936 .\n",
"\n",
"## What we're going to do :\n",
" - Retrieve the dataset, via scikit learn\n",
" - training and classifying\n",
"\n",
"## Step 1 - Import and init"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>\n",
"\n",
"div.warn { \n",
" background-color: #fcf2f2;\n",
" border-color: #dFb5b4;\n",
" border-left: 5px solid #dfb5b4;\n",
" padding: 0.5em;\n",
" font-weight: bold;\n",
" font-size: 1.1em;;\n",
" }\n",
"\n",
"\n",
"\n",
"div.nota { \n",
" background-color: #DAFFDE;\n",
" border-left: 5px solid #92CC99;\n",
" padding: 0.5em;\n",
" }\n",
"\n",
"div.todo:before { content:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1My44OTEyIiBoZWlnaHQ9IjE0My4zOTAyIiB2aWV3Qm94PSIwIDAgNTMuODkxMiAxNDMuMzkwMiI+PHRpdGxlPjAwLUJvYi10b2RvPC90aXRsZT48cGF0aCBkPSJNMjMuNDU2OCwxMTQuMzAxNmExLjgwNjMsMS44MDYzLDAsMSwxLDEuODE1NywxLjgyNEExLjgyMDksMS44MjA5LDAsMCwxLDIzLjQ1NjgsMTE0LjMwMTZabS0xMC42NjEyLDEuODIyQTEuODI3MiwxLjgyNzIsMCwxLDAsMTAuOTgsMTE0LjMsMS44MiwxLjgyLDAsMCwwLDEyLjc5NTYsMTE2LjEyMzZabS03LjcwNyw0LjU4NzR2LTVzLjQ4NjMtOS4xMjIzLDguMDIxNS0xMS45Njc1YTE5LjIwODIsMTkuMjA4MiwwLDAsMSw2LjA0ODYtMS4yNDU0LDE5LjE3NzgsMTkuMTc3OCwwLDAsMSw2LjA0ODcsMS4yNDc1YzcuNTM1MSwyLjgzNDcsOC4wMTc0LDExLjk2NzQsOC4wMTc0LDExLjk2NzR2NS4wMjM0bC4wMDQyLDcuNjgydjIuNGMuMDE2Ny4xOTkyLjAzMzYuMzkyMS4wMzM2LjU4NzEsMCwuMjEzOC0uMDE2OC40MTA5LS4wMzM2LjYzMzJ2LjA1ODdoLS4wMDg0YTguMzcxOSw4LjM3MTksMCwwLDEtNy4zNzM4LDcuNjU0N3MtLjk5NTMsMy42MzgtNi42OTMzLDMuNjM4LTYuNjkzNC0zLjYzOC02LjY5MzQtMy42MzhhOC4zNyw4LjM3LDAsMCwxLTcuMzcxNi03LjY1NDdINS4wODQzdi0uMDU4N2MtLjAxODktLjIyLS4wMjk0LS40MTk0LS4wMjk0LS42MzMyLDAtLjE5MjkuMDE2Ny0uMzgzNy4wMjk0LS41ODcxdi0yLjRtMTguMDkzNy00LjA0YTEuMTU2NSwxLjE1NjUsMCwxLDAtMi4zMTI2LDAsMS4xNTY0LDEuMTU2NCwwLDEsMCwyLjMxMjYsMFptNC4wODM0LDBhMS4xNTk1LDEuMTU5NSwwLDEsMC0xLjE2MzYsMS4xN0ExLjE3NSwxLjE3NSwwLDAsMCwyNy4yNjE0LDEyNC4zNzc5Wk05LjM3MzksMTE0LjYzNWMwLDMuMTA5MywyLjQxMzIsMy4zMSwyLjQxMzIsMy4zMWExMzMuOTI0MywxMzMuOTI0MywwLDAsMCwxNC43MzQ4LDBzMi40MTExLS4xOTI5LDIuNDExMS0zLjMxYTguMDc3Myw4LjA3NzMsMCwwLDAtMi40MTExLTUuNTUxOWMtNC41LTMuNTAzMy05LjkxMjYtMy41MDMzLTE0Ljc0MTEsMEE4LjA4NTEsOC4wODUxLDAsMCwwLDkuMzczOSwxMTQuNjM1WiIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxjaXJjbGUgY3g9IjMzLjE0MzYiIGN5PSIxMjQuNTM0IiByPSIzLjgzNjMiIHN0eWxlPSJmaWxsOiMwMTAxMDEiLz48cmVjdCB4PSIzNS42NjU5IiB5PSIxMTIuOTYyNSIgd2lkdGg9IjIuMDc3IiBoZWlnaHQ9IjEwLjU0NTgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIxLjYgMjQxLjExMjEpIHJvdGF0ZSgtMTU1Ljc0NikiIHN0eWxlPSJmaWxsOiMwMTAxMDEiLz48Y2lyY2xlIGN4PSIzOC44NzA0IiBjeT0iMTEzLjQyNzkiIHI9IjIuNDA4NSIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxjaXJjbGUgY3g9IjUuMjI0OCIgY3k9IjEyNC41MzQiIHI9IjMuODM2MyIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxyZWN0IHg9IjEuNDE2NCIgeT0iMTI0LjYzMDEiIHdpZHRoPSIyLjA3NyIgaGVpZ2h0PSIxMC41NDU4IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0LjkwOTcgMjU5LjgwNikgcm90YXRlKC0xODApIiBzdHlsZT0iZmlsbDojMDEwMTAxIi8+PGNpcmNsZSBjeD0iMi40MDkxIiBjeT0iMTM3LjA5OTYiIHI9IjIuNDA4NSIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxwYXRoIGQ9Ik0xOC4wNTExLDEwMC4xMDY2aC0uMDE0NlYxMDIuNjFoMi4zdi0yLjQyNzlhMi40MjI5LDIuNDIyOSwwLDEsMC0yLjI4NTQtLjA3NTVaIiBzdHlsZT0iZmlsbDojMDEwMTAxIi8+PHBhdGggZD0iTTM5LjQyMTQsMjcuMjU4djEuMDVBMTEuOTQ1MiwxMS45NDUyLDAsMCwwLDQ0LjU5NTQsNS43OWEuMjQ0OS4yNDQ5LDAsMCwxLS4wMjM1LS40MjI3TDQ2Ljc1LDMuOTUxNWEuMzg5Mi4zODkyLDAsMCwxLC40MjYyLDAsMTQuODQ0MiwxNC44NDQyLDAsMCwxLTcuNzU0MywyNy4yNTkxdjEuMDY3YS40NS40NSwwLDAsMS0uNzA0Ny4zNzU4bC0zLjg0MTktMi41MWEuNDUuNDUsMCwwLDEsMC0uNzUxNmwzLjg0MTktMi41MWEuNDUuNDUsMCwwLDEsLjY5NDYuMzc1OFpNNDMuMjMsMi41ODkyLDM5LjM4NzguMDc5NGEuNDUuNDUsMCwwLDAtLjcwNDYuMzc1OHYxLjA2N2ExNC44NDQyLDE0Ljg0NDIsMCwwLDAtNy43NTQzLDI3LjI1OTEuMzg5LjM4OSwwLDAsMCwuNDI2MSwwbDIuMTc3Ny0xLjQxOTNhLjI0NS4yNDUsMCwwLDAtLjAyMzUtLjQyMjgsMTEuOTQ1MSwxMS45NDUxLDAsMCwxLDUuMTc0LTIyLjUxNDZ2MS4wNWEuNDUuNDUsMCwwLDAsLjcwNDYuMzc1OGwzLjg1NTMtMi41MWEuNDUuNDUsMCwwLDAsMC0uNzUxNlpNMzkuMDUyMywxNC4yNDU4YTIuMTIwNiwyLjEyMDYsMCwxLDAsMi4xMjA2LDIuMTIwNmgwQTIuMTI0LDIuMTI0LDAsMCwwLDM5LjA1MjMsMTQuMjQ1OFptNi4wNzMyLTQuNzc4MS44MjU0LjgyNTVhMS4wNTY4LDEuMDU2OCwwLDAsMSwuMTE3NSwxLjM0MjFsLS44MDIsMS4xNDQyYTcuMTAxOCw3LjEwMTgsMCwwLDEsLjcxMTQsMS43MTEybDEuMzc1Ny4yNDE2YTEuMDU2OSwxLjA1NjksMCwwLDEsLjg3NTcsMS4wNHYxLjE2NDNhMS4wNTY5LDEuMDU2OSwwLDAsMS0uODc1NywxLjA0bC0xLjM3MjQuMjQxNkE3LjExLDcuMTEsMCwwLDEsNDUuMjcsMTkuOTNsLjgwMTksMS4xNDQyYTEuMDU3LDEuMDU3LDAsMCwxLS4xMTc0LDEuMzQyMmwtLjgyODguODQ4OWExLjA1NywxLjA1NywwLDAsMS0xLjM0MjEuMTE3NGwtMS4xNDQyLS44MDE5YTcuMTMzOCw3LjEzMzgsMCwwLDEtMS43MTEzLjcxMTNsLS4yNDE2LDEuMzcyNGExLjA1NjgsMS4wNTY4LDAsMCwxLTEuMDQuODc1N0gzOC40Njg0YTEuMDU2OCwxLjA1NjgsMCwwLDEtMS4wNC0uODc1N2wtLjI0MTYtMS4zNzI0YTcuMTM1NSw3LjEzNTUsMCwwLDEtMS43MTEzLS43MTEzbC0xLjE0NDEuODAxOWExLjA1NzEsMS4wNTcxLDAsMCwxLTEuMzQyMi0uMTE3NGwtLjgzNTUtLjgyNTVhMS4wNTcsMS4wNTcsMCwwLDEtLjExNzQtMS4zNDIxbC44MDE5LTEuMTQ0MmE3LjEyMSw3LjEyMSwwLDAsMS0uNzExMy0xLjcxMTJsLTEuMzcyNC0uMjQxNmExLjA1NjksMS4wNTY5LDAsMCwxLS44NzU3LTEuMDRWMTUuNzgyNmExLjA1NjksMS4wNTY5LDAsMCwxLC44NzU3LTEuMDRsMS4zNzU3LS4yNDE2YTcuMTEsNy4xMSwwLDAsMSwuNzExNC0xLjcxMTJsLS44MDItMS4xNDQyYTEuMDU3LDEuMDU3LDAsMCwxLC4xMTc1LTEuMzQyMmwuODI1NC0uODI1NEExLjA1NjgsMS4wNTY4LDAsMCwxLDM0LjMyNDUsOS4zNmwxLjE0NDIuODAxOUE3LjEzNTUsNy4xMzU1LDAsMCwxLDM3LjE4LDkuNDUxbC4yNDE2LTEuMzcyNGExLjA1NjgsMS4wNTY4LDAsMCwxLDEuMDQtLjg3NTdoMS4xNjc3YTEuMDU2OSwxLjA1NjksMCwwLDEsMS4wNC44NzU3bC4yNDE2LDEuMzcyNGE3LjEyNSw3LjEyNSwwLDAsMSwxLjcxMTIuNzExM0w0My43NjY2LDkuMzZBMS4wNTY5LDEuMDU2OSwwLDAsMSw0NS4xMjU1LDkuNDY3N1ptLTIuMDMsNi44OTg3QTQuMDQzMyw0LjA0MzMsMCwxLDAsMzkuMDUyMywyMC40MWgwQTQuMDQ2NSw0LjA0NjUsMCwwLDAsNDMuMDk1NSwxNi4zNjY0WiIgc3R5bGU9ImZpbGw6I2UxMjIyOSIvPjxwb2x5Z29uIHBvaW50cz0iMzkuNDEzIDM0Ljc1NyAzOS41MzcgMzQuNzU3IDM5LjY3NSAzNC43NTcgMzkuNjc1IDEwOS41MSAzOS41MzcgMTA5LjUxIDM5LjQxMyAxMDkuNTEgMzkuNDEzIDM0Ljc1NyAzOS40MTMgMzQuNzU3IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojOTk5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS13aWR0aDowLjMwODg1NDQ1MDU2MDE2MThweDtmaWxsLXJ1bGU6ZXZlbm9kZCIvPjwvc3ZnPg==);\n",
" float:left;\n",
" margin-right:20px;\n",
" margin-top:-20px;\n",
" margin-bottom:20px;\n",
"}\n",
"div.todo{\n",
" font-weight: bold;\n",
" font-size: 1.1em;\n",
" margin-top:40px;\n",
"}\n",
"div.todo ul{\n",
" margin: 0.2em;\n",
"}\n",
"div.todo li{\n",
" margin-left:60px;\n",
" margin-top:0;\n",
" margin-bottom:0;\n",
"}\n",
"div .comment{\n",
" font-size:0.8em;\n",
" color:#696969;\n",
"}\n",
"\n",
"\n",
"\n",
"</style>\n",
"\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"**FIDLE 2020 - Practical Work Module**"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Version : 0.6.1 DEV\n",
"Notebook id : PER57\n",
"Run time : Wednesday 16 December 2020, 21:01:59\n",
"TensorFlow version : 2.0.0\n",
"Keras version : 2.2.4-tf\n",
"Datasets dir : ~/datasets/fidle\n",
"Update keras cache : False\n",
"Save figs : True\n",
"Path figs : ./run/figs\n"
]
}
],
"source": [
"import numpy as np\n",
"from sklearn.datasets import load_iris\n",
"from sklearn.linear_model import Perceptron\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"\n",
"import os,sys\n",
"\n",
"sys.path.append('..')\n",
"import fidle.pwk as pwk\n",
"datasets_dir = pwk.init('PER57')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 2 - Prepare IRIS Dataset\n",
"\n",
"Retrieve a dataset : http://scikit-learn.org/stable/modules/classes.html#module-sklearn.datasets \n",
"About the datesets : http://scikit-learn.org/stable/datasets/index.html \n",
"\n",
"Data fields (X) :\n",
"- 0 : sepal length in cm\n",
"- 1 : sepal width in cm\n",
"- 2 : petal length in cm\n",
"- 3 : petal width in cm \n",
"\n",
"Class (y) :\n",
"- 0 : class 0=Iris-Setosa, 1=Iris-Versicolour, 2=Iris-Virginica\n",
"\n",
"### 2.1 - Get dataset"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Length (x1)</th>\n",
" <th>Width (x2)</th>\n",
" <th>Setosa {0,1} (y)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.3</td>\n",
" <td>0.2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.5</td>\n",
" <td>0.2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>145</th>\n",
" <td>5.2</td>\n",
" <td>2.3</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>146</th>\n",
" <td>5.0</td>\n",
" <td>1.9</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>147</th>\n",
" <td>5.2</td>\n",
" <td>2.0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>148</th>\n",
" <td>5.4</td>\n",
" <td>2.3</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>149</th>\n",
" <td>5.1</td>\n",
" <td>1.8</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>150 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" Length (x1) Width (x2) Setosa {0,1} (y)\n",
"0 1.4 0.2 1\n",
"1 1.4 0.2 1\n",
"2 1.3 0.2 1\n",
"3 1.5 0.2 1\n",
"4 1.4 0.2 1\n",
".. ... ... ...\n",
"145 5.2 2.3 0\n",
"146 5.0 1.9 0\n",
"147 5.2 2.0 0\n",
"148 5.4 2.3 0\n",
"149 5.1 1.8 0\n",
"\n",
"[150 rows x 3 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"y shape : (150,)\n"
]
}
],
"source": [
"x0,y0 = load_iris(return_X_y=True)\n",
"x = x0[:, (2,3)] # We only keep fields 2 and 3\n",
"y = y0.copy()\n",
"\n",
"y[ y0==0 ] = 1 # 1 = Iris setosa\n",
"y[ y0>=1 ] = 0 # 0 = not iris setosa\n",
"\n",
"df=pd.DataFrame.from_dict({'Length (x1)':x[:,0], 'Width (x2)':x[:,1], 'Setosa {0,1} (y)':y})\n",
"display(df)\n",
"\n",
"print(f'x shape : {x.shape}')\n",
"print(f'y shape : {y.shape}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 - Train and test sets"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
{
"name": "stdout",
"output_type": "stream",
"text": [
"x_train shape : (120, 2)\n",
"y_train shape : (120,)\n",
"x_test shape : (30, 2)\n",
"y_test shape : (30,)\n"
]
}
],
"source": [
"x,y = pwk.shuffle_np_dataset(x, y)\n",
" \n",
"n=int(len(x)*0.8)\n",
"x_train = x[:n]\n",
"y_train = y[:n]\n",
"x_test = x[n:]\n",
"y_test = y[n:]\n",
"\n",
"print(f'x_train shape : {x_train.shape}')\n",
"print(f'y_train shape : {y_train.shape}')\n",
"print(f'x_test shape : {x_test.shape}')\n",
"print(f'y_test shape : {y_test.shape}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 3 - Get a perceptron, and train it"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-- Epoch 1\n",
"Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 120, Avg. loss: 0.176917\n",
"Total training time: 0.00 seconds.\n",
"-- Epoch 2\n",
"Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 240, Avg. loss: 0.000000\n",
"Total training time: 0.00 seconds.\n",
"-- Epoch 3\n",
"Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 360, Avg. loss: 0.000000\n",
"Total training time: 0.00 seconds.\n",
"-- Epoch 4\n",
"Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 480, Avg. loss: 0.000000\n",
"Total training time: 0.00 seconds.\n",
"-- Epoch 5\n",
"Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 600, Avg. loss: 0.000000\n",
"Total training time: 0.00 seconds.\n",
"-- Epoch 6\n",
"Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 720, Avg. loss: 0.000000\n",
"Total training time: 0.00 seconds.\n",
"-- Epoch 7\n",
"Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 840, Avg. loss: 0.000000\n",
"Total training time: 0.00 seconds.\n",
"Convergence after 7 epochs took 0.00 seconds\n"
]
},
{
"data": {
"text/plain": [
"Perceptron(max_iter=100, random_state=82, tol=0.01, verbose=1)"
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pct = Perceptron(max_iter=100, random_state=82, tol=0.01, verbose=1)\n",
"pct.fit(x_train, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 4 - Prédictions"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Length (x1)</th>\n",
" <th>Width (x2)</th>\n",
" <th>y_test</th>\n",
" <th>y_pred</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.2</td>\n",
" <td>0.2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>5.6</td>\n",
" <td>2.4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>4.3</td>\n",
" <td>1.3</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4.3</td>\n",
" <td>1.3</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5.2</td>\n",
" <td>2.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>5.1</td>\n",
" <td>2.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>4.0</td>\n",
" <td>1.2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1.5</td>\n",
" <td>0.4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>4.5</td>\n",
" <td>1.5</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1.5</td>\n",
" <td>0.4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>5.1</td>\n",
" <td>1.6</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>3.3</td>\n",
" <td>1.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>5.8</td>\n",
" <td>2.2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>4.8</td>\n",
" <td>1.8</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>4.7</td>\n",
" <td>1.6</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Length (x1) Width (x2) y_test y_pred\n",
"0 1.2 0.2 1 1\n",
"1 5.6 2.4 0 0\n",
"2 4.3 1.3 0 0\n",
"3 4.3 1.3 0 0\n",
"4 5.2 2.0 0 0\n",
"5 5.1 2.0 0 0\n",
"6 4.0 1.2 0 0\n",
"7 1.5 0.4 1 1\n",
"8 4.5 1.5 0 0\n",
"9 1.5 0.4 1 1\n",
"10 5.1 1.6 0 0\n",
"11 3.3 1.0 0 0\n",
"12 5.8 2.2 0 0\n",
"13 4.8 1.8 0 0\n",
"14 4.7 1.6 0 0"
]
},
"metadata": {},
"output_type": "display_data"
"y_pred = pct.predict(x_test) \n",
"df=pd.DataFrame.from_dict({'Length (x1)':x_test[:,0], 'Width (x2)':x_test[:,1], 'y_test':y_test, 'y_pred':y_pred})\n",
"display(df[:15])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 5 - Visualisation"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div class=\"comment\">Saved: ./run/figs/PER57-01-perceptron-iris</div>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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66+/3u/j5OfnByAay7XXXsv06dMpKIiOXl1JBMNB/TRrvbuExPI9XHa7tX3sQ54XR27ZFk7rZQ3Llu3Vcziciz6fgJNu/tM2bwv7DluTLCo8RiHsz3C//+DvUKex+1jrNPD/egN13yJA9erVmTt3Lna7nWeeeaZ4mEIIEZ52ZWbj8DR4omF3ZtUMMebk5PDOO+9w4403Mnz4cGbNmlVqv6vePqUU8+fPB6Bly5YAdO/eHaUU5513HgCjR49myJAhTJ06lSZNmtCkSRMADh48yOWXX06tWrWoVasWF110Uanlrw4cOMCll15K7dq1qVatGmeccQb/+c9/XF7Dxo0b+eGHHxgyZEi5uN955x169+5NUlISZ5xxBkuXLi1us2LFCpRSfPrpp5x99tkkJCTw2WefobXmqaee4tRTTyU5OZmOHTsyd+7cUufcsGEDZ511FklJSXTp0oV169aVi2vQoEFkZmZGzc9hSQTDRcfuMGk69L0QkqpZM3OTqlmfT5ru/aLIvYdA/2vAngIFhVbvXEGh9Xn/a+D+F2HEDRBXpictLs7afs9UePR1KEiFX4+WPsavR63tD78J9voV77fXhwmvwiPT4cLLys8wVsraPnV2YK43UPctAvTo0YOHHnoIrTWjRo3i2LFjoQ5JCOHCgeM5ngdogJ+OV81ktvnz59O8eXM6derE1VdfzVtvveVzr9j69esBWLJkCb/88gsLF/61FNfKlSvZunUrS5YsYdmyZZw4cYL+/fuTlJTEypUr+d///kejRo244IILOHHiBACGYXDixAm+/PJLtm3bxvPPP88pp5zi8vyrV6+mdevWFba59957uf3229myZQsDBw7k0ksv5eDB0uvX3nfffUyZMoXvv/+++OfnrFmzePnll9m+fTvjx4/npptu4pNPPgEgOzubiy66iFatWrFx40aefPJJxo0bV+7cCQkJdO7cmZUrV/p0P8OW1lo+fPgYO3asHjt2rBYiFPLy8nT37t11x44d9e7du0MdjhBRb/v27ZV634LvM7z+qAp9+/bVTz/9tNZaa4fDoZs3b67nz59fvH/v3r0a0Bs2bCj1PkC///77btuMGjVK161bV588ebJ426xZs3Tr1q21w+Eo3lZQUKBr166t582bp7XWumPHjnrSpEleX8Mdd9yh+/btW2pbUUxTpkwp3lZYWKjbtGmjH3zwQa211l9++aUGSl1vVlaWTkpK0qtWrSp3jgsvvFBrrfWrr76qa9asqY8fP168f86cORrQX375Zan3/eMf/9AjR470+lqCwcP3qsu8RmoNR5pg1dXdsQXenQ4Z+//altYcrhgLbTt7rmcsqkR8fDwffvghderUITExMdThCCFciLOp4gkintoF2u7du1mzZg3vvvsuYA33XnXVVcycOZNhw4YF5BwdOnQo9TNo06ZN7N27l9TU1FLtTpw4wY8//gjAHXfcwc0338ySJUsYMGAA//jHPzjrrLNcniMnJ4ekpKQK951zzjnF/7bZbPTo0YPt27eXatOtW7fif2/fvp2TJ0/yt7/9rVTJzvz8fFq0aAFYJdo6depESkpKhecpKTk5mZycyF6arIgkgpGkorq6J0/A6sXw9eeBq6v78dvw3znlt2fsh2fuh3P6gMqyqpgUPZtnt4MjC758Cw72soaoRZVISyud8Ofk5JCcHNlL5AgRbZqmJrPv2Am3w8MKaJYa+P+7M2fOpLCwkGbNmhVv085JgAcOHKBp06bYnOvOFm0H3yZUVK9evdTnDoeDzp07V/jMX+3atQG4/vrrGTx4MJ9++ilffPEF5557LuPHj2fSpEkVnqNu3bps3rzZ65jcxehwPtP+8ccfl7ovYP2BDaXvhSeZmZnFCWSkk2cEI0Ww6uru2FJxElgkKQHUcff1jH9YY/UYiir1+++/c8UVV/CPf/zDpx9gQoiq16Z2dTx19tkUtK5d3X0jHxUUFDB79myeeOIJtmzZUvzx7bff0qlTJ9544w0A6tWrB8Avv/xS/N4tW7aUOlZCglWXvtBTBSega9eu7N69m7p169K6detSH0WJIECTJk0YM2YM7733Ho8++igzZsxwecwuXbqwc+fO4iSupLVr1xb/W2vN+vXradvW9WhUu3btSExMZP/+/eXia968eXGb9PT0UmsEljxPSd999x1du3Z1fUMiiCSCkSJYdXXfne5+vze1iBWwOvLq+0aanJwcli5dymeffcb06R6+bkKIoEpJiKNHWi3sqnwJeAXYFfRIq0VKQmAH5j755BOOHj3KjTfeSIcOHUp9XH755bz++us4HA6Sk5Pp2bMnU6dOZdu2bXz99dflJkbUr1+f5ORkPvvsMw4dOuR2gtpVV11FgwYNuPTSS1m5ciV79+5l1apV3H333cUzh++44w6WLFnCnj172LJlC0uWLKFdu3Yuj9m/f39OnjzJ1q1by+2bPn068+fPZ+fOndx5553s37+fsWPHujxWamoq48aNY9y4cbz++uvs3r2bLVu28MorrxQno1deeSVxcXFcd911bNu2jc8//5zHHnus3LH27dvHwYMHGTRokMvzRRJJBCNFsOrqlnwmsCLe1CK22SD/uH9xCI/S0tJ49dVXARg3bhw7d+4McURCiJIapiQxoEU9WtasVvwsYJxN0bJmNQa0qEfDlIqff/PHrFmz6N+/P3XqlK/3PmLECPbv388XX3wBwOuvvw5Yy8PcdNNNTJkypVT7uLg4XnzxRWbOnElaWhqXXnqpy/NWq1aNVatW0apVK0aMGMEZZ5zBqFGj+P3336lVqxZgDc/edttttGvXjoEDB9KgQQNmz57t8ph16tRh6NChvP322+X2Pfnkkzz77LOceeaZLFmyhA8++KB4GRtXJk+ezKRJk5g2bRrt27dn4MCBLFiwoHiZnJSUFBYtWsSuXbvo2rUr48aNY+rUqeWO8+677zJo0KDinsRIp2RIyTeGYWgA0zSDe+IbLsTzatFYvXWvLfbjPH9zv793V889gmAtKTP68crHIbw2atQo3nrrLbp168bXX39d/LyLEMJ/O3bscDvkKKrWtm3b6N+/P7t376ZGjRrs27ePli1bsmHDhlKTQYIlNzeXNm3a8O6771a6YktV8fC96vIXt/QIRopwqavrbQ3hQNUsFh69+OKLNGvWjI0bN5b7i14IISJZ+/btmTZtGnv37g11KADs37+fBx98MOySQH9IIhgpglVXN81DV7c3tYgdDohPdd9GBEzNmjV56623UErx2GOPsWHDhlCHJIQQAXPNNddw5plnhjoMAE477TRuuummUIcRULJ8TKQYNNRaIsbdc4KBqKt7xVhriRhXDh6CBuWfPSlFA30iv75vJOnXrx/jxo0jOzvb7cPXQggRyVq0aCGrJASY9AhGimDV1W3bGS692vX+k3mgU93XMz6tlywqHQJTp07l5ZdfLre+lxBCCOGK9AhGkqK6up8vtGYH5+ZYzwSec77VExioyiIXXwWt28N/psPBErOIGzeHy0tUFlm90JodbLdZCWB8qtUTKElgSJRcLf/48ePs3r2bLl26hDAiIaKD1rrU/y8hwo0/vaSSCEaa+mlw1a3WR1Vq2xke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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def plot_perceptron(x_train,y_train,x_test,y_test):\n",
" a = -pct.coef_[0][0] / pct.coef_[0][1]\n",
" b = -pct.intercept_ / pct.coef_[0][1]\n",
" box=[x.min(axis=0)[0],x.max(axis=0)[0],x.min(axis=0)[1],x.max(axis=0)[1]]\n",
" mx=(box[1]-box[0])/20\n",
" my=(box[3]-box[2])/20\n",
" box=[box[0]-mx,box[1]+mx,box[2]-my,box[3]+my]\n",
" fig, axs = plt.subplots(1, 1)\n",
" fig.set_size_inches(10,6)\n",
" \n",
" axs.plot(x_train[y_train==1, 0], x_train[y_train==1, 1], \"o\", color='tomato', label=\"Iris-Setosa\")\n",
" axs.plot(x_train[y_train==0, 0], x_train[y_train==0, 1], \"o\", color='steelblue',label=\"Autres\")\n",
" \n",
" axs.plot(x_test[y_pred==1, 0], x_test[y_pred==1, 1], \"o\", color='lightsalmon', label=\"Iris-Setosa (pred)\")\n",
" axs.plot(x_test[y_pred==0, 0], x_test[y_pred==0, 1], \"o\", color='lightblue', label=\"Autres (pred)\")\n",
" \n",
" axs.plot([box[0], box[1]], [a*box[0]+b, a*box[1]+b], \"k--\", linewidth=2)\n",
" axs.set_xlabel(\"Petal length (cm)\", labelpad=15) #, fontsize=14)\n",
" axs.set_ylabel(\"Petal width (cm)\", labelpad=15) #, fontsize=14)\n",
" axs.legend(loc=\"lower right\", fontsize=14)\n",
" axs.set_xlim(box[0],box[1])\n",
" axs.set_ylim(box[2],box[3])\n",
" pwk.save_fig('01-perceptron-iris')\n",
" plt.show()\n",
" \n",
"plot_perceptron(x_train,y_train, x_test,y_test)"
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"End time is : Wednesday 16 December 2020, 21:02:00\n",
"Duration is : 00:00:01 537ms\n",
"This notebook ends here\n"
]
}
],
"source": [
"pwk.end()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"<img width=\"80px\" src=\"../fidle/img/00-Fidle-logo-01.svg\"></img>"
]
}
],
"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",
}
},
"nbformat": 4,
"nbformat_minor": 4
}