├── .gitignore
├── ArtificialNeuralNetwork.ipynb
├── Churn_Modelling.csv
├── Evaluate_Improving_Tuning.ipynb
├── README.md
├── ann.py
├── evaluating_improving_tuning.py
└── requirements.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | .ipynb_checkpoints/
2 |
--------------------------------------------------------------------------------
/ArtificialNeuralNetwork.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# REDES NEURAIS ARTIFICIAIS\n",
8 | "\n",
9 | "[Aula 3 de Deep Learning](http://bit.ly/dn-unb03) da Engenharia de Software da UnB"
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {},
15 | "source": [
16 | "# Parte 1 - Pré-processamento dos Dados"
17 | ]
18 | },
19 | {
20 | "cell_type": "markdown",
21 | "metadata": {},
22 | "source": [
23 | "### Importar as libs"
24 | ]
25 | },
26 | {
27 | "cell_type": "code",
28 | "execution_count": 1,
29 | "metadata": {
30 | "colab": {},
31 | "colab_type": "code",
32 | "id": "MxkJoQBkUIHC"
33 | },
34 | "outputs": [],
35 | "source": [
36 | "import numpy as np\n",
37 | "import pandas as pd\n",
38 | "import tensorflow as tf"
39 | ]
40 | },
41 | {
42 | "cell_type": "code",
43 | "execution_count": 2,
44 | "metadata": {
45 | "colab": {
46 | "base_uri": "https://localhost:8080/",
47 | "height": 34
48 | },
49 | "colab_type": "code",
50 | "id": "ZaTwK7ojXr2F",
51 | "outputId": "0b27a96d-d11a-43e8-ab4b-87c1f01896fe"
52 | },
53 | "outputs": [
54 | {
55 | "data": {
56 | "text/plain": [
57 | "'2.4.1'"
58 | ]
59 | },
60 | "execution_count": 2,
61 | "metadata": {},
62 | "output_type": "execute_result"
63 | }
64 | ],
65 | "source": [
66 | "tf.__version__"
67 | ]
68 | },
69 | {
70 | "cell_type": "markdown",
71 | "metadata": {},
72 | "source": [
73 | "### Importar o dataset"
74 | ]
75 | },
76 | {
77 | "cell_type": "code",
78 | "execution_count": 4,
79 | "metadata": {},
80 | "outputs": [
81 | {
82 | "data": {
83 | "text/html": [
84 | "
\n",
85 | "\n",
98 | "
\n",
99 | " \n",
100 | " \n",
101 | " | \n",
102 | " RowNumber | \n",
103 | " CustomerId | \n",
104 | " Surname | \n",
105 | " CreditScore | \n",
106 | " Geography | \n",
107 | " Gender | \n",
108 | " Age | \n",
109 | " Tenure | \n",
110 | " Balance | \n",
111 | " NumOfProducts | \n",
112 | " HasCrCard | \n",
113 | " IsActiveMember | \n",
114 | " EstimatedSalary | \n",
115 | " Exited | \n",
116 | "
\n",
117 | " \n",
118 | " \n",
119 | " \n",
120 | " 0 | \n",
121 | " 1 | \n",
122 | " 15634602 | \n",
123 | " Hargrave | \n",
124 | " 619 | \n",
125 | " France | \n",
126 | " Female | \n",
127 | " 42 | \n",
128 | " 2 | \n",
129 | " 0.00 | \n",
130 | " 1 | \n",
131 | " 1 | \n",
132 | " 1 | \n",
133 | " 101348.88 | \n",
134 | " 1 | \n",
135 | "
\n",
136 | " \n",
137 | " 1 | \n",
138 | " 2 | \n",
139 | " 15647311 | \n",
140 | " Hill | \n",
141 | " 608 | \n",
142 | " Spain | \n",
143 | " Female | \n",
144 | " 41 | \n",
145 | " 1 | \n",
146 | " 83807.86 | \n",
147 | " 1 | \n",
148 | " 0 | \n",
149 | " 1 | \n",
150 | " 112542.58 | \n",
151 | " 0 | \n",
152 | "
\n",
153 | " \n",
154 | " 2 | \n",
155 | " 3 | \n",
156 | " 15619304 | \n",
157 | " Onio | \n",
158 | " 502 | \n",
159 | " France | \n",
160 | " Female | \n",
161 | " 42 | \n",
162 | " 8 | \n",
163 | " 159660.80 | \n",
164 | " 3 | \n",
165 | " 1 | \n",
166 | " 0 | \n",
167 | " 113931.57 | \n",
168 | " 1 | \n",
169 | "
\n",
170 | " \n",
171 | " 3 | \n",
172 | " 4 | \n",
173 | " 15701354 | \n",
174 | " Boni | \n",
175 | " 699 | \n",
176 | " France | \n",
177 | " Female | \n",
178 | " 39 | \n",
179 | " 1 | \n",
180 | " 0.00 | \n",
181 | " 2 | \n",
182 | " 0 | \n",
183 | " 0 | \n",
184 | " 93826.63 | \n",
185 | " 0 | \n",
186 | "
\n",
187 | " \n",
188 | " 4 | \n",
189 | " 5 | \n",
190 | " 15737888 | \n",
191 | " Mitchell | \n",
192 | " 850 | \n",
193 | " Spain | \n",
194 | " Female | \n",
195 | " 43 | \n",
196 | " 2 | \n",
197 | " 125510.82 | \n",
198 | " 1 | \n",
199 | " 1 | \n",
200 | " 1 | \n",
201 | " 79084.10 | \n",
202 | " 0 | \n",
203 | "
\n",
204 | " \n",
205 | " 5 | \n",
206 | " 6 | \n",
207 | " 15574012 | \n",
208 | " Chu | \n",
209 | " 645 | \n",
210 | " Spain | \n",
211 | " Male | \n",
212 | " 44 | \n",
213 | " 8 | \n",
214 | " 113755.78 | \n",
215 | " 2 | \n",
216 | " 1 | \n",
217 | " 0 | \n",
218 | " 149756.71 | \n",
219 | " 1 | \n",
220 | "
\n",
221 | " \n",
222 | " 6 | \n",
223 | " 7 | \n",
224 | " 15592531 | \n",
225 | " Bartlett | \n",
226 | " 822 | \n",
227 | " France | \n",
228 | " Male | \n",
229 | " 50 | \n",
230 | " 7 | \n",
231 | " 0.00 | \n",
232 | " 2 | \n",
233 | " 1 | \n",
234 | " 1 | \n",
235 | " 10062.80 | \n",
236 | " 0 | \n",
237 | "
\n",
238 | " \n",
239 | " 7 | \n",
240 | " 8 | \n",
241 | " 15656148 | \n",
242 | " Obinna | \n",
243 | " 376 | \n",
244 | " Germany | \n",
245 | " Female | \n",
246 | " 29 | \n",
247 | " 4 | \n",
248 | " 115046.74 | \n",
249 | " 4 | \n",
250 | " 1 | \n",
251 | " 0 | \n",
252 | " 119346.88 | \n",
253 | " 1 | \n",
254 | "
\n",
255 | " \n",
256 | " 8 | \n",
257 | " 9 | \n",
258 | " 15792365 | \n",
259 | " He | \n",
260 | " 501 | \n",
261 | " France | \n",
262 | " Male | \n",
263 | " 44 | \n",
264 | " 4 | \n",
265 | " 142051.07 | \n",
266 | " 2 | \n",
267 | " 0 | \n",
268 | " 1 | \n",
269 | " 74940.50 | \n",
270 | " 0 | \n",
271 | "
\n",
272 | " \n",
273 | " 9 | \n",
274 | " 10 | \n",
275 | " 15592389 | \n",
276 | " H? | \n",
277 | " 684 | \n",
278 | " France | \n",
279 | " Male | \n",
280 | " 27 | \n",
281 | " 2 | \n",
282 | " 134603.88 | \n",
283 | " 1 | \n",
284 | " 1 | \n",
285 | " 1 | \n",
286 | " 71725.73 | \n",
287 | " 0 | \n",
288 | "
\n",
289 | " \n",
290 | " 10 | \n",
291 | " 11 | \n",
292 | " 15767821 | \n",
293 | " Bearce | \n",
294 | " 528 | \n",
295 | " France | \n",
296 | " Male | \n",
297 | " 31 | \n",
298 | " 6 | \n",
299 | " 102016.72 | \n",
300 | " 2 | \n",
301 | " 0 | \n",
302 | " 0 | \n",
303 | " 80181.12 | \n",
304 | " 0 | \n",
305 | "
\n",
306 | " \n",
307 | " 11 | \n",
308 | " 12 | \n",
309 | " 15737173 | \n",
310 | " Andrews | \n",
311 | " 497 | \n",
312 | " Spain | \n",
313 | " Male | \n",
314 | " 24 | \n",
315 | " 3 | \n",
316 | " 0.00 | \n",
317 | " 2 | \n",
318 | " 1 | \n",
319 | " 0 | \n",
320 | " 76390.01 | \n",
321 | " 0 | \n",
322 | "
\n",
323 | " \n",
324 | " 12 | \n",
325 | " 13 | \n",
326 | " 15632264 | \n",
327 | " Kay | \n",
328 | " 476 | \n",
329 | " France | \n",
330 | " Female | \n",
331 | " 34 | \n",
332 | " 10 | \n",
333 | " 0.00 | \n",
334 | " 2 | \n",
335 | " 1 | \n",
336 | " 0 | \n",
337 | " 26260.98 | \n",
338 | " 0 | \n",
339 | "
\n",
340 | " \n",
341 | " 13 | \n",
342 | " 14 | \n",
343 | " 15691483 | \n",
344 | " Chin | \n",
345 | " 549 | \n",
346 | " France | \n",
347 | " Female | \n",
348 | " 25 | \n",
349 | " 5 | \n",
350 | " 0.00 | \n",
351 | " 2 | \n",
352 | " 0 | \n",
353 | " 0 | \n",
354 | " 190857.79 | \n",
355 | " 0 | \n",
356 | "
\n",
357 | " \n",
358 | " 14 | \n",
359 | " 15 | \n",
360 | " 15600882 | \n",
361 | " Scott | \n",
362 | " 635 | \n",
363 | " Spain | \n",
364 | " Female | \n",
365 | " 35 | \n",
366 | " 7 | \n",
367 | " 0.00 | \n",
368 | " 2 | \n",
369 | " 1 | \n",
370 | " 1 | \n",
371 | " 65951.65 | \n",
372 | " 0 | \n",
373 | "
\n",
374 | " \n",
375 | " 15 | \n",
376 | " 16 | \n",
377 | " 15643966 | \n",
378 | " Goforth | \n",
379 | " 616 | \n",
380 | " Germany | \n",
381 | " Male | \n",
382 | " 45 | \n",
383 | " 3 | \n",
384 | " 143129.41 | \n",
385 | " 2 | \n",
386 | " 0 | \n",
387 | " 1 | \n",
388 | " 64327.26 | \n",
389 | " 0 | \n",
390 | "
\n",
391 | " \n",
392 | " 16 | \n",
393 | " 17 | \n",
394 | " 15737452 | \n",
395 | " Romeo | \n",
396 | " 653 | \n",
397 | " Germany | \n",
398 | " Male | \n",
399 | " 58 | \n",
400 | " 1 | \n",
401 | " 132602.88 | \n",
402 | " 1 | \n",
403 | " 1 | \n",
404 | " 0 | \n",
405 | " 5097.67 | \n",
406 | " 1 | \n",
407 | "
\n",
408 | " \n",
409 | " 17 | \n",
410 | " 18 | \n",
411 | " 15788218 | \n",
412 | " Henderson | \n",
413 | " 549 | \n",
414 | " Spain | \n",
415 | " Female | \n",
416 | " 24 | \n",
417 | " 9 | \n",
418 | " 0.00 | \n",
419 | " 2 | \n",
420 | " 1 | \n",
421 | " 1 | \n",
422 | " 14406.41 | \n",
423 | " 0 | \n",
424 | "
\n",
425 | " \n",
426 | " 18 | \n",
427 | " 19 | \n",
428 | " 15661507 | \n",
429 | " Muldrow | \n",
430 | " 587 | \n",
431 | " Spain | \n",
432 | " Male | \n",
433 | " 45 | \n",
434 | " 6 | \n",
435 | " 0.00 | \n",
436 | " 1 | \n",
437 | " 0 | \n",
438 | " 0 | \n",
439 | " 158684.81 | \n",
440 | " 0 | \n",
441 | "
\n",
442 | " \n",
443 | " 19 | \n",
444 | " 20 | \n",
445 | " 15568982 | \n",
446 | " Hao | \n",
447 | " 726 | \n",
448 | " France | \n",
449 | " Female | \n",
450 | " 24 | \n",
451 | " 6 | \n",
452 | " 0.00 | \n",
453 | " 2 | \n",
454 | " 1 | \n",
455 | " 1 | \n",
456 | " 54724.03 | \n",
457 | " 0 | \n",
458 | "
\n",
459 | " \n",
460 | " 20 | \n",
461 | " 21 | \n",
462 | " 15577657 | \n",
463 | " McDonald | \n",
464 | " 732 | \n",
465 | " France | \n",
466 | " Male | \n",
467 | " 41 | \n",
468 | " 8 | \n",
469 | " 0.00 | \n",
470 | " 2 | \n",
471 | " 1 | \n",
472 | " 1 | \n",
473 | " 170886.17 | \n",
474 | " 0 | \n",
475 | "
\n",
476 | " \n",
477 | " 21 | \n",
478 | " 22 | \n",
479 | " 15597945 | \n",
480 | " Dellucci | \n",
481 | " 636 | \n",
482 | " Spain | \n",
483 | " Female | \n",
484 | " 32 | \n",
485 | " 8 | \n",
486 | " 0.00 | \n",
487 | " 2 | \n",
488 | " 1 | \n",
489 | " 0 | \n",
490 | " 138555.46 | \n",
491 | " 0 | \n",
492 | "
\n",
493 | " \n",
494 | " 22 | \n",
495 | " 23 | \n",
496 | " 15699309 | \n",
497 | " Gerasimov | \n",
498 | " 510 | \n",
499 | " Spain | \n",
500 | " Female | \n",
501 | " 38 | \n",
502 | " 4 | \n",
503 | " 0.00 | \n",
504 | " 1 | \n",
505 | " 1 | \n",
506 | " 0 | \n",
507 | " 118913.53 | \n",
508 | " 1 | \n",
509 | "
\n",
510 | " \n",
511 | " 23 | \n",
512 | " 24 | \n",
513 | " 15725737 | \n",
514 | " Mosman | \n",
515 | " 669 | \n",
516 | " France | \n",
517 | " Male | \n",
518 | " 46 | \n",
519 | " 3 | \n",
520 | " 0.00 | \n",
521 | " 2 | \n",
522 | " 0 | \n",
523 | " 1 | \n",
524 | " 8487.75 | \n",
525 | " 0 | \n",
526 | "
\n",
527 | " \n",
528 | " 24 | \n",
529 | " 25 | \n",
530 | " 15625047 | \n",
531 | " Yen | \n",
532 | " 846 | \n",
533 | " France | \n",
534 | " Female | \n",
535 | " 38 | \n",
536 | " 5 | \n",
537 | " 0.00 | \n",
538 | " 1 | \n",
539 | " 1 | \n",
540 | " 1 | \n",
541 | " 187616.16 | \n",
542 | " 0 | \n",
543 | "
\n",
544 | " \n",
545 | " 25 | \n",
546 | " 26 | \n",
547 | " 15738191 | \n",
548 | " Maclean | \n",
549 | " 577 | \n",
550 | " France | \n",
551 | " Male | \n",
552 | " 25 | \n",
553 | " 3 | \n",
554 | " 0.00 | \n",
555 | " 2 | \n",
556 | " 0 | \n",
557 | " 1 | \n",
558 | " 124508.29 | \n",
559 | " 0 | \n",
560 | "
\n",
561 | " \n",
562 | " 26 | \n",
563 | " 27 | \n",
564 | " 15736816 | \n",
565 | " Young | \n",
566 | " 756 | \n",
567 | " Germany | \n",
568 | " Male | \n",
569 | " 36 | \n",
570 | " 2 | \n",
571 | " 136815.64 | \n",
572 | " 1 | \n",
573 | " 1 | \n",
574 | " 1 | \n",
575 | " 170041.95 | \n",
576 | " 0 | \n",
577 | "
\n",
578 | " \n",
579 | " 27 | \n",
580 | " 28 | \n",
581 | " 15700772 | \n",
582 | " Nebechi | \n",
583 | " 571 | \n",
584 | " France | \n",
585 | " Male | \n",
586 | " 44 | \n",
587 | " 9 | \n",
588 | " 0.00 | \n",
589 | " 2 | \n",
590 | " 0 | \n",
591 | " 0 | \n",
592 | " 38433.35 | \n",
593 | " 0 | \n",
594 | "
\n",
595 | " \n",
596 | " 28 | \n",
597 | " 29 | \n",
598 | " 15728693 | \n",
599 | " McWilliams | \n",
600 | " 574 | \n",
601 | " Germany | \n",
602 | " Female | \n",
603 | " 43 | \n",
604 | " 3 | \n",
605 | " 141349.43 | \n",
606 | " 1 | \n",
607 | " 1 | \n",
608 | " 1 | \n",
609 | " 100187.43 | \n",
610 | " 0 | \n",
611 | "
\n",
612 | " \n",
613 | " 29 | \n",
614 | " 30 | \n",
615 | " 15656300 | \n",
616 | " Lucciano | \n",
617 | " 411 | \n",
618 | " France | \n",
619 | " Male | \n",
620 | " 29 | \n",
621 | " 0 | \n",
622 | " 59697.17 | \n",
623 | " 2 | \n",
624 | " 1 | \n",
625 | " 1 | \n",
626 | " 53483.21 | \n",
627 | " 0 | \n",
628 | "
\n",
629 | " \n",
630 | " 30 | \n",
631 | " 31 | \n",
632 | " 15589475 | \n",
633 | " Azikiwe | \n",
634 | " 591 | \n",
635 | " Spain | \n",
636 | " Female | \n",
637 | " 39 | \n",
638 | " 3 | \n",
639 | " 0.00 | \n",
640 | " 3 | \n",
641 | " 1 | \n",
642 | " 0 | \n",
643 | " 140469.38 | \n",
644 | " 1 | \n",
645 | "
\n",
646 | " \n",
647 | " 31 | \n",
648 | " 32 | \n",
649 | " 15706552 | \n",
650 | " Odinakachukwu | \n",
651 | " 533 | \n",
652 | " France | \n",
653 | " Male | \n",
654 | " 36 | \n",
655 | " 7 | \n",
656 | " 85311.70 | \n",
657 | " 1 | \n",
658 | " 0 | \n",
659 | " 1 | \n",
660 | " 156731.91 | \n",
661 | " 0 | \n",
662 | "
\n",
663 | " \n",
664 | " 32 | \n",
665 | " 33 | \n",
666 | " 15750181 | \n",
667 | " Sanderson | \n",
668 | " 553 | \n",
669 | " Germany | \n",
670 | " Male | \n",
671 | " 41 | \n",
672 | " 9 | \n",
673 | " 110112.54 | \n",
674 | " 2 | \n",
675 | " 0 | \n",
676 | " 0 | \n",
677 | " 81898.81 | \n",
678 | " 0 | \n",
679 | "
\n",
680 | " \n",
681 | " 33 | \n",
682 | " 34 | \n",
683 | " 15659428 | \n",
684 | " Maggard | \n",
685 | " 520 | \n",
686 | " Spain | \n",
687 | " Female | \n",
688 | " 42 | \n",
689 | " 6 | \n",
690 | " 0.00 | \n",
691 | " 2 | \n",
692 | " 1 | \n",
693 | " 1 | \n",
694 | " 34410.55 | \n",
695 | " 0 | \n",
696 | "
\n",
697 | " \n",
698 | " 34 | \n",
699 | " 35 | \n",
700 | " 15732963 | \n",
701 | " Clements | \n",
702 | " 722 | \n",
703 | " Spain | \n",
704 | " Female | \n",
705 | " 29 | \n",
706 | " 9 | \n",
707 | " 0.00 | \n",
708 | " 2 | \n",
709 | " 1 | \n",
710 | " 1 | \n",
711 | " 142033.07 | \n",
712 | " 0 | \n",
713 | "
\n",
714 | " \n",
715 | " 35 | \n",
716 | " 36 | \n",
717 | " 15794171 | \n",
718 | " Lombardo | \n",
719 | " 475 | \n",
720 | " France | \n",
721 | " Female | \n",
722 | " 45 | \n",
723 | " 0 | \n",
724 | " 134264.04 | \n",
725 | " 1 | \n",
726 | " 1 | \n",
727 | " 0 | \n",
728 | " 27822.99 | \n",
729 | " 1 | \n",
730 | "
\n",
731 | " \n",
732 | " 36 | \n",
733 | " 37 | \n",
734 | " 15788448 | \n",
735 | " Watson | \n",
736 | " 490 | \n",
737 | " Spain | \n",
738 | " Male | \n",
739 | " 31 | \n",
740 | " 3 | \n",
741 | " 145260.23 | \n",
742 | " 1 | \n",
743 | " 0 | \n",
744 | " 1 | \n",
745 | " 114066.77 | \n",
746 | " 0 | \n",
747 | "
\n",
748 | " \n",
749 | " 37 | \n",
750 | " 38 | \n",
751 | " 15729599 | \n",
752 | " Lorenzo | \n",
753 | " 804 | \n",
754 | " Spain | \n",
755 | " Male | \n",
756 | " 33 | \n",
757 | " 7 | \n",
758 | " 76548.60 | \n",
759 | " 1 | \n",
760 | " 0 | \n",
761 | " 1 | \n",
762 | " 98453.45 | \n",
763 | " 0 | \n",
764 | "
\n",
765 | " \n",
766 | " 38 | \n",
767 | " 39 | \n",
768 | " 15717426 | \n",
769 | " Armstrong | \n",
770 | " 850 | \n",
771 | " France | \n",
772 | " Male | \n",
773 | " 36 | \n",
774 | " 7 | \n",
775 | " 0.00 | \n",
776 | " 1 | \n",
777 | " 1 | \n",
778 | " 1 | \n",
779 | " 40812.90 | \n",
780 | " 0 | \n",
781 | "
\n",
782 | " \n",
783 | " 39 | \n",
784 | " 40 | \n",
785 | " 15585768 | \n",
786 | " Cameron | \n",
787 | " 582 | \n",
788 | " Germany | \n",
789 | " Male | \n",
790 | " 41 | \n",
791 | " 6 | \n",
792 | " 70349.48 | \n",
793 | " 2 | \n",
794 | " 0 | \n",
795 | " 1 | \n",
796 | " 178074.04 | \n",
797 | " 0 | \n",
798 | "
\n",
799 | " \n",
800 | " 40 | \n",
801 | " 41 | \n",
802 | " 15619360 | \n",
803 | " Hsiao | \n",
804 | " 472 | \n",
805 | " Spain | \n",
806 | " Male | \n",
807 | " 40 | \n",
808 | " 4 | \n",
809 | " 0.00 | \n",
810 | " 1 | \n",
811 | " 1 | \n",
812 | " 0 | \n",
813 | " 70154.22 | \n",
814 | " 0 | \n",
815 | "
\n",
816 | " \n",
817 | " 41 | \n",
818 | " 42 | \n",
819 | " 15738148 | \n",
820 | " Clarke | \n",
821 | " 465 | \n",
822 | " France | \n",
823 | " Female | \n",
824 | " 51 | \n",
825 | " 8 | \n",
826 | " 122522.32 | \n",
827 | " 1 | \n",
828 | " 0 | \n",
829 | " 0 | \n",
830 | " 181297.65 | \n",
831 | " 1 | \n",
832 | "
\n",
833 | " \n",
834 | " 42 | \n",
835 | " 43 | \n",
836 | " 15687946 | \n",
837 | " Osborne | \n",
838 | " 556 | \n",
839 | " France | \n",
840 | " Female | \n",
841 | " 61 | \n",
842 | " 2 | \n",
843 | " 117419.35 | \n",
844 | " 1 | \n",
845 | " 1 | \n",
846 | " 1 | \n",
847 | " 94153.83 | \n",
848 | " 0 | \n",
849 | "
\n",
850 | " \n",
851 | " 43 | \n",
852 | " 44 | \n",
853 | " 15755196 | \n",
854 | " Lavine | \n",
855 | " 834 | \n",
856 | " France | \n",
857 | " Female | \n",
858 | " 49 | \n",
859 | " 2 | \n",
860 | " 131394.56 | \n",
861 | " 1 | \n",
862 | " 0 | \n",
863 | " 0 | \n",
864 | " 194365.76 | \n",
865 | " 1 | \n",
866 | "
\n",
867 | " \n",
868 | " 44 | \n",
869 | " 45 | \n",
870 | " 15684171 | \n",
871 | " Bianchi | \n",
872 | " 660 | \n",
873 | " Spain | \n",
874 | " Female | \n",
875 | " 61 | \n",
876 | " 5 | \n",
877 | " 155931.11 | \n",
878 | " 1 | \n",
879 | " 1 | \n",
880 | " 1 | \n",
881 | " 158338.39 | \n",
882 | " 0 | \n",
883 | "
\n",
884 | " \n",
885 | " 45 | \n",
886 | " 46 | \n",
887 | " 15754849 | \n",
888 | " Tyler | \n",
889 | " 776 | \n",
890 | " Germany | \n",
891 | " Female | \n",
892 | " 32 | \n",
893 | " 4 | \n",
894 | " 109421.13 | \n",
895 | " 2 | \n",
896 | " 1 | \n",
897 | " 1 | \n",
898 | " 126517.46 | \n",
899 | " 0 | \n",
900 | "
\n",
901 | " \n",
902 | " 46 | \n",
903 | " 47 | \n",
904 | " 15602280 | \n",
905 | " Martin | \n",
906 | " 829 | \n",
907 | " Germany | \n",
908 | " Female | \n",
909 | " 27 | \n",
910 | " 9 | \n",
911 | " 112045.67 | \n",
912 | " 1 | \n",
913 | " 1 | \n",
914 | " 1 | \n",
915 | " 119708.21 | \n",
916 | " 1 | \n",
917 | "
\n",
918 | " \n",
919 | " 47 | \n",
920 | " 48 | \n",
921 | " 15771573 | \n",
922 | " Okagbue | \n",
923 | " 637 | \n",
924 | " Germany | \n",
925 | " Female | \n",
926 | " 39 | \n",
927 | " 9 | \n",
928 | " 137843.80 | \n",
929 | " 1 | \n",
930 | " 1 | \n",
931 | " 1 | \n",
932 | " 117622.80 | \n",
933 | " 1 | \n",
934 | "
\n",
935 | " \n",
936 | " 48 | \n",
937 | " 49 | \n",
938 | " 15766205 | \n",
939 | " Yin | \n",
940 | " 550 | \n",
941 | " Germany | \n",
942 | " Male | \n",
943 | " 38 | \n",
944 | " 2 | \n",
945 | " 103391.38 | \n",
946 | " 1 | \n",
947 | " 0 | \n",
948 | " 1 | \n",
949 | " 90878.13 | \n",
950 | " 0 | \n",
951 | "
\n",
952 | " \n",
953 | " 49 | \n",
954 | " 50 | \n",
955 | " 15771873 | \n",
956 | " Buccho | \n",
957 | " 776 | \n",
958 | " Germany | \n",
959 | " Female | \n",
960 | " 37 | \n",
961 | " 2 | \n",
962 | " 103769.22 | \n",
963 | " 2 | \n",
964 | " 1 | \n",
965 | " 0 | \n",
966 | " 194099.12 | \n",
967 | " 0 | \n",
968 | "
\n",
969 | " \n",
970 | "
\n",
971 | "
"
972 | ],
973 | "text/plain": [
974 | " RowNumber CustomerId Surname CreditScore Geography Gender Age \\\n",
975 | "0 1 15634602 Hargrave 619 France Female 42 \n",
976 | "1 2 15647311 Hill 608 Spain Female 41 \n",
977 | "2 3 15619304 Onio 502 France Female 42 \n",
978 | "3 4 15701354 Boni 699 France Female 39 \n",
979 | "4 5 15737888 Mitchell 850 Spain Female 43 \n",
980 | "5 6 15574012 Chu 645 Spain Male 44 \n",
981 | "6 7 15592531 Bartlett 822 France Male 50 \n",
982 | "7 8 15656148 Obinna 376 Germany Female 29 \n",
983 | "8 9 15792365 He 501 France Male 44 \n",
984 | "9 10 15592389 H? 684 France Male 27 \n",
985 | "10 11 15767821 Bearce 528 France Male 31 \n",
986 | "11 12 15737173 Andrews 497 Spain Male 24 \n",
987 | "12 13 15632264 Kay 476 France Female 34 \n",
988 | "13 14 15691483 Chin 549 France Female 25 \n",
989 | "14 15 15600882 Scott 635 Spain Female 35 \n",
990 | "15 16 15643966 Goforth 616 Germany Male 45 \n",
991 | "16 17 15737452 Romeo 653 Germany Male 58 \n",
992 | "17 18 15788218 Henderson 549 Spain Female 24 \n",
993 | "18 19 15661507 Muldrow 587 Spain Male 45 \n",
994 | "19 20 15568982 Hao 726 France Female 24 \n",
995 | "20 21 15577657 McDonald 732 France Male 41 \n",
996 | "21 22 15597945 Dellucci 636 Spain Female 32 \n",
997 | "22 23 15699309 Gerasimov 510 Spain Female 38 \n",
998 | "23 24 15725737 Mosman 669 France Male 46 \n",
999 | "24 25 15625047 Yen 846 France Female 38 \n",
1000 | "25 26 15738191 Maclean 577 France Male 25 \n",
1001 | "26 27 15736816 Young 756 Germany Male 36 \n",
1002 | "27 28 15700772 Nebechi 571 France Male 44 \n",
1003 | "28 29 15728693 McWilliams 574 Germany Female 43 \n",
1004 | "29 30 15656300 Lucciano 411 France Male 29 \n",
1005 | "30 31 15589475 Azikiwe 591 Spain Female 39 \n",
1006 | "31 32 15706552 Odinakachukwu 533 France Male 36 \n",
1007 | "32 33 15750181 Sanderson 553 Germany Male 41 \n",
1008 | "33 34 15659428 Maggard 520 Spain Female 42 \n",
1009 | "34 35 15732963 Clements 722 Spain Female 29 \n",
1010 | "35 36 15794171 Lombardo 475 France Female 45 \n",
1011 | "36 37 15788448 Watson 490 Spain Male 31 \n",
1012 | "37 38 15729599 Lorenzo 804 Spain Male 33 \n",
1013 | "38 39 15717426 Armstrong 850 France Male 36 \n",
1014 | "39 40 15585768 Cameron 582 Germany Male 41 \n",
1015 | "40 41 15619360 Hsiao 472 Spain Male 40 \n",
1016 | "41 42 15738148 Clarke 465 France Female 51 \n",
1017 | "42 43 15687946 Osborne 556 France Female 61 \n",
1018 | "43 44 15755196 Lavine 834 France Female 49 \n",
1019 | "44 45 15684171 Bianchi 660 Spain Female 61 \n",
1020 | "45 46 15754849 Tyler 776 Germany Female 32 \n",
1021 | "46 47 15602280 Martin 829 Germany Female 27 \n",
1022 | "47 48 15771573 Okagbue 637 Germany Female 39 \n",
1023 | "48 49 15766205 Yin 550 Germany Male 38 \n",
1024 | "49 50 15771873 Buccho 776 Germany Female 37 \n",
1025 | "\n",
1026 | " Tenure Balance NumOfProducts HasCrCard IsActiveMember \\\n",
1027 | "0 2 0.00 1 1 1 \n",
1028 | "1 1 83807.86 1 0 1 \n",
1029 | "2 8 159660.80 3 1 0 \n",
1030 | "3 1 0.00 2 0 0 \n",
1031 | "4 2 125510.82 1 1 1 \n",
1032 | "5 8 113755.78 2 1 0 \n",
1033 | "6 7 0.00 2 1 1 \n",
1034 | "7 4 115046.74 4 1 0 \n",
1035 | "8 4 142051.07 2 0 1 \n",
1036 | "9 2 134603.88 1 1 1 \n",
1037 | "10 6 102016.72 2 0 0 \n",
1038 | "11 3 0.00 2 1 0 \n",
1039 | "12 10 0.00 2 1 0 \n",
1040 | "13 5 0.00 2 0 0 \n",
1041 | "14 7 0.00 2 1 1 \n",
1042 | "15 3 143129.41 2 0 1 \n",
1043 | "16 1 132602.88 1 1 0 \n",
1044 | "17 9 0.00 2 1 1 \n",
1045 | "18 6 0.00 1 0 0 \n",
1046 | "19 6 0.00 2 1 1 \n",
1047 | "20 8 0.00 2 1 1 \n",
1048 | "21 8 0.00 2 1 0 \n",
1049 | "22 4 0.00 1 1 0 \n",
1050 | "23 3 0.00 2 0 1 \n",
1051 | "24 5 0.00 1 1 1 \n",
1052 | "25 3 0.00 2 0 1 \n",
1053 | "26 2 136815.64 1 1 1 \n",
1054 | "27 9 0.00 2 0 0 \n",
1055 | "28 3 141349.43 1 1 1 \n",
1056 | "29 0 59697.17 2 1 1 \n",
1057 | "30 3 0.00 3 1 0 \n",
1058 | "31 7 85311.70 1 0 1 \n",
1059 | "32 9 110112.54 2 0 0 \n",
1060 | "33 6 0.00 2 1 1 \n",
1061 | "34 9 0.00 2 1 1 \n",
1062 | "35 0 134264.04 1 1 0 \n",
1063 | "36 3 145260.23 1 0 1 \n",
1064 | "37 7 76548.60 1 0 1 \n",
1065 | "38 7 0.00 1 1 1 \n",
1066 | "39 6 70349.48 2 0 1 \n",
1067 | "40 4 0.00 1 1 0 \n",
1068 | "41 8 122522.32 1 0 0 \n",
1069 | "42 2 117419.35 1 1 1 \n",
1070 | "43 2 131394.56 1 0 0 \n",
1071 | "44 5 155931.11 1 1 1 \n",
1072 | "45 4 109421.13 2 1 1 \n",
1073 | "46 9 112045.67 1 1 1 \n",
1074 | "47 9 137843.80 1 1 1 \n",
1075 | "48 2 103391.38 1 0 1 \n",
1076 | "49 2 103769.22 2 1 0 \n",
1077 | "\n",
1078 | " EstimatedSalary Exited \n",
1079 | "0 101348.88 1 \n",
1080 | "1 112542.58 0 \n",
1081 | "2 113931.57 1 \n",
1082 | "3 93826.63 0 \n",
1083 | "4 79084.10 0 \n",
1084 | "5 149756.71 1 \n",
1085 | "6 10062.80 0 \n",
1086 | "7 119346.88 1 \n",
1087 | "8 74940.50 0 \n",
1088 | "9 71725.73 0 \n",
1089 | "10 80181.12 0 \n",
1090 | "11 76390.01 0 \n",
1091 | "12 26260.98 0 \n",
1092 | "13 190857.79 0 \n",
1093 | "14 65951.65 0 \n",
1094 | "15 64327.26 0 \n",
1095 | "16 5097.67 1 \n",
1096 | "17 14406.41 0 \n",
1097 | "18 158684.81 0 \n",
1098 | "19 54724.03 0 \n",
1099 | "20 170886.17 0 \n",
1100 | "21 138555.46 0 \n",
1101 | "22 118913.53 1 \n",
1102 | "23 8487.75 0 \n",
1103 | "24 187616.16 0 \n",
1104 | "25 124508.29 0 \n",
1105 | "26 170041.95 0 \n",
1106 | "27 38433.35 0 \n",
1107 | "28 100187.43 0 \n",
1108 | "29 53483.21 0 \n",
1109 | "30 140469.38 1 \n",
1110 | "31 156731.91 0 \n",
1111 | "32 81898.81 0 \n",
1112 | "33 34410.55 0 \n",
1113 | "34 142033.07 0 \n",
1114 | "35 27822.99 1 \n",
1115 | "36 114066.77 0 \n",
1116 | "37 98453.45 0 \n",
1117 | "38 40812.90 0 \n",
1118 | "39 178074.04 0 \n",
1119 | "40 70154.22 0 \n",
1120 | "41 181297.65 1 \n",
1121 | "42 94153.83 0 \n",
1122 | "43 194365.76 1 \n",
1123 | "44 158338.39 0 \n",
1124 | "45 126517.46 0 \n",
1125 | "46 119708.21 1 \n",
1126 | "47 117622.80 1 \n",
1127 | "48 90878.13 0 \n",
1128 | "49 194099.12 0 "
1129 | ]
1130 | },
1131 | "execution_count": 4,
1132 | "metadata": {},
1133 | "output_type": "execute_result"
1134 | }
1135 | ],
1136 | "source": [
1137 | "dataset = pd.read_csv('Churn_Modelling.csv')\n",
1138 | "dataset.head(50)"
1139 | ]
1140 | },
1141 | {
1142 | "cell_type": "code",
1143 | "execution_count": 5,
1144 | "metadata": {},
1145 | "outputs": [
1146 | {
1147 | "data": {
1148 | "text/plain": [
1149 | "France 5014\n",
1150 | "Germany 2509\n",
1151 | "Spain 2477\n",
1152 | "Name: Geography, dtype: int64"
1153 | ]
1154 | },
1155 | "execution_count": 5,
1156 | "metadata": {},
1157 | "output_type": "execute_result"
1158 | }
1159 | ],
1160 | "source": [
1161 | "dataset.Geography.value_counts()"
1162 | ]
1163 | },
1164 | {
1165 | "cell_type": "code",
1166 | "execution_count": 7,
1167 | "metadata": {},
1168 | "outputs": [
1169 | {
1170 | "name": "stdout",
1171 | "output_type": "stream",
1172 | "text": [
1173 | "X >>\n",
1174 | " [[619 'France' 'Female' ... 1 1 101348.88]\n",
1175 | " [608 'Spain' 'Female' ... 0 1 112542.58]\n",
1176 | " [502 'France' 'Female' ... 1 0 113931.57]\n",
1177 | " ...\n",
1178 | " [709 'France' 'Female' ... 0 1 42085.58]\n",
1179 | " [772 'Germany' 'Male' ... 1 0 92888.52]\n",
1180 | " [792 'France' 'Female' ... 1 0 38190.78]]\n",
1181 | "y >>\n",
1182 | " [1 0 1 ... 1 1 0]\n"
1183 | ]
1184 | }
1185 | ],
1186 | "source": [
1187 | "X = dataset.iloc[:, 3:13].values\n",
1188 | "y = dataset.iloc[:, 13].values\n",
1189 | "print(\"X >>\\n\",X)\n",
1190 | "print(\"y >>\\n\",y)"
1191 | ]
1192 | },
1193 | {
1194 | "cell_type": "markdown",
1195 | "metadata": {},
1196 | "source": [
1197 | "### Transformando os dados categóricos\n"
1198 | ]
1199 | },
1200 | {
1201 | "cell_type": "code",
1202 | "execution_count": 9,
1203 | "metadata": {},
1204 | "outputs": [
1205 | {
1206 | "name": "stdout",
1207 | "output_type": "stream",
1208 | "text": [
1209 | "[0 0 0 ... 0 1 0]\n"
1210 | ]
1211 | }
1212 | ],
1213 | "source": [
1214 | "# Label Encoding the \"Gender\" column\n",
1215 | "from sklearn.preprocessing import LabelEncoder\n",
1216 | "le = LabelEncoder()\n",
1217 | "X[:, 2] = le.fit_transform(X[:, 2])\n",
1218 | "print(X[:, 2])"
1219 | ]
1220 | },
1221 | {
1222 | "cell_type": "code",
1223 | "execution_count": 10,
1224 | "metadata": {},
1225 | "outputs": [
1226 | {
1227 | "name": "stdout",
1228 | "output_type": "stream",
1229 | "text": [
1230 | "[[1.0 0.0 0.0 ... 1 1 101348.88]\n",
1231 | " [0.0 0.0 1.0 ... 0 1 112542.58]\n",
1232 | " [1.0 0.0 0.0 ... 1 0 113931.57]\n",
1233 | " ...\n",
1234 | " [1.0 0.0 0.0 ... 0 1 42085.58]\n",
1235 | " [0.0 1.0 0.0 ... 1 0 92888.52]\n",
1236 | " [1.0 0.0 0.0 ... 1 0 38190.78]]\n"
1237 | ]
1238 | }
1239 | ],
1240 | "source": [
1241 | "# One Hot Encoding the \"Geography\" column\n",
1242 | "from sklearn.compose import ColumnTransformer\n",
1243 | "from sklearn.preprocessing import OneHotEncoder\n",
1244 | "ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [1])], remainder='passthrough')\n",
1245 | "X = np.array(ct.fit_transform(X))\n",
1246 | "print(X)"
1247 | ]
1248 | },
1249 | {
1250 | "cell_type": "markdown",
1251 | "metadata": {},
1252 | "source": [
1253 | "# Dividindo o dataset em conjunto de treinamento e conjunto de teste"
1254 | ]
1255 | },
1256 | {
1257 | "cell_type": "code",
1258 | "execution_count": 11,
1259 | "metadata": {},
1260 | "outputs": [],
1261 | "source": [
1262 | "from sklearn.model_selection import train_test_split\n",
1263 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)"
1264 | ]
1265 | },
1266 | {
1267 | "cell_type": "markdown",
1268 | "metadata": {},
1269 | "source": [
1270 | "# Feature Scaling"
1271 | ]
1272 | },
1273 | {
1274 | "cell_type": "code",
1275 | "execution_count": 12,
1276 | "metadata": {},
1277 | "outputs": [],
1278 | "source": [
1279 | "from sklearn.preprocessing import StandardScaler\n",
1280 | "sc = StandardScaler()\n",
1281 | "X_train = sc.fit_transform(X_train)\n",
1282 | "X_test = sc.transform(X_test)"
1283 | ]
1284 | },
1285 | {
1286 | "cell_type": "code",
1287 | "execution_count": 13,
1288 | "metadata": {},
1289 | "outputs": [
1290 | {
1291 | "data": {
1292 | "text/plain": [
1293 | "(8000, 12)"
1294 | ]
1295 | },
1296 | "execution_count": 13,
1297 | "metadata": {},
1298 | "output_type": "execute_result"
1299 | }
1300 | ],
1301 | "source": [
1302 | "np.shape(X_train)"
1303 | ]
1304 | },
1305 | {
1306 | "cell_type": "code",
1307 | "execution_count": 14,
1308 | "metadata": {},
1309 | "outputs": [
1310 | {
1311 | "data": {
1312 | "text/plain": [
1313 | "array([[-1.01460667, -0.5698444 , 1.74309049, ..., 0.64259497,\n",
1314 | " -1.03227043, 1.10643166],\n",
1315 | " [-1.01460667, 1.75486502, -0.57369368, ..., 0.64259497,\n",
1316 | " 0.9687384 , -0.74866447],\n",
1317 | " [ 0.98560362, -0.5698444 , -0.57369368, ..., 0.64259497,\n",
1318 | " -1.03227043, 1.48533467],\n",
1319 | " ...,\n",
1320 | " [ 0.98560362, -0.5698444 , -0.57369368, ..., 0.64259497,\n",
1321 | " -1.03227043, 1.41231994],\n",
1322 | " [-1.01460667, -0.5698444 , 1.74309049, ..., 0.64259497,\n",
1323 | " 0.9687384 , 0.84432121],\n",
1324 | " [-1.01460667, 1.75486502, -0.57369368, ..., 0.64259497,\n",
1325 | " -1.03227043, 0.32472465]])"
1326 | ]
1327 | },
1328 | "execution_count": 14,
1329 | "metadata": {},
1330 | "output_type": "execute_result"
1331 | }
1332 | ],
1333 | "source": [
1334 | "X_train"
1335 | ]
1336 | },
1337 | {
1338 | "cell_type": "markdown",
1339 | "metadata": {},
1340 | "source": [
1341 | "---\n",
1342 | "# Parte 2 -Vamos construir uma ANN!\n"
1343 | ]
1344 | },
1345 | {
1346 | "cell_type": "markdown",
1347 | "metadata": {
1348 | "colab_type": "text",
1349 | "id": "KvdeScabXtlB"
1350 | },
1351 | "source": [
1352 | "### Initializing the ANN"
1353 | ]
1354 | },
1355 | {
1356 | "cell_type": "code",
1357 | "execution_count": 15,
1358 | "metadata": {
1359 | "colab": {},
1360 | "colab_type": "code",
1361 | "id": "3dtrScHxXQox"
1362 | },
1363 | "outputs": [],
1364 | "source": [
1365 | "ann = tf.keras.models.Sequential()"
1366 | ]
1367 | },
1368 | {
1369 | "cell_type": "markdown",
1370 | "metadata": {
1371 | "colab_type": "text",
1372 | "id": "rP6urV6SX7kS"
1373 | },
1374 | "source": [
1375 | "### Adding the input layer and the first hidden layer"
1376 | ]
1377 | },
1378 | {
1379 | "cell_type": "code",
1380 | "execution_count": 16,
1381 | "metadata": {
1382 | "colab": {},
1383 | "colab_type": "code",
1384 | "id": "bppGycBXYCQr"
1385 | },
1386 | "outputs": [],
1387 | "source": [
1388 | "ann.add(tf.keras.layers.Dense(units=6, activation='relu'))"
1389 | ]
1390 | },
1391 | {
1392 | "cell_type": "markdown",
1393 | "metadata": {
1394 | "colab_type": "text",
1395 | "id": "BELWAc_8YJze"
1396 | },
1397 | "source": [
1398 | "### Adding the second hidden layer"
1399 | ]
1400 | },
1401 | {
1402 | "cell_type": "code",
1403 | "execution_count": 17,
1404 | "metadata": {
1405 | "colab": {},
1406 | "colab_type": "code",
1407 | "id": "JneR0u0sYRTd"
1408 | },
1409 | "outputs": [],
1410 | "source": [
1411 | "ann.add(tf.keras.layers.Dense(units=6, activation='relu'))"
1412 | ]
1413 | },
1414 | {
1415 | "cell_type": "markdown",
1416 | "metadata": {
1417 | "colab_type": "text",
1418 | "id": "OyNEe6RXYcU4"
1419 | },
1420 | "source": [
1421 | "### Adding the output layer"
1422 | ]
1423 | },
1424 | {
1425 | "cell_type": "code",
1426 | "execution_count": 18,
1427 | "metadata": {
1428 | "colab": {},
1429 | "colab_type": "code",
1430 | "id": "Cn3x41RBYfvY"
1431 | },
1432 | "outputs": [],
1433 | "source": [
1434 | "ann.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))"
1435 | ]
1436 | },
1437 | {
1438 | "cell_type": "markdown",
1439 | "metadata": {
1440 | "colab_type": "text",
1441 | "id": "8GWlJChhY_ZI"
1442 | },
1443 | "source": [
1444 | "### Compiling the ANN"
1445 | ]
1446 | },
1447 | {
1448 | "cell_type": "code",
1449 | "execution_count": 19,
1450 | "metadata": {
1451 | "colab": {},
1452 | "colab_type": "code",
1453 | "id": "fG3RrwDXZEaS"
1454 | },
1455 | "outputs": [],
1456 | "source": [
1457 | "ann.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])"
1458 | ]
1459 | },
1460 | {
1461 | "cell_type": "markdown",
1462 | "metadata": {
1463 | "colab_type": "text",
1464 | "id": "JT4u2S1_Y4WG"
1465 | },
1466 | "source": [
1467 | "## Part 3 - Training the ANN"
1468 | ]
1469 | },
1470 | {
1471 | "cell_type": "markdown",
1472 | "metadata": {
1473 | "colab_type": "text",
1474 | "id": "0QR_G5u7ZLSM"
1475 | },
1476 | "source": [
1477 | "### Training the ANN on the Training set"
1478 | ]
1479 | },
1480 | {
1481 | "cell_type": "code",
1482 | "execution_count": 20,
1483 | "metadata": {
1484 | "colab": {
1485 | "base_uri": "https://localhost:8080/",
1486 | "height": 1000
1487 | },
1488 | "colab_type": "code",
1489 | "id": "nHZ-LKv_ZRb3",
1490 | "outputId": "718cc4b0-b5aa-40f0-9b20-d3d31730a531"
1491 | },
1492 | "outputs": [
1493 | {
1494 | "name": "stdout",
1495 | "output_type": "stream",
1496 | "text": [
1497 | "Epoch 1/100\n",
1498 | "250/250 [==============================] - 2s 3ms/step - loss: 0.5819 - accuracy: 0.7604\n",
1499 | "Epoch 2/100\n",
1500 | "250/250 [==============================] - 1s 3ms/step - loss: 0.4819 - accuracy: 0.7966\n",
1501 | "Epoch 3/100\n",
1502 | "250/250 [==============================] - 1s 4ms/step - loss: 0.4565 - accuracy: 0.7976TA: 4\n",
1503 | "Epoch 4/100\n",
1504 | "250/250 [==============================] - 1s 4ms/step - loss: 0.4461 - accuracy: 0.8012\n",
1505 | "Epoch 5/100\n",
1506 | "250/250 [==============================] - 2s 6ms/step - loss: 0.4380 - accuracy: 0.8144\n",
1507 | "Epoch 6/100\n",
1508 | "250/250 [==============================] - 1s 5ms/step - loss: 0.4241 - accuracy: 0.8217\n",
1509 | "Epoch 7/100\n",
1510 | "250/250 [==============================] - 1s 5ms/step - loss: 0.4247 - accuracy: 0.8228\n",
1511 | "Epoch 8/100\n",
1512 | "250/250 [==============================] - 1s 6ms/step - loss: 0.4212 - accuracy: 0.8239\n",
1513 | "Epoch 9/100\n",
1514 | "250/250 [==============================] - 2s 6ms/step - loss: 0.4153 - accuracy: 0.8270\n",
1515 | "Epoch 10/100\n",
1516 | "250/250 [==============================] - 1s 6ms/step - loss: 0.4188 - accuracy: 0.8269\n",
1517 | "Epoch 11/100\n",
1518 | "250/250 [==============================] - 2s 6ms/step - loss: 0.4013 - accuracy: 0.8392\n",
1519 | "Epoch 12/100\n",
1520 | "250/250 [==============================] - 1s 6ms/step - loss: 0.4047 - accuracy: 0.8339\n",
1521 | "Epoch 13/100\n",
1522 | "250/250 [==============================] - 1s 5ms/step - loss: 0.4108 - accuracy: 0.8234\n",
1523 | "Epoch 14/100\n",
1524 | "250/250 [==============================] - 1s 5ms/step - loss: 0.4088 - accuracy: 0.8298\n",
1525 | "Epoch 15/100\n",
1526 | "250/250 [==============================] - 1s 6ms/step - loss: 0.4024 - accuracy: 0.8309\n",
1527 | "Epoch 16/100\n",
1528 | "250/250 [==============================] - 2s 6ms/step - loss: 0.4004 - accuracy: 0.8277\n",
1529 | "Epoch 17/100\n",
1530 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3997 - accuracy: 0.8324\n",
1531 | "Epoch 18/100\n",
1532 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3812 - accuracy: 0.8430: 1s - loss: - ETA: 0s - los\n",
1533 | "Epoch 19/100\n",
1534 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3860 - accuracy: 0.8360\n",
1535 | "Epoch 20/100\n",
1536 | "250/250 [==============================] - 1s 5ms/step - loss: 0.3943 - accuracy: 0.8300\n",
1537 | "Epoch 21/100\n",
1538 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3885 - accuracy: 0.8331\n",
1539 | "Epoch 22/100\n",
1540 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3755 - accuracy: 0.8342\n",
1541 | "Epoch 23/100\n",
1542 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3746 - accuracy: 0.8395\n",
1543 | "Epoch 24/100\n",
1544 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3769 - accuracy: 0.8359\n",
1545 | "Epoch 25/100\n",
1546 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3792 - accuracy: 0.8390: 0s - l\n",
1547 | "Epoch 26/100\n",
1548 | "250/250 [==============================] - 2s 9ms/step - loss: 0.3752 - accuracy: 0.8437\n",
1549 | "Epoch 27/100\n",
1550 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3629 - accuracy: 0.8575\n",
1551 | "Epoch 28/100\n",
1552 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3619 - accuracy: 0.8469: \n",
1553 | "Epoch 29/100\n",
1554 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3646 - accuracy: 0.8520\n",
1555 | "Epoch 30/100\n",
1556 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3559 - accuracy: 0.8568\n",
1557 | "Epoch 31/100\n",
1558 | "250/250 [==============================] - 1s 5ms/step - loss: 0.3490 - accuracy: 0.8637\n",
1559 | "Epoch 32/100\n",
1560 | "250/250 [==============================] - 1s 5ms/step - loss: 0.3608 - accuracy: 0.8485\n",
1561 | "Epoch 33/100\n",
1562 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3533 - accuracy: 0.8581\n",
1563 | "Epoch 34/100\n",
1564 | "250/250 [==============================] - 1s 5ms/step - loss: 0.3498 - accuracy: 0.8586\n",
1565 | "Epoch 35/100\n",
1566 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3616 - accuracy: 0.8514: 0s -\n",
1567 | "Epoch 36/100\n",
1568 | "250/250 [==============================] - 1s 4ms/step - loss: 0.3465 - accuracy: 0.8561\n",
1569 | "Epoch 37/100\n",
1570 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3532 - accuracy: 0.8522: 1s - loss: 0.3\n",
1571 | "Epoch 38/100\n",
1572 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3506 - accuracy: 0.8518\n",
1573 | "Epoch 39/100\n",
1574 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3329 - accuracy: 0.8668\n",
1575 | "Epoch 40/100\n",
1576 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3594 - accuracy: 0.8522: 0s - loss:\n",
1577 | "Epoch 41/100\n",
1578 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3466 - accuracy: 0.8533\n",
1579 | "Epoch 42/100\n",
1580 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3600 - accuracy: 0.8502\n",
1581 | "Epoch 43/100\n",
1582 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3510 - accuracy: 0.8531\n",
1583 | "Epoch 44/100\n",
1584 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3483 - accuracy: 0.8568\n",
1585 | "Epoch 45/100\n",
1586 | "250/250 [==============================] - 2s 9ms/step - loss: 0.3460 - accuracy: 0.8601\n",
1587 | "Epoch 46/100\n",
1588 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3346 - accuracy: 0.8593\n",
1589 | "Epoch 47/100\n",
1590 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3413 - accuracy: 0.8607: 0s - loss: 0.3411 - accuracy: \n",
1591 | "Epoch 48/100\n",
1592 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3569 - accuracy: 0.8516\n",
1593 | "Epoch 49/100\n",
1594 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3346 - accuracy: 0.8662\n",
1595 | "Epoch 50/100\n",
1596 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3404 - accuracy: 0.8630\n",
1597 | "Epoch 51/100\n",
1598 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3303 - accuracy: 0.8675\n",
1599 | "Epoch 52/100\n",
1600 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3423 - accuracy: 0.8595\n",
1601 | "Epoch 53/100\n",
1602 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3317 - accuracy: 0.8637\n",
1603 | "Epoch 54/100\n",
1604 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3361 - accuracy: 0.8626\n",
1605 | "Epoch 55/100\n",
1606 | "250/250 [==============================] - 1s 5ms/step - loss: 0.3498 - accuracy: 0.8522\n",
1607 | "Epoch 56/100\n",
1608 | "250/250 [==============================] - 1s 5ms/step - loss: 0.3446 - accuracy: 0.8582\n",
1609 | "Epoch 57/100\n",
1610 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3295 - accuracy: 0.8666: 0s - loss: 0.3282 - accura\n",
1611 | "Epoch 58/100\n",
1612 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3392 - accuracy: 0.8621\n",
1613 | "Epoch 59/100\n",
1614 | "250/250 [==============================] - 1s 5ms/step - loss: 0.3335 - accuracy: 0.8620\n",
1615 | "Epoch 60/100\n",
1616 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3355 - accuracy: 0.8670\n",
1617 | "Epoch 61/100\n",
1618 | "250/250 [==============================] - 1s 4ms/step - loss: 0.3264 - accuracy: 0.8667\n",
1619 | "Epoch 62/100\n",
1620 | "250/250 [==============================] - 1s 4ms/step - loss: 0.3400 - accuracy: 0.8600: 0s - loss:\n",
1621 | "Epoch 63/100\n",
1622 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3512 - accuracy: 0.8541: 0s - loss: 0.3544 - ac\n",
1623 | "Epoch 64/100\n",
1624 | "250/250 [==============================] - 1s 4ms/step - loss: 0.3483 - accuracy: 0.8578\n",
1625 | "Epoch 65/100\n",
1626 | "250/250 [==============================] - 1s 4ms/step - loss: 0.3294 - accuracy: 0.8683\n",
1627 | "Epoch 66/100\n",
1628 | "250/250 [==============================] - 1s 4ms/step - loss: 0.3318 - accuracy: 0.8681\n",
1629 | "Epoch 67/100\n",
1630 | "250/250 [==============================] - 1s 4ms/step - loss: 0.3367 - accuracy: 0.8607\n",
1631 | "Epoch 68/100\n",
1632 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3358 - accuracy: 0.8667\n",
1633 | "Epoch 69/100\n",
1634 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3324 - accuracy: 0.8619\n",
1635 | "Epoch 70/100\n",
1636 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3338 - accuracy: 0.8634: 0s - loss:\n",
1637 | "Epoch 71/100\n",
1638 | "250/250 [==============================] - 3s 10ms/step - loss: 0.3324 - accuracy: 0.8639\n",
1639 | "Epoch 72/100\n",
1640 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3336 - accuracy: 0.8595\n",
1641 | "Epoch 73/100\n",
1642 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3276 - accuracy: 0.8686: 0s - loss: 0.3245 - \n",
1643 | "Epoch 74/100\n",
1644 | "250/250 [==============================] - 1s 5ms/step - loss: 0.3334 - accuracy: 0.8647\n",
1645 | "Epoch 75/100\n",
1646 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3256 - accuracy: 0.8665\n",
1647 | "Epoch 76/100\n",
1648 | "250/250 [==============================] - 2s 6ms/step - loss: 0.3226 - accuracy: 0.8694\n",
1649 | "Epoch 77/100\n",
1650 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3385 - accuracy: 0.8571\n",
1651 | "Epoch 78/100\n",
1652 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3427 - accuracy: 0.8521: 0s - loss: 0.3433 - accuracy\n",
1653 | "Epoch 79/100\n",
1654 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3366 - accuracy: 0.8609: 0s\n",
1655 | "Epoch 80/100\n",
1656 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3314 - accuracy: 0.8625\n",
1657 | "Epoch 81/100\n",
1658 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3452 - accuracy: 0.8597\n",
1659 | "Epoch 82/100\n",
1660 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3302 - accuracy: 0.8609: 0s - loss: 0.3288 - \n",
1661 | "Epoch 83/100\n",
1662 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3370 - accuracy: 0.8608\n",
1663 | "Epoch 84/100\n",
1664 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3350 - accuracy: 0.8646\n",
1665 | "Epoch 85/100\n",
1666 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3524 - accuracy: 0.8557: 0s - loss: 0.3586 - accuracy: 0.85 - ETA: 0s - loss: 0.3\n",
1667 | "Epoch 86/100\n",
1668 | "250/250 [==============================] - 2s 9ms/step - loss: 0.3319 - accuracy: 0.8623\n",
1669 | "Epoch 87/100\n",
1670 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3357 - accuracy: 0.8626\n",
1671 | "Epoch 88/100\n",
1672 | "250/250 [==============================] - 2s 7ms/step - loss: 0.3367 - accuracy: 0.8612\n",
1673 | "Epoch 89/100\n",
1674 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3339 - accuracy: 0.8631\n",
1675 | "Epoch 90/100\n",
1676 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3390 - accuracy: 0.8546\n",
1677 | "Epoch 91/100\n",
1678 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3307 - accuracy: 0.8648: 1s - loss: 0.3297 - accu\n",
1679 | "Epoch 92/100\n",
1680 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3218 - accuracy: 0.8735\n",
1681 | "Epoch 93/100\n",
1682 | "250/250 [==============================] - 1s 2ms/step - loss: 0.3458 - accuracy: 0.8532\n",
1683 | "Epoch 94/100\n",
1684 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3362 - accuracy: 0.8622\n",
1685 | "Epoch 95/100\n",
1686 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3364 - accuracy: 0.8617\n",
1687 | "Epoch 96/100\n",
1688 | "250/250 [==============================] - 2s 8ms/step - loss: 0.3329 - accuracy: 0.8617\n",
1689 | "Epoch 97/100\n",
1690 | "250/250 [==============================] - 1s 5ms/step - loss: 0.3260 - accuracy: 0.8705\n",
1691 | "Epoch 98/100\n",
1692 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3452 - accuracy: 0.8588: 0s - loss: 0.3490 - ac\n",
1693 | "Epoch 99/100\n",
1694 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3383 - accuracy: 0.8617\n",
1695 | "Epoch 100/100\n",
1696 | "250/250 [==============================] - 1s 6ms/step - loss: 0.3389 - accuracy: 0.8612\n"
1697 | ]
1698 | },
1699 | {
1700 | "data": {
1701 | "text/plain": [
1702 | ""
1703 | ]
1704 | },
1705 | "execution_count": 20,
1706 | "metadata": {},
1707 | "output_type": "execute_result"
1708 | }
1709 | ],
1710 | "source": [
1711 | "ann.fit(X_train, y_train, batch_size = 32, epochs = 100)"
1712 | ]
1713 | },
1714 | {
1715 | "cell_type": "markdown",
1716 | "metadata": {},
1717 | "source": [
1718 | "# Parte 3 - Fazendo predições e avaliando o modelo\n",
1719 | "\n",
1720 | "## Prevendo os resultados com o conjunto de testes"
1721 | ]
1722 | },
1723 | {
1724 | "cell_type": "code",
1725 | "execution_count": 21,
1726 | "metadata": {},
1727 | "outputs": [
1728 | {
1729 | "data": {
1730 | "text/plain": [
1731 | "array([[0.3427144 ],\n",
1732 | " [0.3022073 ],\n",
1733 | " [0.1530391 ],\n",
1734 | " ...,\n",
1735 | " [0.19075722],\n",
1736 | " [0.138769 ],\n",
1737 | " [0.2750219 ]], dtype=float32)"
1738 | ]
1739 | },
1740 | "execution_count": 21,
1741 | "metadata": {},
1742 | "output_type": "execute_result"
1743 | }
1744 | ],
1745 | "source": [
1746 | "y_pred = ann.predict(X_test)\n",
1747 | "y_pred"
1748 | ]
1749 | },
1750 | {
1751 | "cell_type": "code",
1752 | "execution_count": 22,
1753 | "metadata": {},
1754 | "outputs": [
1755 | {
1756 | "data": {
1757 | "text/plain": [
1758 | "array([[False],\n",
1759 | " [False],\n",
1760 | " [False],\n",
1761 | " ...,\n",
1762 | " [False],\n",
1763 | " [False],\n",
1764 | " [False]])"
1765 | ]
1766 | },
1767 | "execution_count": 22,
1768 | "metadata": {},
1769 | "output_type": "execute_result"
1770 | }
1771 | ],
1772 | "source": [
1773 | "y_pred = (y_pred > 0.5)\n",
1774 | "y_pred"
1775 | ]
1776 | },
1777 | {
1778 | "cell_type": "markdown",
1779 | "metadata": {},
1780 | "source": [
1781 | "# Criando uma Confusion Matrix"
1782 | ]
1783 | },
1784 | {
1785 | "cell_type": "code",
1786 | "execution_count": 18,
1787 | "metadata": {},
1788 | "outputs": [
1789 | {
1790 | "name": "stdout",
1791 | "output_type": "stream",
1792 | "text": [
1793 | "[[1519 76]\n",
1794 | " [ 200 205]]\n"
1795 | ]
1796 | }
1797 | ],
1798 | "source": [
1799 | "from sklearn.metrics import confusion_matrix\n",
1800 | "cm = confusion_matrix(y_test, y_pred)\n",
1801 | "print(cm)"
1802 | ]
1803 | },
1804 | {
1805 | "cell_type": "markdown",
1806 | "metadata": {},
1807 | "source": [
1808 | "# FIM"
1809 | ]
1810 | },
1811 | {
1812 | "cell_type": "markdown",
1813 | "metadata": {},
1814 | "source": [
1815 | "> Professor Diego Dorgam \n",
1816 | "> [@diegodorgam](https://twitter.com/diegodorgam)"
1817 | ]
1818 | }
1819 | ],
1820 | "metadata": {
1821 | "kernelspec": {
1822 | "display_name": "Python 3",
1823 | "language": "python",
1824 | "name": "python3"
1825 | },
1826 | "language_info": {
1827 | "codemirror_mode": {
1828 | "name": "ipython",
1829 | "version": 3
1830 | },
1831 | "file_extension": ".py",
1832 | "mimetype": "text/x-python",
1833 | "name": "python",
1834 | "nbconvert_exporter": "python",
1835 | "pygments_lexer": "ipython3",
1836 | "version": "3.8.6"
1837 | }
1838 | },
1839 | "nbformat": 4,
1840 | "nbformat_minor": 4
1841 | }
1842 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Construindo uma Rede Neural Artificial
2 |
3 | Construindo sua primeira rede neural usando Keras, Theano e Tensorflow
4 | Parte da matéria de DeepLearning da escola de Engenharia de Software da UnB
5 |
6 | ## Usage
7 |
8 | ### jupyter-notebook
9 |
10 | Open a `jupyter-notebook` in your desired `env` and run the command:
11 |
12 | ```sh
13 | jupyter-notebook ArtificialNeuralNetwork.ipynb
14 | ```
15 | ### Python module
16 |
17 | Install the requirements in the desired `env`:
18 |
19 | ```sh
20 | pip install -r requirements.txt
21 | ```
22 |
23 | Run the python module and make changes in a file editor:
24 |
25 | ```sh
26 | python ann.py
27 | ```
28 |
29 | or
30 |
31 | ```sh
32 | python evaluating_improving_tuning.py
33 | ```
34 |
35 |
--------------------------------------------------------------------------------
/ann.py:
--------------------------------------------------------------------------------
1 | # Artificial Neural Network
2 |
3 | # Installing Theano
4 | # pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git
5 |
6 | # Installing Tensorflow
7 | # pip install tensorflow
8 |
9 | # Installing Keras
10 | # pip install --upgrade keras
11 |
12 | # Part 1 - Data Preprocessing
13 |
14 | # Importing the libraries
15 | import numpy as np
16 | import matplotlib.pyplot as plt
17 | import pandas as pd
18 |
19 | # Importing the dataset
20 | dataset = pd.read_csv('Churn_Modelling.csv')
21 | X = dataset.iloc[:, 3:13].values
22 | y = dataset.iloc[:, 13].values
23 |
24 | # Encoding categorical data
25 | from sklearn.preprocessing import LabelEncoder, OneHotEncoder
26 | labelencoder_X_1 = LabelEncoder()
27 | X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])
28 | labelencoder_X_2 = LabelEncoder()
29 | X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])
30 | onehotencoder = OneHotEncoder(categorical_features = [1])
31 | X = onehotencoder.fit_transform(X).toarray()
32 | X = X[:, 1:]
33 |
34 | # Splitting the dataset into the Training set and Test set
35 | from sklearn.model_selection import train_test_split
36 | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
37 |
38 | # Feature Scaling
39 | from sklearn.preprocessing import StandardScaler
40 | sc = StandardScaler()
41 | X_train = sc.fit_transform(X_train)
42 | X_test = sc.transform(X_test)
43 |
44 | # Part 2 - Now let's make the ANN!
45 |
46 | # Importing the Keras libraries and packages
47 | import keras
48 | from keras.models import Sequential
49 | from keras.layers import Dense
50 |
51 | # Initialising the ANN
52 | classifier = Sequential()
53 |
54 | # Adding the input layer and the first hidden layer
55 | classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11))
56 |
57 | # Adding the second hidden layer
58 | classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu'))
59 |
60 | # Adding the output layer
61 | classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
62 |
63 | # Compiling the ANN
64 | classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
65 |
66 | # Fitting the ANN to the Training set
67 | classifier.fit(X_train, y_train, batch_size = 10, epochs = 30)
68 |
69 | # Part 3 - Making predictions and evaluating the model
70 |
71 | # Predicting the Test set results
72 | y_pred = classifier.predict(X_test)
73 | y_pred = (y_pred > 0.5)
74 |
75 | # Making the Confusion Matrix
76 | from sklearn.metrics import confusion_matrix
77 | cm = confusion_matrix(y_test, y_pred)
--------------------------------------------------------------------------------
/evaluating_improving_tuning.py:
--------------------------------------------------------------------------------
1 | # Artificial Neural Network
2 |
3 | # Installing Theano
4 | # pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git
5 |
6 | # Installing Tensorflow
7 | # pip install tensorflow
8 |
9 | # Installing Keras
10 | # pip install --upgrade keras
11 |
12 | # Part 1 - Data Preprocessing
13 |
14 | # Importing the libraries
15 | import numpy as np
16 | import matplotlib.pyplot as plt
17 | import pandas as pd
18 |
19 | # Importing the dataset
20 | dataset = pd.read_csv('Churn_Modelling.csv')
21 | X = dataset.iloc[:, 3:13].values
22 | y = dataset.iloc[:, 13].values
23 |
24 | # Encoding categorical data
25 | from sklearn.preprocessing import LabelEncoder, OneHotEncoder
26 | labelencoder_X_1 = LabelEncoder()
27 | X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])
28 | labelencoder_X_2 = LabelEncoder()
29 | X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])
30 | onehotencoder = OneHotEncoder(categorical_features = [1])
31 | X = onehotencoder.fit_transform(X).toarray()
32 | X = X[:, 1:]
33 |
34 | # Splitting the dataset into the Training set and Test set
35 | from sklearn.model_selection import train_test_split
36 | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
37 |
38 | # Feature Scaling
39 | from sklearn.preprocessing import StandardScaler
40 | sc = StandardScaler()
41 | X_train = sc.fit_transform(X_train)
42 | X_test = sc.transform(X_test)
43 |
44 | # Part 2 - Now let's make the ANN!
45 |
46 | # Importing the Keras libraries and packages
47 | import keras
48 | from keras.models import Sequential
49 | from keras.layers import Dense
50 | from keras.layers import Dropout
51 |
52 | # Initialising the ANN
53 | classifier = Sequential()
54 |
55 | # Adding the input layer and the first hidden layer
56 | classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11))
57 | # classifier.add(Dropout(rate = 0.1))
58 |
59 | # Adding the second hidden layer
60 | classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu'))
61 | # classifier.add(Dropout(rate = 0.1))
62 |
63 | # Adding the output layer
64 | classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
65 |
66 | # Compiling the ANN
67 | classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
68 |
69 | # Fitting the ANN to the Training set
70 | classifier.fit(X_train, y_train, batch_size = 10, epochs = 100)
71 |
72 | # Part 3 - Making predictions and evaluating the model
73 |
74 | # Predicting the Test set results
75 | y_pred = classifier.predict(X_test)
76 | y_pred = (y_pred > 0.5)
77 |
78 | # Predicting a single new observation
79 | """Predict if the customer with the following informations will leave the bank:
80 | Geography: France
81 | Credit Score: 600
82 | Gender: Male
83 | Age: 40
84 | Tenure: 3
85 | Balance: 60000
86 | Number of Products: 2
87 | Has Credit Card: Yes
88 | Is Active Member: Yes
89 | Estimated Salary: 50000"""
90 | new_prediction = classifier.predict(sc.transform(np.array([[0.0, 0, 600, 1, 40, 3, 60000, 2, 1, 1, 50000]])))
91 | new_prediction = (new_prediction > 0.5)
92 |
93 | # Making the Confusion Matrix
94 | from sklearn.metrics import confusion_matrix
95 | cm = confusion_matrix(y_test, y_pred)
96 |
97 | # Part 4 - Evaluating, Improving and Tuning the ANN
98 |
99 | # Evaluating the ANN
100 | from keras.wrappers.scikit_learn import KerasClassifier
101 | from sklearn.model_selection import cross_val_score
102 | from keras.models import Sequential
103 | from keras.layers import Dense
104 | #from keras.layers import Dropout
105 | def build_classifier():
106 | classifier = Sequential()
107 | classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11))
108 | classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu'))
109 | classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
110 | classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
111 | return classifier
112 |
113 | classifier = KerasClassifier(build_fn = build_classifier, batch_size = 10, epochs = 10)
114 | accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10, n_jobs = -1)
115 | mean = accuracies.mean()
116 | variance = accuracies.std()
117 |
118 | # Improving the ANN
119 | # Dropout Regularization to reduce overfitting if needed
120 | from keras.layers import Dropout
121 |
122 | def build_classifier():
123 | classifier = Sequential()
124 | classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11))
125 | classifier.add(Dropout(rate = 0.1))
126 | classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu'))
127 | classifier.add(Dropout(rate = 0.1))
128 | classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
129 | classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
130 | return classifier
131 |
132 | classifier = KerasClassifier(build_fn = build_classifier, batch_size = 10, epochs = 10)
133 | accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10, n_jobs = -1)
134 | mean = accuracies.mean()
135 | variance = accuracies.std()
136 |
137 | # Tuning the ANN
138 | from keras.wrappers.scikit_learn import KerasClassifier
139 | from sklearn.model_selection import GridSearchCV
140 | from keras.models import Sequential
141 | from keras.layers import Dense
142 |
143 | def build_classifier(optimizer):
144 | classifier = Sequential()
145 | classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11))
146 | classifier.add(Dropout(rate = 0.1))
147 | classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu'))
148 | classifier.add(Dropout(rate = 0.1))
149 | classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
150 | classifier.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = ['accuracy'])
151 | return classifier
152 |
153 | classifier = KerasClassifier(build_fn = build_classifier)
154 |
155 | parameters = {'batch_size': [10, 25, 32],
156 | 'epochs': [100, 500],
157 | 'optimizer': ['adam', 'rmsprop']}
158 |
159 | grid_search = GridSearchCV(estimator = classifier,
160 | scoring = 'accuracy',
161 | param_grid = parameters,
162 | cv = 10)
163 |
164 | grid_search = grid_search.fit(X_train, y_train)
165 |
166 | best_parameters = grid_search.best_params_
167 | best_accuracy = grid_search.best_score_
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | numpy==1.16.2
2 | pandas==0.24.2
3 | matplotlib==3.0.3
4 | sklearn==0.0
5 | tensorflow==2.3.1
6 |
--------------------------------------------------------------------------------