├── README.md └── First Innings Score Prediction - IPL.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # IPL-score-prediction -------------------------------------------------------------------------------- /First Innings Score Prediction - IPL.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "First Innings Score Predictor - IPL.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "toc_visible": true 10 | }, 11 | "kernelspec": { 12 | "name": "python3", 13 | "display_name": "Python 3" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "code", 19 | "metadata": { 20 | "id": "Ye3oEMGgcWhp", 21 | "colab_type": "code", 22 | "colab": {} 23 | }, 24 | "source": [ 25 | "# Importing essential libraries\n", 26 | "import pandas as pd\n", 27 | "import numpy as np" 28 | ], 29 | "execution_count": 1, 30 | "outputs": [] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "metadata": { 35 | "id": "Z8utzElrdPub", 36 | "colab_type": "code", 37 | "colab": {} 38 | }, 39 | "source": [ 40 | "# Loading the dataset\n", 41 | "df = pd.read_csv('ipl.csv')" 42 | ], 43 | "execution_count": 2, 44 | "outputs": [] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": { 49 | "id": "5vWE2y4ldZC4", 50 | "colab_type": "text" 51 | }, 52 | "source": [ 53 | "## **Exploring the dataset**" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "metadata": { 59 | "id": "LEkrx9IWdYHh", 60 | "colab_type": "code", 61 | "colab": { 62 | "base_uri": "https://localhost:8080/", 63 | "height": 87 64 | }, 65 | "outputId": "71a453fa-df59-40b6-81b5-3407a240b3f0" 66 | }, 67 | "source": [ 68 | "df.columns" 69 | ], 70 | "execution_count": 3, 71 | "outputs": [ 72 | { 73 | "output_type": "execute_result", 74 | "data": { 75 | "text/plain": [ 76 | "Index(['mid', 'date', 'venue', 'bat_team', 'bowl_team', 'batsman', 'bowler',\n", 77 | " 'runs', 'wickets', 'overs', 'runs_last_5', 'wickets_last_5', 'striker',\n", 78 | " 'non-striker', 'total'],\n", 79 | " dtype='object')" 80 | ] 81 | }, 82 | "metadata": { 83 | "tags": [] 84 | }, 85 | "execution_count": 3 86 | } 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "metadata": { 92 | "id": "3OZDpVGvddx6", 93 | "colab_type": "code", 94 | "colab": { 95 | "base_uri": "https://localhost:8080/", 96 | "height": 34 97 | }, 98 | "outputId": "14bdb7d8-4de8-42d5-820e-a4151ff3533d" 99 | }, 100 | "source": [ 101 | "df.shape" 102 | ], 103 | "execution_count": 4, 104 | "outputs": [ 105 | { 106 | "output_type": "execute_result", 107 | "data": { 108 | "text/plain": [ 109 | "(76014, 15)" 110 | ] 111 | }, 112 | "metadata": { 113 | "tags": [] 114 | }, 115 | "execution_count": 4 116 | } 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "metadata": { 122 | "id": "JNodK4n7dpep", 123 | "colab_type": "code", 124 | "colab": { 125 | "base_uri": "https://localhost:8080/", 126 | "height": 301 127 | }, 128 | "outputId": "55a278d8-cbc8-467a-892f-c33ed14fd8c1" 129 | }, 130 | "source": [ 131 | "df.dtypes" 132 | ], 133 | "execution_count": 5, 134 | "outputs": [ 135 | { 136 | "output_type": "execute_result", 137 | "data": { 138 | "text/plain": [ 139 | "mid int64\n", 140 | "date object\n", 141 | "venue object\n", 142 | "bat_team object\n", 143 | "bowl_team object\n", 144 | "batsman object\n", 145 | "bowler object\n", 146 | "runs int64\n", 147 | "wickets int64\n", 148 | "overs float64\n", 149 | "runs_last_5 int64\n", 150 | "wickets_last_5 int64\n", 151 | "striker int64\n", 152 | "non-striker int64\n", 153 | "total int64\n", 154 | "dtype: object" 155 | ] 156 | }, 157 | "metadata": { 158 | "tags": [] 159 | }, 160 | "execution_count": 5 161 | } 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "metadata": { 167 | "id": "p8VJefH9drgh", 168 | "colab_type": "code", 169 | "colab": { 170 | "base_uri": "https://localhost:8080/", 171 | "height": 381 172 | }, 173 | "outputId": "1bd26e10-6d71-4e6d-c747-9a4d014f1adc" 174 | }, 175 | "source": [ 176 | "df.head()" 177 | ], 178 | "execution_count": 6, 179 | "outputs": [ 180 | { 181 | "output_type": "execute_result", 182 | "data": { 183 | "text/html": [ 184 | "
\n", 185 | "\n", 198 | "\n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \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 | "
middatevenuebat_teambowl_teambatsmanbowlerrunswicketsoversruns_last_5wickets_last_5strikernon-strikertotal
012008-04-18M Chinnaswamy StadiumKolkata Knight RidersRoyal Challengers BangaloreSC GangulyP Kumar100.11000222
112008-04-18M Chinnaswamy StadiumKolkata Knight RidersRoyal Challengers BangaloreBB McCullumP Kumar100.21000222
212008-04-18M Chinnaswamy StadiumKolkata Knight RidersRoyal Challengers BangaloreBB McCullumP Kumar200.22000222
312008-04-18M Chinnaswamy StadiumKolkata Knight RidersRoyal Challengers BangaloreBB McCullumP Kumar200.32000222
412008-04-18M Chinnaswamy StadiumKolkata Knight RidersRoyal Challengers BangaloreBB McCullumP Kumar200.42000222
\n", 312 | "
" 313 | ], 314 | "text/plain": [ 315 | " mid date venue ... striker non-striker total\n", 316 | "0 1 2008-04-18 M Chinnaswamy Stadium ... 0 0 222\n", 317 | "1 1 2008-04-18 M Chinnaswamy Stadium ... 0 0 222\n", 318 | "2 1 2008-04-18 M Chinnaswamy Stadium ... 0 0 222\n", 319 | "3 1 2008-04-18 M Chinnaswamy Stadium ... 0 0 222\n", 320 | "4 1 2008-04-18 M Chinnaswamy Stadium ... 0 0 222\n", 321 | "\n", 322 | "[5 rows x 15 columns]" 323 | ] 324 | }, 325 | "metadata": { 326 | "tags": [] 327 | }, 328 | "execution_count": 6 329 | } 330 | ] 331 | }, 332 | { 333 | "cell_type": "markdown", 334 | "metadata": { 335 | "id": "srvJazxud7BB", 336 | "colab_type": "text" 337 | }, 338 | "source": [ 339 | "## **Data Cleaning**\n", 340 | "Points covered under this section:
\n", 341 | "*• Removing unwanted columns*
\n", 342 | "*• Keeping only consistent teams*
\n", 343 | "*• Removing the first 5 overs data in every match*
\n", 344 | "*• Converting the column 'date' from string into datetime object*
" 345 | ] 346 | }, 347 | { 348 | "cell_type": "code", 349 | "metadata": { 350 | "id": "t3w2hRVbekfq", 351 | "colab_type": "code", 352 | "colab": { 353 | "base_uri": "https://localhost:8080/", 354 | "height": 87 355 | }, 356 | "outputId": "dbc88fd6-19ed-43b1-94b2-8c19bb9bbd6a" 357 | }, 358 | "source": [ 359 | "df.columns" 360 | ], 361 | "execution_count": 7, 362 | "outputs": [ 363 | { 364 | "output_type": "execute_result", 365 | "data": { 366 | "text/plain": [ 367 | "Index(['mid', 'date', 'venue', 'bat_team', 'bowl_team', 'batsman', 'bowler',\n", 368 | " 'runs', 'wickets', 'overs', 'runs_last_5', 'wickets_last_5', 'striker',\n", 369 | " 'non-striker', 'total'],\n", 370 | " dtype='object')" 371 | ] 372 | }, 373 | "metadata": { 374 | "tags": [] 375 | }, 376 | "execution_count": 7 377 | } 378 | ] 379 | }, 380 | { 381 | "cell_type": "code", 382 | "metadata": { 383 | "id": "bOyVrvsSdyFx", 384 | "colab_type": "code", 385 | "colab": { 386 | "base_uri": "https://localhost:8080/", 387 | "height": 52 388 | }, 389 | "outputId": "4a70f21e-7f2d-439a-bfb1-d0f7037cca49" 390 | }, 391 | "source": [ 392 | "# Removing unwanted columns\n", 393 | "columns_to_remove = ['mid', 'venue', 'batsman', 'bowler', 'striker', 'non-striker']\n", 394 | "\n", 395 | "print('Before removing unwanted columns: {}'.format(df.shape))\n", 396 | "df.drop(labels=columns_to_remove, axis=1, inplace=True)\n", 397 | "print('After removing unwanted columns: {}'.format(df.shape))" 398 | ], 399 | "execution_count": 8, 400 | "outputs": [ 401 | { 402 | "output_type": "stream", 403 | "text": [ 404 | "Before removing unwanted columns: (76014, 15)\n", 405 | "After removing unwanted columns: (76014, 9)\n" 406 | ], 407 | "name": "stdout" 408 | } 409 | ] 410 | }, 411 | { 412 | "cell_type": "code", 413 | "metadata": { 414 | "id": "VeYhEaB6fQdC", 415 | "colab_type": "code", 416 | "colab": { 417 | "base_uri": "https://localhost:8080/", 418 | "height": 70 419 | }, 420 | "outputId": "93c091c8-16ce-47be-a79b-46e5dbe1f691" 421 | }, 422 | "source": [ 423 | "df.columns" 424 | ], 425 | "execution_count": 9, 426 | "outputs": [ 427 | { 428 | "output_type": "execute_result", 429 | "data": { 430 | "text/plain": [ 431 | "Index(['date', 'bat_team', 'bowl_team', 'runs', 'wickets', 'overs',\n", 432 | " 'runs_last_5', 'wickets_last_5', 'total'],\n", 433 | " dtype='object')" 434 | ] 435 | }, 436 | "metadata": { 437 | "tags": [] 438 | }, 439 | "execution_count": 9 440 | } 441 | ] 442 | }, 443 | { 444 | "cell_type": "code", 445 | "metadata": { 446 | "id": "FCfuyal8hvXt", 447 | "colab_type": "code", 448 | "colab": { 449 | "base_uri": "https://localhost:8080/", 450 | "height": 197 451 | }, 452 | "outputId": "b128f1c8-dd1d-4283-bd84-f371fc50982b" 453 | }, 454 | "source": [ 455 | "df.head()" 456 | ], 457 | "execution_count": 10, 458 | "outputs": [ 459 | { 460 | "output_type": "execute_result", 461 | "data": { 462 | "text/html": [ 463 | "
\n", 464 | "\n", 477 | "\n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \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 | "
datebat_teambowl_teamrunswicketsoversruns_last_5wickets_last_5total
02008-04-18Kolkata Knight RidersRoyal Challengers Bangalore100.110222
12008-04-18Kolkata Knight RidersRoyal Challengers Bangalore100.210222
22008-04-18Kolkata Knight RidersRoyal Challengers Bangalore200.220222
32008-04-18Kolkata Knight RidersRoyal Challengers Bangalore200.320222
42008-04-18Kolkata Knight RidersRoyal Challengers Bangalore200.420222
\n", 555 | "
" 556 | ], 557 | "text/plain": [ 558 | " date bat_team ... wickets_last_5 total\n", 559 | "0 2008-04-18 Kolkata Knight Riders ... 0 222\n", 560 | "1 2008-04-18 Kolkata Knight Riders ... 0 222\n", 561 | "2 2008-04-18 Kolkata Knight Riders ... 0 222\n", 562 | "3 2008-04-18 Kolkata Knight Riders ... 0 222\n", 563 | "4 2008-04-18 Kolkata Knight Riders ... 0 222\n", 564 | "\n", 565 | "[5 rows x 9 columns]" 566 | ] 567 | }, 568 | "metadata": { 569 | "tags": [] 570 | }, 571 | "execution_count": 10 572 | } 573 | ] 574 | }, 575 | { 576 | "cell_type": "code", 577 | "metadata": { 578 | "id": "W2jQTWJhmIrt", 579 | "colab_type": "code", 580 | "colab": { 581 | "base_uri": "https://localhost:8080/", 582 | "height": 34 583 | }, 584 | "outputId": "23463ddc-6c24-43f7-d60d-f43f64ad1a6b" 585 | }, 586 | "source": [ 587 | "df.index" 588 | ], 589 | "execution_count": 11, 590 | "outputs": [ 591 | { 592 | "output_type": "execute_result", 593 | "data": { 594 | "text/plain": [ 595 | "RangeIndex(start=0, stop=76014, step=1)" 596 | ] 597 | }, 598 | "metadata": { 599 | "tags": [] 600 | }, 601 | "execution_count": 11 602 | } 603 | ] 604 | }, 605 | { 606 | "cell_type": "code", 607 | "metadata": { 608 | "id": "HD-7eP27iWab", 609 | "colab_type": "code", 610 | "colab": { 611 | "base_uri": "https://localhost:8080/", 612 | "height": 123 613 | }, 614 | "outputId": "2477db91-0a4e-41e3-9689-2abf870a2d4d" 615 | }, 616 | "source": [ 617 | "df['bat_team'].unique()" 618 | ], 619 | "execution_count": 12, 620 | "outputs": [ 621 | { 622 | "output_type": "execute_result", 623 | "data": { 624 | "text/plain": [ 625 | "array(['Kolkata Knight Riders', 'Chennai Super Kings', 'Rajasthan Royals',\n", 626 | " 'Mumbai Indians', 'Deccan Chargers', 'Kings XI Punjab',\n", 627 | " 'Royal Challengers Bangalore', 'Delhi Daredevils',\n", 628 | " 'Kochi Tuskers Kerala', 'Pune Warriors', 'Sunrisers Hyderabad',\n", 629 | " 'Rising Pune Supergiants', 'Gujarat Lions',\n", 630 | " 'Rising Pune Supergiant'], dtype=object)" 631 | ] 632 | }, 633 | "metadata": { 634 | "tags": [] 635 | }, 636 | "execution_count": 12 637 | } 638 | ] 639 | }, 640 | { 641 | "cell_type": "code", 642 | "metadata": { 643 | "id": "VcC_Crmhih1r", 644 | "colab_type": "code", 645 | "colab": {} 646 | }, 647 | "source": [ 648 | "consistent_teams = ['Kolkata Knight Riders', 'Chennai Super Kings', 'Rajasthan Royals',\n", 649 | " 'Mumbai Indians', 'Kings XI Punjab', 'Royal Challengers Bangalore',\n", 650 | " 'Delhi Daredevils', 'Sunrisers Hyderabad']" 651 | ], 652 | "execution_count": 13, 653 | "outputs": [] 654 | }, 655 | { 656 | "cell_type": "code", 657 | "metadata": { 658 | "id": "MXmAt3Colmdu", 659 | "colab_type": "code", 660 | "colab": { 661 | "base_uri": "https://localhost:8080/", 662 | "height": 52 663 | }, 664 | "outputId": "9874be5e-a71f-418a-8d90-45268c6c634f" 665 | }, 666 | "source": [ 667 | "# Keeping only consistent teams\n", 668 | "print('Before removing inconsistent teams: {}'.format(df.shape))\n", 669 | "df = df[(df['bat_team'].isin(consistent_teams)) & (df['bowl_team'].isin(consistent_teams))]\n", 670 | "print('After removing inconsistent teams: {}'.format(df.shape))" 671 | ], 672 | "execution_count": 14, 673 | "outputs": [ 674 | { 675 | "output_type": "stream", 676 | "text": [ 677 | "Before removing inconsistent teams: (76014, 9)\n", 678 | "After removing inconsistent teams: (53811, 9)\n" 679 | ], 680 | "name": "stdout" 681 | } 682 | ] 683 | }, 684 | { 685 | "cell_type": "code", 686 | "metadata": { 687 | "id": "AB8uOLpHoKtB", 688 | "colab_type": "code", 689 | "colab": { 690 | "base_uri": "https://localhost:8080/", 691 | "height": 70 692 | }, 693 | "outputId": "89633380-9611-4552-e964-2d7fdbe8839c" 694 | }, 695 | "source": [ 696 | "df['bat_team'].unique()" 697 | ], 698 | "execution_count": 15, 699 | "outputs": [ 700 | { 701 | "output_type": "execute_result", 702 | "data": { 703 | "text/plain": [ 704 | "array(['Kolkata Knight Riders', 'Chennai Super Kings', 'Rajasthan Royals',\n", 705 | " 'Mumbai Indians', 'Kings XI Punjab', 'Royal Challengers Bangalore',\n", 706 | " 'Delhi Daredevils', 'Sunrisers Hyderabad'], dtype=object)" 707 | ] 708 | }, 709 | "metadata": { 710 | "tags": [] 711 | }, 712 | "execution_count": 15 713 | } 714 | ] 715 | }, 716 | { 717 | "cell_type": "code", 718 | "metadata": { 719 | "id": "HVouIS8QqFwX", 720 | "colab_type": "code", 721 | "colab": { 722 | "base_uri": "https://localhost:8080/", 723 | "height": 52 724 | }, 725 | "outputId": "5cf9861c-e3e4-41c4-937e-bf1de77c6556" 726 | }, 727 | "source": [ 728 | "# Removing the first 5 overs data in every match\n", 729 | "print('Before removing first 5 overs data: {}'.format(df.shape))\n", 730 | "df = df[df['overs']>=5.0]\n", 731 | "print('After removing first 5 overs data: {}'.format(df.shape))" 732 | ], 733 | "execution_count": 16, 734 | "outputs": [ 735 | { 736 | "output_type": "stream", 737 | "text": [ 738 | "Before removing first 5 overs data: (53811, 9)\n", 739 | "After removing first 5 overs data: (40108, 9)\n" 740 | ], 741 | "name": "stdout" 742 | } 743 | ] 744 | }, 745 | { 746 | "cell_type": "code", 747 | "metadata": { 748 | "id": "J_R7UNqkf3Mt", 749 | "colab_type": "code", 750 | "colab": { 751 | "base_uri": "https://localhost:8080/", 752 | "height": 52 753 | }, 754 | "outputId": "e2383f98-4771-41d9-c6a4-ebd96a7aa575" 755 | }, 756 | "source": [ 757 | "# Converting the column 'date' from string into datetime object\n", 758 | "from datetime import datetime\n", 759 | "print(\"Before converting 'date' column from string to datetime object: {}\".format(type(df.iloc[0,0])))\n", 760 | "df['date'] = df['date'].apply(lambda x: datetime.strptime(x, '%Y-%m-%d'))\n", 761 | "print(\"After converting 'date' column from string to datetime object: {}\".format(type(df.iloc[0,0])))" 762 | ], 763 | "execution_count": 17, 764 | "outputs": [ 765 | { 766 | "output_type": "stream", 767 | "text": [ 768 | "Before converting 'date' column from string to datetime object: \n", 769 | "After converting 'date' column from string to datetime object: \n" 770 | ], 771 | "name": "stdout" 772 | } 773 | ] 774 | }, 775 | { 776 | "cell_type": "code", 777 | "metadata": { 778 | "id": "try0O4SSxjBE", 779 | "colab_type": "code", 780 | "colab": { 781 | "base_uri": "https://localhost:8080/", 782 | "height": 651 783 | }, 784 | "outputId": "3bde5d22-653f-49a4-965b-f992b2a6374d" 785 | }, 786 | "source": [ 787 | "# Selecting correlated features using Heatmap\n", 788 | "import matplotlib.pyplot as plt\n", 789 | "import seaborn as sns\n", 790 | "\n", 791 | "# Get correlation of all the features of the dataset\n", 792 | "corr_matrix = df.corr()\n", 793 | "top_corr_features = corr_matrix.index\n", 794 | "\n", 795 | "# Plotting the heatmap\n", 796 | "plt.figure(figsize=(13,10))\n", 797 | "g = sns.heatmap(data=df[top_corr_features].corr(), annot=True, cmap='RdYlGn')" 798 | ], 799 | "execution_count": 18, 800 | "outputs": [ 801 | { 802 | "output_type": "stream", 803 | "text": [ 804 | "/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n", 805 | " import pandas.util.testing as tm\n" 806 | ], 807 | "name": "stderr" 808 | }, 809 | { 810 | "output_type": "display_data", 811 | "data": { 812 | "image/png": "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\n", 813 | "text/plain": [ 814 | "
" 815 | ] 816 | }, 817 | "metadata": { 818 | "tags": [], 819 | "needs_background": "light" 820 | } 821 | } 822 | ] 823 | }, 824 | { 825 | "cell_type": "markdown", 826 | "metadata": { 827 | "id": "o9Qt4bOGpKh3", 828 | "colab_type": "text" 829 | }, 830 | "source": [ 831 | "## **Data Preprocessing**\n", 832 | "*• Handling categorical features*
\n", 833 | "*• Splitting dataset into train and test set on the basis of date*
" 834 | ] 835 | }, 836 | { 837 | "cell_type": "code", 838 | "metadata": { 839 | "id": "ZpJLe1YVfrr6", 840 | "colab_type": "code", 841 | "colab": { 842 | "base_uri": "https://localhost:8080/", 843 | "height": 212 844 | }, 845 | "outputId": "ced0b921-0d9e-4f51-f3ce-841d16fcff0f" 846 | }, 847 | "source": [ 848 | "# Converting categorical features using OneHotEncoding method\n", 849 | "encoded_df = pd.get_dummies(data=df, columns=['bat_team', 'bowl_team'])\n", 850 | "encoded_df.columns" 851 | ], 852 | "execution_count": 19, 853 | "outputs": [ 854 | { 855 | "output_type": "execute_result", 856 | "data": { 857 | "text/plain": [ 858 | "Index(['date', 'runs', 'wickets', 'overs', 'runs_last_5', 'wickets_last_5',\n", 859 | " 'total', 'bat_team_Chennai Super Kings', 'bat_team_Delhi Daredevils',\n", 860 | " 'bat_team_Kings XI Punjab', 'bat_team_Kolkata Knight Riders',\n", 861 | " 'bat_team_Mumbai Indians', 'bat_team_Rajasthan Royals',\n", 862 | " 'bat_team_Royal Challengers Bangalore', 'bat_team_Sunrisers Hyderabad',\n", 863 | " 'bowl_team_Chennai Super Kings', 'bowl_team_Delhi Daredevils',\n", 864 | " 'bowl_team_Kings XI Punjab', 'bowl_team_Kolkata Knight Riders',\n", 865 | " 'bowl_team_Mumbai Indians', 'bowl_team_Rajasthan Royals',\n", 866 | " 'bowl_team_Royal Challengers Bangalore',\n", 867 | " 'bowl_team_Sunrisers Hyderabad'],\n", 868 | " dtype='object')" 869 | ] 870 | }, 871 | "metadata": { 872 | "tags": [] 873 | }, 874 | "execution_count": 19 875 | } 876 | ] 877 | }, 878 | { 879 | "cell_type": "code", 880 | "metadata": { 881 | "id": "ZtrtRO7AiLPz", 882 | "colab_type": "code", 883 | "colab": { 884 | "base_uri": "https://localhost:8080/", 885 | "height": 334 886 | }, 887 | "outputId": "925d1844-a1b0-49ac-bced-79940195d950" 888 | }, 889 | "source": [ 890 | "encoded_df.head()" 891 | ], 892 | "execution_count": 20, 893 | "outputs": [ 894 | { 895 | "output_type": "execute_result", 896 | "data": { 897 | "text/html": [ 898 | "
\n", 899 | "\n", 912 | "\n", 913 | " \n", 914 | " \n", 915 | " \n", 916 | " \n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \n", 922 | " \n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | "
daterunswicketsoversruns_last_5wickets_last_5totalbat_team_Chennai Super Kingsbat_team_Delhi Daredevilsbat_team_Kings XI Punjabbat_team_Kolkata Knight Ridersbat_team_Mumbai Indiansbat_team_Rajasthan Royalsbat_team_Royal Challengers Bangalorebat_team_Sunrisers Hyderabadbowl_team_Chennai Super Kingsbowl_team_Delhi Daredevilsbowl_team_Kings XI Punjabbowl_team_Kolkata Knight Ridersbowl_team_Mumbai Indiansbowl_team_Rajasthan Royalsbowl_team_Royal Challengers Bangalorebowl_team_Sunrisers Hyderabad
322008-04-186105.15902220001000000000010
332008-04-186115.25912220001000000000010
342008-04-186115.35912220001000000000010
352008-04-186115.45912220001000000000010
362008-04-186115.55812220001000000000010
\n", 1074 | "
" 1075 | ], 1076 | "text/plain": [ 1077 | " date ... bowl_team_Sunrisers Hyderabad\n", 1078 | "32 2008-04-18 ... 0\n", 1079 | "33 2008-04-18 ... 0\n", 1080 | "34 2008-04-18 ... 0\n", 1081 | "35 2008-04-18 ... 0\n", 1082 | "36 2008-04-18 ... 0\n", 1083 | "\n", 1084 | "[5 rows x 23 columns]" 1085 | ] 1086 | }, 1087 | "metadata": { 1088 | "tags": [] 1089 | }, 1090 | "execution_count": 20 1091 | } 1092 | ] 1093 | }, 1094 | { 1095 | "cell_type": "code", 1096 | "metadata": { 1097 | "id": "dVj9eyGJj5-J", 1098 | "colab_type": "code", 1099 | "colab": {} 1100 | }, 1101 | "source": [ 1102 | "# Rearranging the columns\n", 1103 | "encoded_df = encoded_df[['date', 'bat_team_Chennai Super Kings', 'bat_team_Delhi Daredevils', 'bat_team_Kings XI Punjab',\n", 1104 | " 'bat_team_Kolkata Knight Riders', 'bat_team_Mumbai Indians', 'bat_team_Rajasthan Royals',\n", 1105 | " 'bat_team_Royal Challengers Bangalore', 'bat_team_Sunrisers Hyderabad',\n", 1106 | " 'bowl_team_Chennai Super Kings', 'bowl_team_Delhi Daredevils', 'bowl_team_Kings XI Punjab',\n", 1107 | " 'bowl_team_Kolkata Knight Riders', 'bowl_team_Mumbai Indians', 'bowl_team_Rajasthan Royals',\n", 1108 | " 'bowl_team_Royal Challengers Bangalore', 'bowl_team_Sunrisers Hyderabad',\n", 1109 | " 'overs', 'runs', 'wickets', 'runs_last_5', 'wickets_last_5', 'total']]" 1110 | ], 1111 | "execution_count": 21, 1112 | "outputs": [] 1113 | }, 1114 | { 1115 | "cell_type": "code", 1116 | "metadata": { 1117 | "id": "8raq2VVXeHyr", 1118 | "colab_type": "code", 1119 | "colab": { 1120 | "base_uri": "https://localhost:8080/", 1121 | "height": 34 1122 | }, 1123 | "outputId": "c89b9399-6397-438f-cd3c-3e7ca0ae63ee" 1124 | }, 1125 | "source": [ 1126 | "# Splitting the data into train and test set\n", 1127 | "X_train = encoded_df.drop(labels='total', axis=1)[encoded_df['date'].dt.year <= 2016]\n", 1128 | "X_test = encoded_df.drop(labels='total', axis=1)[encoded_df['date'].dt.year >= 2017]\n", 1129 | "\n", 1130 | "y_train = encoded_df[encoded_df['date'].dt.year <= 2016]['total'].values\n", 1131 | "y_test = encoded_df[encoded_df['date'].dt.year >= 2017]['total'].values\n", 1132 | "\n", 1133 | "# Removing the 'date' column\n", 1134 | "X_train.drop(labels='date', axis=True, inplace=True)\n", 1135 | "X_test.drop(labels='date', axis=True, inplace=True)\n", 1136 | "\n", 1137 | "print(\"Training set: {} and Test set: {}\".format(X_train.shape, X_test.shape))" 1138 | ], 1139 | "execution_count": 22, 1140 | "outputs": [ 1141 | { 1142 | "output_type": "stream", 1143 | "text": [ 1144 | "Training set: (37330, 21) and Test set: (2778, 21)\n" 1145 | ], 1146 | "name": "stdout" 1147 | } 1148 | ] 1149 | }, 1150 | { 1151 | "cell_type": "markdown", 1152 | "metadata": { 1153 | "id": "QRZoptrOlsT5", 1154 | "colab_type": "text" 1155 | }, 1156 | "source": [ 1157 | "## **Model Building**\n", 1158 | "I will experiment with 5 different algorithms, they are as follows:
\n", 1159 | "*• Linear Regression*
\n", 1160 | "*• Decision Tree Regression*
\n", 1161 | "*• Random Forest Regression*
\n", 1162 | "\n", 1163 | "----- Boosting Algorithm -----
\n", 1164 | "*• Adaptive Boosting (AdaBoost) Algorithm*
" 1165 | ] 1166 | }, 1167 | { 1168 | "cell_type": "markdown", 1169 | "metadata": { 1170 | "id": "w5NJZyB8oFEw", 1171 | "colab_type": "text" 1172 | }, 1173 | "source": [ 1174 | "### *Linear Regression*" 1175 | ] 1176 | }, 1177 | { 1178 | "cell_type": "code", 1179 | "metadata": { 1180 | "id": "TAbGSLrVln6Q", 1181 | "colab_type": "code", 1182 | "colab": { 1183 | "base_uri": "https://localhost:8080/", 1184 | "height": 34 1185 | }, 1186 | "outputId": "d33e0b5f-511c-42dd-f4e3-da8f8b6b2610" 1187 | }, 1188 | "source": [ 1189 | "# Linear Regression Model\n", 1190 | "from sklearn.linear_model import LinearRegression\n", 1191 | "linear_regressor = LinearRegression()\n", 1192 | "linear_regressor.fit(X_train,y_train)" 1193 | ], 1194 | "execution_count": 23, 1195 | "outputs": [ 1196 | { 1197 | "output_type": "execute_result", 1198 | "data": { 1199 | "text/plain": [ 1200 | "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)" 1201 | ] 1202 | }, 1203 | "metadata": { 1204 | "tags": [] 1205 | }, 1206 | "execution_count": 23 1207 | } 1208 | ] 1209 | }, 1210 | { 1211 | "cell_type": "code", 1212 | "metadata": { 1213 | "id": "JeKomR6-nfaX", 1214 | "colab_type": "code", 1215 | "colab": {} 1216 | }, 1217 | "source": [ 1218 | "# Predicting results\n", 1219 | "y_pred_lr = linear_regressor.predict(X_test)" 1220 | ], 1221 | "execution_count": 24, 1222 | "outputs": [] 1223 | }, 1224 | { 1225 | "cell_type": "code", 1226 | "metadata": { 1227 | "id": "xRPc6nsmmlbo", 1228 | "colab_type": "code", 1229 | "colab": { 1230 | "base_uri": "https://localhost:8080/", 1231 | "height": 87 1232 | }, 1233 | "outputId": "24f2c7ee-a0dd-43c3-9efc-ba1d0856cad7" 1234 | }, 1235 | "source": [ 1236 | "# Linear Regression - Model Evaluation\n", 1237 | "from sklearn.metrics import mean_absolute_error as mae, mean_squared_error as mse, accuracy_score\n", 1238 | "print(\"---- Linear Regression - Model Evaluation ----\")\n", 1239 | "print(\"Mean Absolute Error (MAE): {}\".format(mae(y_test, y_pred_lr)))\n", 1240 | "print(\"Mean Squared Error (MSE): {}\".format(mse(y_test, y_pred_lr)))\n", 1241 | "print(\"Root Mean Squared Error (RMSE): {}\".format(np.sqrt(mse(y_test, y_pred_lr))))" 1242 | ], 1243 | "execution_count": 25, 1244 | "outputs": [ 1245 | { 1246 | "output_type": "stream", 1247 | "text": [ 1248 | "---- Linear Regression - Model Evaluation ----\n", 1249 | "Mean Absolute Error (MAE): 12.11861754619329\n", 1250 | "Mean Squared Error (MSE): 251.00792310417438\n", 1251 | "Root Mean Squared Error (RMSE): 15.843229566732106\n" 1252 | ], 1253 | "name": "stdout" 1254 | } 1255 | ] 1256 | }, 1257 | { 1258 | "cell_type": "markdown", 1259 | "metadata": { 1260 | "colab_type": "text", 1261 | "id": "fuPztrQQoLNg" 1262 | }, 1263 | "source": [ 1264 | "### *Decision Tree*" 1265 | ] 1266 | }, 1267 | { 1268 | "cell_type": "code", 1269 | "metadata": { 1270 | "id": "drFWmrvBoC6x", 1271 | "colab_type": "code", 1272 | "colab": { 1273 | "base_uri": "https://localhost:8080/", 1274 | "height": 123 1275 | }, 1276 | "outputId": "83a98e88-4307-4bbd-f941-74bb30dc5170" 1277 | }, 1278 | "source": [ 1279 | "# Decision Tree Regression Model\n", 1280 | "from sklearn.tree import DecisionTreeRegressor\n", 1281 | "decision_regressor = DecisionTreeRegressor()\n", 1282 | "decision_regressor.fit(X_train,y_train)" 1283 | ], 1284 | "execution_count": 26, 1285 | "outputs": [ 1286 | { 1287 | "output_type": "execute_result", 1288 | "data": { 1289 | "text/plain": [ 1290 | "DecisionTreeRegressor(ccp_alpha=0.0, criterion='mse', max_depth=None,\n", 1291 | " max_features=None, max_leaf_nodes=None,\n", 1292 | " min_impurity_decrease=0.0, min_impurity_split=None,\n", 1293 | " min_samples_leaf=1, min_samples_split=2,\n", 1294 | " min_weight_fraction_leaf=0.0, presort='deprecated',\n", 1295 | " random_state=None, splitter='best')" 1296 | ] 1297 | }, 1298 | "metadata": { 1299 | "tags": [] 1300 | }, 1301 | "execution_count": 26 1302 | } 1303 | ] 1304 | }, 1305 | { 1306 | "cell_type": "code", 1307 | "metadata": { 1308 | "id": "cCl-LXmpofeq", 1309 | "colab_type": "code", 1310 | "colab": {} 1311 | }, 1312 | "source": [ 1313 | "# Predicting results\n", 1314 | "y_pred_dt = decision_regressor.predict(X_test)" 1315 | ], 1316 | "execution_count": 27, 1317 | "outputs": [] 1318 | }, 1319 | { 1320 | "cell_type": "code", 1321 | "metadata": { 1322 | "id": "fxQBkteHoj2Y", 1323 | "colab_type": "code", 1324 | "colab": { 1325 | "base_uri": "https://localhost:8080/", 1326 | "height": 87 1327 | }, 1328 | "outputId": "bc4f87bf-0ce4-44fb-c957-11f85d3526e0" 1329 | }, 1330 | "source": [ 1331 | "# Decision Tree Regression - Model Evaluation\n", 1332 | "print(\"---- Decision Tree Regression - Model Evaluation ----\")\n", 1333 | "print(\"Mean Absolute Error (MAE): {}\".format(mae(y_test, y_pred_dt)))\n", 1334 | "print(\"Mean Squared Error (MSE): {}\".format(mse(y_test, y_pred_dt)))\n", 1335 | "print(\"Root Mean Squared Error (RMSE): {}\".format(np.sqrt(mse(y_test, y_pred_dt))))" 1336 | ], 1337 | "execution_count": 28, 1338 | "outputs": [ 1339 | { 1340 | "output_type": "stream", 1341 | "text": [ 1342 | "---- Decision Tree Regression - Model Evaluation ----\n", 1343 | "Mean Absolute Error (MAE): 17.08963282937365\n", 1344 | "Mean Squared Error (MSE): 531.0550755939524\n", 1345 | "Root Mean Squared Error (RMSE): 23.044632251219642\n" 1346 | ], 1347 | "name": "stdout" 1348 | } 1349 | ] 1350 | }, 1351 | { 1352 | "cell_type": "markdown", 1353 | "metadata": { 1354 | "colab_type": "text", 1355 | "id": "scpqVJxCpFyB" 1356 | }, 1357 | "source": [ 1358 | "### *Random Forest*" 1359 | ] 1360 | }, 1361 | { 1362 | "cell_type": "code", 1363 | "metadata": { 1364 | "id": "MNNGZMlRpKnq", 1365 | "colab_type": "code", 1366 | "colab": { 1367 | "base_uri": "https://localhost:8080/", 1368 | "height": 141 1369 | }, 1370 | "outputId": "8d67934e-f177-4270-b2ba-93feba78fef6" 1371 | }, 1372 | "source": [ 1373 | "# Random Forest Regression Model\n", 1374 | "from sklearn.ensemble import RandomForestRegressor\n", 1375 | "random_regressor = RandomForestRegressor()\n", 1376 | "random_regressor.fit(X_train,y_train)" 1377 | ], 1378 | "execution_count": 29, 1379 | "outputs": [ 1380 | { 1381 | "output_type": "execute_result", 1382 | "data": { 1383 | "text/plain": [ 1384 | "RandomForestRegressor(bootstrap=True, ccp_alpha=0.0, criterion='mse',\n", 1385 | " max_depth=None, max_features='auto', max_leaf_nodes=None,\n", 1386 | " max_samples=None, min_impurity_decrease=0.0,\n", 1387 | " min_impurity_split=None, min_samples_leaf=1,\n", 1388 | " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", 1389 | " n_estimators=100, n_jobs=None, oob_score=False,\n", 1390 | " random_state=None, verbose=0, warm_start=False)" 1391 | ] 1392 | }, 1393 | "metadata": { 1394 | "tags": [] 1395 | }, 1396 | "execution_count": 29 1397 | } 1398 | ] 1399 | }, 1400 | { 1401 | "cell_type": "code", 1402 | "metadata": { 1403 | "colab_type": "code", 1404 | "id": "UpqtMy1jpYTd", 1405 | "colab": {} 1406 | }, 1407 | "source": [ 1408 | "# Predicting results\n", 1409 | "y_pred_rf = random_regressor.predict(X_test)" 1410 | ], 1411 | "execution_count": 30, 1412 | "outputs": [] 1413 | }, 1414 | { 1415 | "cell_type": "code", 1416 | "metadata": { 1417 | "id": "VPsdbFk_pdrH", 1418 | "colab_type": "code", 1419 | "colab": { 1420 | "base_uri": "https://localhost:8080/", 1421 | "height": 87 1422 | }, 1423 | "outputId": "ad050bf7-70e5-4df5-a7ca-7fc0700cf7d5" 1424 | }, 1425 | "source": [ 1426 | "# Random Forest Regression - Model Evaluation\n", 1427 | "print(\"---- Random Forest Regression - Model Evaluation ----\")\n", 1428 | "print(\"Mean Absolute Error (MAE): {}\".format(mae(y_test, y_pred_rf)))\n", 1429 | "print(\"Mean Squared Error (MSE): {}\".format(mse(y_test, y_pred_rf)))\n", 1430 | "print(\"Root Mean Squared Error (RMSE): {}\".format(np.sqrt(mse(y_test, y_pred_rf))))" 1431 | ], 1432 | "execution_count": 31, 1433 | "outputs": [ 1434 | { 1435 | "output_type": "stream", 1436 | "text": [ 1437 | "---- Random Forest Regression - Model Evaluation ----\n", 1438 | "Mean Absolute Error (MAE): 13.76117836573074\n", 1439 | "Mean Squared Error (MSE): 330.21283012058035\n", 1440 | "Root Mean Squared Error (RMSE): 18.171759136654337\n" 1441 | ], 1442 | "name": "stdout" 1443 | } 1444 | ] 1445 | }, 1446 | { 1447 | "cell_type": "markdown", 1448 | "metadata": { 1449 | "id": "wMd5-w5Tpv-Y", 1450 | "colab_type": "text" 1451 | }, 1452 | "source": [ 1453 | "*Note: Since Linear Regression model performs best as compared to other two, we use this model and boost it's performance using AdaBoost Algorithm*" 1454 | ] 1455 | }, 1456 | { 1457 | "cell_type": "markdown", 1458 | "metadata": { 1459 | "colab_type": "text", 1460 | "id": "cJNnp9xHssI8" 1461 | }, 1462 | "source": [ 1463 | "### *AdaBoost Algorithm*" 1464 | ] 1465 | }, 1466 | { 1467 | "cell_type": "code", 1468 | "metadata": { 1469 | "colab_type": "code", 1470 | "id": "eua4hjEus0W2", 1471 | "colab": { 1472 | "base_uri": "https://localhost:8080/", 1473 | "height": 123 1474 | }, 1475 | "outputId": "2290f73b-67f2-4551-a77a-7f2942e465c4" 1476 | }, 1477 | "source": [ 1478 | "# AdaBoost Model using Linear Regression as the base learner\n", 1479 | "from sklearn.ensemble import AdaBoostRegressor\n", 1480 | "adb_regressor = AdaBoostRegressor(base_estimator=linear_regressor, n_estimators=100)\n", 1481 | "adb_regressor.fit(X_train, y_train)" 1482 | ], 1483 | "execution_count": 32, 1484 | "outputs": [ 1485 | { 1486 | "output_type": "execute_result", 1487 | "data": { 1488 | "text/plain": [ 1489 | "AdaBoostRegressor(base_estimator=LinearRegression(copy_X=True,\n", 1490 | " fit_intercept=True,\n", 1491 | " n_jobs=None,\n", 1492 | " normalize=False),\n", 1493 | " learning_rate=1.0, loss='linear', n_estimators=100,\n", 1494 | " random_state=None)" 1495 | ] 1496 | }, 1497 | "metadata": { 1498 | "tags": [] 1499 | }, 1500 | "execution_count": 32 1501 | } 1502 | ] 1503 | }, 1504 | { 1505 | "cell_type": "code", 1506 | "metadata": { 1507 | "id": "mBRmYqGvtdaJ", 1508 | "colab_type": "code", 1509 | "colab": {} 1510 | }, 1511 | "source": [ 1512 | "# Predicting results\n", 1513 | "y_pred_adb = adb_regressor.predict(X_test)" 1514 | ], 1515 | "execution_count": 33, 1516 | "outputs": [] 1517 | }, 1518 | { 1519 | "cell_type": "code", 1520 | "metadata": { 1521 | "id": "67pZWWEKtgiF", 1522 | "colab_type": "code", 1523 | "colab": { 1524 | "base_uri": "https://localhost:8080/", 1525 | "height": 87 1526 | }, 1527 | "outputId": "709cb77d-a0eb-43f5-aded-3c16ff2d0c98" 1528 | }, 1529 | "source": [ 1530 | "# AdaBoost Regression - Model Evaluation\n", 1531 | "print(\"---- AdaBoost Regression - Model Evaluation ----\")\n", 1532 | "print(\"Mean Absolute Error (MAE): {}\".format(mae(y_test, y_pred_adb)))\n", 1533 | "print(\"Mean Squared Error (MSE): {}\".format(mse(y_test, y_pred_adb)))\n", 1534 | "print(\"Root Mean Squared Error (RMSE): {}\".format(np.sqrt(mse(y_test, y_pred_adb))))" 1535 | ], 1536 | "execution_count": 34, 1537 | "outputs": [ 1538 | { 1539 | "output_type": "stream", 1540 | "text": [ 1541 | "---- AdaBoost Regression - Model Evaluation ----\n", 1542 | "Mean Absolute Error (MAE): 12.217362349360771\n", 1543 | "Mean Squared Error (MSE): 249.6020058588232\n", 1544 | "Root Mean Squared Error (RMSE): 15.798797608008757\n" 1545 | ], 1546 | "name": "stdout" 1547 | } 1548 | ] 1549 | }, 1550 | { 1551 | "cell_type": "markdown", 1552 | "metadata": { 1553 | "id": "nbvk3I7ZvVG4", 1554 | "colab_type": "text" 1555 | }, 1556 | "source": [ 1557 | "*Note: Using AdaBoost did not reduce the error to a significant level. Hence, we will you simple linear regression model for prediction*" 1558 | ] 1559 | }, 1560 | { 1561 | "cell_type": "markdown", 1562 | "metadata": { 1563 | "id": "2Xl7f4FQybFg", 1564 | "colab_type": "text" 1565 | }, 1566 | "source": [ 1567 | "## **Predictions**\n", 1568 | "• Model *trained on* the data from **IPL Seasons 1 to 9** ie: (2008 to 2016)
\n", 1569 | "• Model *tested on* data from **IPL Season 10** ie: (2017)
\n", 1570 | "• Model *predicts on* data from **IPL Seasons 11 to 12** ie: (2018 to 2019)" 1571 | ] 1572 | }, 1573 | { 1574 | "cell_type": "code", 1575 | "metadata": { 1576 | "id": "-C4QKIa-yhYB", 1577 | "colab_type": "code", 1578 | "colab": {} 1579 | }, 1580 | "source": [ 1581 | "def predict_score(batting_team='Chennai Super Kings', bowling_team='Mumbai Indians', overs=5.1, runs=50, wickets=0, runs_in_prev_5=50, wickets_in_prev_5=0):\n", 1582 | " temp_array = list()\n", 1583 | "\n", 1584 | " # Batting Team\n", 1585 | " if batting_team == 'Chennai Super Kings':\n", 1586 | " temp_array = temp_array + [1,0,0,0,0,0,0,0]\n", 1587 | " elif batting_team == 'Delhi Daredevils':\n", 1588 | " temp_array = temp_array + [0,1,0,0,0,0,0,0]\n", 1589 | " elif batting_team == 'Kings XI Punjab':\n", 1590 | " temp_array = temp_array + [0,0,1,0,0,0,0,0]\n", 1591 | " elif batting_team == 'Kolkata Knight Riders':\n", 1592 | " temp_array = temp_array + [0,0,0,1,0,0,0,0]\n", 1593 | " elif batting_team == 'Mumbai Indians':\n", 1594 | " temp_array = temp_array + [0,0,0,0,1,0,0,0]\n", 1595 | " elif batting_team == 'Rajasthan Royals':\n", 1596 | " temp_array = temp_array + [0,0,0,0,0,1,0,0]\n", 1597 | " elif batting_team == 'Royal Challengers Bangalore':\n", 1598 | " temp_array = temp_array + [0,0,0,0,0,0,1,0]\n", 1599 | " elif batting_team == 'Sunrisers Hyderabad':\n", 1600 | " temp_array = temp_array + [0,0,0,0,0,0,0,1]\n", 1601 | "\n", 1602 | " # Bowling Team\n", 1603 | " if bowling_team == 'Chennai Super Kings':\n", 1604 | " temp_array = temp_array + [1,0,0,0,0,0,0,0]\n", 1605 | " elif bowling_team == 'Delhi Daredevils':\n", 1606 | " temp_array = temp_array + [0,1,0,0,0,0,0,0]\n", 1607 | " elif bowling_team == 'Kings XI Punjab':\n", 1608 | " temp_array = temp_array + [0,0,1,0,0,0,0,0]\n", 1609 | " elif bowling_team == 'Kolkata Knight Riders':\n", 1610 | " temp_array = temp_array + [0,0,0,1,0,0,0,0]\n", 1611 | " elif bowling_team == 'Mumbai Indians':\n", 1612 | " temp_array = temp_array + [0,0,0,0,1,0,0,0]\n", 1613 | " elif bowling_team == 'Rajasthan Royals':\n", 1614 | " temp_array = temp_array + [0,0,0,0,0,1,0,0]\n", 1615 | " elif bowling_team == 'Royal Challengers Bangalore':\n", 1616 | " temp_array = temp_array + [0,0,0,0,0,0,1,0]\n", 1617 | " elif bowling_team == 'Sunrisers Hyderabad':\n", 1618 | " temp_array = temp_array + [0,0,0,0,0,0,0,1]\n", 1619 | "\n", 1620 | " # Overs, Runs, Wickets, Runs_in_prev_5, Wickets_in_prev_5\n", 1621 | " temp_array = temp_array + [overs, runs, wickets, runs_in_prev_5, wickets_in_prev_5]\n", 1622 | "\n", 1623 | " # Converting into numpy array\n", 1624 | " temp_array = np.array([temp_array])\n", 1625 | "\n", 1626 | " # Prediction\n", 1627 | " return int(linear_regressor.predict(temp_array)[0])" 1628 | ], 1629 | "execution_count": 35, 1630 | "outputs": [] 1631 | }, 1632 | { 1633 | "cell_type": "markdown", 1634 | "metadata": { 1635 | "id": "lRZQW-YGS141", 1636 | "colab_type": "text" 1637 | }, 1638 | "source": [ 1639 | "### **Prediction 1**\n", 1640 | "• Date: 16th April 2018
\n", 1641 | "• IPL : Season 11
\n", 1642 | "• Match number: 13
\n", 1643 | "• Teams: Kolkata Knight Riders vs. Delhi Daredevils
\n", 1644 | "• First Innings final score: 200/9\n" 1645 | ] 1646 | }, 1647 | { 1648 | "cell_type": "code", 1649 | "metadata": { 1650 | "id": "fhgissiE10Bx", 1651 | "colab_type": "code", 1652 | "colab": { 1653 | "base_uri": "https://localhost:8080/", 1654 | "height": 34 1655 | }, 1656 | "outputId": "94bfaafb-6305-4187-c813-9c2c9af0a3d9" 1657 | }, 1658 | "source": [ 1659 | "final_score = predict_score(batting_team='Kolkata Knight Riders', bowling_team='Delhi Daredevils', overs=9.2, runs=79, wickets=2, runs_in_prev_5=60, wickets_in_prev_5=1)\n", 1660 | "print(\"The final predicted score (range): {} to {}\".format(final_score-10, final_score+5))" 1661 | ], 1662 | "execution_count": 36, 1663 | "outputs": [ 1664 | { 1665 | "output_type": "stream", 1666 | "text": [ 1667 | "The final predicted score (range): 159 to 174\n" 1668 | ], 1669 | "name": "stdout" 1670 | } 1671 | ] 1672 | }, 1673 | { 1674 | "cell_type": "markdown", 1675 | "metadata": { 1676 | "colab_type": "text", 1677 | "id": "IMAYg53PfbLm" 1678 | }, 1679 | "source": [ 1680 | "### **Prediction 2**\n", 1681 | "• Date: 7th May 2018
\n", 1682 | "• IPL : Season 11
\n", 1683 | "• Match number: 39
\n", 1684 | "• Teams: Sunrisers Hyderabad vs. Royal Challengers Bangalore
\n", 1685 | "• First Innings final score: 146/10\n" 1686 | ] 1687 | }, 1688 | { 1689 | "cell_type": "code", 1690 | "metadata": { 1691 | "id": "eVtlLk3afeDT", 1692 | "colab_type": "code", 1693 | "colab": { 1694 | "base_uri": "https://localhost:8080/", 1695 | "height": 34 1696 | }, 1697 | "outputId": "62562997-ce49-41c5-8341-430965293e35" 1698 | }, 1699 | "source": [ 1700 | "final_score = predict_score(batting_team='Sunrisers Hyderabad', bowling_team='Royal Challengers Bangalore', overs=10.5, runs=67, wickets=3, runs_in_prev_5=29, wickets_in_prev_5=1)\n", 1701 | "print(\"The final predicted score (range): {} to {}\".format(final_score-10, final_score+5))" 1702 | ], 1703 | "execution_count": 37, 1704 | "outputs": [ 1705 | { 1706 | "output_type": "stream", 1707 | "text": [ 1708 | "The final predicted score (range): 138 to 153\n" 1709 | ], 1710 | "name": "stdout" 1711 | } 1712 | ] 1713 | }, 1714 | { 1715 | "cell_type": "markdown", 1716 | "metadata": { 1717 | "colab_type": "text", 1718 | "id": "M-3FC7VhUzdK" 1719 | }, 1720 | "source": [ 1721 | "### **Prediction 3**\n", 1722 | "• Date: 17th May 2018
\n", 1723 | "• IPL : Season 11
\n", 1724 | "• Match number: 50
\n", 1725 | "• Teams: Mumbai Indians vs. Kings XI Punjab
\n", 1726 | "• First Innings final score: 186/8
\n" 1727 | ] 1728 | }, 1729 | { 1730 | "cell_type": "code", 1731 | "metadata": { 1732 | "id": "CVgb01MY29NQ", 1733 | "colab_type": "code", 1734 | "colab": { 1735 | "base_uri": "https://localhost:8080/", 1736 | "height": 34 1737 | }, 1738 | "outputId": "a1a3dc25-0ba3-489d-ff65-a4a3c4829c22" 1739 | }, 1740 | "source": [ 1741 | "final_score = predict_score(batting_team='Mumbai Indians', bowling_team='Kings XI Punjab', overs=14.1, runs=136, wickets=4, runs_in_prev_5=50, wickets_in_prev_5=0)\n", 1742 | "print(\"The final predicted score (range): {} to {}\".format(final_score-10, final_score+5))" 1743 | ], 1744 | "execution_count": 38, 1745 | "outputs": [ 1746 | { 1747 | "output_type": "stream", 1748 | "text": [ 1749 | "The final predicted score (range): 180 to 195\n" 1750 | ], 1751 | "name": "stdout" 1752 | } 1753 | ] 1754 | }, 1755 | { 1756 | "cell_type": "markdown", 1757 | "metadata": { 1758 | "colab_type": "text", 1759 | "id": "Ix3XW3y2iPgc" 1760 | }, 1761 | "source": [ 1762 | "### **Prediction 4**\n", 1763 | "• Date: 30th March 2019
\n", 1764 | "• IPL : Season 12
\n", 1765 | "• Match number: 9
\n", 1766 | "• Teams: Mumbai Indians vs. Kings XI Punjab
\n", 1767 | "• First Innings final score: 176/7\n" 1768 | ] 1769 | }, 1770 | { 1771 | "cell_type": "code", 1772 | "metadata": { 1773 | "id": "FUWG9gsviudD", 1774 | "colab_type": "code", 1775 | "colab": { 1776 | "base_uri": "https://localhost:8080/", 1777 | "height": 34 1778 | }, 1779 | "outputId": "eaf6b5c4-d1ef-4f13-9ba4-8457fbe6dd5d" 1780 | }, 1781 | "source": [ 1782 | "final_score = predict_score(batting_team='Mumbai Indians', bowling_team='Kings XI Punjab', overs=12.3, runs=113, wickets=2, runs_in_prev_5=55, wickets_in_prev_5=0)\n", 1783 | "print(\"The final predicted score (range): {} to {}\".format(final_score-10, final_score+5))" 1784 | ], 1785 | "execution_count": 39, 1786 | "outputs": [ 1787 | { 1788 | "output_type": "stream", 1789 | "text": [ 1790 | "The final predicted score (range): 179 to 194\n" 1791 | ], 1792 | "name": "stdout" 1793 | } 1794 | ] 1795 | }, 1796 | { 1797 | "cell_type": "markdown", 1798 | "metadata": { 1799 | "colab_type": "text", 1800 | "id": "pNs2zIxlW6Ou" 1801 | }, 1802 | "source": [ 1803 | "### **Prediction 5**\n", 1804 | "• Date: 11th April 2019
\n", 1805 | "• IPL : Season 12
\n", 1806 | "• Match number: 25
\n", 1807 | "• Teams: Rajasthan Royals vs. Chennai Super Kings
\n", 1808 | "• First Innings final score: 151/7\n" 1809 | ] 1810 | }, 1811 | { 1812 | "cell_type": "code", 1813 | "metadata": { 1814 | "colab_type": "code", 1815 | "id": "hByMrV6l29YV", 1816 | "colab": { 1817 | "base_uri": "https://localhost:8080/", 1818 | "height": 34 1819 | }, 1820 | "outputId": "1cff54c2-0e7b-46f9-dd02-4437bd0d4028" 1821 | }, 1822 | "source": [ 1823 | "final_score = predict_score(batting_team='Rajasthan Royals', bowling_team='Chennai Super Kings', overs=13.3, runs=92, wickets=5, runs_in_prev_5=27, wickets_in_prev_5=2)\n", 1824 | "print(\"The final predicted score (range): {} to {}\".format(final_score-10, final_score+5))" 1825 | ], 1826 | "execution_count": 40, 1827 | "outputs": [ 1828 | { 1829 | "output_type": "stream", 1830 | "text": [ 1831 | "The final predicted score (range): 128 to 143\n" 1832 | ], 1833 | "name": "stdout" 1834 | } 1835 | ] 1836 | }, 1837 | { 1838 | "cell_type": "markdown", 1839 | "metadata": { 1840 | "colab_type": "text", 1841 | "id": "hYLKJMHShBn8" 1842 | }, 1843 | "source": [ 1844 | "### **Prediction 6**\n", 1845 | "• Date: 14th April 2019
\n", 1846 | "• IPL : Season 12
\n", 1847 | "• Match number: 30
\n", 1848 | "• Teams: Sunrisers Hyderabad vs. Delhi Daredevils
\n", 1849 | "• First Innings final score: 155/7\n" 1850 | ] 1851 | }, 1852 | { 1853 | "cell_type": "code", 1854 | "metadata": { 1855 | "id": "dAmNR2WLhD2F", 1856 | "colab_type": "code", 1857 | "colab": { 1858 | "base_uri": "https://localhost:8080/", 1859 | "height": 34 1860 | }, 1861 | "outputId": "f6d18cd0-5eeb-4999-a6d9-9b303324fa2a" 1862 | }, 1863 | "source": [ 1864 | "final_score = predict_score(batting_team='Delhi Daredevils', bowling_team='Sunrisers Hyderabad', overs=11.5, runs=98, wickets=3, runs_in_prev_5=41, wickets_in_prev_5=1)\n", 1865 | "print(\"The final predicted score (range): {} to {}\".format(final_score-10, final_score+5))" 1866 | ], 1867 | "execution_count": 41, 1868 | "outputs": [ 1869 | { 1870 | "output_type": "stream", 1871 | "text": [ 1872 | "The final predicted score (range): 157 to 172\n" 1873 | ], 1874 | "name": "stdout" 1875 | } 1876 | ] 1877 | }, 1878 | { 1879 | "cell_type": "markdown", 1880 | "metadata": { 1881 | "colab_type": "text", 1882 | "id": "zxjq482uaQpc" 1883 | }, 1884 | "source": [ 1885 | "### **Prediction 7**\n", 1886 | "• Date: 10th May 2019
\n", 1887 | "• IPL : Season 12
\n", 1888 | "• Match number: 59 (Eliminator)
\n", 1889 | "• Teams: Delhi Daredevils vs. Chennai Super Kings
\n", 1890 | "• First Innings final score: 147/9\n" 1891 | ] 1892 | }, 1893 | { 1894 | "cell_type": "code", 1895 | "metadata": { 1896 | "id": "UR6QNPK_aSSj", 1897 | "colab_type": "code", 1898 | "colab": { 1899 | "base_uri": "https://localhost:8080/", 1900 | "height": 34 1901 | }, 1902 | "outputId": "1afc6b5b-d1bc-4f55-9c61-362e31cb4e80" 1903 | }, 1904 | "source": [ 1905 | "final_score = predict_score(batting_team='Delhi Daredevils', bowling_team='Chennai Super Kings', overs=10.2, runs=68, wickets=3, runs_in_prev_5=29, wickets_in_prev_5=1)\n", 1906 | "print(\"The final predicted score (range): {} to {}\".format(final_score-10, final_score+5))" 1907 | ], 1908 | "execution_count": 42, 1909 | "outputs": [ 1910 | { 1911 | "output_type": "stream", 1912 | "text": [ 1913 | "The final predicted score (range): 137 to 152\n" 1914 | ], 1915 | "name": "stdout" 1916 | } 1917 | ] 1918 | }, 1919 | { 1920 | "cell_type": "markdown", 1921 | "metadata": { 1922 | "id": "ZaEK5rEmjp8K", 1923 | "colab_type": "text" 1924 | }, 1925 | "source": [ 1926 | "*Note: In IPL, it is very difficult to predict the actual score because in a moment of time the game can completely turn upside down!*\n" 1927 | ] 1928 | } 1929 | ] 1930 | } --------------------------------------------------------------------------------