nlkt-lab 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nlkt_lab-0.1.0/LICENSE +0 -0
- nlkt_lab-0.1.0/PKG-INFO +13 -0
- nlkt_lab-0.1.0/README.md +0 -0
- nlkt_lab-0.1.0/pyproject.toml +41 -0
- nlkt_lab-0.1.0/setup.cfg +4 -0
- nlkt_lab-0.1.0/src/nlkt/__init__.py +3 -0
- nlkt_lab-0.1.0/src/nlkt/autoencoders/__init__.py +0 -0
- nlkt_lab-0.1.0/src/nlkt/cbow/__init__.py +0 -0
- nlkt_lab-0.1.0/src/nlkt/cnn/__init__.py +0 -0
- nlkt_lab-0.1.0/src/nlkt/fnn/__init__.py +0 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/autoencoders/AutoEncoder_CreditCard.ipynb +280 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/autoencoders/AutoEncoder_Energy.ipynb +300 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/autoencoders/AutoEncoder_NASA.ipynb +301 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/autoencoders/Autoencoder_SignLanguageMNIST.ipynb +290 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/cbow/CBOW_IMDB.ipynb +217 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/cbow/CBOW_Recommendation.ipynb +160 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/cbow/CBOW_Text.ipynb +387 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/cbow/CBOW_Twitter.ipynb +29390 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/cnn/CNN_CIFAR-10.ipynb +232 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/cnn/CNN_HandwrittenMNIST.ipynb +120 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/cnn/CNN_SignLanguageMNIST.ipynb +127 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/fnn/FNN_CIFAR-10.ipynb +188 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/fnn/FNN_FashionMNIST.ipynb +210 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/fnn/FNN_HandwrittenMNIST.ipynb +185 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/fnn/FNN_SignLanguageMNIST.ipynb +207 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/object_detection/ObjectDetect_Caltech.ipynb +284 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/object_detection/ObjectDetect_FashionMNIST.ipynb +383 -0
- nlkt_lab-0.1.0/src/nlkt/notebooks/object_detection/ObjectDetect_IntelImage.ipynb +340 -0
- nlkt_lab-0.1.0/src/nlkt/object_detection/__init__.py +0 -0
- nlkt_lab-0.1.0/src/nlkt_lab.egg-info/PKG-INFO +13 -0
- nlkt_lab-0.1.0/src/nlkt_lab.egg-info/SOURCES.txt +31 -0
- nlkt_lab-0.1.0/src/nlkt_lab.egg-info/dependency_links.txt +1 -0
- nlkt_lab-0.1.0/src/nlkt_lab.egg-info/top_level.txt +1 -0
nlkt_lab-0.1.0/LICENSE
ADDED
|
File without changes
|
nlkt_lab-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nlkt-lab
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A collection of machine learning and deep learning Jupyter notebooks
|
|
5
|
+
Keywords: machine-learning,deep-learning,jupyter-notebooks,cnn,autoencoder,cbow,neural-networks,object-detection
|
|
6
|
+
Classifier: Programming Language :: Python :: 3
|
|
7
|
+
Classifier: Operating System :: OS Independent
|
|
8
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
9
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
10
|
+
Requires-Python: >=3.10
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Dynamic: license-file
|
nlkt_lab-0.1.0/README.md
ADDED
|
File without changes
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
|
|
2
|
+
[build-system]
|
|
3
|
+
requires = ["setuptools>=68", "wheel"]
|
|
4
|
+
build-backend = "setuptools.build_meta"
|
|
5
|
+
|
|
6
|
+
[project]
|
|
7
|
+
name = "nlkt-lab"
|
|
8
|
+
version = "0.1.0"
|
|
9
|
+
description = "A collection of machine learning and deep learning Jupyter notebooks"
|
|
10
|
+
readme = "README.md"
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
|
|
13
|
+
keywords = [
|
|
14
|
+
"machine-learning",
|
|
15
|
+
"deep-learning",
|
|
16
|
+
"jupyter-notebooks",
|
|
17
|
+
"cnn",
|
|
18
|
+
"autoencoder",
|
|
19
|
+
"cbow",
|
|
20
|
+
"neural-networks",
|
|
21
|
+
"object-detection"
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
classifiers = [
|
|
25
|
+
"Programming Language :: Python :: 3",
|
|
26
|
+
"Operating System :: OS Independent",
|
|
27
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
28
|
+
"Topic :: Software Development :: Libraries :: Python Modules"
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
[tool.setuptools.packages.find]
|
|
32
|
+
where = ["src"]
|
|
33
|
+
|
|
34
|
+
[tool.setuptools.package-data]
|
|
35
|
+
nlkt = [
|
|
36
|
+
"notebooks/autoencoders/*.ipynb",
|
|
37
|
+
"notebooks/cbow/*.ipynb",
|
|
38
|
+
"notebooks/cnn/*.ipynb",
|
|
39
|
+
"notebooks/fnn/*.ipynb",
|
|
40
|
+
"notebooks/object_detection/*.ipynb"
|
|
41
|
+
]
|
nlkt_lab-0.1.0/setup.cfg
ADDED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "code",
|
|
5
|
+
"execution_count": 11,
|
|
6
|
+
"id": "601bbf34-95b9-4a78-9f0c-d5e78b9707fb",
|
|
7
|
+
"metadata": {},
|
|
8
|
+
"outputs": [
|
|
9
|
+
{
|
|
10
|
+
"data": {
|
|
11
|
+
"text/html": [
|
|
12
|
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential_10\"</span>\n",
|
|
13
|
+
"</pre>\n"
|
|
14
|
+
],
|
|
15
|
+
"text/plain": [
|
|
16
|
+
"\u001b[1mModel: \"sequential_10\"\u001b[0m\n"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"metadata": {},
|
|
20
|
+
"output_type": "display_data"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"data": {
|
|
24
|
+
"text/html": [
|
|
25
|
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
|
|
26
|
+
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
|
|
27
|
+
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
|
|
28
|
+
"│ dense_34 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">992</span> │\n",
|
|
29
|
+
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
|
|
30
|
+
"│ dense_35 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">528</span> │\n",
|
|
31
|
+
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
|
|
32
|
+
"│ dense_36 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">544</span> │\n",
|
|
33
|
+
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
|
|
34
|
+
"│ dense_37 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">30</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">990</span> │\n",
|
|
35
|
+
"└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
|
|
36
|
+
"</pre>\n"
|
|
37
|
+
],
|
|
38
|
+
"text/plain": [
|
|
39
|
+
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
|
|
40
|
+
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
|
|
41
|
+
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
|
|
42
|
+
"│ dense_34 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m992\u001b[0m │\n",
|
|
43
|
+
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
|
|
44
|
+
"│ dense_35 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m528\u001b[0m │\n",
|
|
45
|
+
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
|
|
46
|
+
"│ dense_36 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m544\u001b[0m │\n",
|
|
47
|
+
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
|
|
48
|
+
"│ dense_37 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m30\u001b[0m) │ \u001b[38;5;34m990\u001b[0m │\n",
|
|
49
|
+
"└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"metadata": {},
|
|
53
|
+
"output_type": "display_data"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"data": {
|
|
57
|
+
"text/html": [
|
|
58
|
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">3,054</span> (11.93 KB)\n",
|
|
59
|
+
"</pre>\n"
|
|
60
|
+
],
|
|
61
|
+
"text/plain": [
|
|
62
|
+
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m3,054\u001b[0m (11.93 KB)\n"
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"metadata": {},
|
|
66
|
+
"output_type": "display_data"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"data": {
|
|
70
|
+
"text/html": [
|
|
71
|
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">3,054</span> (11.93 KB)\n",
|
|
72
|
+
"</pre>\n"
|
|
73
|
+
],
|
|
74
|
+
"text/plain": [
|
|
75
|
+
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m3,054\u001b[0m (11.93 KB)\n"
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
"metadata": {},
|
|
79
|
+
"output_type": "display_data"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"data": {
|
|
83
|
+
"text/html": [
|
|
84
|
+
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
|
|
85
|
+
"</pre>\n"
|
|
86
|
+
],
|
|
87
|
+
"text/plain": [
|
|
88
|
+
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
"metadata": {},
|
|
92
|
+
"output_type": "display_data"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "stdout",
|
|
96
|
+
"output_type": "stream",
|
|
97
|
+
"text": [
|
|
98
|
+
"Epoch 1/10\n",
|
|
99
|
+
"\u001b[1m889/889\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 4ms/step - accuracy: 0.9437 - loss: 0.0039 - val_accuracy: 0.8079 - val_loss: 0.0014\n",
|
|
100
|
+
"Epoch 2/10\n",
|
|
101
|
+
"\u001b[1m889/889\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 4ms/step - accuracy: 0.9916 - loss: 0.0011 - val_accuracy: 0.8079 - val_loss: 8.9444e-04\n",
|
|
102
|
+
"Epoch 3/10\n",
|
|
103
|
+
"\u001b[1m889/889\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 4ms/step - accuracy: 0.9917 - loss: 6.7799e-04 - val_accuracy: 0.8079 - val_loss: 6.4038e-04\n",
|
|
104
|
+
"Epoch 4/10\n",
|
|
105
|
+
"\u001b[1m889/889\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 4ms/step - accuracy: 0.9917 - loss: 4.9503e-04 - val_accuracy: 0.8079 - val_loss: 5.3534e-04\n",
|
|
106
|
+
"Epoch 5/10\n",
|
|
107
|
+
"\u001b[1m889/889\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 3ms/step - accuracy: 0.9917 - loss: 4.3762e-04 - val_accuracy: 0.8081 - val_loss: 4.9779e-04\n",
|
|
108
|
+
"Epoch 6/10\n",
|
|
109
|
+
"\u001b[1m889/889\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 3ms/step - accuracy: 0.9917 - loss: 3.8599e-04 - val_accuracy: 0.8085 - val_loss: 4.3286e-04\n",
|
|
110
|
+
"Epoch 7/10\n",
|
|
111
|
+
"\u001b[1m889/889\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 3ms/step - accuracy: 0.9918 - loss: 3.3092e-04 - val_accuracy: 0.8085 - val_loss: 4.0030e-04\n",
|
|
112
|
+
"Epoch 8/10\n",
|
|
113
|
+
"\u001b[1m889/889\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 3ms/step - accuracy: 0.9918 - loss: 2.9805e-04 - val_accuracy: 0.8086 - val_loss: 3.8773e-04\n",
|
|
114
|
+
"Epoch 9/10\n",
|
|
115
|
+
"\u001b[1m889/889\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 3ms/step - accuracy: 0.9918 - loss: 2.8682e-04 - val_accuracy: 0.8089 - val_loss: 3.6781e-04\n",
|
|
116
|
+
"Epoch 10/10\n",
|
|
117
|
+
"\u001b[1m889/889\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 3ms/step - accuracy: 0.9918 - loss: 2.8043e-04 - val_accuracy: 0.8088 - val_loss: 3.7500e-04\n",
|
|
118
|
+
"\n",
|
|
119
|
+
"Threshold: 0.0007049179265381085\n",
|
|
120
|
+
"\n",
|
|
121
|
+
"Classification Report:\n",
|
|
122
|
+
" precision recall f1-score support\n",
|
|
123
|
+
"\n",
|
|
124
|
+
" 0 1.00 0.95 0.97 284315\n",
|
|
125
|
+
" 1 0.03 0.87 0.06 492\n",
|
|
126
|
+
"\n",
|
|
127
|
+
" accuracy 0.95 284807\n",
|
|
128
|
+
" macro avg 0.51 0.91 0.52 284807\n",
|
|
129
|
+
"weighted avg 1.00 0.95 0.97 284807\n",
|
|
130
|
+
"\n"
|
|
131
|
+
]
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"data": {
|
|
135
|
+
"image/png": "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N95Ay5YtC6w/f/68mni3LC1cuBDly5eHq2BwcgGNq5RDoK8XktOzceRiir0vh4jILQwaNAjr169Xk9bmJxPexsTEoHnz5iU+bqVKlRAYGIibITIyEn5+HDy5JBicXIC3lydaVjekec5bR0R0czzwwAMq5EiLiqmUlBQsX75cBatLly6hX79+qFq1qgpDzZo1w1dffVXkcfN31R05cgQdO3ZUE9M2btxYhbX8Ro8ejfr166tz3HLLLZgwYQKysrLUNrm+N998E3v27FGtYLLo15y/q06mXrn77rsREBCAihUrqpYv+Ty6p59+Gj169MD777+PKlWqqH2GDh1qPFdpnDp1Cg8//DCCg4PVBLsy0fCFCxeM2+W6O3XqhJCQELU9OjoasbGxxjn3pOUvLCwMQUFBaNKkCVavXo2yxClXXGggzM3HLql5655oW9Pel0NEdGM0DchKs8+5fQIlURS7m7e3N/r3769CyOuvv65CiJDQlJOTowKThA75opdgI1/6P/74I5566inUqVMHbdq0KfYcubm5ePTRRxEREYGtW7ciKSnJrB5KJ6FCriMqKkqFn8GDB6t1o0aNQt++fbF//36sWbNGzUcnQkNDCxwjNTUVXbt2Rbt27VR34cWLF/Gvf/0LL774olk43LRpkwpN8nj06FF1fOkGlHOWlHw+PTT9+uuvyM7OVkFMjvnLL7+ofZ544gm0atUKc+bMgZeXF3bv3g0fHx+1TfbNzMzEb7/9poLTgQMH1LHKEoOTiw2EyRYnInIJEpreibLPucedA3yDrNr1mWeewfTp09WXvhR56910PXv2VOFElldffdW4/7Bhw7B27Vp8/fXXVgUnCTqHDh1S75FQJN55550CdUnjx483a7GScy5dulQFJ2k9kjAhQU+65gqzZMkSpKen48svv1QhRMyaNUu16Lz33nsqvAlp3ZH1EmIaNmyI7t27Y+PGjaUKTvI+CXrHjx9X8+cJOb+0HEl4k0mIpUXqtddeU+cS9erVM75ftsnPWlryhLS2uUVX3ezZs9UvWpoh27Zti23bthW5v6R5+QHK/vLDyt8sp2kaJk6cqBKx/MF06dJFNXWaeuihh1CjRg11DNlP/gVw7tw54/YTJ04YmzRNlz///BOOqFWN8vD0AE5fvoYLyen2vhwiIrcg30Xt27fHF198oV5LC4wUhks3nZCWp8mTJ6vvqgoVKqgAIyFIvvCtcfDgQRUo9NAkpEUov2XLluH2229XwUjOIUHK2nOYnqtFixbG0CTkmNIqdPjwYeO6Jk2aqNCkk+9QaZ0qDf3z6aFJSHekFJPLNjFy5EjV8iXf5e+++y6OHTtm3Pell17ClClT1HVOmjSpVMX4TtfiJL9s+aHMnTtXhSbp15WmQvklVa5cucD+mzdvVs2fU6dOVf3LkpClv3Xnzp1o2rSp2mfatGmYOXMmFi1ahNq1a6u+XjmmNOFJUBLSXzpu3Dj1Cz979qxK57169VLHz5/25Y9EJ/25jijE3wcNI8vhwPlk1V3XvXkVe18SEdGNdZdJy4+9zl0CEpKkJUkaAaS1Sbrh7rzzTrVNWqM+/vhj9d0m4UlCiXS1SfeSrWzZskV1Z0kdk3zXSSuXtDbNmDEDZcEnr5tMJ40KEq7KitwR+Pjjj6tuzp9++kkFJPl8jzzyiApU8pll27p161Q2kM8tvw+XbXH64IMPVPPewIEDVcqUACXFbXp6z0/+AOX2T2m2a9SokUryt956q2o21Fub5A9U0rb0m8odDdLsJ61JpgVwL7/8Mm677TbUrFlT/WthzJgxqjUpf4GbBCVJ8PqS/w/GkbTOG5aA89YRkdOTeiHpLrPHYkV9kykpZvb09FT/kJfvG+m+0+ud/vjjD/Vd9OSTT6rWHOlK+vvvv60+tnzPnT59Wg0boMvf8yH/4JfvMqmzkjv5pCtLiqZN+fr6qtav4s4lhdhS66ST65fP1qBBA5SFRnmfTxadNHIkJiaqTKCTwnf53pZwJDVfElB10lr13HPP4dtvv8Urr7yCzz77DGXJrsFJEveOHTtU85vxgjw91WtJ0JbIetP9haRNfX/pJ42LizPbR9K3tGYVdszLly9j8eLFKkDlD0bSpSctXx06dMDKlSuL/DwZGRlITk42W26m6LwRxGU8JyIiujmka0yKmceOHasCjtx5ppMQI3fBSbiRrqdnn33W7I6x4sh3mYSGAQMGqFAj3YASkEzJOaRbTlphpBtLely+++47s32kHEa+H6WwOiEhQX1f5SetVtIrI+eSYnIp/paWGyll0eubSktCm5zbdJGfh3w+aYmTc0vPkZTqSMG9tNhJCLx27ZoqTpdCcQmDEuSk9kkCl5DWO+n6lM8m75dr1re5ZHCSX578MPP/QuS1hB9LZH1R++uP1hxT7nKQZlNpVZI/uu+//97sPwRp7pN6KmkClOAkXYJFhSdpItSLAWUx7bO9mS1O0l2XmpF9U89NROTOpLvuypUr6h/ypvVI0vshvSKyXorHpedCvkusJY0JEoIkQEgxuXRNvf322wX+gS+tMRIw5O42CWlSomJKCqilt0bKVGQIBUtDIkhvj4QQaUyQomwpX+ncubOxR+dGpKSkqDvjTBcpOpeWOfnulYJzGXJBgpS0ykkZj5BaKhnSQcKUBEhp3ZPCeOmWFJIh5M46CUvy+WSfTz/9FGXJQ5O+LTuR7jMZ20J+yabFbnIXgNyhILde5ifNjVK7JHVOOvkhyQ9RUrwcS4rE5NhSv6STH7b8gvRfhh7c5A9EUqy8X8LOqlWrjE2s+ckvTlKtJH5LJMGbpnhpcZLwJLePym2oN8Pt7/6Ms4nXsPhfbXF73fCbck4iohsld3PJ/79KXapei0p0s/7G5PtaMoA139d2bXEKDw9XaTJ/s6W8LuyWSVlf1P76ozXHlPNLOr3nnntUE6fcnVfUXXPS3Sd3TBRGRl+VH7jpYq/pV1jnREREZHt2DU7SeiQDg8k4DjqpzJfXlm63FLLedH8h/cf6/pIkJSCZ7iNJUlqvCjumfl5hqd9XJ32ypq1YjjyeE+uciIiIXHA4AhmKQArRpAhM+m/ljjip6Je77PTuMenOk/ohMXz4cFU0JvVHMuiWtBTJ0Ovz589X26WbTYrFZFwHKZjThyOQPme9X1lClBSXSd2S9KtKMZ3sI7eQ6uFKugMl2Ek/rJBqfbnT7/PPP4ejjyAudp68guycXDUdCxEREblIcJI7EeLj49WAlVK8LYVtMiy8XtwtRdtSHKeTO9/klk8puJNxmCQcyTAD+hhOeo2UhC+ZY0duaZSAJMfU+zSlAE6CkIwFIftJK5IUlckxTSc7lKEOpP5JRluVQc6kPkqK5RxZ/YgQhPh542pGNg7FXUXTqgWH1SciIiInLA53dSUpNrOlAV9sw69/x+PNh5pgQPtaN+28RESlxeJwKmsuURxOZUOvc2KBOBE5G/5bnsqKrUY3t3tXHZVdnZNMvSL/J1TY8ApERI5CBh+W/6+S0g0ZZ4j/v0W2It+DMuC2/G1J6Y/UL98IBicX1LJ6eXh7eiAuOV2N6VQtrGTzLhER3WwyNE21atVw5swZNck6ka1JfXONGjXM6qZLg8HJBQX4eqFJ1VDsOZ2ohiVgcCIiZyAzNsgNP/nnDCWyRTCXG71s0ZLJ4OTCdU4SnKTO6eGWVe19OUREVn/ByULkqFgc7qL0eeukzomIiIhsg8HJRUXXNBSIH75wFUnX2OxNRERkCwxOLqpSiB9qVQyE3Nm76xRbnYiIiGyBwckNWp3YXUdERGQbDE7uUOd0kgNhEhER2QKDkwuLyQtOu08nIivHNiOmEhERuTMGJxdWp1IwwgJ9kJ6Vi7/OJdv7coiIiJweg5MLk4G+ovPmrYvlvHVEREQ3jMHJjeatIyIiohvD4OQGI4jrBeKcdZyIiOjGMDi5uGbVQuHr7YmElEycvJRm78shIiJyagxOLs7P2wvNq4aq5zJvHREREZUeg5Mb1TntOMk6JyIiohvB4ORGdU5scSIiIroxDE5uQB+S4Fh8Ki6nZtr7coiIiJwWg5MbCAvyRd3Kweo5u+uIiIhKj8HJTXDeOiIiohvH4OQmomtyIEwiIqIbxeDkZi1O+84kIT0rx96XQ0RE5JQYnNxEjQqBCA/2Q2ZOLvadTbL35RARETklBic3mvDXOP0Ku+uIiIhKhcHJjcToBeIcz4mIiMh5g9Ps2bNRq1Yt+Pv7o23btti2bVuR+y9fvhwNGzZU+zdr1gyrV6822y6T2U6cOBFVqlRBQEAAunTpgiNHjpjt89BDD6FGjRrqGLLfU089hXPnzpnts3fvXtxxxx1qn+rVq2PatGlwiRHET11Bbi4n/CUiInK64LRs2TKMHDkSkyZNws6dO9GiRQt07doVFy9etLj/5s2b0a9fPwwaNAi7du1Cjx491LJ//37jPhJwZs6ciblz52Lr1q0ICgpSx0xPTzfu06lTJ3z99dc4fPgwvvnmGxw7dgy9evUybk9OTsa9996LmjVrYseOHZg+fTreeOMNzJ8/H86qSVQ5+Pt4IjEtC8fiU+x9OURERM5Hs7M2bdpoQ4cONb7OycnRoqKitKlTp1rcv0+fPlr37t3N1rVt21Z79tln1fPc3FwtMjJSmz59unF7YmKi5ufnp3311VeFXsf333+veXh4aJmZmer1p59+qoWFhWkZGRnGfUaPHq01aNDA6s+WlJQkzTrq0VH0nbdZqzl6lbZk60l7XwoREZFDKMn3tV1bnDIzM1VrjnSl6Tw9PdXrLVu2WHyPrDfdX0hrkr7/8ePHERcXZ7ZPaGio6gIs7JiXL1/G4sWL0b59e/j4+BjP07FjR/j6+pqdR1qorlxx3uLq1nnddZy3joiIqOTsGpwSEhKQk5ODiIgIs/XyWsKPJbK+qP31R2uOOXr0aNWNV7FiRZw6dQrff/99secxPUd+GRkZqovPdHHUees49QoREZET1jjZ02uvvabqpNatWwcvLy/0799fFZaX1tSpU1Xrlr5IQbmjubVmGDw8gJOX0nDx6vWaLyIiInLw4BQeHq4Cy4ULF8zWy+vIyEiL75H1Re2vP1pzTDl//fr1cc8992Dp0qXq7rw///yzyPOYniO/sWPHIikpybicPn0ajqacvw8aRISo5zs4nhMREZHzBCepH4qOjsbGjRuN63Jzc9Xrdu3aWXyPrDfdX6xfv964f+3atVWwMd1Huszk7rrCjqmfV+9u08/z22+/ISsry+w8DRo0QFiYobsrPz8/P5QrV85scew6JwYnIiIip+qqk6EIPvvsMyxatAgHDx7E888/j9TUVAwcOFBtl+4zacnRDR8+HGvWrMGMGTNw6NAhNURAbGwsXnzxReMI2SNGjMCUKVOwcuVK7Nu3Tx0jKipKDVsgJETNmjULu3fvxsmTJ/Hzzz+rIQ7q1KljDFePP/64CnYy7MFff/2lhk34+OOP1fW6ykCYO06yQJyIiKgkvGFnffv2RXx8vBqwUoquW7ZsqYKRXogtRdtyp51O7nxbsmQJxo8fj3HjxqFevXpYsWIFmjZtatxn1KhRKnwNGTIEiYmJ6NChgzqmDGQpAgMD8e2336qxo2Q/GQCzW7du6pjSaiSkRklqn4YOHapaxaRbT65Rjuns9IEw959LRlpmNgJ97f5nQERE5BQ8ZEwCe1+Eq5IuQglgUu/kaN127aZuxPmkdCwZ3Bbt64Tb+3KIiIic4vva7l11ZN9WJ074S0REZD0GJzcVkzeeUyzHcyIiIrIag5Ob0gvEd568ghxO+EtERGQVBic31TCyHIL9vJGSkY3DcVftfTlEREROgcHJTXl5eqBVjfLqeSyHJSAiIrIKg5Mbi6nJAnEiIqKSYHByY63z6pxiT7DFiYiIyBoMTm6sZY3yqsvuXFI6ziZes/flEBEROTwGJzcmI4Y3iTIM9MVWJyIiouIxOLm56LzxnHZwPCciIqJiMTi5udYcQZyIiMhqDE5uTh9B/FBcMq6mZ9n7coiIiBwag5Obq1zOHzUqBEIGD991KtHel0NEROTQGJzo+rx1LBAnIiIqEoMTIUavc2KBOBERUZEYnMg44a901WXl5Nr7coiIiBwWgxOhbqVghAb44FpWDg6eT7b35RARETksBieCp6eHcTyn7RyWgIiIqFAMTmTWXbfjJAvEiYiICsPgREpMzQrGFidN0+x9OURERA6JwYmU5tVC4evlifirGTh9mRP+EhERWcLgRIq/jxeaVjVM+Lud4zkRERFZxOBEBeet43hOREREFjE4kZF+Zx1HECciIrKMwYkKBKcjF1OQmJZp78shIiJyOAxOZFQx2A+3VApSz3ewu46IiKgABicy0zpvWALWORERETlocJo9ezZq1aoFf39/tG3bFtu2bSty/+XLl6Nhw4Zq/2bNmmH16tVm22UcookTJ6JKlSoICAhAly5dcOTIEeP2EydOYNCgQahdu7baXqdOHUyaNAmZmZlm+3h4eBRY/vzzT7iy6LyBMFnnRERE5IDBadmyZRg5cqQKLjt37kSLFi3QtWtXXLx40eL+mzdvRr9+/VTw2bVrF3r06KGW/fv3G/eZNm0aZs6ciblz52Lr1q0ICgpSx0xPT1fbDx06hNzcXMybNw9//fUXPvzwQ7XvuHHjCpxvw4YNOH/+vHGJjo6GK4vJq3PacyYJGdk59r4cIiIih+Kh2XmYaGlhat26NWbNmqVeS6CpXr06hg0bhjFjxhTYv2/fvkhNTcWqVauM62677Ta0bNlShR/5OFFRUXjllVfw6quvqu1JSUmIiIjAwoUL8dhjj1m8junTp2POnDn4559/jC1O0iIl4UyOXRrJyckIDQ1V5y9XzjBGkqOTn1/MlA24lJqJb55vh+i8rjsiIiJXVZLva7u2OEnX2I4dO1RXmvGCPD3V6y1btlh8j6w33V9Ia5K+//HjxxEXF2e2j/wwJKAVdkwhP6wKFQqGhIceegiVK1dGhw4dsHLlSrg66Y68PiwB65yIiIgcJjglJCQgJydHtQaZktcSfiyR9UXtrz+W5JhHjx7FJ598gmeffda4Ljg4GDNmzFD1VD/++KMKTtIlWFR4ysjIUKnVdHHmgTBl3joiIiK6zhtu7uzZs+jWrRt69+6NwYMHG9eHh4er2iuddCeeO3dOdelJK5QlU6dOxZtvvglXKRDfcfKy6rqTVigiIiKyc4uThBMvLy9cuHDBbL28joyMtPgeWV/U/vqjNceUINSpUye0b98e8+fPL/Z6pbtPWqcKM3bsWNXlpy+nT5+GM2oaFQo/b09cScvCsfhUe18OERGRw7BrcPL19VV3qW3cuNG4TorD5XW7du0svkfWm+4v1q9fb9xfCrolIJnuI11mcned6TGlpemuu+5S51+wYIGqrSrO7t271RAHhfHz81NFZaaLM/L19kSL6uWNrU5ERETkIF110h02YMAAxMTEoE2bNvjoo4/UXXMDBw5U2/v374+qVauqbjAxfPhw3Hnnnar+qHv37li6dCliY2ONLUbSrTRixAhMmTIF9erVU0FqwoQJ6k47qVEyDU01a9bE+++/j/j4eOP16K1SixYtUsGuVatW6vW3336LL774Ap9//jncQetaYdh2/LKqc+rbuoa9L4eIiMgh2D04yfACElxkwEop3pZb/9esWWMs7j516pRZa5B0qy1ZsgTjx49X4y5JOFqxYgWaNm1q3GfUqFEqfA0ZMgSJiYmqsFuOKQNm6i1U0uUmS7Vq1cyux3R0hsmTJ+PkyZPw9vZWA27KmFO9evWCO4hRwxAc49QrREREjjSOkytzxnGcdElpWWg5eR3kr2P7611QKcTP3pdERETk3uM4keMKDfRB/coh6jlbnYiIiAwYnKhQMZy3joiIyAyDExUfnNjiREREpDA4UTEF4sD+s0m4lskJf4mIiBicqFDVwgIQUc4P2bka9pxJtPflEBER2R2DExVKxsSKyZu3jnVOREREDE5UjJiarHMiIiLSMThRkVrntTjJkAS5uRzyi4iI3BuDExWpYWQIAn29cDU9G39fvGrvyyEiIrIrBicqkreXJ26tYeiuk3nriIiI3BmDExUrOq/OaQcLxImIyM0xOJHVdU5scSIiInfH4ETFalmjPDw9gLOJ13A+6Zq9L4eIiMhuGJyoWMF+3mgcZZgtOpatTkRE5MZKFZxOnz6NM2fOGF9v27YNI0aMwPz58215beSA06/IsARERETuqlTB6fHHH8emTZvU87i4ONxzzz0qPL3++ut46623bH2N5EAT/m5ngTgREbmxUgWn/fv3o02bNur5119/jaZNm2Lz5s1YvHgxFi5caOtrJAdqcTp4PhkpGdn2vhwiIiLnCU5ZWVnw8/NTzzds2ICHHnpIPW/YsCHOnz9v2yskhxAZ6q8m/ZXBw3edYncdERG5p1IFpyZNmmDu3Ln4/fffsX79enTr1k2tP3fuHCpWrGjrayRHm7eOBeJEROSmShWc3nvvPcybNw933XUX+vXrhxYtWqj1K1euNHbhkeuJyRvPKfYk65yIiMg9eZfmTRKYEhISkJycjLAwQyuEGDJkCAIDA215feSABeK7TiUiOydXTcdCRETkTkr1zXft2jVkZGQYQ9PJkyfx0Ucf4fDhw6hcubKtr5EcRP3KIQjx90ZaZg4OxXHCXyIicj+lCk4PP/wwvvzyS/U8MTERbdu2xYwZM9CjRw/MmTPH1tdIDsLT08M4bx2HJSAiIndUquC0c+dO3HHHHer5f//7X0RERKhWJwlTM2fOtPU1kgPOWxfLgTCJiMgNlSo4paWlISQkRD1ft24dHn30UXh6euK2225TAYpcl97iFHviMjRNs/flEBEROX5wqlu3LlasWKGmXlm7di3uvfdetf7ixYsoV84wpxm5phbVysPHywMXkjNw5gon/CUiIvdSquA0ceJEvPrqq6hVq5YafqBdu3bG1qdWrVrZ+hrJgQT4eqFJVKh6zmEJiIjI3ZQqOPXq1QunTp1CbGysanHSde7cGR9++KEtr48cUOu8YQk4ECYREbmbUg/EExkZqVqXZLTwM2fOqHXS+iTTrpTU7NmzVeuVv7+/ukNPJgwuyvLly9V5ZP9mzZph9erVZtul9kZaxapUqYKAgAB06dIFR44cMW4/ceIEBg0ahNq1a6vtderUwaRJk5CZmWl2nL1796oieDlP9erVMW3atBJ/NlcUnTdvHYMTERG5m1IFp9zcXLz11lsIDQ1FzZo11VK+fHlMnjxZbSuJZcuWYeTIkSq4yN16Mgp5165dVb2UJTKZsIxWLsFn165daggEWWTiYZ0EHLm7T6aF2bp1K4KCgtQx09PT1fZDhw6p65TRz//66y/VSib7jhs3zngMGdxTarfks+3YsQPTp0/HG2+8gfnz58Pd6QNh/n3xKpLSsux9OURERDePVgpjxozRKlWqpH366afanj171DJ79my1bty4cSU6Vps2bbShQ4caX+fk5GhRUVHa1KlTLe7fp08frXv37mbr2rZtqz377LPqeW5urhYZGalNnz7duD0xMVHz8/PTvvrqq0KvY9q0aVrt2rWNr+WzhYWFaRkZGcZ1o0eP1ho0aGD1Z0tKSpLbztSjq7lr+iat5uhV2s8HL9j7UoiIiG5ISb6vS9XitGjRInz++ed4/vnn0bx5c7W88MIL+Oyzz7Bw4UKrjyNdY9KaI11pOhnWQF5v2bLF4ntkven+QlqT9P2PHz+OuLg4s32kZUy6AAs7pkhKSkKFChXMztOxY0f4+vqanUdGR79yxXIXlYymLi1VpovLD0vAAnEiInIjpQpOly9ftljLJOtkm7VkvrucnBw1gKYpeS3hxxJZX9T++mNJjnn06FF88sknePbZZ4s9j+k58ps6daoKafoidVGuXiC+nXVORETkRkoVnKQOadasWQXWyzppfXImZ8+eRbdu3dC7d28MHjz4ho41duxY1XKlLzLOlasXiO85nYjM7JLVtRERETkr79K8SYqvu3fvjg0bNhjHcJKuLQkK+e9wK0p4eDi8vLxw4cIFs/XyWu7as0TWF7W//ijr5K46031atmxp9j65I7BTp05o3759gaLvws5jeo78/Pz81OIO6lQKQligD66kZWH/uSTcWsPQAkVEROTKStXidOedd+Lvv//GI488oib5lUWmXZE71P79739bfRypH4qOjsbGjRuN6+RuN3mtB7L8ZL3p/mL9+vXG/WWIAQk2pvtIrZHcXWd6TGlpuuuuu9T5FyxYoGqr8p/nt99+Q1ZWltl5GjRogLAwhgQPDw9jq9MOdtcREZG70Gxo9+7dmqenZ4nes3TpUnXH28KFC7UDBw5oQ4YM0cqXL6/FxcWp7U899ZS6i0/3xx9/aN7e3tr777+vHTx4UJs0aZLm4+Oj7du3z7jPu+++q47x/fffa3v37tUefvhhdcfctWvX1PYzZ85odevW1Tp37qyenz9/3riY3okXERGhzr9//351nYGBgdq8efOs/myufFedmPvLUXVn3eBF2+19KURERKVWku/rUnXV2VLfvn0RHx+vBqyUomvpTluzZo2xEFtGKDdtDZJutSVLlmD8+PFq3KV69eqpefOaNm1q3GfUqFFITU3FkCFDVGtYhw4d1DFlIEu95UgKwmWpVq2a2fXoE9dKcbdMITN06FDVKiXdinKNckwyH89px8kr6ucmrVBERESuzEPSk60OtmfPHtx6663qTjkydBFKAJNCcVec/DgjOwfN3linisN/fuVO3FIp2N6XREREVKbf16WecoXIz9sLLarpE/6yzomIiFxfibrqpAC8KNItRu4l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+7//M67r2bOnan36z3/+Y9drc2ZscXISmZmZ2LFjB7p06WI2pYu83rJli12vjYCkpCT1WKFCBXtfituSFsDu3bub/TdCN9/KlSsRExOD3r17q39MtGrVCp999pm9L8sttW/fHhs3bsTff/+tXu/Zswf/+9//cN9999n70pwa56pzEgkJCaq/Wv71YEpeHzp0yG7XRYaWP6mnke6Jpk2b2vty3NLSpUtV97V01ZF9/fPPP6p7SMoKxo0bp34nL730Enx9fTFgwAB7X57btf7J5L4NGzaEl5eX+g55++238cQTT9j70pwagxORDVo69u/fr/4lRzefzPY+fPhwVWsmN02Q/f8hIS1O77zzjnotLU7y38fcuXMZnG6yr7/+GosXL8aSJUvQpEkT7N69W/0jLyoqir+LG8Dg5CTCw8PVvxguXLhgtl5eR0ZG2u263N2LL76IVatW4bfffkO1atXsfTluSbqw5QYJqW/Syb+s5Xci9YAZGRnqvx26OapUqYLGjRubrWvUqBG++eYbu12Tu3rttddUq9Njjz2mXsvdjSdPnlR3BTM4lR5rnJyENHNHR0er/mrTf9nJ63bt2tn12tyR3FMhoem7777Dzz//rG73Jfvo3Lkz9u3bp/41rS/S4iHdEfKcoenmki7r/ENzSI1NzZo17XZN7iotLU3VwpqS/x7ku4NKjy1OTkRqBuRfCfKl0KZNG3XHkNz+PnDgQHtfmlt2z0nz9/fff6/GcoqLi1PrQ0ND1R0rdPPIzz9/bVlQUJAaQ4g1Zzffyy+/rIqSpauuT58+aqy5+fPnq4VurgcffFDVNNWoUUN11e3atQsffPABnnnmGXtfmlPjcARORroepk+frr6o5XbrmTNnqmEK6OaSARYtWbBgAZ5++umbfj1k7q677uJwBHYk3ddjx47FkSNHVGus/KNv8ODB9r4st3P16lU1AKa0jEt3ttQ29evXDxMnTlS9GFQ6DE5EREREVmKNExEREZGVGJyIiIiIrMTgRERERGQlBiciIiIiKzE4EREREVmJwYmIiIjISgxORERERFZicCIiIiKyEoMTEdFNGm1+xYoV9r4MIrpBDE5E5PJkGhwJLvmXbt262fvSiMjJcJJfInILEpJkLkFTfn5+drseInJObHEiIrcgISkyMtJsCQsLU9uk9WnOnDm47777EBAQgFtuuQX//e9/zd6/b98+3H333Wp7xYoVMWTIEKSkpJjt88UXX6hZ6OVcVapUwYsvvmi2PSEhAY888ggCAwNRr149rFy58iZ8ciKyJQYnIiJAzSLfs2dP7NmzB0888QQee+wxHDx4UG1LTU1F165dVdDavn07li9fjg0bNpgFIwleQ4cOVYFKQpaEorp165qd480330SfPn2wd+9e3H///eo8ly9fvumflYhugEZE5OIGDBigeXl5aUFBQWbL22+/rbbL/xU+99xzZu9p27at9vzzz6vn8+fP18LCwrSUlBTj9h9//FHz9PTU4uLi1OuoqCjt9ddfL/Qa5Bzjx483vpZjybqffvrJ5p+XiMoOa5yIyC106tRJtQqZqlChgvF5u3btzLbJ6927d6vn0vLUokULBAUFGbfffvvtyM3NxeHDh1VX37lz59C5c+cir6F58+bG53KscuXK4eLFizf82Yjo5mFwIiK3IEElf9eZrUjdkzV8fHzMXkvgkvBFRM6DNU5ERAD+/PPPAq8bNWqknsuj1D5JrZPujz/+gKenJxo0aICQkBDUqlULGzduvOnXTUQ3F1uciMgtZGRkIC4uzmydt7c3wsPD1XMp+I6JiUGHDh2wePFibNu2Df/3f/+ntkkR96RJkzBgwAC88cYbiI+Px7Bhw/DUU08hIiJC7SPrn3vuOVSuXFndnXf16lUVrmQ/InIdDE5E5BbWrFmjhggwJa1Fhw4dMt7xtnTpUrzwwgtqv6+++gqNGzdW22T4gLVr12L48OFo3bq1ei134H3wwQfGY0moSk9Px4cffohXX31VBbJevXrd5E9JRGXNQyrEy/wsREQOTGqNvvvuO/To0cPel0JEDo41TkRERERWYnAiIiIishJrnIjI7bFigYisxRYnIiIiIisxOBERERFZicGJiIiIyEoMTkRERERWYnAiIiIishKDExEREZGVGJyIiIiIrMTgRERERGQlBiciIiIiWOf/AbKPpbn4xs/FAAAAAElFTkSuQmCC",
|
|
136
|
+
"text/plain": [
|
|
137
|
+
"<Figure size 600x400 with 1 Axes>"
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
"metadata": {},
|
|
141
|
+
"output_type": "display_data"
|
|
142
|
+
}
|
|
143
|
+
],
|
|
144
|
+
"source": [
|
|
145
|
+
"# 3A - Credit Card Fraud Detection using Autoencoder\n",
|
|
146
|
+
"\n",
|
|
147
|
+
"import numpy as np\n",
|
|
148
|
+
"import pandas as pd\n",
|
|
149
|
+
"import matplotlib.pyplot as plt\n",
|
|
150
|
+
"\n",
|
|
151
|
+
"from sklearn.preprocessing import MinMaxScaler\n",
|
|
152
|
+
"from sklearn.metrics import classification_report\n",
|
|
153
|
+
"from tensorflow import keras\n",
|
|
154
|
+
"\n",
|
|
155
|
+
"\n",
|
|
156
|
+
"# 1. LOAD DATASET\n",
|
|
157
|
+
"data = pd.read_csv(\"creditcard.csv\")\n",
|
|
158
|
+
"\n",
|
|
159
|
+
"# Separate features and target\n",
|
|
160
|
+
"x = data.drop(\"Class\", axis=1).values\n",
|
|
161
|
+
"y = data[\"Class\"].values # 0 = Normal, 1 = Fraud\n",
|
|
162
|
+
"\n",
|
|
163
|
+
"\n",
|
|
164
|
+
"# 2. SCALE FEATURES BETWEEN 0 AND 1\n",
|
|
165
|
+
"scaler = MinMaxScaler()\n",
|
|
166
|
+
"x = scaler.fit_transform(x)\n",
|
|
167
|
+
"\n",
|
|
168
|
+
"\n",
|
|
169
|
+
"# 3. USE ONLY NORMAL TRANSACTIONS FOR TRAINING\n",
|
|
170
|
+
"x_normal = x[y == 0]\n",
|
|
171
|
+
"\n",
|
|
172
|
+
"\n",
|
|
173
|
+
"# 4. CREATE AUTOENCODER MODEL\n",
|
|
174
|
+
"n = x.shape[1]\n",
|
|
175
|
+
"\n",
|
|
176
|
+
"model = keras.Sequential([\n",
|
|
177
|
+
" # Encoder\n",
|
|
178
|
+
" keras.layers.Input(shape=(n,)),\n",
|
|
179
|
+
" keras.layers.Dense(32, activation=\"relu\"),\n",
|
|
180
|
+
" keras.layers.Dense(16, activation=\"relu\"),\n",
|
|
181
|
+
"\n",
|
|
182
|
+
" # Decoder\n",
|
|
183
|
+
" keras.layers.Dense(32, activation=\"relu\"),\n",
|
|
184
|
+
" keras.layers.Dense(n, activation=\"sigmoid\")\n",
|
|
185
|
+
"])\n",
|
|
186
|
+
"\n",
|
|
187
|
+
"\n",
|
|
188
|
+
"# 5. COMPILE MODEL\n",
|
|
189
|
+
"model.compile(\n",
|
|
190
|
+
" optimizer=\"adam\",\n",
|
|
191
|
+
" loss=\"mse\",\n",
|
|
192
|
+
" metrics=['accuracy']\n",
|
|
193
|
+
")\n",
|
|
194
|
+
"\n",
|
|
195
|
+
"model.summary()\n",
|
|
196
|
+
"\n",
|
|
197
|
+
"\n",
|
|
198
|
+
"# 6. TRAIN THE AUTOENCODER\n",
|
|
199
|
+
"# Input and output are the same because the model learns reconstruction\n",
|
|
200
|
+
"history = model.fit(\n",
|
|
201
|
+
" x_normal,\n",
|
|
202
|
+
" x_normal,\n",
|
|
203
|
+
" epochs=10,\n",
|
|
204
|
+
" batch_size=256,\n",
|
|
205
|
+
" validation_split=0.2,\n",
|
|
206
|
+
" verbose=1\n",
|
|
207
|
+
")\n",
|
|
208
|
+
"\n",
|
|
209
|
+
"\n",
|
|
210
|
+
"# 7. PREDICT / RECONSTRUCT ALL TRANSACTIONS\n",
|
|
211
|
+
"reconstructed = model.predict(x, verbose=0)\n",
|
|
212
|
+
"\n",
|
|
213
|
+
"\n",
|
|
214
|
+
"# 8. CALCULATE RECONSTRUCTION ERROR\n",
|
|
215
|
+
"error = np.mean(np.square(x - reconstructed), axis=1)\n",
|
|
216
|
+
"\n",
|
|
217
|
+
"\n",
|
|
218
|
+
"# 9. SET THRESHOLD\n",
|
|
219
|
+
"# 95th percentile of normal transaction errors\n",
|
|
220
|
+
"threshold = np.percentile(error[y == 0], 95)\n",
|
|
221
|
+
"\n",
|
|
222
|
+
"print(\"\\nThreshold:\", threshold)\n",
|
|
223
|
+
"\n",
|
|
224
|
+
"\n",
|
|
225
|
+
"# 10. CLASSIFY TRANSACTIONS\n",
|
|
226
|
+
"# Error greater than threshold = Fraud\n",
|
|
227
|
+
"y_pred = (error > threshold).astype(int)\n",
|
|
228
|
+
"\n",
|
|
229
|
+
"\n",
|
|
230
|
+
"# 11. DISPLAY RESULTS\n",
|
|
231
|
+
"print(\"\\nClassification Report:\")\n",
|
|
232
|
+
"print(classification_report(y, y_pred))\n",
|
|
233
|
+
"\n",
|
|
234
|
+
"\n",
|
|
235
|
+
"# 12. PLOT TRAINING AND VALIDATION LOSS\n",
|
|
236
|
+
"plt.figure(figsize=(6, 4))\n",
|
|
237
|
+
"\n",
|
|
238
|
+
"plt.plot(history.history[\"loss\"], label=\"Training Loss\")\n",
|
|
239
|
+
"plt.plot(history.history[\"val_loss\"], label=\"Validation Loss\")\n",
|
|
240
|
+
"\n",
|
|
241
|
+
"plt.title(\"Autoencoder Loss (MSE)\")\n",
|
|
242
|
+
"plt.xlabel(\"Epoch\")\n",
|
|
243
|
+
"plt.ylabel(\"Loss\")\n",
|
|
244
|
+
"plt.legend()\n",
|
|
245
|
+
"plt.tight_layout()\n",
|
|
246
|
+
"\n",
|
|
247
|
+
"plt.show()"
|
|
248
|
+
]
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"cell_type": "code",
|
|
252
|
+
"execution_count": null,
|
|
253
|
+
"id": "52864447-7033-4c4f-927f-66e142e4a5a9",
|
|
254
|
+
"metadata": {},
|
|
255
|
+
"outputs": [],
|
|
256
|
+
"source": []
|
|
257
|
+
}
|
|
258
|
+
],
|
|
259
|
+
"metadata": {
|
|
260
|
+
"kernelspec": {
|
|
261
|
+
"display_name": "Python 3 (ipykernel)",
|
|
262
|
+
"language": "python",
|
|
263
|
+
"name": "python3"
|
|
264
|
+
},
|
|
265
|
+
"language_info": {
|
|
266
|
+
"codemirror_mode": {
|
|
267
|
+
"name": "ipython",
|
|
268
|
+
"version": 3
|
|
269
|
+
},
|
|
270
|
+
"file_extension": ".py",
|
|
271
|
+
"mimetype": "text/x-python",
|
|
272
|
+
"name": "python",
|
|
273
|
+
"nbconvert_exporter": "python",
|
|
274
|
+
"pygments_lexer": "ipython3",
|
|
275
|
+
"version": "3.12.2"
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
"nbformat": 4,
|
|
279
|
+
"nbformat_minor": 5
|
|
280
|
+
}
|