Newer
Older
1
2
3
4
5
6
7
8
9
10
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
{
"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 --> A simple perceptron, with the IRIS dataset.\n",
"<!-- 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",
"\n",
"\n",
"</style>\n",
"\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"FIDLE 2020 - Practical Work Module\n",
"Version : 0.4.0\n",
"Run time : Saturday 22 February 2020, 21:46:23\n",
"TensorFlow version : 2.0.0\n",
"Keras version : 2.2.4-tf\n"
]
}
],
"source": [
"import numpy as np\n",
"from sklearn.datasets import load_iris\n",
"from sklearn.linear_model import Perceptron\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"\n",
"import os,sys\n",
"\n",
"sys.path.append('..')\n",
"import fidle.pwk as ooo\n",
"\n",
"ooo.init()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 2 - IRIS Data Recovery\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"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Examples :\n",
"Length Width Iris Setosa (0/1)\n",
" x1 x2 y\n",
" 1.4 1.4 1\n",
" 1.6 1.6 1\n",
" 1.4 1.4 1\n",
" 1.5 1.5 1\n",
" 1.4 1.4 1\n",
" 4.7 4.7 0\n",
" 4.5 4.5 0\n",
" 4.9 4.9 0\n",
" 4.0 4.0 0\n",
" 4.6 4.6 0\n",
"\n",
"X shape : (150, 2)\n",
"y shape : (150,)\n"
]
}
],
"source": [
"X0,y0 = load_iris(return_X_y=True)\n",
"\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",
"print('Examples :')\n",
"print('Length Width Iris Setosa (0/1)')\n",
"print(' x1 x2 y')\n",
"for i in range(45,55):\n",
" print(f\" {X[i][0]:3.1f} {X[i][0]:3.1f} {y[i]}\")\n",
"print(f'\\nX shape : {X.shape}')\n",
"print(f'y shape : {y.shape}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 3 - Get a perceptron"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Perceptron(alpha=0.0001, class_weight=None, early_stopping=False, eta0=1.0,\n",
" fit_intercept=True, max_iter=100, n_iter_no_change=5, n_jobs=None,\n",
" penalty=None, random_state=82, shuffle=True, tol=0.01,\n",
" validation_fraction=0.1, verbose=0, warm_start=False)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pct = Perceptron(max_iter=100, random_state=82, tol=0.01)\n",
"pct.fit(X, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 4 - Prédictions"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Petal : length=2.0, width=2.0 => is setosa : 1\n",
"Petal : length=5.0, width=5.0 => is setosa : 0\n"
]
}
],
"source": [
"X_pred = np.array( [ [2.0, 0.5], [5.0, 1.5] ] )\n",
"\n",
"y_pred = pct.predict(X_pred) \n",
"\n",
"for i,x in enumerate(X_pred):\n",
" print(f'Petal : length={x[0]}, width={x[0]} => is setosa : {y_pred[i]}')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 5 - Visualisation"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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rH9+yKZvdh18rc1RjTDPOoFu7VoAkVf8vPgtMVl/00xllZWVXHvttXz44Yf06tWLuXPn0qZNG7/DEpEkU71zU00VlTYVlU7npkfH9Enof68PPObSrFmzmOa57rrrWLZsGX//+9/p3LkzO3bsYMWKFezYscOjSINDzwimmecWf8ot01YckgQCbPpmF7dMW8Fziz/l3pdXc++r7x9WPHpXaTn3vvo+f3hmOdc9voR5q79iz/5ybGDP/nLmrf6K6x5fwqrPtkWMY9Vn22KeQ6KXkZHBnDlz6NSpEx9++CEFBQW8++67foclIkkmWTo3XXnllZx77rncc889HHPMMRxzjPPoUb9+/bj++usPjps9ezYnnngiubm5NGvWjNNPP52tW7fWOe9rr73Gbbfdxrnnnkvbtm056aSTGDt2LOPGjTs4xrZt7r33Xtq3b09ubi5dunRh2rRpL1KtdwAAIABJREFUB99v187ZiNi9e3cMw6Bfv36A8wv3pEmTOPbYY8nOzqZLly68+uqrhxz/rrvuok2bNmRnZ3P00Ufzq1/96uB7b775Jn369OEnP/kJzZo146yzzmLdunX1v4gRKBFMI2u++JZn3l4fdswzb6+P2Ev4/U07Yurvm+49gv3Wtm1b3nnnHfr378/XX39N3759D/uPlIikt2g6N8Xb22+/zQcffMCbb77JwoULD3v/66+/5pJLLuGKK65g3bp1LF68mMsvvzzsnEcffTRvvvkmO3furHPM+PHjefLJJ3nkkUf46KOPuO2227j22muZO3cuACtXrgScxO3//u//mD17NgB///vfue+++7jnnntYu3YtF1xwAcOHD2fNmjUAzJo1iylTpmBZFuvXr2fOnDmceuqpB4+7e/dufve737Fy5UoWLVpEkyZNGDp0KPv374/uwrmkW8NpxG2f4Fgd+C2xrrZu0fymmcqt4fzUtGlT5s2bx7XXXsvUqVO54IILePjhhzFN0+/QRCQJJFPnppycHJ566qk6W2aWlJRQVlbGhRdeePBRl86dw/+/4/HHH2fUqFG0aNGCLl26cNpppzFs2DDOPPNMwEnG7r//fubPn0+fPn0AZwVw5cqVPPLIIwwZMoSjjjoKgObNm3P00UcfnHvKlCncdNNNXHrppYCz+rd48WKmTJnCtGnT2LRpEz/96U8ZNGgQDRo0oHXr1oc8YzhixIhDYn366adp3LgxK1eupHfv3tFcOle0IphGat4OjpdIvyUm02+a6SwrK4unnnqKyZMnEwqFOO644/wOSUSSRDJ1burcuXPYvuldu3Zl4MCBdO7cmREjRlBYWMg333wDwJdffkmjRo0Oft19990A9O3blw0bNlBUVMTFF1/Mp59+yqBBg7j22msB+OijjygtLeXss88+5POFhYV8/vnndcby/fffU1JSQq9evQ55vXfv3nz00UcAXHTRRZSWltKuXTt+/etf89JLL7Fv376DYz///HMuvfRS2rdvT+PGjWnVqhWVlZV8+eWX9buAESgRlLgI91tiMv2mme4Mw+COO+7g448/5uyzzz74uqoJiKS3ZOrcdMQR4TejhEIh5s+fz/z58znxxBN58skn6dixI++//z55eXmsWbPm4Nd111138HMNGjSgT58+3HrrrcyfP59Jkybx+OOPs3HjRiornbtWr7/++iGf//DDD5k/f37EmGtr6XfgtWOPPZZPPvmExx57jMaNG3PjjTdy8sknH2wRN3ToUL755hsee+wxVqxYwerVq8nMzIzbrWElghIX4X5LTKbfNMXRvn37g/+8cOFCevbsSUlJ+GdFRSR1Ba1zk2EY9OzZkz/+8Y+sWrWKvLw8pk+fTmZmJh06dDj4FW638fHHHw/Arl27OP7448nOzmbTpk2HfL5Dhw4Hbz8fKNJfUfHjzurGjRuTl5fH0qVLD5l76dKlB+cH53b3kCFDeOCBB1i1ahUffvghy5YtY/v27axbt47bb7+dgQMH0qlTJ3744QfKy+O3MKL/06aRNkc1Ssjt4Ui/Jfbvkse81V+FvT2cjj2Ck4Ft29x66628++679OjRg7lz53LiiSf6HZaIJNiBzk2R6ggmQ6mv4uJi3nrrLc466yxatWrF6tWr+eqrrw5JvGrq168fI0eO5JRTTqF58+Z89NFH3H777fz85z+nU6dOhEIhbrrpJm666SZs26Zv377s2rWL4uJiMjIyGDNmDC1btiQ3N5d//vOftG3blpycHJo0acLNN9/MnXfeSceOHTn55JOZNm0aS5Ys4d///jcAU6dOpby8nB49etCoUSOmT59OgwYN6NixIz/5yU9o0aIF//u//8uxxx7Lli1buPnmm8nMjF+6phXBNOK2T3CsIv2WGLTfNNOJYRjMmzePXr16sXnzZnr37s0///lP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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"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",
"\n",
"fig, axs = plt.subplots(1, 1)\n",
"fig.set_size_inches(10,6)\n",
"axs.plot(X[y==1, 0], X[y==1, 1], \"o\", label=\"Iris-Setosa\")\n",
"axs.plot(X[y==0, 0], X[y==0, 1], \"o\", label=\"Autres\")\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",
"\n",
"plt.show()"
]
},
{
"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",
"version": "3.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}