├── .DS_Store ├── .ipynb_checkpoints ├── 0001_RFECV-checkpoint.ipynb ├── 0002_EfficientNet-checkpoint.ipynb ├── 0003_Top3PandasFunctions-checkpoint.ipynb ├── 0004_TPOT-checkpoint.ipynb ├── 0005_PyCaret-checkpoint.ipynb ├── 0006_PyCaretRegression-checkpoint.ipynb └── 0007_PyCaretClassification-checkpoint.ipynb ├── 0001_RFECV.ipynb ├── 0002_MLDeploy ├── .DS_Store ├── .ipynb_checkpoints │ └── Test-checkpoint.ipynb ├── Test.ipynb ├── app.py ├── modeler │ ├── .ipynb_checkpoints │ │ └── Modeler-checkpoint.py │ ├── Modeler.py │ ├── __init__.py │ └── __pycache__ │ │ ├── Modeler.cpython-37.pyc │ │ └── __init__.cpython-37.pyc └── models │ └── iris.model ├── 0003_Top3PandasFunctions.ipynb ├── 0004_TPOT.ipynb ├── 0005_PyCaret.ipynb ├── 0006_PyCaretRegression.ipynb ├── 0007_PyCaretClassification.ipynb ├── data └── RealEstate.csv └── img └── LogoSingleRow.png /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/betterdatascience/YouTube/cf24c5cf3192eb7b17c25d94c710d3f941818537/.DS_Store -------------------------------------------------------------------------------- /.ipynb_checkpoints/0002_EfficientNet-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "- EfficientNet rethinks the way in which we scale the CNNs up\n", 8 | "- One wasy of scaling is adding more layers - ResNet18 to ResNet200\n", 9 | "- Width scaling: adding more feature maps\n", 10 | "- Depth scaling: more layers\n", 11 | "- Resolution scaling: larger input images\n", 12 | "- Compound scaling: combination of increasing width, adding more layers, and enargening the resolution\n", 13 | "- Compound scaling is a basic idea in EfficientNet - the idea is to balance upsampling of width, depth, and resolution by scalling with a contant ratio\n", 14 | "\n", 15 | "- Intuition: if the input image is bigger, then the network needs more layer to increase the receptive field and more channels to capture more fine-grained patterns on the bigger image" 16 | ] 17 | } 18 | ], 19 | "metadata": { 20 | "kernelspec": { 21 | "display_name": "Python 3", 22 | "language": "python", 23 | "name": "python3" 24 | }, 25 | "language_info": { 26 | "codemirror_mode": { 27 | "name": "ipython", 28 | "version": 3 29 | }, 30 | "file_extension": ".py", 31 | "mimetype": "text/x-python", 32 | "name": "python", 33 | "nbconvert_exporter": "python", 34 | "pygments_lexer": "ipython3", 35 | "version": "3.7.6" 36 | } 37 | }, 38 | "nbformat": 4, 39 | "nbformat_minor": 4 40 | } 41 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/0003_Top3PandasFunctions-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "
\n", 8 | " \n", 9 | "
\n", 10 | "\n", 11 | "# Top 3 Pandas Functions" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "import pandas as pd" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 2, 26 | "metadata": {}, 27 | "outputs": [ 28 | { 29 | "data": { 30 | "text/html": [ 31 | "
\n", 32 | "\n", 45 | "\n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", 141 | "
" 142 | ], 143 | "text/plain": [ 144 | " PassengerId Survived Pclass \\\n", 145 | "0 1 0 3 \n", 146 | "1 2 1 1 \n", 147 | "2 3 1 3 \n", 148 | "3 4 1 1 \n", 149 | "4 5 0 3 \n", 150 | "\n", 151 | " Name Sex Age SibSp \\\n", 152 | "0 Braund, Mr. Owen Harris male 22.0 1 \n", 153 | "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", 154 | "2 Heikkinen, Miss. Laina female 26.0 0 \n", 155 | "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", 156 | "4 Allen, Mr. William Henry male 35.0 0 \n", 157 | "\n", 158 | " Parch Ticket Fare Cabin Embarked \n", 159 | "0 0 A/5 21171 7.2500 NaN S \n", 160 | "1 0 PC 17599 71.2833 C85 C \n", 161 | "2 0 STON/O2. 3101282 7.9250 NaN S \n", 162 | "3 0 113803 53.1000 C123 S \n", 163 | "4 0 373450 8.0500 NaN S " 164 | ] 165 | }, 166 | "execution_count": 2, 167 | "metadata": {}, 168 | "output_type": "execute_result" 169 | } 170 | ], 171 | "source": [ 172 | "df = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')\n", 173 | "df.head()" 174 | ] 175 | }, 176 | { 177 | "cell_type": "markdown", 178 | "metadata": {}, 179 | "source": [ 180 | "# 1. apply()" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 3, 186 | "metadata": {}, 187 | "outputs": [], 188 | "source": [ 189 | "def extract_title(string):\n", 190 | " string = string.split(',')[-1]\n", 191 | " string = string.strip()\n", 192 | " string = string.split('.')[0]\n", 193 | " return string" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 4, 199 | "metadata": {}, 200 | "outputs": [ 201 | { 202 | "data": { 203 | "text/plain": [ 204 | "0 Mr\n", 205 | "1 Mrs\n", 206 | "2 Miss\n", 207 | "3 Mrs\n", 208 | "4 Mr\n", 209 | "Name: Name, dtype: object" 210 | ] 211 | }, 212 | "execution_count": 4, 213 | "metadata": {}, 214 | "output_type": "execute_result" 215 | } 216 | ], 217 | "source": [ 218 | "titles = df['Name'].apply(extract_title)\n", 219 | "titles[:5]" 220 | ] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": 5, 225 | "metadata": {}, 226 | "outputs": [ 227 | { 228 | "data": { 229 | "text/plain": [ 230 | "0 Mr\n", 231 | "1 Mrs\n", 232 | "2 Miss\n", 233 | "3 Mrs\n", 234 | "4 Mr\n", 235 | "Name: Name, dtype: object" 236 | ] 237 | }, 238 | "execution_count": 5, 239 | "metadata": {}, 240 | "output_type": "execute_result" 241 | } 242 | ], 243 | "source": [ 244 | "titles = df['Name'].apply(lambda x: x.split(',')[-1].strip().split('.')[0])\n", 245 | "titles[:5]" 246 | ] 247 | }, 248 | { 249 | "cell_type": "markdown", 250 | "metadata": {}, 251 | "source": [ 252 | "# 2. value_counts()" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": 6, 258 | "metadata": {}, 259 | "outputs": [ 260 | { 261 | "data": { 262 | "text/plain": [ 263 | "Mr 517\n", 264 | "Miss 182\n", 265 | "Mrs 125\n", 266 | "Master 40\n", 267 | "Dr 7\n", 268 | "Rev 6\n", 269 | "Mlle 2\n", 270 | "Col 2\n", 271 | "Major 2\n", 272 | "Mme 1\n", 273 | "Jonkheer 1\n", 274 | "Sir 1\n", 275 | "Lady 1\n", 276 | "Don 1\n", 277 | "the Countess 1\n", 278 | "Capt 1\n", 279 | "Ms 1\n", 280 | "Name: Name, dtype: int64" 281 | ] 282 | }, 283 | "execution_count": 6, 284 | "metadata": {}, 285 | "output_type": "execute_result" 286 | } 287 | ], 288 | "source": [ 289 | "titles.value_counts()" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": 8, 295 | "metadata": {}, 296 | "outputs": [ 297 | { 298 | "data": { 299 | "text/plain": [ 300 | "Mr 58.024691\n", 301 | "Miss 20.426487\n", 302 | "Mrs 14.029181\n", 303 | "Master 4.489338\n", 304 | "Dr 0.785634\n", 305 | "Rev 0.673401\n", 306 | "Mlle 0.224467\n", 307 | "Col 0.224467\n", 308 | "Major 0.224467\n", 309 | "Mme 0.112233\n", 310 | "Jonkheer 0.112233\n", 311 | "Sir 0.112233\n", 312 | "Lady 0.112233\n", 313 | "Don 0.112233\n", 314 | "the Countess 0.112233\n", 315 | "Capt 0.112233\n", 316 | "Ms 0.112233\n", 317 | "Name: Name, dtype: float64" 318 | ] 319 | }, 320 | "execution_count": 8, 321 | "metadata": {}, 322 | "output_type": "execute_result" 323 | } 324 | ], 325 | "source": [ 326 | "titles.value_counts(normalize=True) * 100" 327 | ] 328 | }, 329 | { 330 | "cell_type": "markdown", 331 | "metadata": {}, 332 | "source": [ 333 | "# 3. get_dummies()" 334 | ] 335 | }, 336 | { 337 | "cell_type": "code", 338 | "execution_count": 9, 339 | "metadata": {}, 340 | "outputs": [ 341 | { 342 | "data": { 343 | "text/html": [ 344 | "
\n", 345 | "\n", 358 | "\n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | "
CQS
0001
1100
2001
3001
4001
\n", 400 | "
" 401 | ], 402 | "text/plain": [ 403 | " C Q S\n", 404 | "0 0 0 1\n", 405 | "1 1 0 0\n", 406 | "2 0 0 1\n", 407 | "3 0 0 1\n", 408 | "4 0 0 1" 409 | ] 410 | }, 411 | "execution_count": 9, 412 | "metadata": {}, 413 | "output_type": "execute_result" 414 | } 415 | ], 416 | "source": [ 417 | "emb = pd.get_dummies(df['Embarked'])\n", 418 | "emb.head()" 419 | ] 420 | }, 421 | { 422 | "cell_type": "code", 423 | "execution_count": 10, 424 | "metadata": {}, 425 | "outputs": [ 426 | { 427 | "data": { 428 | "text/html": [ 429 | "
\n", 430 | "\n", 443 | "\n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | "
Embarked_CEmbarked_QEmbarked_S
0001
1100
2001
3001
4001
\n", 485 | "
" 486 | ], 487 | "text/plain": [ 488 | " Embarked_C Embarked_Q Embarked_S\n", 489 | "0 0 0 1\n", 490 | "1 1 0 0\n", 491 | "2 0 0 1\n", 492 | "3 0 0 1\n", 493 | "4 0 0 1" 494 | ] 495 | }, 496 | "execution_count": 10, 497 | "metadata": {}, 498 | "output_type": "execute_result" 499 | } 500 | ], 501 | "source": [ 502 | "emb = pd.get_dummies(df['Embarked'], prefix='Embarked')\n", 503 | "emb.head()" 504 | ] 505 | }, 506 | { 507 | "cell_type": "code", 508 | "execution_count": 11, 509 | "metadata": {}, 510 | "outputs": [ 511 | { 512 | "data": { 513 | "text/html": [ 514 | "
\n", 515 | "\n", 528 | "\n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | "
Embarked_QEmbarked_S
001
100
201
301
401
\n", 564 | "
" 565 | ], 566 | "text/plain": [ 567 | " Embarked_Q Embarked_S\n", 568 | "0 0 1\n", 569 | "1 0 0\n", 570 | "2 0 1\n", 571 | "3 0 1\n", 572 | "4 0 1" 573 | ] 574 | }, 575 | "execution_count": 11, 576 | "metadata": {}, 577 | "output_type": "execute_result" 578 | } 579 | ], 580 | "source": [ 581 | "emb = pd.get_dummies(df['Embarked'], prefix='Embarked', drop_first=True)\n", 582 | "emb.head()" 583 | ] 584 | } 585 | ], 586 | "metadata": { 587 | "kernelspec": { 588 | "display_name": "Python 3", 589 | "language": "python", 590 | "name": "python3" 591 | }, 592 | "language_info": { 593 | "codemirror_mode": { 594 | "name": "ipython", 595 | "version": 3 596 | }, 597 | "file_extension": ".py", 598 | "mimetype": "text/x-python", 599 | "name": "python", 600 | "nbconvert_exporter": "python", 601 | "pygments_lexer": "ipython3", 602 | "version": "3.7.6" 603 | } 604 | }, 605 | "nbformat": 4, 606 | "nbformat_minor": 4 607 | } 608 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/0004_TPOT-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "
\n", 8 | " \n", 9 | "
\n", 10 | "\n", 11 | "# TPOT" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": {}, 18 | "outputs": [ 19 | { 20 | "name": "stderr", 21 | "output_type": "stream", 22 | "text": [ 23 | "/opt/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", 24 | " return f(*args, **kwds)\n" 25 | ] 26 | } 27 | ], 28 | "source": [ 29 | "import pandas as pd\n", 30 | "from sklearn.preprocessing import StandardScaler\n", 31 | "from sklearn.model_selection import train_test_split" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 2, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "data": { 41 | "text/html": [ 42 | "
\n", 43 | "\n", 56 | "\n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", 152 | "
" 153 | ], 154 | "text/plain": [ 155 | " PassengerId Survived Pclass \\\n", 156 | "0 1 0 3 \n", 157 | "1 2 1 1 \n", 158 | "2 3 1 3 \n", 159 | "3 4 1 1 \n", 160 | "4 5 0 3 \n", 161 | "\n", 162 | " Name Sex Age SibSp \\\n", 163 | "0 Braund, Mr. Owen Harris male 22.0 1 \n", 164 | "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", 165 | "2 Heikkinen, Miss. Laina female 26.0 0 \n", 166 | "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", 167 | "4 Allen, Mr. William Henry male 35.0 0 \n", 168 | "\n", 169 | " Parch Ticket Fare Cabin Embarked \n", 170 | "0 0 A/5 21171 7.2500 NaN S \n", 171 | "1 0 PC 17599 71.2833 C85 C \n", 172 | "2 0 STON/O2. 3101282 7.9250 NaN S \n", 173 | "3 0 113803 53.1000 C123 S \n", 174 | "4 0 373450 8.0500 NaN S " 175 | ] 176 | }, 177 | "execution_count": 2, 178 | "metadata": {}, 179 | "output_type": "execute_result" 180 | } 181 | ], 182 | "source": [ 183 | "data = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')\n", 184 | "data.head()" 185 | ] 186 | }, 187 | { 188 | "cell_type": "markdown", 189 | "metadata": {}, 190 | "source": [ 191 | "## Data preparation" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": 3, 197 | "metadata": {}, 198 | "outputs": [], 199 | "source": [ 200 | "data.drop(['Ticket', 'PassengerId'], axis=1, inplace=True)\n", 201 | "\n", 202 | "gender_mapper = {'male': 0, 'female': 1}\n", 203 | "data['Sex'].replace(gender_mapper, inplace=True)\n", 204 | "\n", 205 | "data['Title'] = data['Name'].apply(lambda x: x.split(',')[1].strip().split(' ')[0])\n", 206 | "data['Title'] = [0 if x in ['Mr.', 'Miss.', 'Mrs.'] else 1 for x in data['Title']]\n", 207 | "data = data.rename(columns={'Title': 'Title_Unusual'})\n", 208 | "data.drop('Name', axis=1, inplace=True)\n", 209 | "\n", 210 | "data['Cabin_Known'] = [0 if str(x) == 'nan' else 1 for x in data['Cabin']]\n", 211 | "data.drop('Cabin', axis=1, inplace=True)\n", 212 | "\n", 213 | "emb_dummies = pd.get_dummies(data['Embarked'], drop_first=True, prefix='Embarked')\n", 214 | "data = pd.concat([data, emb_dummies], axis=1)\n", 215 | "data.drop('Embarked', axis=1, inplace=True)\n", 216 | "\n", 217 | "data['Age'] = data['Age'].fillna(int(data['Age'].mean()))" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": 4, 223 | "metadata": {}, 224 | "outputs": [ 225 | { 226 | "data": { 227 | "text/html": [ 228 | "
\n", 229 | "\n", 242 | "\n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | "
SurvivedPclassSexAgeSibSpParchFareTitle_UnusualCabin_KnownEmbarked_QEmbarked_S
003022.0107.25000001
111138.01071.28330100
213126.0007.92500001
311135.01053.10000101
403035.0008.05000001
\n", 332 | "
" 333 | ], 334 | "text/plain": [ 335 | " Survived Pclass Sex Age SibSp Parch Fare Title_Unusual \\\n", 336 | "0 0 3 0 22.0 1 0 7.2500 0 \n", 337 | "1 1 1 1 38.0 1 0 71.2833 0 \n", 338 | "2 1 3 1 26.0 0 0 7.9250 0 \n", 339 | "3 1 1 1 35.0 1 0 53.1000 0 \n", 340 | "4 0 3 0 35.0 0 0 8.0500 0 \n", 341 | "\n", 342 | " Cabin_Known Embarked_Q Embarked_S \n", 343 | "0 0 0 1 \n", 344 | "1 1 0 0 \n", 345 | "2 0 0 1 \n", 346 | "3 1 0 1 \n", 347 | "4 0 0 1 " 348 | ] 349 | }, 350 | "execution_count": 4, 351 | "metadata": {}, 352 | "output_type": "execute_result" 353 | } 354 | ], 355 | "source": [ 356 | "data.head()" 357 | ] 358 | }, 359 | { 360 | "cell_type": "markdown", 361 | "metadata": {}, 362 | "source": [ 363 | "## Train Test split and Scaling" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 5, 369 | "metadata": {}, 370 | "outputs": [], 371 | "source": [ 372 | "X = data.drop('Survived', axis=1)\n", 373 | "y = data['Survived']\n", 374 | "\n", 375 | "X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8)" 376 | ] 377 | }, 378 | { 379 | "cell_type": "code", 380 | "execution_count": 6, 381 | "metadata": {}, 382 | "outputs": [], 383 | "source": [ 384 | "ss = StandardScaler()\n", 385 | "X_train_scaled = ss.fit_transform(X_train)\n", 386 | "X_test_scaled = ss.transform(X_test)" 387 | ] 388 | }, 389 | { 390 | "cell_type": "markdown", 391 | "metadata": {}, 392 | "source": [ 393 | "# TPOT" 394 | ] 395 | }, 396 | { 397 | "cell_type": "code", 398 | "execution_count": 7, 399 | "metadata": {}, 400 | "outputs": [ 401 | { 402 | "name": "stderr", 403 | "output_type": "stream", 404 | "text": [ 405 | "/opt/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", 406 | " return f(*args, **kwds)\n", 407 | "/opt/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", 408 | " return f(*args, **kwds)\n", 409 | "/opt/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", 410 | " return f(*args, **kwds)\n", 411 | "/opt/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", 412 | " return f(*args, **kwds)\n" 413 | ] 414 | }, 415 | { 416 | "data": { 417 | "application/vnd.jupyter.widget-view+json": { 418 | "model_id": "486d08b62e1d41f09461fea3e3eb29ba", 419 | "version_major": 2, 420 | "version_minor": 0 421 | }, 422 | "text/plain": [ 423 | "HBox(children=(FloatProgress(value=0.0, description='Optimization Progress', style=ProgressStyle(description_w…" 424 | ] 425 | }, 426 | "metadata": {}, 427 | "output_type": "display_data" 428 | }, 429 | { 430 | "name": "stdout", 431 | "output_type": "stream", 432 | "text": [ 433 | "\n", 434 | "Generation 1 - Current best internal CV score: 0.8216389244558258\n", 435 | "Generation 2 - Current best internal CV score: 0.8216389244558258\n", 436 | "Generation 3 - Current best internal CV score: 0.8244361272530286\n", 437 | "Generation 4 - Current best internal CV score: 0.8244361272530287\n", 438 | "10.02 minutes have elapsed. TPOT will close down.\n", 439 | "TPOT closed during evaluation in one generation.\n", 440 | "WARNING: TPOT may not provide a good pipeline if TPOT is stopped/interrupted in a early generation.\n", 441 | "\n", 442 | "\n", 443 | "TPOT closed prematurely. Will use the current best pipeline.\n", 444 | "\n", 445 | "Best pipeline: GradientBoostingClassifier(input_matrix, learning_rate=0.1, max_depth=10, max_features=0.55, min_samples_leaf=16, min_samples_split=3, n_estimators=100, subsample=0.6000000000000001)\n" 446 | ] 447 | }, 448 | { 449 | "data": { 450 | "text/plain": [ 451 | "TPOTClassifier(config_dict=None, crossover_rate=0.1, cv=5,\n", 452 | " disable_update_check=False, early_stop=None, generations=100,\n", 453 | " log_file=,\n", 454 | " max_eval_time_mins=5, max_time_mins=10, memory=None,\n", 455 | " mutation_rate=0.9, n_jobs=1, offspring_size=None,\n", 456 | " periodic_checkpoint_folder=None, population_size=100,\n", 457 | " random_state=None, scoring=None, subsample=1.0, template=None,\n", 458 | " use_dask=False, verbosity=2, warm_start=False)" 459 | ] 460 | }, 461 | "execution_count": 7, 462 | "metadata": {}, 463 | "output_type": "execute_result" 464 | } 465 | ], 466 | "source": [ 467 | "from tpot import TPOTClassifier\n", 468 | "\n", 469 | "tpot = TPOTClassifier(verbosity=2, max_time_mins=10)\n", 470 | "tpot.fit(X_train_scaled, y_train)" 471 | ] 472 | }, 473 | { 474 | "cell_type": "code", 475 | "execution_count": null, 476 | "metadata": {}, 477 | "outputs": [], 478 | "source": [] 479 | }, 480 | { 481 | "cell_type": "code", 482 | "execution_count": 8, 483 | "metadata": {}, 484 | "outputs": [ 485 | { 486 | "data": { 487 | "text/plain": [ 488 | "Pipeline(memory=None,\n", 489 | " steps=[('gradientboostingclassifier',\n", 490 | " GradientBoostingClassifier(ccp_alpha=0.0,\n", 491 | " criterion='friedman_mse', init=None,\n", 492 | " learning_rate=0.1, loss='deviance',\n", 493 | " max_depth=10, max_features=0.55,\n", 494 | " max_leaf_nodes=None,\n", 495 | " min_impurity_decrease=0.0,\n", 496 | " min_impurity_split=None,\n", 497 | " min_samples_leaf=16,\n", 498 | " min_samples_split=3,\n", 499 | " min_weight_fraction_leaf=0.0,\n", 500 | " n_estimators=100,\n", 501 | " n_iter_no_change=None,\n", 502 | " presort='deprecated',\n", 503 | " random_state=None,\n", 504 | " subsample=0.6000000000000001,\n", 505 | " tol=0.0001, validation_fraction=0.1,\n", 506 | " verbose=0, warm_start=False))],\n", 507 | " verbose=False)" 508 | ] 509 | }, 510 | "execution_count": 8, 511 | "metadata": {}, 512 | "output_type": "execute_result" 513 | } 514 | ], 515 | "source": [ 516 | "tpot.fitted_pipeline_" 517 | ] 518 | }, 519 | { 520 | "cell_type": "code", 521 | "execution_count": 9, 522 | "metadata": {}, 523 | "outputs": [ 524 | { 525 | "data": { 526 | "text/plain": [ 527 | "0.8491620111731844" 528 | ] 529 | }, 530 | "execution_count": 9, 531 | "metadata": {}, 532 | "output_type": "execute_result" 533 | } 534 | ], 535 | "source": [ 536 | "tpot.score(X_test_scaled, y_test)" 537 | ] 538 | } 539 | ], 540 | "metadata": { 541 | "kernelspec": { 542 | "display_name": "Python 3", 543 | "language": "python", 544 | "name": "python3" 545 | }, 546 | "language_info": { 547 | "codemirror_mode": { 548 | "name": "ipython", 549 | "version": 3 550 | }, 551 | "file_extension": ".py", 552 | "mimetype": "text/x-python", 553 | "name": "python", 554 | "nbconvert_exporter": "python", 555 | "pygments_lexer": "ipython3", 556 | "version": "3.7.6" 557 | } 558 | }, 559 | "nbformat": 4, 560 | "nbformat_minor": 4 561 | } 562 | -------------------------------------------------------------------------------- /0001_RFECV.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "
\n", 8 | " \n", 9 | "
\n", 10 | "\n", 11 | "# Recursive Feature Elimination with Cross-Validation" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "## Imports" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 2, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "import numpy as np\n", 28 | "import pandas as pd\n", 29 | "import matplotlib.pyplot as plt\n", 30 | "\n", 31 | "from sklearn.model_selection import StratifiedKFold\n", 32 | "from sklearn.feature_selection import RFECV\n", 33 | "from sklearn.ensemble import RandomForestClassifier\n", 34 | "\n", 35 | "import warnings\n", 36 | "warnings.filterwarnings('ignore')" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 3, 42 | "metadata": {}, 43 | "outputs": [ 44 | { 45 | "data": { 46 | "text/html": [ 47 | "
\n", 48 | "\n", 61 | "\n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", 157 | "
" 158 | ], 159 | "text/plain": [ 160 | " PassengerId Survived Pclass \\\n", 161 | "0 1 0 3 \n", 162 | "1 2 1 1 \n", 163 | "2 3 1 3 \n", 164 | "3 4 1 1 \n", 165 | "4 5 0 3 \n", 166 | "\n", 167 | " Name Sex Age SibSp \\\n", 168 | "0 Braund, Mr. Owen Harris male 22.0 1 \n", 169 | "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", 170 | "2 Heikkinen, Miss. Laina female 26.0 0 \n", 171 | "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", 172 | "4 Allen, Mr. William Henry male 35.0 0 \n", 173 | "\n", 174 | " Parch Ticket Fare Cabin Embarked \n", 175 | "0 0 A/5 21171 7.2500 NaN S \n", 176 | "1 0 PC 17599 71.2833 C85 C \n", 177 | "2 0 STON/O2. 3101282 7.9250 NaN S \n", 178 | "3 0 113803 53.1000 C123 S \n", 179 | "4 0 373450 8.0500 NaN S " 180 | ] 181 | }, 182 | "execution_count": 3, 183 | "metadata": {}, 184 | "output_type": "execute_result" 185 | } 186 | ], 187 | "source": [ 188 | "data = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')\n", 189 | "data.head()" 190 | ] 191 | }, 192 | { 193 | "cell_type": "markdown", 194 | "metadata": {}, 195 | "source": [ 196 | "## Data cleaning and preparation" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 4, 202 | "metadata": {}, 203 | "outputs": [], 204 | "source": [ 205 | "data.drop(['Ticket', 'PassengerId'], axis=1, inplace=True)\n", 206 | "\n", 207 | "gender_mapper = {'male': 0, 'female': 1}\n", 208 | "data['Sex'].replace(gender_mapper, inplace=True)\n", 209 | "\n", 210 | "data['Title'] = data['Name'].apply(lambda x: x.split(',')[1].strip().split(' ')[0])\n", 211 | "data['Title'] = [0 if x in ['Mr.', 'Miss.', 'Mrs.'] else 1 for x in data['Title']]\n", 212 | "data = data.rename(columns={'Title': 'Title_Unusual'})\n", 213 | "data.drop('Name', axis=1, inplace=True)\n", 214 | "\n", 215 | "data['Cabin_Known'] = [0 if str(x) == 'nan' else 1 for x in data['Cabin']]\n", 216 | "data.drop('Cabin', axis=1, inplace=True)\n", 217 | "\n", 218 | "emb_dummies = pd.get_dummies(data['Embarked'], drop_first=True, prefix='Embarked')\n", 219 | "data = pd.concat([data, emb_dummies], axis=1)\n", 220 | "data.drop('Embarked', axis=1, inplace=True)\n", 221 | "\n", 222 | "data['Age'] = data['Age'].fillna(int(data['Age'].mean()))" 223 | ] 224 | }, 225 | { 226 | "cell_type": "code", 227 | "execution_count": 5, 228 | "metadata": {}, 229 | "outputs": [ 230 | { 231 | "data": { 232 | "text/html": [ 233 | "
\n", 234 | "\n", 247 | "\n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | "
SurvivedPclassSexAgeSibSpParchFareTitle_UnusualCabin_KnownEmbarked_QEmbarked_S
003022.0107.25000001
111138.01071.28330100
213126.0007.92500001
311135.01053.10000101
403035.0008.05000001
\n", 337 | "
" 338 | ], 339 | "text/plain": [ 340 | " Survived Pclass Sex Age SibSp Parch Fare Title_Unusual \\\n", 341 | "0 0 3 0 22.0 1 0 7.2500 0 \n", 342 | "1 1 1 1 38.0 1 0 71.2833 0 \n", 343 | "2 1 3 1 26.0 0 0 7.9250 0 \n", 344 | "3 1 1 1 35.0 1 0 53.1000 0 \n", 345 | "4 0 3 0 35.0 0 0 8.0500 0 \n", 346 | "\n", 347 | " Cabin_Known Embarked_Q Embarked_S \n", 348 | "0 0 0 1 \n", 349 | "1 1 0 0 \n", 350 | "2 0 0 1 \n", 351 | "3 1 0 1 \n", 352 | "4 0 0 1 " 353 | ] 354 | }, 355 | "execution_count": 5, 356 | "metadata": {}, 357 | "output_type": "execute_result" 358 | } 359 | ], 360 | "source": [ 361 | "data.head()" 362 | ] 363 | }, 364 | { 365 | "cell_type": "markdown", 366 | "metadata": {}, 367 | "source": [ 368 | "## Remove correlated features " 369 | ] 370 | }, 371 | { 372 | "cell_type": "code", 373 | "execution_count": 6, 374 | "metadata": {}, 375 | "outputs": [], 376 | "source": [ 377 | "correlated_features = set()\n", 378 | "correlation_matrix = data.drop('Survived', axis=1).corr()\n", 379 | "\n", 380 | "for i in range(len(correlation_matrix.columns)):\n", 381 | " for j in range(i):\n", 382 | " if abs(correlation_matrix.iloc[i, j]) > 0.8:\n", 383 | " colname = correlation_matrix.columns[i]\n", 384 | " correlated_features.add(colname)" 385 | ] 386 | }, 387 | { 388 | "cell_type": "code", 389 | "execution_count": 7, 390 | "metadata": {}, 391 | "outputs": [ 392 | { 393 | "data": { 394 | "text/plain": [ 395 | "set()" 396 | ] 397 | }, 398 | "execution_count": 7, 399 | "metadata": {}, 400 | "output_type": "execute_result" 401 | } 402 | ], 403 | "source": [ 404 | "correlated_features" 405 | ] 406 | }, 407 | { 408 | "cell_type": "markdown", 409 | "metadata": {}, 410 | "source": [ 411 | "## Running RFECV" 412 | ] 413 | }, 414 | { 415 | "cell_type": "code", 416 | "execution_count": 8, 417 | "metadata": {}, 418 | "outputs": [ 419 | { 420 | "data": { 421 | "text/plain": [ 422 | "RFECV(cv=StratifiedKFold(n_splits=10, random_state=None, shuffle=False),\n", 423 | " estimator=RandomForestClassifier(bootstrap=True, ccp_alpha=0.0,\n", 424 | " class_weight=None, criterion='gini',\n", 425 | " max_depth=None, max_features='auto',\n", 426 | " max_leaf_nodes=None, max_samples=None,\n", 427 | " min_impurity_decrease=0.0,\n", 428 | " min_impurity_split=None,\n", 429 | " min_samples_leaf=1, min_samples_split=2,\n", 430 | " min_weight_fraction_leaf=0.0,\n", 431 | " n_estimators=100, n_jobs=None,\n", 432 | " oob_score=False, random_state=101,\n", 433 | " verbose=0, warm_start=False),\n", 434 | " min_features_to_select=1, n_jobs=None, scoring='accuracy', step=1,\n", 435 | " verbose=0)" 436 | ] 437 | }, 438 | "execution_count": 8, 439 | "metadata": {}, 440 | "output_type": "execute_result" 441 | } 442 | ], 443 | "source": [ 444 | "X = data.drop('Survived', axis=1)\n", 445 | "target = data['Survived']\n", 446 | "\n", 447 | "rfc = RandomForestClassifier(random_state=101)\n", 448 | "rfecv = RFECV(estimator=rfc, step=1, cv=StratifiedKFold(10), scoring='accuracy')\n", 449 | "rfecv.fit(X, target)" 450 | ] 451 | }, 452 | { 453 | "cell_type": "code", 454 | "execution_count": 9, 455 | "metadata": {}, 456 | "outputs": [ 457 | { 458 | "name": "stdout", 459 | "output_type": "stream", 460 | "text": [ 461 | "Optimal number of features: 4\n" 462 | ] 463 | } 464 | ], 465 | "source": [ 466 | "print('Optimal number of features: {}'.format(rfecv.n_features_))" 467 | ] 468 | }, 469 | { 470 | "cell_type": "code", 471 | "execution_count": 10, 472 | "metadata": {}, 473 | "outputs": [ 474 | { 475 | "data": { 476 | "image/png": "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\n", 477 | "text/plain": [ 478 | "
" 479 | ] 480 | }, 481 | "metadata": { 482 | "needs_background": "light" 483 | }, 484 | "output_type": "display_data" 485 | } 486 | ], 487 | "source": [ 488 | "plt.figure(figsize=(16, 9))\n", 489 | "plt.title('Recursive Feature Elimination with Cross-Validation', fontsize=18, fontweight='bold', pad=20)\n", 490 | "plt.xlabel('Number of features selected', fontsize=14, labelpad=20)\n", 491 | "plt.ylabel('% Correct Classification', fontsize=14, labelpad=20)\n", 492 | "plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_, color='#303F9F', linewidth=3)\n", 493 | "plt.show()" 494 | ] 495 | }, 496 | { 497 | "cell_type": "code", 498 | "execution_count": 11, 499 | "metadata": {}, 500 | "outputs": [ 501 | { 502 | "name": "stdout", 503 | "output_type": "stream", 504 | "text": [ 505 | "[3 4 6 7 8 9]\n" 506 | ] 507 | } 508 | ], 509 | "source": [ 510 | "print(np.where(rfecv.support_ == False)[0])\n", 511 | "\n", 512 | "X.drop(X.columns[np.where(rfecv.support_ == False)[0]], axis=1, inplace=True)" 513 | ] 514 | }, 515 | { 516 | "cell_type": "code", 517 | "execution_count": 12, 518 | "metadata": {}, 519 | "outputs": [ 520 | { 521 | "data": { 522 | "text/plain": [ 523 | "array([0.09550623, 0.27979401, 0.28835754, 0.33634222])" 524 | ] 525 | }, 526 | "execution_count": 12, 527 | "metadata": {}, 528 | "output_type": "execute_result" 529 | } 530 | ], 531 | "source": [ 532 | "rfecv.estimator_.feature_importances_" 533 | ] 534 | }, 535 | { 536 | "cell_type": "code", 537 | "execution_count": 13, 538 | "metadata": {}, 539 | "outputs": [ 540 | { 541 | "data": { 542 | "image/png": "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\n", 543 | "text/plain": [ 544 | "
" 545 | ] 546 | }, 547 | "metadata": { 548 | "needs_background": "light" 549 | }, 550 | "output_type": "display_data" 551 | } 552 | ], 553 | "source": [ 554 | "dset = pd.DataFrame()\n", 555 | "dset['attr'] = X.columns\n", 556 | "dset['importance'] = rfecv.estimator_.feature_importances_\n", 557 | "dset = dset.sort_values(by='importance', ascending=False)\n", 558 | "\n", 559 | "plt.figure(figsize=(16, 10))\n", 560 | "plt.barh(y=dset['attr'], width=dset['importance'], color='#1976D2')\n", 561 | "plt.title('RFECV - Feature importances', fontsize=20, fontweight='bold', pad=20)\n", 562 | "plt.xlabel('Importance', fontsize=14, labelpad=20)\n", 563 | "plt.show()" 564 | ] 565 | } 566 | ], 567 | "metadata": { 568 | "kernelspec": { 569 | "display_name": "Python 3", 570 | "language": "python", 571 | "name": "python3" 572 | }, 573 | "language_info": { 574 | "codemirror_mode": { 575 | "name": "ipython", 576 | "version": 3 577 | }, 578 | "file_extension": ".py", 579 | "mimetype": "text/x-python", 580 | "name": "python", 581 | "nbconvert_exporter": "python", 582 | "pygments_lexer": "ipython3", 583 | "version": "3.7.6" 584 | } 585 | }, 586 | "nbformat": 4, 587 | "nbformat_minor": 4 588 | } 589 | -------------------------------------------------------------------------------- /0002_MLDeploy/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/betterdatascience/YouTube/cf24c5cf3192eb7b17c25d94c710d3f941818537/0002_MLDeploy/.DS_Store -------------------------------------------------------------------------------- /0002_MLDeploy/.ipynb_checkpoints/Test-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 4 6 | } 7 | -------------------------------------------------------------------------------- /0002_MLDeploy/Test.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import requests" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 5, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "res = requests.post(\n", 19 | " url='http://localhost:5000/predict',\n", 20 | " json={\n", 21 | " 'sepal_length': 5.0,\n", 22 | " 'sepal_width': 3.2,\n", 23 | " 'petal_length': 1.5,\n", 24 | " 'petal_width': 0.3\n", 25 | " }\n", 26 | ")" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 6, 32 | "metadata": {}, 33 | "outputs": [ 34 | { 35 | "data": { 36 | "text/plain": [ 37 | "" 38 | ] 39 | }, 40 | "execution_count": 6, 41 | "metadata": {}, 42 | "output_type": "execute_result" 43 | } 44 | ], 45 | "source": [ 46 | "res" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 8, 52 | "metadata": {}, 53 | "outputs": [ 54 | { 55 | "data": { 56 | "text/plain": [ 57 | "{'Class': 'setosa',\n", 58 | " 'Input': {'PetalLength': 1.5,\n", 59 | " 'PetalWidth': 0.3,\n", 60 | " 'SepalLength': 5.0,\n", 61 | " 'SepalWidth': 3.2}}" 62 | ] 63 | }, 64 | "execution_count": 8, 65 | "metadata": {}, 66 | "output_type": "execute_result" 67 | } 68 | ], 69 | "source": [ 70 | "res.json()" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": null, 76 | "metadata": {}, 77 | "outputs": [], 78 | "source": [] 79 | } 80 | ], 81 | "metadata": { 82 | "kernelspec": { 83 | "display_name": "Python 3", 84 | "language": "python", 85 | "name": "python3" 86 | }, 87 | "language_info": { 88 | "codemirror_mode": { 89 | "name": "ipython", 90 | "version": 3 91 | }, 92 | "file_extension": ".py", 93 | "mimetype": "text/x-python", 94 | "name": "python", 95 | "nbconvert_exporter": "python", 96 | "pygments_lexer": "ipython3", 97 | "version": "3.7.6" 98 | } 99 | }, 100 | "nbformat": 4, 101 | "nbformat_minor": 4 102 | } 103 | -------------------------------------------------------------------------------- /0002_MLDeploy/app.py: -------------------------------------------------------------------------------- 1 | import os 2 | import joblib 3 | from flask import Flask, jsonify, request 4 | from flask_restful import Api, Resource 5 | from modeler.Modeler import Modeler 6 | 7 | app = Flask(__name__) 8 | api = Api(app) 9 | 10 | 11 | class Predict(Resource): 12 | @staticmethod 13 | def post(): 14 | data = request.get_json() 15 | sepal_length = data['sepal_length'] 16 | sepal_width = data['sepal_width'] 17 | petal_length = data['petal_length'] 18 | petal_width = data['petal_width'] 19 | 20 | m = Modeler() 21 | if not os.path.isfile('models/iris.model'): 22 | m.fit() 23 | prediction = m.predict([sepal_length, sepal_width, petal_length, petal_width]) 24 | return jsonify({ 25 | 'Input': { 26 | 'SepalLength': sepal_length, 27 | 'SepalWidth': sepal_width, 28 | 'PetalLength': petal_length, 29 | 'PetalWidth': petal_width 30 | }, 31 | 'Class': prediction 32 | }) 33 | 34 | api.add_resource(Predict, '/predict') 35 | 36 | if __name__ == '__main__': 37 | app.run(debug=True) -------------------------------------------------------------------------------- /0002_MLDeploy/modeler/.ipynb_checkpoints/Modeler-checkpoint.py: -------------------------------------------------------------------------------- 1 | import os 2 | import joblib 3 | import pandas as pd 4 | from sklearn.tree import DecisionTreeClassifier 5 | 6 | 7 | class Modeler: 8 | def __init__(self): 9 | self.df = pd.read_csv('https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv') 10 | try: self.model = joblib.load('models/iris.model') 11 | except: self.model = None 12 | 13 | def fit(self): 14 | X = self.df.drop('species', axis=1) 15 | y = self.df['species'] 16 | self.model = DecisionTreeClassifier().fit(X, y) 17 | joblib.dump(self.model, 'models/iris.model') 18 | 19 | def predict(self, measurement): 20 | if not os.path.exists('models/iris.model'): 21 | raise Exception('Model not trained yet. Call .fit() before making predictions') 22 | if len(measurement) != 4: 23 | raise Exception(f'Expected sepal_length, sepal_width, petal_length, petal_width, but got {measurement}') 24 | prediction = self.model.predict([measurement]) 25 | return prediction[0] -------------------------------------------------------------------------------- /0002_MLDeploy/modeler/Modeler.py: -------------------------------------------------------------------------------- 1 | import os 2 | import joblib 3 | import pandas as pd 4 | from sklearn.tree import DecisionTreeClassifier 5 | 6 | 7 | class Modeler: 8 | def __init__(self): 9 | self.df = pd.read_csv('https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv') 10 | try: self.model = joblib.load('models/iris.model') 11 | except: self.model = None 12 | 13 | def fit(self): 14 | X = self.df.drop('species', axis=1) 15 | y = self.df['species'] 16 | self.model = DecisionTreeClassifier().fit(X, y) 17 | joblib.dump(self.model, 'models/iris.model') 18 | 19 | def predict(self, measurement): 20 | if not os.path.exists('models/iris.model'): 21 | raise Exception('Model not trained yet. Call .fit() before making predictions') 22 | if len(measurement) != 4: 23 | raise Exception(f'Expected sepal_length, sepal_width, petal_length, petal_width, but got {measurement}') 24 | prediction = self.model.predict([measurement]) 25 | return prediction[0] -------------------------------------------------------------------------------- /0002_MLDeploy/modeler/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/betterdatascience/YouTube/cf24c5cf3192eb7b17c25d94c710d3f941818537/0002_MLDeploy/modeler/__init__.py -------------------------------------------------------------------------------- /0002_MLDeploy/modeler/__pycache__/Modeler.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/betterdatascience/YouTube/cf24c5cf3192eb7b17c25d94c710d3f941818537/0002_MLDeploy/modeler/__pycache__/Modeler.cpython-37.pyc -------------------------------------------------------------------------------- /0002_MLDeploy/modeler/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/betterdatascience/YouTube/cf24c5cf3192eb7b17c25d94c710d3f941818537/0002_MLDeploy/modeler/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /0002_MLDeploy/models/iris.model: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/betterdatascience/YouTube/cf24c5cf3192eb7b17c25d94c710d3f941818537/0002_MLDeploy/models/iris.model -------------------------------------------------------------------------------- /0003_Top3PandasFunctions.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "
\n", 8 | " \n", 9 | "
\n", 10 | "\n", 11 | "# Top 3 Pandas Functions" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "import pandas as pd" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 2, 26 | "metadata": {}, 27 | "outputs": [ 28 | { 29 | "data": { 30 | "text/html": [ 31 | "
\n", 32 | "\n", 45 | "\n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", 141 | "
" 142 | ], 143 | "text/plain": [ 144 | " PassengerId Survived Pclass \\\n", 145 | "0 1 0 3 \n", 146 | "1 2 1 1 \n", 147 | "2 3 1 3 \n", 148 | "3 4 1 1 \n", 149 | "4 5 0 3 \n", 150 | "\n", 151 | " Name Sex Age SibSp \\\n", 152 | "0 Braund, Mr. Owen Harris male 22.0 1 \n", 153 | "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", 154 | "2 Heikkinen, Miss. Laina female 26.0 0 \n", 155 | "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", 156 | "4 Allen, Mr. William Henry male 35.0 0 \n", 157 | "\n", 158 | " Parch Ticket Fare Cabin Embarked \n", 159 | "0 0 A/5 21171 7.2500 NaN S \n", 160 | "1 0 PC 17599 71.2833 C85 C \n", 161 | "2 0 STON/O2. 3101282 7.9250 NaN S \n", 162 | "3 0 113803 53.1000 C123 S \n", 163 | "4 0 373450 8.0500 NaN S " 164 | ] 165 | }, 166 | "execution_count": 2, 167 | "metadata": {}, 168 | "output_type": "execute_result" 169 | } 170 | ], 171 | "source": [ 172 | "df = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')\n", 173 | "df.head()" 174 | ] 175 | }, 176 | { 177 | "cell_type": "markdown", 178 | "metadata": {}, 179 | "source": [ 180 | "# 1. apply()" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 3, 186 | "metadata": {}, 187 | "outputs": [], 188 | "source": [ 189 | "def extract_title(string):\n", 190 | " string = string.split(',')[-1]\n", 191 | " string = string.strip()\n", 192 | " string = string.split('.')[0]\n", 193 | " return string" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 4, 199 | "metadata": {}, 200 | "outputs": [ 201 | { 202 | "data": { 203 | "text/plain": [ 204 | "0 Mr\n", 205 | "1 Mrs\n", 206 | "2 Miss\n", 207 | "3 Mrs\n", 208 | "4 Mr\n", 209 | "Name: Name, dtype: object" 210 | ] 211 | }, 212 | "execution_count": 4, 213 | "metadata": {}, 214 | "output_type": "execute_result" 215 | } 216 | ], 217 | "source": [ 218 | "titles = df['Name'].apply(extract_title)\n", 219 | "titles[:5]" 220 | ] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": 5, 225 | "metadata": {}, 226 | "outputs": [ 227 | { 228 | "data": { 229 | "text/plain": [ 230 | "0 Mr\n", 231 | "1 Mrs\n", 232 | "2 Miss\n", 233 | "3 Mrs\n", 234 | "4 Mr\n", 235 | "Name: Name, dtype: object" 236 | ] 237 | }, 238 | "execution_count": 5, 239 | "metadata": {}, 240 | "output_type": "execute_result" 241 | } 242 | ], 243 | "source": [ 244 | "titles = df['Name'].apply(lambda x: x.split(',')[-1].strip().split('.')[0])\n", 245 | "titles[:5]" 246 | ] 247 | }, 248 | { 249 | "cell_type": "markdown", 250 | "metadata": {}, 251 | "source": [ 252 | "# 2. value_counts()" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": 6, 258 | "metadata": {}, 259 | "outputs": [ 260 | { 261 | "data": { 262 | "text/plain": [ 263 | "Mr 517\n", 264 | "Miss 182\n", 265 | "Mrs 125\n", 266 | "Master 40\n", 267 | "Dr 7\n", 268 | "Rev 6\n", 269 | "Mlle 2\n", 270 | "Col 2\n", 271 | "Major 2\n", 272 | "Mme 1\n", 273 | "Jonkheer 1\n", 274 | "Sir 1\n", 275 | "Lady 1\n", 276 | "Don 1\n", 277 | "the Countess 1\n", 278 | "Capt 1\n", 279 | "Ms 1\n", 280 | "Name: Name, dtype: int64" 281 | ] 282 | }, 283 | "execution_count": 6, 284 | "metadata": {}, 285 | "output_type": "execute_result" 286 | } 287 | ], 288 | "source": [ 289 | "titles.value_counts()" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": 8, 295 | "metadata": {}, 296 | "outputs": [ 297 | { 298 | "data": { 299 | "text/plain": [ 300 | "Mr 58.024691\n", 301 | "Miss 20.426487\n", 302 | "Mrs 14.029181\n", 303 | "Master 4.489338\n", 304 | "Dr 0.785634\n", 305 | "Rev 0.673401\n", 306 | "Mlle 0.224467\n", 307 | "Col 0.224467\n", 308 | "Major 0.224467\n", 309 | "Mme 0.112233\n", 310 | "Jonkheer 0.112233\n", 311 | "Sir 0.112233\n", 312 | "Lady 0.112233\n", 313 | "Don 0.112233\n", 314 | "the Countess 0.112233\n", 315 | "Capt 0.112233\n", 316 | "Ms 0.112233\n", 317 | "Name: Name, dtype: float64" 318 | ] 319 | }, 320 | "execution_count": 8, 321 | "metadata": {}, 322 | "output_type": "execute_result" 323 | } 324 | ], 325 | "source": [ 326 | "titles.value_counts(normalize=True) * 100" 327 | ] 328 | }, 329 | { 330 | "cell_type": "markdown", 331 | "metadata": {}, 332 | "source": [ 333 | "# 3. get_dummies()" 334 | ] 335 | }, 336 | { 337 | "cell_type": "code", 338 | "execution_count": 9, 339 | "metadata": {}, 340 | "outputs": [ 341 | { 342 | "data": { 343 | "text/html": [ 344 | "
\n", 345 | "\n", 358 | "\n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | "
CQS
0001
1100
2001
3001
4001
\n", 400 | "
" 401 | ], 402 | "text/plain": [ 403 | " C Q S\n", 404 | "0 0 0 1\n", 405 | "1 1 0 0\n", 406 | "2 0 0 1\n", 407 | "3 0 0 1\n", 408 | "4 0 0 1" 409 | ] 410 | }, 411 | "execution_count": 9, 412 | "metadata": {}, 413 | "output_type": "execute_result" 414 | } 415 | ], 416 | "source": [ 417 | "emb = pd.get_dummies(df['Embarked'])\n", 418 | "emb.head()" 419 | ] 420 | }, 421 | { 422 | "cell_type": "code", 423 | "execution_count": 10, 424 | "metadata": {}, 425 | "outputs": [ 426 | { 427 | "data": { 428 | "text/html": [ 429 | "
\n", 430 | "\n", 443 | "\n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | "
Embarked_CEmbarked_QEmbarked_S
0001
1100
2001
3001
4001
\n", 485 | "
" 486 | ], 487 | "text/plain": [ 488 | " Embarked_C Embarked_Q Embarked_S\n", 489 | "0 0 0 1\n", 490 | "1 1 0 0\n", 491 | "2 0 0 1\n", 492 | "3 0 0 1\n", 493 | "4 0 0 1" 494 | ] 495 | }, 496 | "execution_count": 10, 497 | "metadata": {}, 498 | "output_type": "execute_result" 499 | } 500 | ], 501 | "source": [ 502 | "emb = pd.get_dummies(df['Embarked'], prefix='Embarked')\n", 503 | "emb.head()" 504 | ] 505 | }, 506 | { 507 | "cell_type": "code", 508 | "execution_count": 11, 509 | "metadata": {}, 510 | "outputs": [ 511 | { 512 | "data": { 513 | "text/html": [ 514 | "
\n", 515 | "\n", 528 | "\n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | "
Embarked_QEmbarked_S
001
100
201
301
401
\n", 564 | "
" 565 | ], 566 | "text/plain": [ 567 | " Embarked_Q Embarked_S\n", 568 | "0 0 1\n", 569 | "1 0 0\n", 570 | "2 0 1\n", 571 | "3 0 1\n", 572 | "4 0 1" 573 | ] 574 | }, 575 | "execution_count": 11, 576 | "metadata": {}, 577 | "output_type": "execute_result" 578 | } 579 | ], 580 | "source": [ 581 | "emb = pd.get_dummies(df['Embarked'], prefix='Embarked', drop_first=True)\n", 582 | "emb.head()" 583 | ] 584 | } 585 | ], 586 | "metadata": { 587 | "kernelspec": { 588 | "display_name": "Python 3", 589 | "language": "python", 590 | "name": "python3" 591 | }, 592 | "language_info": { 593 | "codemirror_mode": { 594 | "name": "ipython", 595 | "version": 3 596 | }, 597 | "file_extension": ".py", 598 | "mimetype": "text/x-python", 599 | "name": "python", 600 | "nbconvert_exporter": "python", 601 | "pygments_lexer": "ipython3", 602 | "version": "3.7.6" 603 | } 604 | }, 605 | "nbformat": 4, 606 | "nbformat_minor": 4 607 | } 608 | -------------------------------------------------------------------------------- /0004_TPOT.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "
\n", 8 | " \n", 9 | "
\n", 10 | "\n", 11 | "# TPOT" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": {}, 18 | "outputs": [ 19 | { 20 | "name": "stderr", 21 | "output_type": "stream", 22 | "text": [ 23 | "/opt/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", 24 | " return f(*args, **kwds)\n" 25 | ] 26 | } 27 | ], 28 | "source": [ 29 | "import pandas as pd\n", 30 | "from sklearn.preprocessing import StandardScaler\n", 31 | "from sklearn.model_selection import train_test_split" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 2, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "data": { 41 | "text/html": [ 42 | "
\n", 43 | "\n", 56 | "\n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", 152 | "
" 153 | ], 154 | "text/plain": [ 155 | " PassengerId Survived Pclass \\\n", 156 | "0 1 0 3 \n", 157 | "1 2 1 1 \n", 158 | "2 3 1 3 \n", 159 | "3 4 1 1 \n", 160 | "4 5 0 3 \n", 161 | "\n", 162 | " Name Sex Age SibSp \\\n", 163 | "0 Braund, Mr. Owen Harris male 22.0 1 \n", 164 | "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", 165 | "2 Heikkinen, Miss. Laina female 26.0 0 \n", 166 | "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", 167 | "4 Allen, Mr. William Henry male 35.0 0 \n", 168 | "\n", 169 | " Parch Ticket Fare Cabin Embarked \n", 170 | "0 0 A/5 21171 7.2500 NaN S \n", 171 | "1 0 PC 17599 71.2833 C85 C \n", 172 | "2 0 STON/O2. 3101282 7.9250 NaN S \n", 173 | "3 0 113803 53.1000 C123 S \n", 174 | "4 0 373450 8.0500 NaN S " 175 | ] 176 | }, 177 | "execution_count": 2, 178 | "metadata": {}, 179 | "output_type": "execute_result" 180 | } 181 | ], 182 | "source": [ 183 | "data = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')\n", 184 | "data.head()" 185 | ] 186 | }, 187 | { 188 | "cell_type": "markdown", 189 | "metadata": {}, 190 | "source": [ 191 | "## Data preparation" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": 3, 197 | "metadata": {}, 198 | "outputs": [], 199 | "source": [ 200 | "data.drop(['Ticket', 'PassengerId'], axis=1, inplace=True)\n", 201 | "\n", 202 | "gender_mapper = {'male': 0, 'female': 1}\n", 203 | "data['Sex'].replace(gender_mapper, inplace=True)\n", 204 | "\n", 205 | "data['Title'] = data['Name'].apply(lambda x: x.split(',')[1].strip().split(' ')[0])\n", 206 | "data['Title'] = [0 if x in ['Mr.', 'Miss.', 'Mrs.'] else 1 for x in data['Title']]\n", 207 | "data = data.rename(columns={'Title': 'Title_Unusual'})\n", 208 | "data.drop('Name', axis=1, inplace=True)\n", 209 | "\n", 210 | "data['Cabin_Known'] = [0 if str(x) == 'nan' else 1 for x in data['Cabin']]\n", 211 | "data.drop('Cabin', axis=1, inplace=True)\n", 212 | "\n", 213 | "emb_dummies = pd.get_dummies(data['Embarked'], drop_first=True, prefix='Embarked')\n", 214 | "data = pd.concat([data, emb_dummies], axis=1)\n", 215 | "data.drop('Embarked', axis=1, inplace=True)\n", 216 | "\n", 217 | "data['Age'] = data['Age'].fillna(int(data['Age'].mean()))" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": 4, 223 | "metadata": {}, 224 | "outputs": [ 225 | { 226 | "data": { 227 | "text/html": [ 228 | "
\n", 229 | "\n", 242 | "\n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | "
SurvivedPclassSexAgeSibSpParchFareTitle_UnusualCabin_KnownEmbarked_QEmbarked_S
003022.0107.25000001
111138.01071.28330100
213126.0007.92500001
311135.01053.10000101
403035.0008.05000001
\n", 332 | "
" 333 | ], 334 | "text/plain": [ 335 | " Survived Pclass Sex Age SibSp Parch Fare Title_Unusual \\\n", 336 | "0 0 3 0 22.0 1 0 7.2500 0 \n", 337 | "1 1 1 1 38.0 1 0 71.2833 0 \n", 338 | "2 1 3 1 26.0 0 0 7.9250 0 \n", 339 | "3 1 1 1 35.0 1 0 53.1000 0 \n", 340 | "4 0 3 0 35.0 0 0 8.0500 0 \n", 341 | "\n", 342 | " Cabin_Known Embarked_Q Embarked_S \n", 343 | "0 0 0 1 \n", 344 | "1 1 0 0 \n", 345 | "2 0 0 1 \n", 346 | "3 1 0 1 \n", 347 | "4 0 0 1 " 348 | ] 349 | }, 350 | "execution_count": 4, 351 | "metadata": {}, 352 | "output_type": "execute_result" 353 | } 354 | ], 355 | "source": [ 356 | "data.head()" 357 | ] 358 | }, 359 | { 360 | "cell_type": "markdown", 361 | "metadata": {}, 362 | "source": [ 363 | "## Train Test split and Scaling" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 5, 369 | "metadata": {}, 370 | "outputs": [], 371 | "source": [ 372 | "X = data.drop('Survived', axis=1)\n", 373 | "y = data['Survived']\n", 374 | "\n", 375 | "X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8)" 376 | ] 377 | }, 378 | { 379 | "cell_type": "code", 380 | "execution_count": 6, 381 | "metadata": {}, 382 | "outputs": [], 383 | "source": [ 384 | "ss = StandardScaler()\n", 385 | "X_train_scaled = ss.fit_transform(X_train)\n", 386 | "X_test_scaled = ss.transform(X_test)" 387 | ] 388 | }, 389 | { 390 | "cell_type": "markdown", 391 | "metadata": {}, 392 | "source": [ 393 | "# TPOT" 394 | ] 395 | }, 396 | { 397 | "cell_type": "code", 398 | "execution_count": 7, 399 | "metadata": {}, 400 | "outputs": [ 401 | { 402 | "name": "stderr", 403 | "output_type": "stream", 404 | "text": [ 405 | "/opt/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", 406 | " return f(*args, **kwds)\n", 407 | "/opt/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", 408 | " return f(*args, **kwds)\n", 409 | "/opt/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", 410 | " return f(*args, **kwds)\n", 411 | "/opt/anaconda3/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", 412 | " return f(*args, **kwds)\n" 413 | ] 414 | }, 415 | { 416 | "data": { 417 | "application/vnd.jupyter.widget-view+json": { 418 | "model_id": "486d08b62e1d41f09461fea3e3eb29ba", 419 | "version_major": 2, 420 | "version_minor": 0 421 | }, 422 | "text/plain": [ 423 | "HBox(children=(FloatProgress(value=0.0, description='Optimization Progress', style=ProgressStyle(description_w…" 424 | ] 425 | }, 426 | "metadata": {}, 427 | "output_type": "display_data" 428 | }, 429 | { 430 | "name": "stdout", 431 | "output_type": "stream", 432 | "text": [ 433 | "\n", 434 | "Generation 1 - Current best internal CV score: 0.8216389244558258\n", 435 | "Generation 2 - Current best internal CV score: 0.8216389244558258\n", 436 | "Generation 3 - Current best internal CV score: 0.8244361272530286\n", 437 | "Generation 4 - Current best internal CV score: 0.8244361272530287\n", 438 | "10.02 minutes have elapsed. TPOT will close down.\n", 439 | "TPOT closed during evaluation in one generation.\n", 440 | "WARNING: TPOT may not provide a good pipeline if TPOT is stopped/interrupted in a early generation.\n", 441 | "\n", 442 | "\n", 443 | "TPOT closed prematurely. Will use the current best pipeline.\n", 444 | "\n", 445 | "Best pipeline: GradientBoostingClassifier(input_matrix, learning_rate=0.1, max_depth=10, max_features=0.55, min_samples_leaf=16, min_samples_split=3, n_estimators=100, subsample=0.6000000000000001)\n" 446 | ] 447 | }, 448 | { 449 | "data": { 450 | "text/plain": [ 451 | "TPOTClassifier(config_dict=None, crossover_rate=0.1, cv=5,\n", 452 | " disable_update_check=False, early_stop=None, generations=100,\n", 453 | " log_file=,\n", 454 | " max_eval_time_mins=5, max_time_mins=10, memory=None,\n", 455 | " mutation_rate=0.9, n_jobs=1, offspring_size=None,\n", 456 | " periodic_checkpoint_folder=None, population_size=100,\n", 457 | " random_state=None, scoring=None, subsample=1.0, template=None,\n", 458 | " use_dask=False, verbosity=2, warm_start=False)" 459 | ] 460 | }, 461 | "execution_count": 7, 462 | "metadata": {}, 463 | "output_type": "execute_result" 464 | } 465 | ], 466 | "source": [ 467 | "from tpot import TPOTClassifier\n", 468 | "\n", 469 | "tpot = TPOTClassifier(verbosity=2, max_time_mins=10)\n", 470 | "tpot.fit(X_train_scaled, y_train)" 471 | ] 472 | }, 473 | { 474 | "cell_type": "code", 475 | "execution_count": null, 476 | "metadata": {}, 477 | "outputs": [], 478 | "source": [] 479 | }, 480 | { 481 | "cell_type": "code", 482 | "execution_count": 8, 483 | "metadata": {}, 484 | "outputs": [ 485 | { 486 | "data": { 487 | "text/plain": [ 488 | "Pipeline(memory=None,\n", 489 | " steps=[('gradientboostingclassifier',\n", 490 | " GradientBoostingClassifier(ccp_alpha=0.0,\n", 491 | " criterion='friedman_mse', init=None,\n", 492 | " learning_rate=0.1, loss='deviance',\n", 493 | " max_depth=10, max_features=0.55,\n", 494 | " max_leaf_nodes=None,\n", 495 | " min_impurity_decrease=0.0,\n", 496 | " min_impurity_split=None,\n", 497 | " min_samples_leaf=16,\n", 498 | " min_samples_split=3,\n", 499 | " min_weight_fraction_leaf=0.0,\n", 500 | " n_estimators=100,\n", 501 | " n_iter_no_change=None,\n", 502 | " presort='deprecated',\n", 503 | " random_state=None,\n", 504 | " subsample=0.6000000000000001,\n", 505 | " tol=0.0001, validation_fraction=0.1,\n", 506 | " verbose=0, warm_start=False))],\n", 507 | " verbose=False)" 508 | ] 509 | }, 510 | "execution_count": 8, 511 | "metadata": {}, 512 | "output_type": "execute_result" 513 | } 514 | ], 515 | "source": [ 516 | "tpot.fitted_pipeline_" 517 | ] 518 | }, 519 | { 520 | "cell_type": "code", 521 | "execution_count": 9, 522 | "metadata": {}, 523 | "outputs": [ 524 | { 525 | "data": { 526 | "text/plain": [ 527 | "0.8491620111731844" 528 | ] 529 | }, 530 | "execution_count": 9, 531 | "metadata": {}, 532 | "output_type": "execute_result" 533 | } 534 | ], 535 | "source": [ 536 | "tpot.score(X_test_scaled, y_test)" 537 | ] 538 | } 539 | ], 540 | "metadata": { 541 | "kernelspec": { 542 | "display_name": "Python 3", 543 | "language": "python", 544 | "name": "python3" 545 | }, 546 | "language_info": { 547 | "codemirror_mode": { 548 | "name": "ipython", 549 | "version": 3 550 | }, 551 | "file_extension": ".py", 552 | "mimetype": "text/x-python", 553 | "name": "python", 554 | "nbconvert_exporter": "python", 555 | "pygments_lexer": "ipython3", 556 | "version": "3.7.6" 557 | } 558 | }, 559 | "nbformat": 4, 560 | "nbformat_minor": 4 561 | } 562 | -------------------------------------------------------------------------------- /data/RealEstate.csv: -------------------------------------------------------------------------------- 1 | No,X1 transaction date,X2 house age,X3 distance to the nearest MRT station,X4 number of convenience stores,X5 latitude,X6 longitude,Y house price of unit area 2 | 1,2012.917,32,84.87882,10,24.98298,121.54024,37.9 3 | 2,2012.917,19.5,306.5947,9,24.98034,121.53951,42.2 4 | 3,2013.583,13.3,561.9845,5,24.98746,121.54391,47.3 5 | 4,2013.500,13.3,561.9845,5,24.98746,121.54391,54.8 6 | 5,2012.833,5,390.5684,5,24.97937,121.54245,43.1 7 | 6,2012.667,7.1,2175.03,3,24.96305,121.51254,32.1 8 | 7,2012.667,34.5,623.4731,7,24.97933,121.53642,40.3 9 | 8,2013.417,20.3,287.6025,6,24.98042,121.54228,46.7 10 | 9,2013.500,31.7,5512.038,1,24.95095,121.48458,18.8 11 | 10,2013.417,17.9,1783.18,3,24.96731,121.51486,22.1 12 | 11,2013.083,34.8,405.2134,1,24.97349,121.53372,41.4 13 | 12,2013.333,6.3,90.45606,9,24.97433,121.5431,58.1 14 | 13,2012.917,13,492.2313,5,24.96515,121.53737,39.3 15 | 14,2012.667,20.4,2469.645,4,24.96108,121.51046,23.8 16 | 15,2013.500,13.2,1164.838,4,24.99156,121.53406,34.3 17 | 16,2013.583,35.7,579.2083,2,24.9824,121.54619,50.5 18 | 17,2013.250,0,292.9978,6,24.97744,121.54458,70.1 19 | 18,2012.750,17.7,350.8515,1,24.97544,121.53119,37.4 20 | 19,2013.417,16.9,368.1363,8,24.9675,121.54451,42.3 21 | 20,2012.667,1.5,23.38284,7,24.96772,121.54102,47.7 22 | 21,2013.417,4.5,2275.877,3,24.96314,121.51151,29.3 23 | 22,2013.417,10.5,279.1726,7,24.97528,121.54541,51.6 24 | 23,2012.917,14.7,1360.139,1,24.95204,121.54842,24.6 25 | 24,2013.083,10.1,279.1726,7,24.97528,121.54541,47.9 26 | 25,2013.000,39.6,480.6977,4,24.97353,121.53885,38.8 27 | 26,2013.083,29.3,1487.868,2,24.97542,121.51726,27 28 | 27,2012.667,3.1,383.8624,5,24.98085,121.54391,56.2 29 | 28,2013.250,10.4,276.449,5,24.95593,121.53913,33.6 30 | 29,2013.500,19.2,557.478,4,24.97419,121.53797,47 31 | 30,2013.083,7.1,451.2438,5,24.97563,121.54694,57.1 32 | 31,2013.500,25.9,4519.69,0,24.94826,121.49587,22.1 33 | 32,2012.750,29.6,769.4034,7,24.98281,121.53408,25 34 | 33,2012.750,37.9,488.5727,1,24.97349,121.53451,34.2 35 | 34,2013.250,16.5,323.655,6,24.97841,121.54281,49.3 36 | 35,2012.750,15.4,205.367,7,24.98419,121.54243,55.1 37 | 36,2013.500,13.9,4079.418,0,25.01459,121.51816,27.3 38 | 37,2012.917,14.7,1935.009,2,24.96386,121.51458,22.9 39 | 38,2013.167,12,1360.139,1,24.95204,121.54842,25.3 40 | 39,2012.667,3.1,577.9615,6,24.97201,121.54722,47.7 41 | 40,2013.167,16.2,289.3248,5,24.98203,121.54348,46.2 42 | 41,2013.000,13.6,4082.015,0,24.94155,121.50381,15.9 43 | 42,2013.500,16.8,4066.587,0,24.94297,121.50342,18.2 44 | 43,2013.417,36.1,519.4617,5,24.96305,121.53758,34.7 45 | 44,2012.750,34.4,512.7871,6,24.98748,121.54301,34.1 46 | 45,2013.583,2.7,533.4762,4,24.97445,121.54765,53.9 47 | 46,2013.083,36.6,488.8193,8,24.97015,121.54494,38.3 48 | 47,2013.417,21.7,463.9623,9,24.9703,121.54458,42 49 | 48,2013.583,35.9,640.7391,3,24.97563,121.53715,61.5 50 | 49,2013.417,24.2,4605.749,0,24.94684,121.49578,13.4 51 | 50,2012.667,29.4,4510.359,1,24.94925,121.49542,13.2 52 | 51,2013.417,21.7,512.5487,4,24.974,121.53842,44.2 53 | 52,2013.083,31.3,1758.406,1,24.95402,121.55282,20.7 54 | 53,2013.583,32.1,1438.579,3,24.97419,121.5175,27 55 | 54,2013.083,13.3,492.2313,5,24.96515,121.53737,38.9 56 | 55,2013.083,16.1,289.3248,5,24.98203,121.54348,51.7 57 | 56,2012.833,31.7,1160.632,0,24.94968,121.53009,13.7 58 | 57,2013.417,33.6,371.2495,8,24.97254,121.54059,41.9 59 | 58,2012.917,3.5,56.47425,7,24.95744,121.53711,53.5 60 | 59,2013.500,30.3,4510.359,1,24.94925,121.49542,22.6 61 | 60,2013.083,13.3,336.0532,5,24.95776,121.53438,42.4 62 | 61,2013.417,11,1931.207,2,24.96365,121.51471,21.3 63 | 62,2013.500,5.3,259.6607,6,24.97585,121.54516,63.2 64 | 63,2012.917,17.2,2175.877,3,24.96303,121.51254,27.7 65 | 64,2013.583,2.6,533.4762,4,24.97445,121.54765,55 66 | 65,2013.333,17.5,995.7554,0,24.96305,121.54915,25.3 67 | 66,2013.417,40.1,123.7429,8,24.97635,121.54329,44.3 68 | 67,2013.000,1,193.5845,6,24.96571,121.54089,50.7 69 | 68,2013.500,8.5,104.8101,5,24.96674,121.54067,56.8 70 | 69,2013.417,30.4,464.223,6,24.97964,121.53805,36.2 71 | 70,2012.833,12.5,561.9845,5,24.98746,121.54391,42 72 | 71,2013.583,6.6,90.45606,9,24.97433,121.5431,59 73 | 72,2013.083,35.5,640.7391,3,24.97563,121.53715,40.8 74 | 73,2013.583,32.5,424.5442,8,24.97587,121.53913,36.3 75 | 74,2013.167,13.8,4082.015,0,24.94155,121.50381,20 76 | 75,2012.917,6.8,379.5575,10,24.98343,121.53762,54.4 77 | 76,2013.500,12.3,1360.139,1,24.95204,121.54842,29.5 78 | 77,2013.583,35.9,616.4004,3,24.97723,121.53767,36.8 79 | 78,2012.833,20.5,2185.128,3,24.96322,121.51237,25.6 80 | 79,2012.917,38.2,552.4371,2,24.97598,121.53381,29.8 81 | 80,2013.000,18,1414.837,1,24.95182,121.54887,26.5 82 | 81,2013.500,11.8,533.4762,4,24.97445,121.54765,40.3 83 | 82,2013.000,30.8,377.7956,6,24.96427,121.53964,36.8 84 | 83,2013.083,13.2,150.9347,7,24.96725,121.54252,48.1 85 | 84,2012.917,25.3,2707.392,3,24.96056,121.50831,17.7 86 | 85,2013.083,15.1,383.2805,7,24.96735,121.54464,43.7 87 | 86,2012.750,0,338.9679,9,24.96853,121.54413,50.8 88 | 87,2012.833,1.8,1455.798,1,24.9512,121.549,27 89 | 88,2013.583,16.9,4066.587,0,24.94297,121.50342,18.3 90 | 89,2012.917,8.9,1406.43,0,24.98573,121.52758,48 91 | 90,2013.500,23,3947.945,0,24.94783,121.50243,25.3 92 | 91,2012.833,0,274.0144,1,24.9748,121.53059,45.4 93 | 92,2013.250,9.1,1402.016,0,24.98569,121.5276,43.2 94 | 93,2012.917,20.6,2469.645,4,24.96108,121.51046,21.8 95 | 94,2012.917,31.9,1146.329,0,24.9492,121.53076,16.1 96 | 95,2012.917,40.9,167.5989,5,24.9663,121.54026,41 97 | 96,2012.917,8,104.8101,5,24.96674,121.54067,51.8 98 | 97,2013.417,6.4,90.45606,9,24.97433,121.5431,59.5 99 | 98,2013.083,28.4,617.4424,3,24.97746,121.53299,34.6 100 | 99,2013.417,16.4,289.3248,5,24.98203,121.54348,51 101 | 100,2013.417,6.4,90.45606,9,24.97433,121.5431,62.2 102 | 101,2013.500,17.5,964.7496,4,24.98872,121.53411,38.2 103 | 102,2012.833,12.7,170.1289,1,24.97371,121.52984,32.9 104 | 103,2013.083,1.1,193.5845,6,24.96571,121.54089,54.4 105 | 104,2012.750,0,208.3905,6,24.95618,121.53844,45.7 106 | 105,2012.667,32.7,392.4459,6,24.96398,121.5425,30.5 107 | 106,2012.833,0,292.9978,6,24.97744,121.54458,71 108 | 107,2013.083,17.2,189.5181,8,24.97707,121.54308,47.1 109 | 108,2013.333,12.2,1360.139,1,24.95204,121.54842,26.6 110 | 109,2013.417,31.4,592.5006,2,24.9726,121.53561,34.1 111 | 110,2013.583,4,2147.376,3,24.96299,121.51284,28.4 112 | 111,2013.083,8.1,104.8101,5,24.96674,121.54067,51.6 113 | 112,2013.583,33.3,196.6172,7,24.97701,121.54224,39.4 114 | 113,2013.417,9.9,2102.427,3,24.96044,121.51462,23.1 115 | 114,2013.333,14.8,393.2606,6,24.96172,121.53812,7.6 116 | 115,2012.667,30.6,143.8383,8,24.98155,121.54142,53.3 117 | 116,2013.083,20.6,737.9161,2,24.98092,121.54739,46.4 118 | 117,2013.000,30.9,6396.283,1,24.94375,121.47883,12.2 119 | 118,2013.000,13.6,4197.349,0,24.93885,121.50383,13 120 | 119,2013.500,25.3,1583.722,3,24.96622,121.51709,30.6 121 | 120,2013.500,16.6,289.3248,5,24.98203,121.54348,59.6 122 | 121,2013.167,13.3,492.2313,5,24.96515,121.53737,31.3 123 | 122,2013.500,13.6,492.2313,5,24.96515,121.53737,48 124 | 123,2013.250,31.5,414.9476,4,24.98199,121.54464,32.5 125 | 124,2013.417,0,185.4296,0,24.9711,121.5317,45.5 126 | 125,2012.917,9.9,279.1726,7,24.97528,121.54541,57.4 127 | 126,2013.167,1.1,193.5845,6,24.96571,121.54089,48.6 128 | 127,2013.083,38.6,804.6897,4,24.97838,121.53477,62.9 129 | 128,2013.250,3.8,383.8624,5,24.98085,121.54391,55 130 | 129,2013.083,41.3,124.9912,6,24.96674,121.54039,60.7 131 | 130,2013.417,38.5,216.8329,7,24.98086,121.54162,41 132 | 131,2013.250,29.6,535.527,8,24.98092,121.53653,37.5 133 | 132,2013.500,4,2147.376,3,24.96299,121.51284,30.7 134 | 133,2013.167,26.6,482.7581,5,24.97433,121.53863,37.5 135 | 134,2012.833,18,373.3937,8,24.9866,121.54082,39.5 136 | 135,2012.667,33.4,186.9686,6,24.96604,121.54211,42.2 137 | 136,2012.917,18.9,1009.235,0,24.96357,121.54951,20.8 138 | 137,2012.750,11.4,390.5684,5,24.97937,121.54245,46.8 139 | 138,2013.500,13.6,319.0708,6,24.96495,121.54277,47.4 140 | 139,2013.167,10,942.4664,0,24.97843,121.52406,43.5 141 | 140,2012.667,12.9,492.2313,5,24.96515,121.53737,42.5 142 | 141,2013.250,16.2,289.3248,5,24.98203,121.54348,51.4 143 | 142,2013.333,5.1,1559.827,3,24.97213,121.51627,28.9 144 | 143,2013.417,19.8,640.6071,5,24.97017,121.54647,37.5 145 | 144,2013.500,13.6,492.2313,5,24.96515,121.53737,40.1 146 | 145,2013.083,11.9,1360.139,1,24.95204,121.54842,28.4 147 | 146,2012.917,2.1,451.2438,5,24.97563,121.54694,45.5 148 | 147,2012.750,0,185.4296,0,24.9711,121.5317,52.2 149 | 148,2012.750,3.2,489.8821,8,24.97017,121.54494,43.2 150 | 149,2013.500,16.4,3780.59,0,24.93293,121.51203,45.1 151 | 150,2012.667,34.9,179.4538,8,24.97349,121.54245,39.7 152 | 151,2013.250,35.8,170.7311,7,24.96719,121.54269,48.5 153 | 152,2013.500,4.9,387.7721,9,24.98118,121.53788,44.7 154 | 153,2013.333,12,1360.139,1,24.95204,121.54842,28.9 155 | 154,2013.250,6.5,376.1709,6,24.95418,121.53713,40.9 156 | 155,2013.500,16.9,4066.587,0,24.94297,121.50342,20.7 157 | 156,2013.167,13.8,4082.015,0,24.94155,121.50381,15.6 158 | 157,2013.583,30.7,1264.73,0,24.94883,121.52954,18.3 159 | 158,2013.250,16.1,815.9314,4,24.97886,121.53464,35.6 160 | 159,2013.000,11.6,390.5684,5,24.97937,121.54245,39.4 161 | 160,2012.667,15.5,815.9314,4,24.97886,121.53464,37.4 162 | 161,2012.917,3.5,49.66105,8,24.95836,121.53756,57.8 163 | 162,2013.417,19.2,616.4004,3,24.97723,121.53767,39.6 164 | 163,2012.750,16,4066.587,0,24.94297,121.50342,11.6 165 | 164,2013.500,8.5,104.8101,5,24.96674,121.54067,55.5 166 | 165,2012.833,0,185.4296,0,24.9711,121.5317,55.2 167 | 166,2012.917,13.7,1236.564,1,24.97694,121.55391,30.6 168 | 167,2013.417,0,292.9978,6,24.97744,121.54458,73.6 169 | 168,2013.417,28.2,330.0854,8,24.97408,121.54011,43.4 170 | 169,2013.083,27.6,515.1122,5,24.96299,121.5432,37.4 171 | 170,2013.417,8.4,1962.628,1,24.95468,121.55481,23.5 172 | 171,2013.333,24,4527.687,0,24.94741,121.49628,14.4 173 | 172,2013.083,3.6,383.8624,5,24.98085,121.54391,58.8 174 | 173,2013.583,6.6,90.45606,9,24.97433,121.5431,58.1 175 | 174,2013.083,41.3,401.8807,4,24.98326,121.5446,35.1 176 | 175,2013.417,4.3,432.0385,7,24.9805,121.53778,45.2 177 | 176,2013.083,30.2,472.1745,3,24.97005,121.53758,36.5 178 | 177,2012.833,13.9,4573.779,0,24.94867,121.49507,19.2 179 | 178,2013.083,33,181.0766,9,24.97697,121.54262,42 180 | 179,2013.500,13.1,1144.436,4,24.99176,121.53456,36.7 181 | 180,2013.083,14,438.8513,1,24.97493,121.5273,42.6 182 | 181,2012.667,26.9,4449.27,0,24.94898,121.49621,15.5 183 | 182,2013.167,11.6,201.8939,8,24.98489,121.54121,55.9 184 | 183,2013.500,13.5,2147.376,3,24.96299,121.51284,23.6 185 | 184,2013.500,17,4082.015,0,24.94155,121.50381,18.8 186 | 185,2012.750,14.1,2615.465,0,24.95495,121.56174,21.8 187 | 186,2012.750,31.4,1447.286,3,24.97285,121.5173,21.5 188 | 187,2013.167,20.9,2185.128,3,24.96322,121.51237,25.7 189 | 188,2013.000,8.9,3078.176,0,24.95464,121.56627,22 190 | 189,2012.917,34.8,190.0392,8,24.97707,121.54312,44.3 191 | 190,2012.917,16.3,4066.587,0,24.94297,121.50342,20.5 192 | 191,2013.500,35.3,616.5735,8,24.97945,121.53642,42.3 193 | 192,2013.167,13.2,750.0704,2,24.97371,121.54951,37.8 194 | 193,2013.167,43.8,57.58945,7,24.9675,121.54069,42.7 195 | 194,2013.417,9.7,421.479,5,24.98246,121.54477,49.3 196 | 195,2013.500,15.2,3771.895,0,24.93363,121.51158,29.3 197 | 196,2013.333,15.2,461.1016,5,24.95425,121.5399,34.6 198 | 197,2013.000,22.8,707.9067,2,24.981,121.54713,36.6 199 | 198,2013.250,34.4,126.7286,8,24.96881,121.54089,48.2 200 | 199,2013.083,34,157.6052,7,24.96628,121.54196,39.1 201 | 200,2013.417,18.2,451.6419,8,24.96945,121.5449,31.6 202 | 201,2013.417,17.4,995.7554,0,24.96305,121.54915,25.5 203 | 202,2013.417,13.1,561.9845,5,24.98746,121.54391,45.9 204 | 203,2012.917,38.3,642.6985,3,24.97559,121.53713,31.5 205 | 204,2012.667,15.6,289.3248,5,24.98203,121.54348,46.1 206 | 205,2013.000,18,1414.837,1,24.95182,121.54887,26.6 207 | 206,2013.083,12.8,1449.722,3,24.97289,121.51728,21.4 208 | 207,2013.250,22.2,379.5575,10,24.98343,121.53762,44 209 | 208,2013.083,38.5,665.0636,3,24.97503,121.53692,34.2 210 | 209,2012.750,11.5,1360.139,1,24.95204,121.54842,26.2 211 | 210,2012.833,34.8,175.6294,8,24.97347,121.54271,40.9 212 | 211,2013.500,5.2,390.5684,5,24.97937,121.54245,52.2 213 | 212,2013.083,0,274.0144,1,24.9748,121.53059,43.5 214 | 213,2013.333,17.6,1805.665,2,24.98672,121.52091,31.1 215 | 214,2013.083,6.2,90.45606,9,24.97433,121.5431,58 216 | 215,2013.583,18.1,1783.18,3,24.96731,121.51486,20.9 217 | 216,2013.333,19.2,383.7129,8,24.972,121.54477,48.1 218 | 217,2013.250,37.8,590.9292,1,24.97153,121.53559,39.7 219 | 218,2012.917,28,372.6242,6,24.97838,121.54119,40.8 220 | 219,2013.417,13.6,492.2313,5,24.96515,121.53737,43.8 221 | 220,2012.750,29.3,529.7771,8,24.98102,121.53655,40.2 222 | 221,2013.333,37.2,186.5101,9,24.97703,121.54265,78.3 223 | 222,2013.333,9,1402.016,0,24.98569,121.5276,38.5 224 | 223,2013.583,30.6,431.1114,10,24.98123,121.53743,48.5 225 | 224,2013.250,9.1,1402.016,0,24.98569,121.5276,42.3 226 | 225,2013.333,34.5,324.9419,6,24.97814,121.5417,46 227 | 226,2013.250,1.1,193.5845,6,24.96571,121.54089,49 228 | 227,2013.000,16.5,4082.015,0,24.94155,121.50381,12.8 229 | 228,2012.917,32.4,265.0609,8,24.98059,121.53986,40.2 230 | 229,2013.417,11.9,3171.329,0,25.00115,121.51776,46.6 231 | 230,2013.583,31,1156.412,0,24.9489,121.53095,19 232 | 231,2013.500,4,2147.376,3,24.96299,121.51284,33.4 233 | 232,2012.833,16.2,4074.736,0,24.94235,121.50357,14.7 234 | 233,2012.917,27.1,4412.765,1,24.95032,121.49587,17.4 235 | 234,2013.333,39.7,333.3679,9,24.98016,121.53932,32.4 236 | 235,2013.250,8,2216.612,4,24.96007,121.51361,23.9 237 | 236,2012.750,12.9,250.631,7,24.96606,121.54297,39.3 238 | 237,2013.167,3.6,373.8389,10,24.98322,121.53765,61.9 239 | 238,2013.167,13,732.8528,0,24.97668,121.52518,39 240 | 239,2013.083,12.8,732.8528,0,24.97668,121.52518,40.6 241 | 240,2013.500,18.1,837.7233,0,24.96334,121.54767,29.7 242 | 241,2013.083,11,1712.632,2,24.96412,121.5167,28.8 243 | 242,2013.500,13.7,250.631,7,24.96606,121.54297,41.4 244 | 243,2012.833,2,2077.39,3,24.96357,121.51329,33.4 245 | 244,2013.417,32.8,204.1705,8,24.98236,121.53923,48.2 246 | 245,2013.083,4.8,1559.827,3,24.97213,121.51627,21.7 247 | 246,2013.417,7.5,639.6198,5,24.97258,121.54814,40.8 248 | 247,2013.417,16.4,389.8219,6,24.96412,121.54273,40.6 249 | 248,2013.333,21.7,1055.067,0,24.96211,121.54928,23.1 250 | 249,2013.000,19,1009.235,0,24.96357,121.54951,22.3 251 | 250,2012.833,18,6306.153,1,24.95743,121.47516,15 252 | 251,2013.167,39.2,424.7132,7,24.97429,121.53917,30 253 | 252,2012.917,31.7,1159.454,0,24.9496,121.53018,13.8 254 | 253,2012.833,5.9,90.45606,9,24.97433,121.5431,52.7 255 | 254,2012.667,30.4,1735.595,2,24.96464,121.51623,25.9 256 | 255,2012.667,1.1,329.9747,5,24.98254,121.54395,51.8 257 | 256,2013.417,31.5,5512.038,1,24.95095,121.48458,17.4 258 | 257,2012.667,14.6,339.2289,1,24.97519,121.53151,26.5 259 | 258,2013.250,17.3,444.1334,1,24.97501,121.5273,43.9 260 | 259,2013.417,0,292.9978,6,24.97744,121.54458,63.3 261 | 260,2013.083,17.7,837.7233,0,24.96334,121.54767,28.8 262 | 261,2013.250,17,1485.097,4,24.97073,121.517,30.7 263 | 262,2013.167,16.2,2288.011,3,24.95885,121.51359,24.4 264 | 263,2012.917,15.9,289.3248,5,24.98203,121.54348,53 265 | 264,2013.417,3.9,2147.376,3,24.96299,121.51284,31.7 266 | 265,2013.167,32.6,493.657,7,24.96968,121.54522,40.6 267 | 266,2012.833,15.7,815.9314,4,24.97886,121.53464,38.1 268 | 267,2013.250,17.8,1783.18,3,24.96731,121.51486,23.7 269 | 268,2012.833,34.7,482.7581,5,24.97433,121.53863,41.1 270 | 269,2013.417,17.2,390.5684,5,24.97937,121.54245,40.1 271 | 270,2013.000,17.6,837.7233,0,24.96334,121.54767,23 272 | 271,2013.333,10.8,252.5822,1,24.9746,121.53046,117.5 273 | 272,2012.917,17.7,451.6419,8,24.96945,121.5449,26.5 274 | 273,2012.750,13,492.2313,5,24.96515,121.53737,40.5 275 | 274,2013.417,13.2,170.1289,1,24.97371,121.52984,29.3 276 | 275,2013.167,27.5,394.0173,7,24.97305,121.53994,41 277 | 276,2012.667,1.5,23.38284,7,24.96772,121.54102,49.7 278 | 277,2013.000,19.1,461.1016,5,24.95425,121.5399,34 279 | 278,2013.417,21.2,2185.128,3,24.96322,121.51237,27.7 280 | 279,2012.750,0,208.3905,6,24.95618,121.53844,44 281 | 280,2013.417,2.6,1554.25,3,24.97026,121.51642,31.1 282 | 281,2013.250,2.3,184.3302,6,24.96581,121.54086,45.4 283 | 282,2013.333,4.7,387.7721,9,24.98118,121.53788,44.8 284 | 283,2012.917,2,1455.798,1,24.9512,121.549,25.6 285 | 284,2013.417,33.5,1978.671,2,24.98674,121.51844,23.5 286 | 285,2012.917,15,383.2805,7,24.96735,121.54464,34.4 287 | 286,2013.167,30.1,718.2937,3,24.97509,121.53644,55.3 288 | 287,2012.917,5.9,90.45606,9,24.97433,121.5431,56.3 289 | 288,2013.000,19.2,461.1016,5,24.95425,121.5399,32.9 290 | 289,2013.583,16.6,323.6912,6,24.97841,121.5428,51 291 | 290,2013.333,13.9,289.3248,5,24.98203,121.54348,44.5 292 | 291,2013.083,37.7,490.3446,0,24.97217,121.53471,37 293 | 292,2012.833,3.4,56.47425,7,24.95744,121.53711,54.4 294 | 293,2013.083,17.5,395.6747,5,24.95674,121.534,24.5 295 | 294,2012.667,12.6,383.2805,7,24.96735,121.54464,42.5 296 | 295,2013.500,26.4,335.5273,6,24.9796,121.5414,38.1 297 | 296,2013.167,18.2,2179.59,3,24.96299,121.51252,21.8 298 | 297,2012.750,12.5,1144.436,4,24.99176,121.53456,34.1 299 | 298,2012.833,34.9,567.0349,4,24.97003,121.5458,28.5 300 | 299,2013.333,16.7,4082.015,0,24.94155,121.50381,16.7 301 | 300,2013.167,33.2,121.7262,10,24.98178,121.54059,46.1 302 | 301,2013.083,2.5,156.2442,4,24.96696,121.53992,36.9 303 | 302,2012.750,38,461.7848,0,24.97229,121.53445,35.7 304 | 303,2013.500,16.5,2288.011,3,24.95885,121.51359,23.2 305 | 304,2013.500,38.3,439.7105,0,24.97161,121.53423,38.4 306 | 305,2013.417,20,1626.083,3,24.96622,121.51668,29.4 307 | 306,2013.083,16.2,289.3248,5,24.98203,121.54348,55 308 | 307,2013.500,14.4,169.9803,1,24.97369,121.52979,50.2 309 | 308,2012.833,10.3,3079.89,0,24.9546,121.56627,24.7 310 | 309,2013.417,16.4,289.3248,5,24.98203,121.54348,53 311 | 310,2013.250,30.3,1264.73,0,24.94883,121.52954,19.1 312 | 311,2013.583,16.4,1643.499,2,24.95394,121.55174,24.7 313 | 312,2013.167,21.3,537.7971,4,24.97425,121.53814,42.2 314 | 313,2013.583,35.4,318.5292,9,24.97071,121.54069,78 315 | 314,2013.333,8.3,104.8101,5,24.96674,121.54067,42.8 316 | 315,2013.250,3.7,577.9615,6,24.97201,121.54722,41.6 317 | 316,2013.083,15.6,1756.411,2,24.9832,121.51812,27.3 318 | 317,2013.250,13.3,250.631,7,24.96606,121.54297,42 319 | 318,2012.750,15.6,752.7669,2,24.97795,121.53451,37.5 320 | 319,2013.333,7.1,379.5575,10,24.98343,121.53762,49.8 321 | 320,2013.250,34.6,272.6783,5,24.95562,121.53872,26.9 322 | 321,2012.750,13.5,4197.349,0,24.93885,121.50383,18.6 323 | 322,2012.917,16.9,964.7496,4,24.98872,121.53411,37.7 324 | 323,2013.000,12.9,187.4823,1,24.97388,121.52981,33.1 325 | 324,2013.417,28.6,197.1338,6,24.97631,121.54436,42.5 326 | 325,2012.667,12.4,1712.632,2,24.96412,121.5167,31.3 327 | 326,2013.083,36.6,488.8193,8,24.97015,121.54494,38.1 328 | 327,2013.500,4.1,56.47425,7,24.95744,121.53711,62.1 329 | 328,2013.417,3.5,757.3377,3,24.97538,121.54971,36.7 330 | 329,2012.833,15.9,1497.713,3,24.97003,121.51696,23.6 331 | 330,2013.000,13.6,4197.349,0,24.93885,121.50383,19.2 332 | 331,2013.083,32,1156.777,0,24.94935,121.53046,12.8 333 | 332,2013.333,25.6,4519.69,0,24.94826,121.49587,15.6 334 | 333,2013.167,39.8,617.7134,2,24.97577,121.53475,39.6 335 | 334,2012.750,7.8,104.8101,5,24.96674,121.54067,38.4 336 | 335,2012.917,30,1013.341,5,24.99006,121.5346,22.8 337 | 336,2013.583,27.3,337.6016,6,24.96431,121.54063,36.5 338 | 337,2012.833,5.1,1867.233,2,24.98407,121.51748,35.6 339 | 338,2012.833,31.3,600.8604,5,24.96871,121.54651,30.9 340 | 339,2012.917,31.5,258.186,9,24.96867,121.54331,36.3 341 | 340,2013.333,1.7,329.9747,5,24.98254,121.54395,50.4 342 | 341,2013.333,33.6,270.8895,0,24.97281,121.53265,42.9 343 | 342,2013.000,13,750.0704,2,24.97371,121.54951,37 344 | 343,2012.667,5.7,90.45606,9,24.97433,121.5431,53.5 345 | 344,2013.000,33.5,563.2854,8,24.98223,121.53597,46.6 346 | 345,2013.500,34.6,3085.17,0,24.998,121.5155,41.2 347 | 346,2012.667,0,185.4296,0,24.9711,121.5317,37.9 348 | 347,2013.417,13.2,1712.632,2,24.96412,121.5167,30.8 349 | 348,2013.583,17.4,6488.021,1,24.95719,121.47353,11.2 350 | 349,2012.833,4.6,259.6607,6,24.97585,121.54516,53.7 351 | 350,2012.750,7.8,104.8101,5,24.96674,121.54067,47 352 | 351,2013.000,13.2,492.2313,5,24.96515,121.53737,42.3 353 | 352,2012.833,4,2180.245,3,24.96324,121.51241,28.6 354 | 353,2012.833,18.4,2674.961,3,24.96143,121.50827,25.7 355 | 354,2013.500,4.1,2147.376,3,24.96299,121.51284,31.3 356 | 355,2013.417,12.2,1360.139,1,24.95204,121.54842,30.1 357 | 356,2013.250,3.8,383.8624,5,24.98085,121.54391,60.7 358 | 357,2012.833,10.3,211.4473,1,24.97417,121.52999,45.3 359 | 358,2013.417,0,338.9679,9,24.96853,121.54413,44.9 360 | 359,2013.167,1.1,193.5845,6,24.96571,121.54089,45.1 361 | 360,2013.500,5.6,2408.993,0,24.95505,121.55964,24.7 362 | 361,2012.667,32.9,87.30222,10,24.983,121.54022,47.1 363 | 362,2013.083,41.4,281.205,8,24.97345,121.54093,63.3 364 | 363,2013.417,17.1,967.4,4,24.98872,121.53408,40 365 | 364,2013.500,32.3,109.9455,10,24.98182,121.54086,48 366 | 365,2013.417,35.3,614.1394,7,24.97913,121.53666,33.1 367 | 366,2012.917,17.3,2261.432,4,24.96182,121.51222,29.5 368 | 367,2012.750,14.2,1801.544,1,24.95153,121.55254,24.8 369 | 368,2012.833,15,1828.319,2,24.96464,121.51531,20.9 370 | 369,2013.417,18.2,350.8515,1,24.97544,121.53119,43.1 371 | 370,2012.667,20.2,2185.128,3,24.96322,121.51237,22.8 372 | 371,2012.750,15.9,289.3248,5,24.98203,121.54348,42.1 373 | 372,2013.500,4.1,312.8963,5,24.95591,121.53956,51.7 374 | 373,2013.000,33.9,157.6052,7,24.96628,121.54196,41.5 375 | 374,2013.083,0,274.0144,1,24.9748,121.53059,52.2 376 | 375,2013.250,5.4,390.5684,5,24.97937,121.54245,49.5 377 | 376,2013.250,21.7,1157.988,0,24.96165,121.55011,23.8 378 | 377,2013.417,14.7,1717.193,2,24.96447,121.51649,30.5 379 | 378,2013.333,3.9,49.66105,8,24.95836,121.53756,56.8 380 | 379,2013.333,37.3,587.8877,8,24.97077,121.54634,37.4 381 | 380,2013.333,0,292.9978,6,24.97744,121.54458,69.7 382 | 381,2013.333,14.1,289.3248,5,24.98203,121.54348,53.3 383 | 382,2013.417,8,132.5469,9,24.98298,121.53981,47.3 384 | 383,2013.000,16.3,3529.564,0,24.93207,121.51597,29.3 385 | 384,2012.667,29.1,506.1144,4,24.97845,121.53889,40.3 386 | 385,2012.750,16.1,4066.587,0,24.94297,121.50342,12.9 387 | 386,2013.000,18.3,82.88643,10,24.983,121.54026,46.6 388 | 387,2012.833,0,185.4296,0,24.9711,121.5317,55.3 389 | 388,2013.250,16.2,2103.555,3,24.96042,121.51462,25.6 390 | 389,2013.500,10.4,2251.938,4,24.95957,121.51353,27.3 391 | 390,2013.250,40.9,122.3619,8,24.96756,121.5423,67.7 392 | 391,2013.500,32.8,377.8302,9,24.97151,121.5435,38.6 393 | 392,2013.583,6.2,1939.749,1,24.95155,121.55387,31.3 394 | 393,2013.083,42.7,443.802,6,24.97927,121.53874,35.3 395 | 394,2013.000,16.9,967.4,4,24.98872,121.53408,40.3 396 | 395,2013.500,32.6,4136.271,1,24.95544,121.4963,24.7 397 | 396,2012.917,21.2,512.5487,4,24.974,121.53842,42.5 398 | 397,2012.667,37.1,918.6357,1,24.97198,121.55063,31.9 399 | 398,2013.417,13.1,1164.838,4,24.99156,121.53406,32.2 400 | 399,2013.417,14.7,1717.193,2,24.96447,121.51649,23 401 | 400,2012.917,12.7,170.1289,1,24.97371,121.52984,37.3 402 | 401,2013.250,26.8,482.7581,5,24.97433,121.53863,35.5 403 | 402,2013.083,7.6,2175.03,3,24.96305,121.51254,27.7 404 | 403,2012.833,12.7,187.4823,1,24.97388,121.52981,28.5 405 | 404,2012.667,30.9,161.942,9,24.98353,121.53966,39.7 406 | 405,2013.333,16.4,289.3248,5,24.98203,121.54348,41.2 407 | 406,2012.667,23,130.9945,6,24.95663,121.53765,37.2 408 | 407,2013.167,1.9,372.1386,7,24.97293,121.54026,40.5 409 | 408,2013.000,5.2,2408.993,0,24.95505,121.55964,22.3 410 | 409,2013.417,18.5,2175.744,3,24.9633,121.51243,28.1 411 | 410,2013.000,13.7,4082.015,0,24.94155,121.50381,15.4 412 | 411,2012.667,5.6,90.45606,9,24.97433,121.5431,50 413 | 412,2013.250,18.8,390.9696,7,24.97923,121.53986,40.6 414 | 413,2013.000,8.1,104.8101,5,24.96674,121.54067,52.5 415 | 414,2013.500,6.5,90.45606,9,24.97433,121.5431,63.9 416 | -------------------------------------------------------------------------------- /img/LogoSingleRow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/betterdatascience/YouTube/cf24c5cf3192eb7b17c25d94c710d3f941818537/img/LogoSingleRow.png --------------------------------------------------------------------------------