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
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
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
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
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
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Machin Learning with Python\n",
"\n",
"Machine Learning (ML) is a field where we attempt to teach computers to do complex tasks. How do you define a task though? We use computers for a lot of different things, as such we can also teach them to do a lot of different things. Some examples include:\n",
"- Image Recognition - you have probably used your smartphone to take a picture, but how does it detect faces in pictures? That is done via ML and some more interesting examples nowadays include detecting objects in autonomous cars (It is a bit scary in all fairness)\n",
"\n",
"<img src=\"https://miro.medium.com/max/1028/1*MnbUSSXG1IDS9mXC0H8cKQ.png\" alt=\"drawing\" width=\"400\"/>\n",
"\n",
"\n",
"- Speech Recognition - have you ever used Alexa, Siri or Google Assistant? Well all of them are based on ML - computers learning to understand our speech\n",
"- Medical diagnosis - ML can help with diagnosis of diseases. For example, if you take a CT scan of a patient's brain, you can then put the image through a ML algorithm which can tell you if the patient has a brain tumor.\n",
"- and much more...\n",
"\n",
"In this notebook we will use the package `sklearn` to do some basic machine learning. Namely, we will make a teach a computer to recognise handwritten digits and predict house prices."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. Linear Regression\n",
"Let's kick-off with the **Linear regression**. It is an *supervised method* which tries to predict never-before seen data based on data it has seen before.\n",
"\n",
"A simple example would be: Imagine you are budgeting for renting a flat around George Square in Edinburgh but you don't know how much it might cost. Luckily, you have a couple of frinds who live in that area and you ask them how much they are paying based on how many bedrooms they have\n",
"- friend A has 1 bedroom and is paying £560\n",
"- friend B has 3 bedroom and is paying £1200\n",
"- friend C has 1 bedroom and is paying £540\n",
"\n",
"Based on that, you can find how much you expect to be paying for a 2 bedroom flat by simply averaging the price of a bedroom in that area.\n",
"\n",
"$$ \\dfrac{A + B + C}{Num. of bedrooms} $$\n",
"\n",
"\n",
"$$ = \\dfrac{560 + 1200 + 540}{5} $$\n",
"\n",
"\n",
"$$ = £460 $$\n",
"\n",
"Therefore you should expect to be paying 2x460 = £920 for a 2 bedroom flat\n",
"\n",
"You just performed *regression* there. You predicted how much a 2-bedroom flat might cost to rent in the future based on data you have from the past.\n",
"\n",
"Now let's see how we can do that in Python. For that we will be using the package `sklearn`."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First we need to insert the data we just defined above"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Price of flat')"
]
},
"execution_count": 76,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"price = np.array([[560], [1200], [540]])\n",
"bedrooms = np.array([[1], [3], [1]])\n",
"plt.scatter(bedrooms, price)\n",
"plt.xlabel(\"Num of bedrooms\")\n",
"plt.ylabel(\"Price of flat\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we want to fit a linear regression through it which will predict how much flats will cost to rent.\n",
"\n",
"First we have to define the model. You can treat the model as the container for your Linear Regression and all of its parameters. Then we will fit it to the data"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,\n",
" normalize=False)"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.linear_model import LinearRegression\n",
"\n",
"# Create the model\n",
"linreg = LinearRegression()\n",
"\n",
"# Learn to predict\n",
"linreg.fit(bedrooms, price)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's predict how much flats with 1 to 6 bedrooms will cost. First we define the bedrooms we want in `bedrooms_prediction` and then we predict the prices of these flats with `linreg.predict()`"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"bedrooms_prediction = np.array([[1], [2], [3], [4], [5], [6]])\n",
"prices_prediction = linreg.predict(bedrooms_prediction)\n",
"\n",
"# plot the results\n",
"fig = plt.figure()\n",
"plt.scatter(bedrooms, price, label=\"Input data\")\n",
"plt.plot(bedrooms_prediction, prices_prediction, color=\"r\", label=\"Linear fit\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Huh, from the graph, you can see our initial esitmate was fairly correct. Now we can also see what the prices would be even for a 4 5 and 6 bedroom flat. £2000 is a lot of money for a flat!\n",
"\n",
"This example is a fairly trivial one but imagine if you had a lot more information about the flats like number of bathrooms, floor, distance from closest shop, etc.. Then predicting by hand will become way more difficult but Linear Regression would perform just as well!\n",
"\n",
"You will find out how well exactly in the next exercise!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercise 1 - Linear regression for predicting house pricing <a name=\"ex1\"></a>\n",
"Here you will perform linear regression on a dataset of housing prices.\n",
"\n",
"Let's first load the dataset `data/kc_house_data_min.csv`. It has the following columns:\n",
"- **price** in US dollars\n",
"- number of **bedrooms**\n",
"- number of **bathrooms**\n",
"- **sqft_living** - square feet of living space\n",
"- **sqft_lot** - square feet of the full house\n",
"- number of **floors**\n",
"- **waterfront** - 1 if there is one; 0 otherwise\n",
"- **view** - 1 if there is a nice view; 0 otherwise\n",
"- **condition** rating of the house from 1 to 5\n",
"- **grade** - overall grade given to the housing unit, based on King County grading system. From 1 to 13"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(21613, 10)"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = np.loadtxt(\"data/kc_house_data_min.csv\", delimiter=\",\", skiprows=1)\n",
"data.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we want to seperate the data into the description of the houses and the predictions for them. In our case, we are trying to predict the house prices and all other columns are just the description of the houses. Seperate the data below:"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"# [ENTER CODE IN THIS BLOCK]\n",
"prices = data[:, 0]\n",
"descriptions = data[:, 1:]\n",
"\n",
"\n",
"#### CHECKING CODE # DON'T CHANGE ####\n",
"assert prices.shape == (21613,) , \"Price variable has wrong shape\"\n",
"assert descriptions.shape == (21613,9), \"Descriptions variable has wrong shape\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now you can just apply linear regression as it was shown in the example above!"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,\n",
" normalize=False)"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# [ENTER CODE IN THIS BLOCK]\n",
"\n",
"from sklearn.linear_model import LinearRegression\n",
"# Create the model\n",
"linreg = LinearRegression()\n",
"# Learn to predict\n",
"linreg.fit(descriptions, prices)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"OK, now let's see how good are our predictions! Create some arbatrary description of an imaginary house using the fields defined [earlier](#ndarray)! You can use `linreg.predict()` for that.\n",
"\n",
"*Note: Data you input into the linear regression model must be of shape (1,9)!*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# [ENTER CODE IN THIS BLOCK]\n",
"# Create a description of a house"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([477089.02301796])"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# [ENTER CODE IN THIS BLOCK]\n",
"# Predict it's price"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2. Logistic regression\n",
"\n",
"Logistic regression is in many ways similar to Linear regression. However, it's major difference is that it is a **classifying machine learning algorithm**. Instead of outputting a numerical prediction, **logistic regression outputs a label**. But wait, hold on, what is a label?\n",
"\n",
"Imagine that you are driving a car - your goal is to reach your destination safely without causing any incidents. For that you need to look around as you are driving for other cars, pedestrians, roads, dogs, cats, and etc... Based on how you classify those objects, you take different actions. If you see a road you think to yourself \"I should make sure I am driving on that\" but if you see a pedestrian you think to yourself \"Better try to not run over that person\".\n",
"\n",
"This is pretty much how autonomous cars work as well, but first they need to identify and classify objects on the road. Say that your machine learning algorithm can identify a [person, car, traffic light, handbag, backpack, truck], then you give it an image, it tries to identify objects and assign a label for each object. \"Hey, you look like a human, I'll label you a `person`\"\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Logistic Regression is one of the ways you can achieve the above. Let's first have a look at a simple example"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f715a4e8198>"
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD8CAYAAAB0IB+mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAHwFJREFUeJzt3X+QFOWZB/Dvw7q4iyGs8sOTXRRCWST8yoKr8SRaIIkolooiRHPnSVQg5Y9E6wqDMeVtvDJswkVSnsYrTYxYOTWryLqeOQhCDDG5SxiysPzwQGKWuAMq4kFOWcO4vPfHzMLubM9MT3e//b7d/f1UUcs2w/Q7vbPPvP2+z/u8opQCERHF3wDTDSAionAw4BMRJQQDPhFRQjDgExElBAM+EVFCMOATESUEAz4RUUIw4BMRJQQDPhFRQpxkugG9DRs2TI0ePdp0M4iIImXz5s3vKaWGl3qcVQF/9OjRSKVSpptBRBQpIrLXzeM4pENElBAM+ERECRFIwBeRJ0TkXRHZ3uvYaSKyTkTeyH09NYhzERGRN0GN4T8J4GEAT/U6thTAeqVUk4gszX3/jYDOR0Qxlclk0NnZiY8++sh0U6xTVVWFuro6VFZWevr/gQR8pdRGERmdd/gqANNzf18J4FUw4BNRCZ2dnRg8eDBGjx4NETHdHGsopXDw4EF0dnZizJgxnp5D5xj+6Uqp/QCQ+zrC6UEiskhEUiKSOnDggMbmEFEUfPTRRxg6dCiDfR4RwdChQ33d+RiftFVKPaaUalBKNQwfXjKNlIgSgMHemd/rojPgvyMiZwBA7uu7Gs9FtmpvBlZMBBprsl/bm023iCixdAb8VgA35v5+I4AXNZ6LbNTeDLz0NeDwWwBU9utLX2PQJ+u9/fbbuO666zB27FiMHz8es2fPxu7du9HR0YGJEydqOefGjRsxdepUnHTSSXj++ee1nCOotMxnAPwXgHEi0ikiNwNoAvBFEXkDwBdz31OSrL8fyHT1PZbpyh4nspRSCldffTWmT5+OP/7xj9i5cye+853v4J133tF63jPPPBNPPvkkvvzlL2s7R1BZOtcX+KeZQTw/RdThzvKOE3nQ0pbG8rW7sO9QF0bWVGPJrHGYM6XW8/P98pe/RGVlJb761a8eP1ZfXw8A6OjoOH6so6MDN9xwAz788EMAwMMPP4wLLrgA+/fvx5e+9CX85S9/wccff4xHH30UF1xwAW6++WakUimICG666Sbcddddfc7bU0dswAB9Ay9W1dKhmBlSlxvOcThOFICWtjTueWEbujLdAID0oS7c88I2APAc9Ldv345zzjmn5ONGjBiBdevWoaqqCm+88Qauv/56pFIpPP3005g1axbuvfdedHd348iRI9iyZQvS6TS2b8+uTT106JCntvllPEuHYmzmfUBldd9jldXZ40QBWL521/Fg36Mr043la3dpP3cmk8HChQsxadIkzJs3Dzt37gQAnHvuufjJT36CxsZGbNu2DYMHD8anPvUpvPnmm7jjjjuwZs0afPKTn9TePicM+KTP5PnAFQ8BQ0YBkOzXKx7KHicKwL5DXWUdd2PChAnYvHlzycetWLECp59+OrZu3YpUKoWjR48CAC666CJs3LgRtbW1uOGGG/DUU0/h1FNPxdatWzF9+nQ88sgjuOWWWzy3zw8O6ZBek+czwJM2I2uqkXYI7iNrqh0e7c7FF1+Mb37zm3j88cexcOFCAMCmTZtw5MgRnHXWWccfd/jwYdTV1WHAgAFYuXIluruzdxp79+5FbW0tFi5ciA8//BB/+MMfMHv2bAwcOBBz587F2LFjsWDBAs/t84M9fCKKrCWzxqG6sqLPserKCiyZNc7zc4oIVq9ejXXr1mHs2LGYMGECGhsbMXLkyD6Pu/XWW7Fy5Uqcf/752L17N0455RQAwKuvvor6+npMmTIFq1atwte//nWk02lMnz4d9fX1WLBgAZYtW9bvvJs2bUJdXR2ee+45LF68GBMmTPD8Ggq+NqVU4E/qVUNDg+IGKETJ9vrrr+Mzn/mM68cHnaVjO6frIyKblVINpf4vh3SIKNLmTKmNdYAPEod0iIgSggGfiCghGPCJiBKCAZ+IKCEY8EmPYmWRWTKZyAgGfNtFMTgWK4vMkskUASbKIz/44IMYP348Jk+ejJkzZ2Lv3r2Bn4MB32ZRDY7FyiKzZDJZzlR55ClTpiCVSqG9vR3XXnst7r777sDPwYBvs6gGx2JlkVkymYIW8F1wofLIF154YZ/HdXR04MILL8TUqVMxdepU/Pa3vwUA7N+/HxdddBHq6+sxceJE/PrXv0Z3dzcWLFiAiRMnYtKkSVixYkW/886YMQODBg0CAJx//vno7Az+d4ILr2wW1eBYqiwySyZTUHrugns6Rj13wYDnGk42lEf+8Y9/jMsuu8xT+4thwLdZVOvJz7yv7y8h0LcscrF/IypHsbtgzUX7MpkMbr/9dmzZsgUVFRXYvXs3gGx55JtuugmZTAZz5sxBfX19n/LIl19+OS655JKCz/vTn/4UqVQKv/rVrwJvM4d0bBbVevLFyiInvWRyFCfhbabhLthkeeRXXnkFDzzwAFpbW3HyySd7fg2FsIdvs54guP7+7Bt4SF022EchOBYri5zUkskahh8ST8NdsKnyyG1tbVi8eDHWrFmDESNGeG5/MQz4tktqcIwjg8MPsVVq+NCDnvLId955J5qamlBVVYXRo0fjBz/4QZ/H3XrrrZg7dy6ee+45zJgxo0955OXLl6OyshKf+MQn8NRTTyGdTuMrX/kKjh07BgCO5ZGXLFmCDz74APPmzQOQ3dS8tbXV8+twfG0sj0wUksYhBf5BgEYze5zaqNzyyGhvjuZdsEcsj0xku/ZmAALAoYNl+yS87XgX7BonbYnCsP5+OAZ7iP2T8BQbDPhEYSiYNaLYO3Vg01CzTfxeFwZ8co8phd4VGrYZMircdkRAVVUVDh48yKCfRymFgwcPoqqqyvNzcAyf3GFKoT8askniqq6uDp2dnThw4IDpplinqqoKdXXe53wY8MkdphT6E+U1FSGrrKzEmDFjTDcjlhjwyZ2o1vWxSdyzSRKWHhlFHMMndwqOQTOlkBDdUt4Jw4BP7kS1rg+FI6qlvBOGAZ/c0VX0zPbMH9vbZwsO+UUCx/DJvaDHoG3P/LG9fTaJainvhGEPn8yxfRjA9vbZhEN+kcCAT+bYPgxge/tskvR9DiKCQzpkju3DAIXaJwOyY/o2pB7alAoZ97TTGGAPn8yxfRjAqX0AoLphReohUyGpTAz4ZI7twwD57ZOK/o8xOabPOQYqk/YhHRHpAPB/ALoBfOymSD8liO3DAL3b11jj/BhTY/qcY6AyhdXDn6GUqmewp0izbbWxbe0h63FIh8gt2+YcbGsPWS+MgK8A/EJENovIovx/FJFFIpISkRTLoZLVbJtzsK09ZD3tm5iLyEil1D4RGQFgHYA7lFIbnR7LTcyJiMrndhNz7T18pdS+3Nd3AawGcJ7ucxKRhViXyDitAV9EThGRwT1/B3AJgO06z0kUOgay0rhmwAq6e/inA3hNRLYC+D2Al5VSazSfkyg8DGTucM2AFbTm4Sul3gTwWZ3nIDKKWz+6wzUDVmBaJpEfOgJZHIeIuGbACgz4RH4EHcjiOkTENQNWYMAn8iPoQKZ7rNvU3QPXDFiB5ZGJ/OgJWOWWKC5U1ljnWLfpHbxsr5uUAAz4RH6VG8iKBV6dewRwgjnxOKRDFLZigVfnWLfbuwfdwz5xnJSOCPbwicJWLPB6HSJyw83dg+5hH9PDSgnHHj5R2Epl9kyeD9y1HWg8lP0aVCB0c/ege9KYC7CMYsAnZ7zt9qfY9TOVougiU0bpXiDFBVhGcUiH+uNttz+lrp/OYZtSikwwt7Slca4ailp5r/8/BrVAyvaN62OOPXzqj7fd/ri5frqGbXxYvnYXvpuZjyNqYJ/jXTg5uLsPLsAyigGf+uNttz8RvX77DnWh9djnsTRzCzqPDcMxJeg8NgxLj94c3AcSF2AZxSEd6i/s2+5Ci5CiKqLDFiNrqpHOBf3Wo58/fry2prrI//KAC7CMYQ+f+pt5HzCgsu+xAZV6brvjWDsmosMWS2aNQ3VlRZ9j1ZUVWDJrXLAnYkKAMezhkzOR4t8HJY6rP01OyvowZ0otgOxY/r5DXRhZU40ls8YdP56vpS3t+rHHMSHAKO172paDe9qGpNQQyoqJBYYkRmUnGIPUWIPsPvf5JDuhSVZqaUvjnhe2oSvTffxYdWUFll0zqXjQD/O9lSDW7GlLlnEzhBLmpCPrpEfS8rW7+gR7AOjKdGP52l3F/2NEJ7TjggE/adykDIYZhCM63m21EMbI9x3qKuv4cfyAN4oBP0qC+EV208MKMwgzTS9YIU2CjyyQuVPo+HH8gDeKk7ZREdRkl5uUwbAnHZmmd0J7M/Cf3wC63s9+X30acNl33V+fkCbBl8wa5ziGXzKjJ6IT2nHBgB8VQf0iz7yv7wcH4NzDcgjCnrIyyL32ZqDlVuBY5sSxrveBF2/L/t3NzzmkMfJyM3r64Ae8MQz4URHUL7LHHlZ+Vkb6UBdeW/1DXPKLVRjU9TZ7akFYf3/fYN+j+6j7D/YQF33NmVLLD/yIYcCPiiB/kT30sPKzMq4c8Brulx9hUNfR7AHmU/tX7MPb7Qd7gTu4TWPvwJ1NG3h3lnCctI0Kw5Nd+dkXd5/UjEFytO+DWGDNn2If3m4/2B0mwTdN+jb+YdNZSB/qgkL27uyeF7ahpS0dRKspQhjwo8JwNkt+9sVIpxK6QKzyqVva0pjWtAFjlr6MaU0b9AdIp5IWAFAxsLwP9rxKnHfuPNtbzjzFDod0osTgZFd+VsY+NQx1OuumG+Y0Z3HPC9sAQN9QSM/P1k+WjgPPOfMUOwz45Ep+VsaPBv49vqX+DSd1f3TiQQEOMZnOCCq2klRrOzR8qPdUwcw3QAQtbWmO5ScIAz651jcr43KgfYKWfGojves8ceoVO+XMA0C3UqFfVzKLAZ+80zTEZKx33UuhXnHJlaRhcrmPQM81+8fmrejOK5YY6HWN274GMcRJW7KODb3r0GrDe1VmCYU5U2pxrEBl3ECuaxz3NYghBnyyjuc6LQGaM6UWy66ZhNqaagiyuz6VLP0bJg/7Dmu9rtwHORI4pEPW8VynJWBWryT1sPJa63Vl2eNIYMAn6/iq05IUHlZea72uEd3HN2m44xVRFOVXTwWyabGmSkuX2R7Tabdx43bHK/bwKTqYBXKCbWWGy2iPDWm3ScUePkWDbT1a8mxa0wbHlNfammr8ZunFBloUfdzTluKFWSCxYUPabVJpD/gicqmI7BKRPSKyVPf5KKaYBRIbNqTdJpXWgC8iFQAeAXAZgPEArheR8TrPSTHFza9jo9CithmfHh5uddIE0t3DPw/AHqXUm0qpowCeBXCV5nNSHHHz69hwWtQ295xarNqcZs1+zXRn6dQC6J2c2wngc70fICKLACwCgDPPPFNzcyiybMtKCVICs4/yF7VNa9pgvH5SEugO+OJwrE9akFLqMQCPAdksHc3toSiL4+bX+dlHCd0qkhO54dA9pNMJYFSv7+sA7NN8TtIo9F2g4o7ZRwA4kRsW3QF/E4CzRWSMiAwEcB2AVs3nJE16FsxwnDVAzD4CEIHqpDGhNeArpT4GcDuAtQBeB9CslNqh85ykT7E69eQRs48ARKA6aUxoL62glPo5gJ/rPg/px3FWDWbe57yCOIHZR1ZXJ42JeK20bW8GVkwEGmuyX7n5QqA4zqrB5PnZ8hBDRgGQ7Nfe5SKCfk/zdyTR4lM8jdkO2tlSp95RlFMbC2UfBf2e5u9I4sWnh89sB+2sHWeN6/Z6Qb+n+TuSePHp4TPbIRRWjrMWC2RR7rkG/Z7m70jixSfgc8edeCs2ZBPXQBb0e5q/I1YKczOY+AzpsNZKfJUasolramPQ72kvz8dJXq3CXtsSn4BfKtuBoqvU2LPpD3tdQTHo93S5zxfXuRGLhL22JT5DOkA8a61Q6SEbk4XVdGe+BP2eLuf54jo3YpGw17bEK+BTPLkZezb1YR/noBjXuRGLjKypdtzuUdfalvgM6VB8GRqycVUoLs5BMa5zIxYJu4YQe/hkPwNDNj2TaT3jqz2TaQD6ZlCUuPsIKgMjzEyO41j2Qbuen2FYP1tRyp4S9A0NDSqVSpluBhGmNW1wvNWuranGb5ZefOJA/hg+kA2KVzyElu5pjiuTy12slv/h4/V5PInyCuYEEZHNSqmGUo/jkA6VJyFpeq4n04pkvvjOwMhd6ytfnIB1chuuHPCat+fxY/J84K7tQOOh7FcG+0jjkA65l6BaLGVNphWYMPaVgdHrWg8AUDfgPTRV/gjIAK3HPu/+eYh6YQ+f3EtQLZYgJtN8VRd1uNaD5CjuPunEHVVYVUq5y1l8sIdP7rQ3O09OApHPSCk2IepnMs1XddEC13SkHHT9PEFM9DpNXi95fisaW3fgcFcmtAnkoF5L6BPflmHAp9J6hhcKiXCaXqlsHD8BwdeHRoHsn31qKGpdPI/rLKMSnOYhMt0Kh7oyvp63HN9q2YZ//+8/oye9xMs5g7oeUccsHSptxcTCvftcRkpUx/BdZ+OErUj2j5trHdTrGrP0ZbiJELquV0tbGnf9bItjG8o5p7U/54AwSyeKbM2AKTZkE+FgD1i8baPPOjpBvS638wS6rtfytbsKfuCUc05rf84h45COLWzOgCm4uGiU+bb5FPbS9rL4KBcR1OtymocodD4digXkcs5p9c85ROzh28LmDBjT1Sg1Cntpe1iCel35u5ydOqgSlQOk3/PO+PRwLZk8hQKyAGW9lrj+nMvFHr4tdNZk8bta0mQ1Ss3KnliNyMrTIJfs509e52e7zPj0cKzanNYyIep0hyEA/u78M8t67rBLGNiKk7a2KDQxOmRUdoWjVz4n/6gXw9fS1rRC3ROitr5um7idtGUP3xa6ClXFuXxv2AxeS5vTCnVPiFq5j3JEcQzfFrp27Ipz+d6wGbyWfuvy6Fwt62tFMYWKPXyb6NjEgxtXB8fgtfTTiy737qDcIRRfK4opVOzhx12MM2xCZ/Ba+ulFl3N34GVT7fxMntqa6nBKN1PZ2MOPuxhn2ITO4LX004su5+6g2IdDsQDOcfZoYMBPAm7uHhxD13LOlFqk9r6PZ373FrqVQoUI5p7jLsiWs+iIK1LjjUM6RBHQ0pbGqs1pdOfSqLuVwqrNaVeTr+UsOip36Iilk6OFAZ8oAvxk6ZQzxl7Oh4OX8X4yi0M6RBHgd6jF7Rh7OStSC30IffulHZEfz4/rYi8GfKIymAoEYRb/cvvhUOjD5n+PZNDSlo5sgLR5kZtfHNIhcsnkEIaNxb+KfdiEssG6Jr43n7cYAz6RSyYDgYlc91ITssU+bKKc1RPnTCUO6RC5ZDoQhJnr7mZYY86UWjS27ji+3WFvUS6rEOfa+ezhE7mUpJoxbu9mGq+cYN1Qk182Dp8FRVvAF5FGEUmLyJbcn9m6zkVUUIDbRoYZCEznt7u9m4ljWYU4vqYeuod0Viil/kXzOYic+dw20ikjZ9k1k7Rn6diQJRLEsEaUUxvjWipC2wYoItII4INyAn6iN0Ch4PnYVCY/6ALZ3nwYPT3dG4q40dKWxpLntyLTfSI+VFYIll/72X67Xzldp7nn1PbZBavneFx6yrZxuwGK7jH820WkXUSeEJFTnR4gIotEJCUiqQMHDmhuDiWKj/r1JjNyTE8OH5ffF3ToGxa6Ts/87i3H43f+bAtLMBjkK+CLyCsist3hz1UAHgUwFkA9gP0Avu/0HEqpx5RSDUqphuHDh/tpDlFfherUu6hfbzLo2jA5vHztLmSO9Y3wmWOq3wdeoevRXWTkgCUYzPEV8JVSX1BKTXT486JS6h2lVLdS6hiAxwGcF0yTiVzyUb/eZNC1IUvE7QdeoetRIVL0+eOykClqdGbpnNHr26sB+NiJm8gDH9tGmgy6NmSJuP3AK3Sdrv/cqH7H88VhIVPU6MzS+Z6I1CM78tcBYLHGcxE581i/vpwiYjqYzhJxu+FKsevUcNZpWL52l+MENBDP9Qu205al4wWzdMhm5aQZRjklsUdQr8FkxlNSuM3SYWkFIhfKyY23IY8+CEHdZZi+W6ITGPCJXChnr1ev+8LGmekhKspiLR0iF8pJ07Qmj54oDwM+kQvlpGnakEdP5IQBn8iFctI0bcijJ3LCMXwiF8qZeOQkJdmKaZlERBHHtEyKtTjkuROFjQGfIicuee5EYeOkLUWOydLFRFHGgE+Rwzx3Im8Y8ClymOdO5A0DPkUO89yJvOGkLUUO89yJvGHAp0hiMS6i8nFIh4goIRjwiYgSggGfiCghGPCJqLj2ZmDFRKCxJvu1vdl0i8gjTtoSUWHtzcBLXwMyuUVth9/Kfg942hyezGIPn4gKW3//iWDfI9OVPU6Rw4BPRIUd7izvOFmNQzpEOSy57GBIXXYYx+k4RQ57+EQ4UXI5fagLCidKLre0pU03zayZ9wGVeTWKKquzxylyGPCJwJLLBU2eD1zxEDBkFADJfr3iIU7YRhSHdIjAkstFTZ7PAB8TDPhEyJZWTjsEdxtKLid5biHJr10HDulQdAW4IMjWkstJnltI8mvXhQGfAtfSlsa0pg0Ys/RlTGvaoOcXtGdB0OG3AKgTC4I8Bv05U2qx7JpJqK2phgCoranGsmsmGe9NJnluIcmvXRcO6VCgQttgvNiCII/jzTaWXE7y3EKSX7su7OFToELrlSVkQVCSt3NM8mvXhQGfAhVar6zQwp+YLQiydW4hDEl+7bow4FOgQuuVJWRBkK1zC2FI8mvXRZRSpttwXENDg0qlUqabQT7kj+ED2V6Zll/U9ubsmP3hzmzPfuZ9zBenRBKRzUqphlKP46QtBSrUDca5IIioLAz4FDgbs11IHy6Oig5fY/giMk9EdojIMRFpyPu3e0Rkj4jsEpFZ/ppJRDbi4qho8Ttpux3ANQA29j4oIuMBXAdgAoBLAfxQRCr6/3ciijIujooWXwFfKfW6UsrpJ3sVgGeVUn9VSv0JwB4A5/k5FxHZh4ujokVXWmYtgN67JnTmjhFRjHBxVLSUDPgi8oqIbHf4c1Wx/+ZwzDH/U0QWiUhKRFIHDhxw224isgAXR0VLySwdpdQXPDxvJ4BRvb6vA7CvwPM/BuAxIJuH7+FcRIlhW0ZMqGm45JuutMxWAE+LyIMARgI4G8DvNZ2LKBFCK0xXJqbhlmbLB7XftMyrRaQTwN8CeFlE1gKAUmoHgGYAOwGsAXCbUqq78DMRUSnMiIkmm1JXffXwlVKrAawu8G8PAHjAz/MT0QlBZsTY0uNMgmIf1GFfcxZPI4qIoDJibOpxJoFNqasM+EQREVRGDIeGwmVT6ioDPlFEBFUu2KYeZxLYlLrK4mlEERJERszImmqkHYI7F0vpYVPqKgM+UcIsmTXOcc8CLpbSx5bUVQZ8ooSxqcdJ4WLAJ9LMxhRIW3qcFC4GfCKNbF0dS8nELB0ijZgCSTZhD59II5MpkDYOJZFZ7OETaWRq0Q1X05ITBnwijUwtuuFQEjnhkA6RRqZSILmalpww4BNpZiIFkqtpyQmHdIhiyKb6LWQP9vCJYoirackJAz5RTHE1LeXjkA4RUUIw4BMRJQQDPhFRQjDgExElBAM+EVFCiFLKdBuOE5EDAPa6fPgwAO9pbE4U8Zr0xevRH69Jf3G4JmcppYaXepBVAb8cIpJSSjWYbodNeE364vXoj9ekvyRdEw7pEBElBAM+EVFCRDngP2a6ARbiNemL16M/XpP+EnNNIjuGT0RE5YlyD5+IiMoQqYAvIvNEZIeIHBORhrx/u0dE9ojILhGZZaqNJolIo4ikRWRL7s9s020yRUQuzb0X9ojIUtPtsYGIdIjIttx7I2W6PSaIyBMi8q6IbO917DQRWScib+S+nmqyjTpFKuAD2A7gGgAbex8UkfEArgMwAcClAH4oIhX9/3sirFBK1ef+/Nx0Y0zI/ewfAXAZgPEArs+9RwiYkXtvJCIN0cGTyMaI3pYCWK+UOhvA+tz3sRSpgK+Uel0p5bQp51UAnlVK/VUp9ScAewCcF27ryCLnAdijlHpTKXUUwLPIvkco4ZRSGwG8n3f4KgArc39fCWBOqI0KUaQCfhG1AN7q9X1n7lgS3S4i7blb19jempbA94MzBeAXIrJZRBaZboxFTldK7QeA3NcRhtujjXUboIjIKwD+xuGf7lVKvVjovzkci2X6UbHrA+BRAP+M7Gv/ZwDfB3BTeK2zRmLeD2WappTaJyIjAKwTkf/J9XgpIawL+EqpL3j4b50ARvX6vg7AvmBaZBe310dEHgfwH5qbY6vEvB/KoZTal/v6roisRnboiwEfeEdEzlBK7ReRMwC8a7pBusRlSKcVwHUicrKIjAFwNoDfG25T6HJv1h5XIzvJnUSbAJwtImNEZCCyE/qthttklIicIiKDe/4O4BIk9/2RrxXAjbm/3wig0EhC5FnXwy9GRK4G8K8AhgN4WUS2KKVmKaV2iEgzgJ0APgZwm1Kq22RbDfmeiNQjO3zRAWCx2eaYoZT6WERuB7AWQAWAJ5RSOww3y7TTAawWESD7e/+0UmqN2SaFT0SeATAdwDAR6QTwTwCaADSLyM0A/gxgnrkW6sWVtkRECRGXIR0iIiqBAZ+IKCEY8ImIEoIBn4goIRjwiYgSggGfiCghGPCJiBKCAZ+IKCH+H2K1tiZ2U899AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.datasets.samples_generator import make_blobs\n",
"\n",
"# generate 2d classification dataset\n",
"X, y = make_blobs(n_samples=100, centers=2, n_features=2, cluster_std=4)\n",
"\n",
"# plot the data ointo classes\n",
"plt.scatter(X[y==0, 0], X[y==0, 1], label=\"Class 1\")\n",
"plt.scatter(X[y==1, 0], X[y==1, 1], label=\"Class 2\")\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we can distinguish between 2 different classes via their colours. Now let's attempt to put learn a boundary between them and classify them"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ignat/anaconda3/envs/ds/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n"
]
},
{
"data": {
"text/plain": [
"LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
" intercept_scaling=1, max_iter=100, multi_class='warn',\n",
" n_jobs=None, penalty='l2', random_state=None, solver='warn',\n",
" tol=0.0001, verbose=0, warm_start=False)"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"logreg = LogisticRegression()\n",
"logreg.fit(X, y)"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7f7159f23e80>"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 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",
"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",
"h = .02 # step size in the mesh\n",
"xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
"Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])\n",
"\n",
"# Put the result into a color plot\n",
"Z = Z.reshape(xx.shape)\n",
"plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)\n",
"\n",
"# Plot also the training points\n",
"plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pretty cool!\n",
"\n",
"Now you have the chance to apply this to something a bit more practical!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercise 2 - Logistic regression image classification"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You task here is to make the computer learn how to classify hand-written digits.\n",
"\n",
"First let's download our digits from the internet (it might take some time).\n",
"\n",
"*Note: that we will be using only the first 5000 examples of images to make the exercise faster. You can use the full dataset but it might take >1h to train it.*"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.datasets import fetch_openml\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.utils import shuffle\n",
"\n",
"# get data\n",
"X, y, _, _, _, _, _ = fetch_openml(\"mnist_784\").values()\n",
"\n",
"# reorder the data randomly\n",
"X, y = shuffle(X, y)\n",
"\n",
"# Take only 5000 examples\n",
"X = X[:5000]\n",
"yy = y[:5000]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's now create a function that can visualise the data along with labels. This will also be used later"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"def plot_digits(X, y):\n",
" plt.rc(\"image\", cmap=\"binary\")\n",
" nums = np.random.randint(0, len(X), 10)\n",
" for idx, i in enumerate(nums):\n",
" axs = plt.subplot(2,5,idx+1)\n",
" plt.imshow(X[i].reshape(28,28), label=\"1\")\n",
" axs.set_title(\"Label: \" + str(y[i]))\n",
" plt.xticks(())\n",
" plt.yticks(())\n",
" plt.tight_layout()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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3Ts9t/LKKwMwePDgNG3zzTcHGu8RkKzzzz8/PfbPffi34IsvvgBg4MCBADz66KPpuQEDBpQii9IE+tSLiEiUVEGJiEiUouziu+OOO9JjH+j3Qc3Guu7aimOOOSY9vv/++xu8bscddwRyu4dOPPFEAJZddlkgt5v0nXfeKWo+q828efMAOOKII9K0e++9F8hOemiqSZMm1Tt+6qmn0jTvHtxpp52adf9q99NPPwHw17/+FYAXXnihnNmpWD///HN6PH78+Gbdw/+mFHOyiVpQIiISpShaUO+++y4ABx10EACffPJJeq7ugH9b5hNEnn766TTNp83edddd9a7faKONgMYH2MNBZWmcP2W+8cYbaVrdltN+++2XHq+66qrzvec333yTHnsrIFwy4C1ktaDy8zILJ5ZI7ufKp96//vrr9a7zz1d4vbegfEnE/CaV+XX+t2iFFVZIz5122mkA7L777k17A7XUghIRkSipghIRkSiVvItvypQpQHb9CBQW/eGXX34p6P6FXBc2Z8eMGQNAr169AOjRo0dBr1MOX331FQCzZs1K03zgPuwW3X777YGmr53xpvrEiRPTNF+no3U40KlTJwAeeOCBNG2LLbYAYPLkyUBuF5//PxRq9OjRADz//PNp2osvvtisvFaza6+9Nj2+4IILypiTeIUTzY499ticc/57DsVdE+prK2fOnJmmeRQbdfGJiEhVKXkLatiwYQDcfPPNaVoh0R9codPMG7tuwoQJ6fEGG2wAwL777gvAhhtumJ478sgjC3qtUunbt2/OvwBvv/02APvvv3+a5jHI1l57bQCGDBmSnlt66aVz7ukr6wH+8Ic/AHDTTTelabfccguQncAiUFNTkx775/mxxx4DYP3112/SvS6//PL0OF9radNNN21GDqvTE088AdRvETTEWwq//vWv07Qnn3wSgGWWWabIuSsv/+z4pKdwIlVjwtZUQ8LJPv7Z33LLLdM0L8v/+7//A6BPnz4FvXYh1IISEZEolaQFVcw+9Y033rheWjH66X2advh0HBsfJ3v88cfTtO222w6AcePGpWk+luH/+mJngJNPPhnIPjn95S9/Sc/lW6i76KKLFiXv1WqvvfYCYM899wQKb+F7LL5TTz01TfP/k7CV69OoJRsjstAy9pbTnXfemaZVW8vJPfPMM0C25dTY2FLYalp++eUBOOOMM9K0QYMG5Vy/8MILp8ddunRpeWabQC0oERGJkiooERGJUkm6+N577730+P3332/RvcIBT2+qFqOL76yzzgLg9NNPb/G9Wpuv2IZsVIP77rsvTbviiiuAbBdf2HV32GGH5dwrbO63a5f5OPzzn/9M0zyenzQuX7eTR56YPXt2mnbVVVcB2a67sPx9K45wEkDnzp2Ln9kK4FOVw7iTPmW50C6+ap0Q0VReXt5VF04DX3fddQE47rjjSp+xAqgFJSIiUSpJCyqcru3xoG688cY0rZDFtb4gNXy69ym+4VbZhUSVXmihhdJj3/L8zDPPnO/PxchbPXvvvXeatsMOOwDZBckXXnhhem7EiBFA7lOU8zL22IigGHDzM3XqVCA7cSWMTv7ggw8C2aUA+YSTULzc2/ITv38u/W9GuCi6MWuuuSYAm222WZrWlsrRF4rns88++wCwzTbbAHDggQem51ZaaaVWzVdLqQUlIiJRKkkLKnwi9zGofP3I+dJ22223nO/DkBl+fPHFF6dp55xzToP3cuFCskptOTXGxzL832uuuSY9562rQw45BMiNFu/jIeHiUX/qWmuttVoxx/EJW+L//e9/gew4n4fHguxn+9tvv23W64Rhq3z78XC/qbYgDF3k+2sVuq+T70HkoX1WW221IueuMviC+ltvvRXIHdv0z5UvKfnss8/Sc/l6UmKiFpSIiERJFZSIiESpVbv4PHJ5OFU0jGrQkDAi9KWXXjrf68NuOu/ik/x80oPH6csXs8sH/gEGDhwIZAerPd5WtXvrrbfS42233RYoLG6Zd6tC/viOHi3flzW8+eab6Tn/7G6++eZp2iqrrNLUrFeM6dOnAzBy5Mg0bdSoUQ1e7+Xvk3kANtlkE6Dtdu3V5csXTjnllDTNu/E8pt6HH36YnvMu0lipBSUiIlFq1RaU74cT1tj5+NPP8OHDgdwtg2Pen6na7LzzzkBu7MRPP/0UgD322APIbhEN1d2aWnHFFdPjnj17AtkeAd8XCrLR8E888UQgt7W0xBJLNHh/n1wRtqCmTZsG5LZqq7EF5ZMivOXkkeCh8clNvkj/qKOOStMOOOCA1shixfIFt75IHLKtqa+//hrInfDky34WX3zxUmWxSdSCEhGRKKmCEhGRKLVqF593Y8xvu3AfsPd/m8rjSUFhUSl+9atfNet1ql2HDh2A3HiEHmnj448/BnK3h3j22WdLmLvSCre8GDt2LJAdpA8/z+GkiEJ4JI9wmxPnW8n4NvLVwCMchF3Dvk27RzopNLaed6fGGjcuJocffnh6/NNPPwHZyWT+uwzZNXfhBrLdunUrRRYLohaUiIhEqVVbUIVu5e6TI5rKB/PDaAiNvaZHpWju61W7hx56CMiNpr3IIosA2afdtqgpmzaGU6BffvllILe1FMaSBOjXr1967JsYVnoMueeeey499hiRM2bMaNI98sXWCyOcSOP89xbghBNOALJTysNYfL58pH379mmaR56JYeKEWlAiIhKlksTim5+hQ4cChS2yDadA+5O+T4XOp6mLftuyuXPnAnDZZZelad5/7cKF1j5NeMCAASXIXZxeeeUVIDtOddddd6XnwpZEXb4A+m9/+1uaVuktJxdGIG9qy0mx9YrPd2/wKfnnnXdees6j7+dbsB8DtaBERCRKqqBERCRKUXTxXXLJJUB2S+d8fIpvOCGisa49t9FGG6XHikqRtcYaawD5m/a++V4+YfQIj4NWjTxqBGS78V566SUgu/oespEg8k0i8UgSW265ZZq25557AtltTJoyASN2f/zjH4Hstvbz47/THiECtE17Q8JtWb7//nsgd3PM3r17A9ku+PDc+PHjAXjjjTcAmDhxYnrOzFopx8WhFpSIiESpVVtQ77zzDpDdJA9yF4k53xwu3AiuLl+AO79Fvx5BWlPJG+cDpldccUWTfi6MQ9e5c+ei5qk1hdO/b7jhBiAbTTvctM0XH/tnF7KTRxrjA9FhnDif9BPDdN1SGDJkCFD4wltvOd15551pmlpO+YWTRb744osGr/NWaewto0KpBSUiIlFSBSUiIlFq1S4+b5befvvtaZqvXXrvvffqXV9I10B4jccuCwdZfRW0NM63kwhX6je2bqfSjR49Oj0ON9BsCv+c9e/fP03ziAc77rgjAH369GluFtsMX+ukCRGFW3311dPj//3vf/O9vrHNNfv27ZseH3/88UB28g4oFp+IiMh8lWSaeTgd2Vs4YQsqHFhuiG8a59G1IX8LSgrj05t9oz0orAXVpUuXVstTazr00EPrpfnEhvDz6RMawidK34RwscUWA3InikhhvKUJ2SgRajkVLoyCc/TRRwPwww8/1LvOy3SrrbZK0zp27AjAoEGDgNwI/P47ECu1oEREJEolX6jrrR7/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ibTclCnZJUwjR44EYPz48QBsuumm6bndd9+9tBmLiP/tBejduzcAXbp0AWD06NHpuWWWKe3u8GpBiYhIlKJqQT355JMAXHvttWmaWcPRMD766KN61991110A3HvvvYBaUvNz9dVXp8dvvfVWGXNSmb788ksA7rnnHgCef/759NyIESPm+/NnnHFGejxs2LAi565te/XVV4HcHpawpQDwyCOPpMdtuQXlf3shW0b+bxj5Yueddy5pvtSCEhGRKEXVglpttdUA6NGjR5q2xBKZ+Iy//e1vAVh99dXTc+PGjQNyWwEzZswAYJdddgFgzpw5rZjjyvfAAw8UdJ2PRX3wwQdpmo8BtjVXXnlleuxjpF4u4RhpY61/N2bMmCLnrm36/vvvAdh///3TNB9vCsdU6wp7XyS/5ZZbrmyvrRaUiIhESRWUiIhEKaouvjXWWAOAZ599Nk3r2rUrAMsvv3y96/fYYw8gd+rj7373OyDb5H/77bfTc3379i1yjtsO7yq96aab0rRLLrmkXNkpqV9++QWAb775BoAhQ4ak52bPnp1z7cCBA9Pjvffeu969fvzxRwB++OEHALbYYoviZrbCzZ07F8hOPpmfM888E8hOUsnXnRd2tS655JIADB8+HIAtt9yy+ZmtIp999lmD5zp16lTCnORSC0pERKIUVQvK9enTp0nXe2spH7Wacv30008A7Ljjjg1e4xNTADbbbDMAHnroIQD+/ve/p+faSgvKW43eOg/5E/mhhx4KwEUXXVTvGi87gNtvvx3IDuD36tUrPTdp0qQi5bhy+VIHX3D/ySefpOd8Akohk08gO9nqz3/+c5p2wAEHFCWf1eKrr74C4Lrrrqt3zidHdO/evaR5CqkFJSIiUVIFJSIiUYqyi68x77zzTnr84IMPArndKt4N0K1bt9JmLGI///xzenzSSScB8PTTT9e7bumllwbg8ccfT9PWXnttAC699FIALrjggvTcu+++C2TXr1UDX+913333pWnhe4bcCTu77rorkP0MehcewB/+8Acgd8D/22+/BWDrrbcG4LTTTita3iuVT4wAuOOOO4Dcrr2m8IlTABdffDEAK6+8cgtyV918LemECRPqnVt33XWB7N+FclALSkREohR9C+rll18Gsk/w3mqC/IOlHnX7H//4RwlyVxmOPfbY9PjGG29s8DovY281hbbZZhsA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\n",
"text/plain": [
"<Figure size 432x288 with 10 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# X is the data you want to visualise\n",
"# y is the labels that will be displayed on top\n",
"plot_digits(X,y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You have your data, you have a method of visualising it.\n",
"\n",
"**Now apply Logistic Regression to the data!**\n",
"1. Initilise a LogisticRegression model\n",
"2. Train it on the data\n",
"3. Predict 10 examples (can be from the full dataset)\n",
"4. Plot the input images and their labels using `plot_digits()`\n",
"\n",
"*Warning: Training might take up to 5 minutes, so be patient*"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"# YOUR CODE HERE\n",
"logreg = LogisticRegression()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ignat/anaconda3/envs/ds/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/home/ignat/anaconda3/envs/ds/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:460: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
" \"this warning.\", FutureWarning)\n",
"/home/ignat/anaconda3/envs/ds/lib/python3.7/site-packages/sklearn/svm/base.py:931: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
" \"the number of iterations.\", ConvergenceWarning)\n"
]
},
{
"data": {
"text/plain": [
"LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
" intercept_scaling=1, max_iter=100, multi_class='warn',\n",
" n_jobs=None, penalty='l2', random_state=None, solver='warn',\n",
" tol=0.0001, verbose=0, warm_start=False)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"logreg.fit(X_test, y_test)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"y_pred = logreg.predict(X_train[:10])"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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wNnJfY1jfaBXA7OB1cA0oHXsvD2Bl4AVwDISN/w6Vu4/JfGtYa3fl6F+ZRnqV1EXsWgg8TwwWcdvgPnAScWOmeKpmGao4wDg4+T7lAN7FDtupRpPEl2kS4CvSdzLuxJoku84WPLNREREgtJQH9QVEZHAqYESEZEgqYESEZEgqYESEZEgqYESEZEgZTV3UuvWrV1ZWVkdVaV0VFRUsHz58lo/lKZ4Jiie+Td37tzlzrkqc6xlQ/FMyUc8QTH1avo3n1UDVVZWxpw5c3KvVT3Ro0ePvJxH8UxQPPPPzBbU9hyKZ0o+4gmKqVfTv3l18YmISJDUQImISJDUQImISJDUQImISJDUQImISJDUQImISJDUQImISJDUQImISJDUQImISJCymkkiNBMnTgRgxIgRUdmSJUvSjnnzzTej7T333LMwFRMRkVpTBiUiIkEquQzq+++/j7bvvfdeAJo2bRqVTZs2La2sc+fOhauciEgRfPbZZwA899xzAFx77bXRvg8++GCjr//Zz34Wbffq1QuAn//85wAcfvjh0b5ddtml9pXNgjIoEREJkhooEREJUsl18a1evTraLi8vB+C0006Lyvr27VvoKgXHx+iFF14AYPjw4dG+jz/+eIOv88ddffXVUVmjRo02ePzXX38NwMyZM6OyP/7xj0Cqm+Duu+/Oqu4hUjwlRN27d4+2P//8cwBWrlxZ5TizxLJLO+ywAwDr16+P9m266aYAzJ8/Pyrz2/fddx8AHTt2jPZVVFTko+o1pgxKRESCVHIZ1G233RZtt2jRAoBhw4YVqzrBeOihh6Lthx9+GICpU6dWOc5/m8pk3LhxALRpk1o4NJ4tADz66KNV3jNe5u277741qXawFE8J3aJFi6LtypnTtttuG237x3BOPPFEAJxz0b5WrVoBMHfu3KjMZ04TJkwA4LvvvstntbOiDEpERIKkBkpERIJUcl18cd26dUv7tyG66667ADj//POjstqm5I899li0fdJJJwHw/PPPA3D22WdH+9atW1fltf75sy5dutSqDsWieNa95cuXA/Df//4XgNtvvz2r15911lnR9nbbbbfB4/yggOoGppSyK664ItoeOnRo2r6lS5dG2xdffHHav/vss0+0r6ysDIBPP/00KvPdfVtuuSUADz74YB5rnR1lUCIiEqSSzqAELrnkEqD6b/n+mxDAn//8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\n",
"text/plain": [
"<Figure size 432x288 with 10 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_digits(X_train[:10], y_pred)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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4re//W3OPsnPLZPjL/9Qd+mcnXbaqax1Sjo3a0xTH/1ws8hAZnYa93fDn63G3Trxu7S7du1aWGUbQRmUiIgEKYgMavHixQBcd9119R6TL1tq6Fx/+tOfgMxs35A9P1VL4Obku/fee+Ntbpj5yy+/DEBNTU3O6/71r3/F5boP766//vrFrmbiuCHlkBlW7gZC6GHSFfvuu++AzEP3V155Zb3Huhn5JeOpp54Csh/Udfyl2+vjPwrxwAMPAJlZ5AE+/vjjel97yy23ANn/Z8OHDwfglFNOAfLP/VkoZVAiIhKkIDIopzFT7fhDpt2Qyjlz5sTbXF/qgw8+CMB5550X73PTArVkbs0nfwZyx/X/51suettttwVgl112KWHtkuGKK67I2eZm4Zb8li9fHpfdowv+GlF1uc+ZuyqXDPc77DJRn8tm/HvHrkfE/S30h/XXvcfcWO+//35O2a3F9/bbbxd0znyUQYmISJDUQImISJCC6OJzQ8N/97vfAZnFynwudT3zzDPjbSNGjACy552qOz+VWxxNUgYNGgTAOuusk7PPLd3+2Wef5eybMGFCaSuWAG4ouX+T2Q2OyLc44cknnwxkx7qlDqLwh9zffffd9R7n5oG8+OKLgewuKLdQZ0Pz882cOTPneH8mj549ewKZ/xP/kYpLLrkEyH6kxb+lEIouXboA0L59+3ib6+5z3fP+YKZDDjkk6/X+oq+bb745kBk8BZm4uc9yv3794n1ffvklACeccEJOvfxVFopFGZSIiAQpiAzKcTNz+8PBf/zxRyAzZNqfadsZN25cXG5oht+Wxt1odlfykMk68z3Id+utt5anYgnlDy936g6O8B9kdleg/hV8S82gGsqafO5xkk022aSU1aF79+5A/qHafobcunXrktajEK43yb0HgNmzZwPwySefAJmH9fNx2SnAgQce2KSfXXe2ed/IkSObdK7GUAYlIiJBUgMlIiJBCqqLzznxxBMrXYWq4Lrx3M3ffNxT6QD33HNPzv69994bgA022KDItUse99yO32Xnbv7nGyThaGHH8LhnLjfeeON42z777ANkluyBzACuEOeg9J9JdMvozJgxI+vffFZaaaUm/ZyXXnopLu+55545+928nvkGTjSXMigREQlSkBmUlI9bVA8yV5X+8NVTTz217HUK1fPPPw9kLwbnFtLMt9S74x6faMk6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\n",
"text/plain": [
"<Figure size 432x288 with 10 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_digits(X, yy)"
]
}
],
"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.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}