From 6d4dec5080369f80133e74096d7d038a5295a666 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 28 Nov 2023 20:19:58 -0600 Subject: [PATCH] Add XGBoost --- adv_models/XGBoost.ipynb | 546 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 546 insertions(+) create mode 100644 adv_models/XGBoost.ipynb diff --git a/adv_models/XGBoost.ipynb b/adv_models/XGBoost.ipynb new file mode 100644 index 0000000..1dc00ec --- /dev/null +++ b/adv_models/XGBoost.ipynb @@ -0,0 +1,546 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e888feb4", + "metadata": {}, + "source": [ + "- After feature selection step 2 also build (Based on the models compatibility with the data i.e classification or regression problem) (also write a 3 lines on what you understand about these models you are free to use online resources but please cite them.)\n", + "\n", + "- Perform visualization of your model performances, insights etc using apt metrics and charts (ex: MSE bar plots of all the models to identify best models" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3ab83994", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from sklearn.metrics import classification_report, confusion_matrix\n", + "from sklearn.metrics import ConfusionMatrixDisplay, accuracy_score\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5a08bc9c", + "metadata": {}, + "outputs": [], + "source": [ + "selected_features = [\"TP2\", \"H1\", \"DV_pressure\", \"Reservoirs\", \"Oil_temperature\", \"Motor_current\", \"Oil_level\", 'status']" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0091382c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0timestampTP2TP3H1DV_pressureReservoirsOil_temperatureMotor_currentCOMPDV_eletricTowersMPGLPSPressure_switchOil_levelCaudal_impulsesstatus
05625642020-04-18 00:00:01-0.0188.2488.238-0.0248.24849.450.041.00.01.01.00.01.01.01.01
15625652020-04-18 00:00:13-0.0188.2488.238-0.0248.24849.450.041.00.01.01.00.01.01.01.01
25625662020-04-18 00:00:24-0.0188.2488.238-0.0248.24849.450.041.00.01.01.00.01.01.01.01
35625672020-04-18 00:00:36-0.0188.2488.238-0.0248.24849.450.040.00.00.00.00.00.00.00.01
45625682020-04-18 00:00:49-0.0188.2488.238-0.0248.24849.450.041.00.01.01.00.01.01.01.01
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 timestamp TP2 TP3 H1 DV_pressure \\\n", + "0 562564 2020-04-18 00:00:01 -0.018 8.248 8.238 -0.024 \n", + "1 562565 2020-04-18 00:00:13 -0.018 8.248 8.238 -0.024 \n", + "2 562566 2020-04-18 00:00:24 -0.018 8.248 8.238 -0.024 \n", + "3 562567 2020-04-18 00:00:36 -0.018 8.248 8.238 -0.024 \n", + "4 562568 2020-04-18 00:00:49 -0.018 8.248 8.238 -0.024 \n", + "\n", + " Reservoirs Oil_temperature Motor_current COMP DV_eletric Towers MPG \\\n", + "0 8.248 49.45 0.04 1.0 0.0 1.0 1.0 \n", + "1 8.248 49.45 0.04 1.0 0.0 1.0 1.0 \n", + "2 8.248 49.45 0.04 1.0 0.0 1.0 1.0 \n", + "3 8.248 49.45 0.04 0.0 0.0 0.0 0.0 \n", + "4 8.248 49.45 0.04 1.0 0.0 1.0 1.0 \n", + "\n", + " LPS Pressure_switch Oil_level Caudal_impulses status \n", + "0 0.0 1.0 1.0 1.0 1 \n", + "1 0.0 1.0 1.0 1.0 1 \n", + "2 0.0 1.0 1.0 1.0 1 \n", + "3 0.0 0.0 0.0 0.0 1 \n", + "4 0.0 1.0 1.0 1.0 1 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv(\"../data/Group_14_Clean_Data.csv\")\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "73b2dde5", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0timestampTP2TP3H1DV_pressureReservoirsOil_temperatureMotor_currentCOMPDV_eletricTowersMPGLPSPressure_switchOil_levelCaudal_impulsesstatus
267719066862020-06-07 10:22:058.0867.894-0.0061.9287.89476.9005.52250.01.00.00.00.01.01.01.01
319391234922020-02-17 10:55:15-0.0109.6989.684-0.0189.70058.3503.68751.00.01.01.00.01.01.01.00
63665689302020-04-18 17:40:398.6108.764-0.0061.8988.76674.6255.58750.01.01.00.00.01.01.01.01
550835055012020-04-09 20:08:30-0.0148.8168.806-0.0248.81653.6750.04251.00.01.01.00.01.01.01.00
35415661052020-04-18 09:53:569.0748.932-0.0102.0328.93476.0255.73000.01.00.00.00.01.01.01.01
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 timestamp TP2 TP3 H1 DV_pressure \\\n", + "26771 906686 2020-06-07 10:22:05 8.086 7.894 -0.006 1.928 \n", + "31939 123492 2020-02-17 10:55:15 -0.010 9.698 9.684 -0.018 \n", + "6366 568930 2020-04-18 17:40:39 8.610 8.764 -0.006 1.898 \n", + "55083 505501 2020-04-09 20:08:30 -0.014 8.816 8.806 -0.024 \n", + "3541 566105 2020-04-18 09:53:56 9.074 8.932 -0.010 2.032 \n", + "\n", + " Reservoirs Oil_temperature Motor_current COMP DV_eletric Towers \\\n", + "26771 7.894 76.900 5.5225 0.0 1.0 0.0 \n", + "31939 9.700 58.350 3.6875 1.0 0.0 1.0 \n", + "6366 8.766 74.625 5.5875 0.0 1.0 1.0 \n", + "55083 8.816 53.675 0.0425 1.0 0.0 1.0 \n", + "3541 8.934 76.025 5.7300 0.0 1.0 0.0 \n", + "\n", + " MPG LPS Pressure_switch Oil_level Caudal_impulses status \n", + "26771 0.0 0.0 1.0 1.0 1.0 1 \n", + "31939 1.0 0.0 1.0 1.0 1.0 0 \n", + "6366 0.0 0.0 1.0 1.0 1.0 1 \n", + "55083 1.0 0.0 1.0 1.0 1.0 0 \n", + "3541 0.0 0.0 1.0 1.0 1.0 1 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Choose only features selected from Question 2\n", + "#Shuffle the data\n", + "data = data.sample(frac = 1)\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "id": "c38a6d5f", + "metadata": {}, + "source": [ + "# XGBOOST\n", + "\n", + "- XGBoost, a Gradient Boosted decision tree implementation, excels in Kaggle Competitions. \n", + "- It sequentially creates decision trees, assigning weights to variables that are adjusted based on prediction errors. \n", + "- This ensemble method, with optimizations like the Approximate Greedy Algorithm and Cash-Aware Access, proves effective for regression, classification, ranking, and user-defined prediction problems.\n", + "\n", + "reference:
\n", + "https://xgboost.readthedocs.io/en/stable/python/python_intro.html
\n", + "https://www.geeksforgeeks.org/xgboost/
\n", + "https://www.geeksforgeeks.org/ml-xgboost-extreme-gradient-boosting/
" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f5d4ec6c", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "#!pip install xgboost\n", + "import xgboost as xgb" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c8744021", + "metadata": {}, + "outputs": [], + "source": [ + "X = data[selected_features]\n", + "y = data['status']" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "dfc8122f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 1.00 1.00 1.00 5960\n", + " 1 1.00 1.00 1.00 5929\n", + "\n", + " accuracy 1.00 11889\n", + " macro avg 1.00 1.00 1.00 11889\n", + "weighted avg 1.00 1.00 1.00 11889\n", + "\n" + ] + }, + { + "data": { + "image/png": "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+uvVtGlTpzjc9f777ysrK0t79uyRw+FQTU2NTp48qYqKCoWHh0uSAgMD1a1bN/Ocjh076oorrlB+fr5uuukm5ebmatu2bU4VgdraWp08eVInTpxwihHApYuEAH6rd+/eWrBggYKCghQfH19n0uDZD7yzTp8+rVatWumDDz6oc62LXXoXFhbm9jmnT5+WdKZtkJqa6nSsSZMmkiTDMC4qnv/19ddf6/bbb9eDDz6o3/3ud4qKitKGDRs0atQop9aKdGbZ4LnO7jt9+rSeeOIJ3XXXXXXGhIaGehwngMZBQgC/FR4ernbt2tV7/I033qiioiIFBgbq6quvPu+YpKQkbd68WT/72c/MfZs3b/7Oa7Zv315hYWH65z//qfvvv7/O8eDgYElnfqM+KzY2VldeeaW+/PJL3XPPPee9bqdOnbR06VJVVlaaSYerOM5n+/btqqmp0R/+8AcFBJyZTvTqq6/WGVdTU6Pt27frpptukiTt27dPx48fV8eOHSWd+b7t27fPre81gEsPCQHwrb59+yotLU3Dhg3TzJkz1aFDBx08eFBr1qzRsGHD1K1bNz3yyCMaOXKkunXrpu9///tatmyZdu/erbZt2573mqGhoZoyZYomT56s4OBgfe9739ORI0e0e/dujRo1SjExMQoLC1NOTo6uuuoqhYaGym63a/r06Ro/frwiIyM1aNAgVVVVafv27SopKdGECROUnp6uqVOnatSoUfrNb36jr776Sr///e/der/XXHONampq9Nxzz+nOO+/Uxx9/rOeff77OuKCgII0bN07PPvusgoKC9PDDD6tHjx5mgvD4449r8ODBSkhI0I9//GMFBATos88+086dO/Xkk0+6/x8CgE+wygD4ls1m05o1a3TLLbfovvvu07XXXqu7775bX331lbkqYMSIEXr88cc1ZcoUpaSk6Ouvv9YvfvELl9d97LHHNHHiRD3++ONKSkrSiBEjVFxcLOlMf/7ZZ5/VwoULFR8fr6FDh0qS7r//fr344otavHixkpOTdeutt2rx4sXmMsVmzZrp73//u/bs2aOuXbtq6tSpmjlzplvv94YbbtDs2bM1c+ZMde7cWcuWLVN2dnadcU2bNtWUKVOUnp6utLQ0hYWFacWKFebxAQMG6K233tK6devUvXt39ejRQ7Nnz1abNm3cigeAb9mMhmhGAgCAyxoVAgAAQEIAAABICAAAgEgIAACASAgAAIBICAAAgEgIAACASAgAAIBICAAAgEgIAACASAgAAICk/wfOf6xPyfIq2QAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "# Fitting XGBoost to the training data\n", + "my_model = xgb.XGBClassifier()\n", + "my_model.fit(X_train, y_train)\n", + "\n", + "# Predicting the Test set results\n", + "y_pred = my_model.predict(X_test)\n", + "\n", + "# Making the Confusion Matrix\n", + "cm = confusion_matrix(y_test, y_pred)\n", + "\n", + "print(classification_report(y_test, y_pred))\n", + "\n", + "disp = ConfusionMatrixDisplay(cm, display_labels=['0', '1'])\n", + "disp.plot(cmap='Blues', values_format='d')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aac04a8d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}