diff --git a/README.md b/README.md index 1fa9034..07117aa 100644 --- a/README.md +++ b/README.md @@ -1 +1,158 @@ -# Requirements +# RailGuard: Morocco High Speed Train Hackathon Project + +Hello everyone! This project was developed by **Aya Harrak**, **Oumama Lemouakni**, and **Er-Rougui Saad** as part of the Morocco High Speed Train Hackathon. + +This README provides the steps to execute the codes included in this project. + +--- + +## 1) System Requirements + +To run this project, ensure you have the following: + +- **Operating System**: Ubuntu 22.04 +- **ROS2**: Used for fake sensor data publishing. + [Installation Guide for ROS2 on Ubuntu](https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html) +- **Kafka**: Used for real-time data streaming. + [Apache Kafka Installation Guide]([https://kafka.apache.org/documentation/quickstart](https://hostman.com/tutorials/install-apache-kafka-on-ubuntu-22-04/) +- **Apache Spark**: Used for data processing. + [Apache Spark Installation Guide]([https://spark.apache.org/docs/latest/](https://phoenixnap.com/kb/install-spark-on-ubuntu) +- **Dependencies for Spark**: + Download necessary dependencies (`--jars` files) and place them in the directory `~/spark_jars`. +- **Grafana**: Used for data visualization and dashboards. + [Grafana Installation Guide](https://grafana.com/docs/grafana/latest/setup-grafana/installation/) + +--- + +## 2) Sensors Publisher + +To set up the ROS2-based sensor simulation: + +1. Navigate to the RailGuards ROS2 workspace: + ```bash + cd ~/railGuards/ros2 + +2. Build the ROS2 package: + ```bash + colcon build --symlink-install + +2. Source the ROS2 workspace by adding it to your bash configuration: + ```bash + echo "source ~/railGuards/ros2/install/setup.bash" >> ~/.bashrc +``` + + ```bash + source ~/.bashrc +``` + +4. Run the sensor simulator: + +```bash + ros2 run sensors_simulator full_sensor_publisher + ``` + +5. Verify the data: + +List all ROS2 topics +```bash +ros2 topic list +``` + +Echo a topic, for example: + +```bash +ros2 topic echo /Oil_temperature +``` + + +## 3) Data Streaming + +To set up Kafka for data streaming: + +Install Kafka and unzip it into the directory ~/kafka. + +Start the Kafka broker and Zookeeper: +```bash +~/kafka/bin/zookeeper-server-start.sh ~/kafka/config/zookeeper.properties +``` +In another terminal: +```bash +~/kafka/bin/kafka-server-start.sh ~/kafka/config/server.properties +``` + +3. Verify Kafka is running: + +Verify Kafka is running: + +```bash +sudo systemctl status kafka +``` + +if not : + +```bash +sudo systemctl start kafka +``` +```bash +sudo systemctl enable kafka +``` + +4. Launch the ROS2-Kafka bridge to send sensor data to Kafka: +```bash +ros2 run sensors_simulator full_ros2_kafka_bridge +``` + +5. Listen to the Kafka topic (fulldata) to view sensor data being streamed: + +```bash +~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic fulldata +``` + +## 4) Data Processing with Spark +Sensor data contains noise and requires processing. To process data using Apache Spark: + +1. Navigate to the data processing directory: +```bash +cd ~/railGuards/data_processing +``` + +2. Run the Spark job: +```bash +spark-submit --jars ~/spark_jars/ full_spark_processing.py +``` + +# 3. Verify that the cleaned data is being written to the Kafka topic (cleaned_sensor_data) and InfluxDB. + + +## 5) Visualization with Grafana + +To visualize the processed data: + +Install and set up Grafana. +Connect Grafana to InfluxDB as a data source. +Import the provided Grafana dashboard JSON (~/railGuards/grafana/grafana_dashboard.json) file or manually create dashboards. +Use InfluxDB queries to visualize: +Sensor metrics (e.g., temperature, pressure). +Maintenance flags and anomaly rates from the Kafka topic future_anomaly_predictions. + +# AI Predection + +```bash +cd ~/railGuards/machine_learning/data_preprocessing/ +``` +then run : + +```bash +python3 deployement.py +``` + +# Thank You + + + + + + + + + diff --git a/data_processing.ipynb b/data_processing.ipynb deleted file mode 100644 index dc36d4a..0000000 --- a/data_processing.ipynb +++ /dev/null @@ -1,3113 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "2U6-RcNVXpSP", - "metadata": { - "id": "2U6-RcNVXpSP" - }, - "source": [ - "# Data Processing\n" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "791292f6", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "791292f6", - "outputId": "c1bc410d-514d-4465-9e75-ae2d8815a639" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 1516948 entries, 0 to 1516947\n", - "Data columns (total 17 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 Unnamed: 0 1516948 non-null int64 \n", - " 1 timestamp 1516948 non-null object \n", - " 2 TP2 1516948 non-null float64\n", - " 3 TP3 1516948 non-null float64\n", - " 4 H1 1516948 non-null float64\n", - " 5 DV_pressure 1516948 non-null float64\n", - " 6 Reservoirs 1516948 non-null float64\n", - " 7 Oil_temperature 1516948 non-null float64\n", - " 8 Motor_current 1516948 non-null float64\n", - " 9 COMP 1516948 non-null float64\n", - " 10 DV_eletric 1516948 non-null float64\n", - " 11 Towers 1516948 non-null float64\n", - " 12 MPG 1516948 non-null float64\n", - " 13 LPS 1516948 non-null float64\n", - " 14 Pressure_switch 1516948 non-null float64\n", - " 15 Oil_level 1516948 non-null float64\n", - " 16 Caudal_impulses 1516948 non-null float64\n", - "dtypes: float64(15), int64(1), object(1)\n", - "memory usage: 196.7+ MB\n", - "None\n" - ] - } - ], - "source": [ - "from sklearn.model_selection import train_test_split\n", - "from sklearn.linear_model import LogisticRegression\n", - "from sklearn.metrics import classification_report, ConfusionMatrixDisplay, accuracy_score, confusion_matrix\n", - "from sklearn.metrics import roc_curve, auc\n", - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "import seaborn as sns\n", - "import numpy as np\n", - "\n", - "data = pd.read_csv(\"MetroPT3.csv\")\n", - "print(data.info())" - ] - }, - { - "cell_type": "markdown", - "id": "7uLEBO473Bll", - "metadata": { - "id": "7uLEBO473Bll" - }, - "source": [ - "##I. Data Introduction" - ] - }, - { - "cell_type": "markdown", - "id": "i_iR7xMJVv-i", - "metadata": { - "id": "i_iR7xMJVv-i" - }, - "source": [ - "The MetroPT-3 dataset was created to support the development of predictive maintenance, anomaly detection, and remaining useful life (RUL) prediction models for compressors using deep learning and machine learning methods. It consists of multivariate time series data from several analogue and digital sensors installed on a train compressor. The data spans between February and August 2020 and includes 15 signals, such as pressures, motor current, oil temperature, and electrical signals of air intake valves. The dataset is eligible for incremental training and does not contain sensitive data. Data preprocessing includes data segmentation, normalization, and feature extraction. The dataset is unlabeled, but failure reports provided by the company are available for evaluating the effectiveness of anomaly detection, failure prediction, and RUL estimation algorithms. The dataset does not have missing values." - ] - }, - { - "cell_type": "markdown", - "id": "CcgKimrHV1W4", - "metadata": { - "id": "CcgKimrHV1W4" - }, - "source": [ - "This dataset was chosen because it contains information that was obtained from actual events that accurately reflect real-world situations. This makes it a valuable resource for developing and testing algorithms in the field of anomaly detection, failure prediction, and remaining useful life estimation. Additionally, the availability of failure reports from the company allows us to validate the performance of our algorithms against real-world incidents. Also, this dataset is also represent time series attribute, which is crucial for analyzing trends and patterns over a specific period. The inclusion of time series data enables researchers to observe the progression of anomalies and failures, providing deeper insights into their causes and potential mitigation strategies." - ] - }, - { - "cell_type": "markdown", - "id": "IsqkeHN93FYJ", - "metadata": { - "id": "IsqkeHN93FYJ" - }, - "source": [ - "##II. Data Cleaning and Pre-precessing" - ] - }, - { - "cell_type": "markdown", - "id": "tlgQsE5x3fEE", - "metadata": { - "id": "tlgQsE5x3fEE" - }, - "source": [ - "## Data Overview" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "8f0b8b88", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "8f0b8b88", - "outputId": "5b149794-596b-4525-883d-3e218668cb76" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Unnamed: 0 TP2 TP3 H1 DV_pressure \\\n", - "count 1516948.00 1516948.00 1516948.00 1516948.00 1516948.00 \n", - "mean 7584735.00 1.37 8.98 7.57 0.06 \n", - "std 4379053.12 3.25 0.64 3.33 0.38 \n", - "min 0.00 -0.03 0.73 -0.04 -0.03 \n", - "25% 3792367.50 -0.01 8.49 8.25 -0.02 \n", - "50% 7584735.00 -0.01 8.96 8.78 -0.02 \n", - "75% 11377102.50 -0.01 9.49 9.37 -0.02 \n", - "max 15169470.00 10.68 10.30 10.29 9.84 \n", - "\n", - " Reservoirs Oil_temperature Motor_current COMP DV_eletric \\\n", - "count 1516948.00 1516948.00 1516948.00 1516948.00 1516948.00 \n", - "mean 8.99 62.64 2.05 0.84 0.16 \n", - "std 0.64 6.52 2.30 0.37 0.37 \n", - "min 0.71 15.40 0.02 0.00 0.00 \n", - "25% 8.49 57.78 0.04 1.00 0.00 \n", - "50% 8.96 62.70 0.04 1.00 0.00 \n", - "75% 9.49 67.25 3.81 1.00 0.00 \n", - "max 10.30 89.05 9.30 1.00 1.00 \n", - "\n", - " Towers MPG LPS Pressure_switch Oil_level \\\n", - "count 1516948.00 1516948.00 1516948.00 1516948.00 1516948.00 \n", - "mean 0.92 0.83 0.00 0.99 0.90 \n", - "std 0.27 0.37 0.06 0.09 0.29 \n", - "min 0.00 0.00 0.00 0.00 0.00 \n", - "25% 1.00 1.00 0.00 1.00 1.00 \n", - "50% 1.00 1.00 0.00 1.00 1.00 \n", - "75% 1.00 1.00 0.00 1.00 1.00 \n", - "max 1.00 1.00 1.00 1.00 1.00 \n", - "\n", - " Caudal_impulses \n", - "count 1516948.00 \n", - "mean 0.94 \n", - "std 0.24 \n", - "min 0.00 \n", - "25% 1.00 \n", - "50% 1.00 \n", - "75% 1.00 \n", - "max 1.00 \n", - "Index(['Unnamed: 0', 'timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure',\n", - " 'Reservoirs', 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric',\n", - " 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level',\n", - " 'Caudal_impulses'],\n", - " dtype='object')\n" - ] - } - ], - "source": [ - "print(data.describe().round(2))\n", - "print(data.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "1d44ba87-b80a-41fd-982b-061b6cdd81bb", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "1d44ba87-b80a-41fd-982b-061b6cdd81bb", - "outputId": "560e566d-89de-4df0-ff59-3fe32fcd690e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Unnamed: 0 timestamp TP2 TP3 H1 DV_pressure \\\n", - "0 0 2020-02-01 00:00:00 -0.012 9.358 9.340 -0.024 \n", - "1 10 2020-02-01 00:00:10 -0.014 9.348 9.332 -0.022 \n", - "2 20 2020-02-01 00:00:19 -0.012 9.338 9.322 -0.022 \n", - "3 30 2020-02-01 00:00:29 -0.012 9.328 9.312 -0.022 \n", - "4 40 2020-02-01 00:00:39 -0.012 9.318 9.302 -0.022 \n", - "5 50 2020-02-01 00:00:49 -0.012 9.306 9.290 -0.024 \n", - "6 60 2020-02-01 00:00:59 -0.012 9.296 9.280 -0.024 \n", - "7 70 2020-02-01 00:01:09 -0.014 9.286 9.270 -0.024 \n", - "8 80 2020-02-01 00:01:19 -0.012 9.276 9.258 -0.022 \n", - "9 90 2020-02-01 00:01:29 -0.012 9.264 9.248 -0.022 \n", - "\n", - " Reservoirs Oil_temperature Motor_current COMP DV_eletric Towers MPG \\\n", - "0 9.358 53.600 0.0400 1.0 0.0 1.0 1.0 \n", - "1 9.348 53.675 0.0400 1.0 0.0 1.0 1.0 \n", - "2 9.338 53.600 0.0425 1.0 0.0 1.0 1.0 \n", - "3 9.328 53.425 0.0400 1.0 0.0 1.0 1.0 \n", - "4 9.318 53.475 0.0400 1.0 0.0 1.0 1.0 \n", - "5 9.308 53.500 0.0400 1.0 0.0 1.0 1.0 \n", - "6 9.298 53.375 0.0400 1.0 0.0 1.0 1.0 \n", - "7 9.286 53.550 0.0400 1.0 0.0 1.0 1.0 \n", - "8 9.276 53.425 0.0400 1.0 0.0 1.0 1.0 \n", - "9 9.264 53.375 0.0400 1.0 0.0 1.0 1.0 \n", - "\n", - " LPS Pressure_switch Oil_level Caudal_impulses \n", - "0 0.0 1.0 1.0 1.0 \n", - "1 0.0 1.0 1.0 1.0 \n", - "2 0.0 1.0 1.0 1.0 \n", - "3 0.0 1.0 1.0 1.0 \n", - "4 0.0 1.0 1.0 1.0 \n", - "5 0.0 1.0 1.0 1.0 \n", - "6 0.0 1.0 1.0 1.0 \n", - "7 0.0 1.0 1.0 1.0 \n", - "8 0.0 1.0 1.0 1.0 \n", - "9 0.0 1.0 1.0 1.0 \n" - ] - } - ], - "source": [ - "print(data.head(10))" - ] - }, - { - "cell_type": "markdown", - "id": "hI6sjTAB92g_", - "metadata": { - "id": "hI6sjTAB92g_" - }, - "source": [ - "## Cleaning\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "JAQC3yq4-FOa", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "JAQC3yq4-FOa", - "outputId": "c86f8d17-72ac-448c-8ee3-40225240d371" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Index(['Unnamed: 0', 'timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure',\n", - " 'Reservoirs', 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric',\n", - " 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level',\n", - " 'Caudal_impulses'],\n", - " dtype='object')\n" - ] - } - ], - "source": [ - "print(data.columns)\n", - "data = data.drop('Unnamed: 0', axis= 1)" - ] - }, - { - "cell_type": "markdown", - "id": "3eb2efc4-bd6e-4501-a39b-6f7ef141c8a1", - "metadata": { - "id": "3eb2efc4-bd6e-4501-a39b-6f7ef141c8a1" - }, - "source": [ - "## Convert the timestamp collumn into pandas.DateTime data type standarzation" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "d42c2fe5-79e9-4810-977c-ae7485ea5b52", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "d42c2fe5-79e9-4810-977c-ae7485ea5b52", - "outputId": "480f151c-875c-4011-8725-a8dbdc2c596e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Current type of timestamp is \n", - "Current type of timestamp is \n" - ] - } - ], - "source": [ - "import datetime\n", - "\n", - "#Check the current type of timestamp\n", - "print(f\"Current type of timestamp is {type(data.timestamp[0])}\")\n", - "\n", - "#Convert timestamp to pandas.DateTime ISO 8601\n", - "data['timestamp'] = data['timestamp'].apply(pd.to_datetime, format = \"%Y-%m-%d %H:%M:%S\")\n", - "\n", - "#Re-check the type\n", - "print(f\"Current type of timestamp is {type(data.timestamp[0])}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "5d71d0fd", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "5d71d0fd", - "outputId": "da58eaef-12e4-4444-86d7-6e4b654c45bd" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " timestamp TP2 TP3 H1 DV_pressure Reservoirs \\\n", - "0 2020-02-01 00:00:00 -0.012 9.358 9.340 -0.024 9.358 \n", - "1 2020-02-01 00:00:10 -0.014 9.348 9.332 -0.022 9.348 \n", - "2 2020-02-01 00:00:19 -0.012 9.338 9.322 -0.022 9.338 \n", - "3 2020-02-01 00:00:29 -0.012 9.328 9.312 -0.022 9.328 \n", - "4 2020-02-01 00:00:39 -0.012 9.318 9.302 -0.022 9.318 \n", - "5 2020-02-01 00:00:49 -0.012 9.306 9.290 -0.024 9.308 \n", - "6 2020-02-01 00:00:59 -0.012 9.296 9.280 -0.024 9.298 \n", - "7 2020-02-01 00:01:09 -0.014 9.286 9.270 -0.024 9.286 \n", - "8 2020-02-01 00:01:19 -0.012 9.276 9.258 -0.022 9.276 \n", - "9 2020-02-01 00:01:29 -0.012 9.264 9.248 -0.022 9.264 \n", - "\n", - " Oil_temperature Motor_current COMP DV_eletric Towers MPG LPS \\\n", - "0 53.600 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "1 53.675 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "2 53.600 0.0425 1.0 0.0 1.0 1.0 0.0 \n", - "3 53.425 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "4 53.475 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "5 53.500 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "6 53.375 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "7 53.550 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "8 53.425 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "9 53.375 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "\n", - " Pressure_switch Oil_level Caudal_impulses \n", - "0 1.0 1.0 1.0 \n", - "1 1.0 1.0 1.0 \n", - "2 1.0 1.0 1.0 \n", - "3 1.0 1.0 1.0 \n", - "4 1.0 1.0 1.0 \n", - "5 1.0 1.0 1.0 \n", - "6 1.0 1.0 1.0 \n", - "7 1.0 1.0 1.0 \n", - "8 1.0 1.0 1.0 \n", - "9 1.0 1.0 1.0 \n" - ] - } - ], - "source": [ - "print(data.head(10))" - ] - }, - { - "cell_type": "markdown", - "id": "5bca1be5-5d0e-4317-a375-dedbe9168c00", - "metadata": { - "id": "5bca1be5-5d0e-4317-a375-dedbe9168c00" - }, - "source": [ - "## Add a label feature" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "g3txUZmdXZU8", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "g3txUZmdXZU8", - "outputId": "5aaa3394-881e-4869-eb84-855a86e51624" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " timestamp TP2 TP3 H1 DV_pressure Reservoirs \\\n", - "0 2020-02-01 00:00:00 -0.012 9.358 9.340 -0.024 9.358 \n", - "1 2020-02-01 00:00:10 -0.014 9.348 9.332 -0.022 9.348 \n", - "2 2020-02-01 00:00:19 -0.012 9.338 9.322 -0.022 9.338 \n", - "3 2020-02-01 00:00:29 -0.012 9.328 9.312 -0.022 9.328 \n", - "4 2020-02-01 00:00:39 -0.012 9.318 9.302 -0.022 9.318 \n", - "\n", - " Oil_temperature Motor_current COMP DV_eletric Towers MPG LPS \\\n", - "0 53.600 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "1 53.675 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "2 53.600 0.0425 1.0 0.0 1.0 1.0 0.0 \n", - "3 53.425 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "4 53.475 0.0400 1.0 0.0 1.0 1.0 0.0 \n", - "\n", - " Pressure_switch Oil_level Caudal_impulses status \n", - "0 1.0 1.0 1.0 0 \n", - "1 1.0 1.0 1.0 0 \n", - "2 1.0 1.0 1.0 0 \n", - "3 1.0 1.0 1.0 0 \n", - "4 1.0 1.0 1.0 0 \n" - ] - } - ], - "source": [ - "#Create a new column for target variable called status, indicate the equipment has deficiencies and need to be maintained\n", - "# status = 0; system ups and running\n", - "# status = 1; system downs and needs recovering\n", - "labeled_data = data.copy()\n", - "labeled_data['status'] = 0\n", - "print(labeled_data.head(5))" - ] - }, - { - "cell_type": "markdown", - "id": "-nhbRJGNhMU0", - "metadata": { - "id": "-nhbRJGNhMU0" - }, - "source": [ - "Next, set the status of the machine to 1 based on the time from the table below\n", - "\n", - "![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+4AAAHlCAYAAABrvKZUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABjaVRYdFNuaXBNZXRhZGF0YQAAAAAAeyJjbGlwUG9pbnRzIjpbeyJ4IjowLCJ5IjowfSx7IngiOjEwMDYsInkiOjB9LHsieCI6MTAwNiwieSI6NDg1fSx7IngiOjAsInkiOjQ4NX1dfY+f4/4AAKhhSURBVHhe7N0PXBR1/j/wF2upZ4BmWrJYmhFoaZoQnn+6EAzyTDNIuzMVg19X6XUmJxKGl3f+O5HDrOzqPAjUvPxHaJmBilypnXxZ07QCItICVtNIgUxNlt/nMzsLy7ILC6IO+Ho+HqvM7O7s7Mx7Zz7v+fwZl2oBRERERERERKRJOvV/IiIiIiIiItIgJu5EREREREREGsbEnYiIiIiIiEjDmLgTERERERERaRgTdyIiIiIiIiINY+JOREREREREpGFM3ImIiIiIiIg0jIk7ERERERERkYYxcSciIiIiIiLSMCbuRERERERERBrGxJ2IiIiIiIhIw5i4ExEREREREWkYE3ciIiIiIiIiDWPiTkRERERERKRhTNyJiIiIiIiINIyJOxEREREREZGGMXEnIiIiIiIi0jAm7kREREREREQaxsSdiIiIiIiISMOYuBMRERERERFpGBN3IiIiIiIiIg1j4k5ERERERESkYUzciYiIiIiIiDRMU4m7i4uL8qDGcVvR1cT4I61gLJKWMT7JFmOCrjWM+ZbjUi2of1913KlERERERERti4ZSzlaLTeWJiIiIiIiINEyTNe4LX09X/ifH4qaPV/7ntqKrgfFHWsFYJC1jfJItxgRdaywxzxr3S8cadyIiIiIiIiINY+JOREREREREpGFM3ImIiIiIiIg0jIk7ERERERERkYYxcSciIiIiIiLSMCbuRERERERERBrGxJ2IiIiIiIhIw5i4ExEREREREWkYE3ciIiIiIiIiDWPiTkRERERERKRhTNyJiIiIiIiINIyJOxEREREREZGGMXEnIiIiIiIi0jAm7kREREREREQaxsSdiIiIiIiISMOYuBMRERERERFpGBN3IiIiIiIiIg1j4k5ERERERESkYUzciYiIiIiIiDSMiTsRERERERGRhjFxJyIiIiIi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IiIiIiINY+JOREREREREpGFM3ImIiIiIiIg0jIk7ERERERERkYYxcSciIiIiIiLSMCbuRERERERERBrGxJ2IiIiIiIhIw1yqBfXvq87FxUX9i4iIiIiIiNoCDaWcrRZr3ImIiIiIiIg0TJM17gtfT1f+J8fipo9X/ufVK7oaLL9Vxh9dbYxF0jLGJ9liTNC1hjHfcljjTkRERERERKRhTNyJiIiIiIiINIyJOxEREREREZGGMXEnIiIiIiIi0jAm7kREREREREQaxsSdiIiIiIiISMOYuBMRERERERFpGBN3IiIiIiIiIg1j4k5ERERERESkYUzciYiIiIiIiDSMiTsRERERERGRhjFxJyIiIiIiItIwJu5EREREREREGsbEnYiIiIiIiEjDmLgTERERERERaRgTdyIiIiIiIiINY+JOREREREREpGFM3ImIiIiIiIg0jIk7ERERERERkYYxcSciIiIiIiLSMCbuRERERERERBrGxJ2IiIiIiIhIw5i4ExEREREREWkYE3ciIiIiIiIiDWPiTkRERERERKRhTNyJiIiIiIiINIyJOxEREREREZGGMXEnIiIiIiIi0jAm7kREREREREQaxsSdiIiIiIiISMOYuBMRERERERFpGBN3IiIiIiIiIg1j4k5ERERERESkYUzciYiIiIiIiDSMiTsRERERERGRhjFxJyIiIiIiItIwJu5EREREREREGtYGEvdyFKX/E4bvfzFPVpfA8Gpi7TQRERFRW1WZg4SRfohMOwaTOssplQXISluFmJFPILngnDqTrknNjSEiuqJaf+J+7hi+OuCGG93bmafPl+HUyZtrp6XqH1Hy2T4Y0udjafphnFdnExHRtc1UkoZI/cSGExelUKuHiz4SyXnl6symqoQhYSRcXFzqP7wSYLiovuyysPns8DQY1WdIC0woz5oLvXVMyEdIMgqULOocCpIn1n1OPPQxWWhuNAKnkLVgEoLC/oD47MtR0XEK2Wn/u4T1u9bZxoQfYrJOqc85YMpDcog4TlneUxM/lxv3NdGV0uoT9+ryEzB27wH3DuavIqe/HzwQnh0tX60cRVs34shXmXg386A6j4iI6BwKM95BsnEj4pL2OSx4mirOoEz9u/lc4Tt7N6or9mNZgIc6bwKS8n9GdeFs+F6nzrosxGdH/RNJwZbPJW3RwT1wMUqrf0Z+0gQx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)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "ab649eb6", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "ab649eb6", - "outputId": "a3f95a09-2407-4dfe-9941-e7802dba6193" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[Timestamp('2020-04-18 00:00:00'), Timestamp('2020-05-29 23:30:00'), Timestamp('2020-06-05 10:00:00'), Timestamp('2020-07-15 14:30:00')] \n", - " 59\n" - ] - } - ], - "source": [ - "def to_datetime(xs):\n", - " result = []\n", - " format = \"%Y-%m-%d %H:%M:%S\"\n", - " for x in xs:\n", - " result.append(pd.to_datetime(x, format = format))\n", - " return result\n", - "\n", - "\n", - "failure_start_time = to_datetime([\"2020-04-18 00:00:00\", \"2020-05-29 23:30:00\", \"2020-06-05 10:00:00\", \"2020-07-15 14:30:00\"] )\n", - "failure_end_time = to_datetime([\"2020-04-18 23:59:00\", \"2020-05-30 06:00:00\", \"2020-06-07 14:30:00\", \"2020-07-15 19:00:00\"] )\n", - "\n", - "print(failure_start_time,\"\\n\", failure_end_time[0].minute)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "KqHsjSKPyFsT", - "metadata": { - "id": "KqHsjSKPyFsT" - }, - "outputs": [], - "source": [ - "def in_between(x, start, end):\n", - "\n", - " start_con = x >= start\n", - " end_con = x<= end\n", - "\n", - " inbetween_con = start_con and end_con\n", - " if inbetween_con:\n", - " return 1\n", - " else:\n", - " return 0" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "oig21csoXP3w", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "oig21csoXP3w", - "outputId": "ddaeae7d-d645-488d-e33d-c13da88cc78e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Found 29954 samples representing failure state\n" - ] - } - ], - "source": [ - "failure_indx = []\n", - "import numpy as np\n", - "for i, (start_time, end_time) in enumerate(zip(failure_start_time, failure_end_time)):\n", - " mask = labeled_data['timestamp'].apply(in_between, start = start_time, end = end_time)\n", - " indx = labeled_data.index[mask == True].tolist()\n", - " failure_indx += indx\n", - "\n", - "\n", - "print(f\" Found {len(failure_indx)} samples representing failure state\")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "b27kdTKUCR_S", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "b27kdTKUCR_S", - "outputId": "f13398b5-d843-4be6-a993-969dc4204fc4" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_6226/4086430353.py:2: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!\n", - "You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.\n", - "A typical example is when you are setting values in a column of a DataFrame, like:\n", - "\n", - "df[\"col\"][row_indexer] = value\n", - "\n", - "Use `df.loc[row_indexer, \"col\"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n", - " labeled_data['status'].iloc[failure_indx] = 1\n", - "/tmp/ipykernel_6226/4086430353.py:2: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " labeled_data['status'].iloc[failure_indx] = 1\n" - ] - } - ], - "source": [ - "#Set the sample with the timestamp falled between the failure time to 1\n", - "labeled_data['status'].iloc[failure_indx] = 1" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "IoSJk9IZmtJR", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "IoSJk9IZmtJR", - "outputId": "0fac4f34-f073-475b-f722-5a093dff0a51" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "We have 29954 positve samples\n" - ] - } - ], - "source": [ - "#Check the number of possitive samples\n", - "print(f\"We have {labeled_data['status'][labeled_data['status']==1].count()} positve samples\" )" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "TROhLWInqqGr", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "TROhLWInqqGr", - "outputId": "69ab8657-212c-401b-ae32-5722b74dee5d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Example of Failure state \n", - " timestamp TP2 TP3 H1 DV_pressure Reservoirs \\\n", - "562564 2020-04-18 00:00:01 -0.018 8.248 8.238 -0.024 8.248 \n", - "562565 2020-04-18 00:00:13 -0.018 8.248 8.238 -0.024 8.248 \n", - "562566 2020-04-18 00:00:24 -0.018 8.248 8.238 -0.024 8.248 \n", - "562567 2020-04-18 00:00:36 -0.018 8.248 8.238 -0.024 8.248 \n", - "562568 2020-04-18 00:00:49 -0.018 8.248 8.238 -0.024 8.248 \n", - "\n", - " Oil_temperature Motor_current COMP DV_eletric Towers MPG LPS \\\n", - "562564 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", - "562565 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", - "562566 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", - "562567 49.45 0.04 0.0 0.0 0.0 0.0 0.0 \n", - "562568 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", - "\n", - " Pressure_switch Oil_level Caudal_impulses status \n", - "562564 1.0 1.0 1.0 1 \n", - "562565 1.0 1.0 1.0 1 \n", - "562566 1.0 1.0 1.0 1 \n", - "562567 0.0 0.0 0.0 1 \n", - "562568 1.0 1.0 1.0 1 \n" - ] - } - ], - "source": [ - "print(f\"Example of Failure state \\n {labeled_data[labeled_data['status']==1].head()}\")" - ] - }, - { - "cell_type": "markdown", - "id": "A8iLUYDTpjfI", - "metadata": { - "id": "A8iLUYDTpjfI" - }, - "source": [ - "## splite the dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "sEyrVfNUsy98", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "sEyrVfNUsy98", - "outputId": "b92e948b-2d88-4c4b-b223-f35a89479d8d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Index: 29954 entries, 562564 to 1172714\n", - "Data columns (total 17 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 timestamp 29954 non-null datetime64[ns]\n", - " 1 TP2 29954 non-null float64 \n", - " 2 TP3 29954 non-null float64 \n", - " 3 H1 29954 non-null float64 \n", - " 4 DV_pressure 29954 non-null float64 \n", - " 5 Reservoirs 29954 non-null float64 \n", - " 6 Oil_temperature 29954 non-null float64 \n", - " 7 Motor_current 29954 non-null float64 \n", - " 8 COMP 29954 non-null float64 \n", - " 9 DV_eletric 29954 non-null float64 \n", - " 10 Towers 29954 non-null float64 \n", - " 11 MPG 29954 non-null float64 \n", - " 12 LPS 29954 non-null float64 \n", - " 13 Pressure_switch 29954 non-null float64 \n", - " 14 Oil_level 29954 non-null float64 \n", - " 15 Caudal_impulses 29954 non-null float64 \n", - " 16 status 29954 non-null int64 \n", - "dtypes: datetime64[ns](1), float64(15), int64(1)\n", - "memory usage: 4.1 MB\n", - "Positive dataset\n", - " None\n", - "\n", - "\n", - "Index: 1486994 entries, 0 to 1516947\n", - "Data columns (total 17 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 timestamp 1486994 non-null datetime64[ns]\n", - " 1 TP2 1486994 non-null float64 \n", - " 2 TP3 1486994 non-null float64 \n", - " 3 H1 1486994 non-null float64 \n", - " 4 DV_pressure 1486994 non-null float64 \n", - " 5 Reservoirs 1486994 non-null float64 \n", - " 6 Oil_temperature 1486994 non-null float64 \n", - " 7 Motor_current 1486994 non-null float64 \n", - " 8 COMP 1486994 non-null float64 \n", - " 9 DV_eletric 1486994 non-null float64 \n", - " 10 Towers 1486994 non-null float64 \n", - " 11 MPG 1486994 non-null float64 \n", - " 12 LPS 1486994 non-null float64 \n", - " 13 Pressure_switch 1486994 non-null float64 \n", - " 14 Oil_level 1486994 non-null float64 \n", - " 15 Caudal_impulses 1486994 non-null float64 \n", - " 16 status 1486994 non-null int64 \n", - "dtypes: datetime64[ns](1), float64(15), int64(1)\n", - "memory usage: 204.2 MB\n", - "Negative dataset\n", - " None\n", - "\n" - ] - } - ], - "source": [ - "#Seperate Positive samples and Negative sample\n", - "pos_data = labeled_data[labeled_data['status'] == 1]\n", - "neg_data = labeled_data[labeled_data['status'] == 0]\n", - "\n", - "#Print out the info of 2 dataset\n", - "print(f\"Positive dataset\\n {pos_data.info()}\\n\")\n", - "print(f\"Negative dataset\\n {neg_data.info()}\\n\")" - ] - }, - { - "cell_type": "markdown", - "id": "U9kT3KI0tbCz", - "metadata": { - "id": "U9kT3KI0tbCz" - }, - "source": [ - "As we can see, we have around 30K postive samples and 1500K negative sample. This indicates highly imbalanced dataset. Thus, we have to subsample the negative class to balance the training data. To achive this, we will randomly sample 30K negative sample from the set of 1500K sample." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "6_vdKBfat9fH", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "6_vdKBfat9fH", - "outputId": "b5b61cdf-5878-48dc-c767-a884f24dbce4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Index: 29954 entries, 1306134 to 1276653\n", - "Data columns (total 17 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 timestamp 29954 non-null datetime64[ns]\n", - " 1 TP2 29954 non-null float64 \n", - " 2 TP3 29954 non-null float64 \n", - " 3 H1 29954 non-null float64 \n", - " 4 DV_pressure 29954 non-null float64 \n", - " 5 Reservoirs 29954 non-null float64 \n", - " 6 Oil_temperature 29954 non-null float64 \n", - " 7 Motor_current 29954 non-null float64 \n", - " 8 COMP 29954 non-null float64 \n", - " 9 DV_eletric 29954 non-null float64 \n", - " 10 Towers 29954 non-null float64 \n", - " 11 MPG 29954 non-null float64 \n", - " 12 LPS 29954 non-null float64 \n", - " 13 Pressure_switch 29954 non-null float64 \n", - " 14 Oil_level 29954 non-null float64 \n", - " 15 Caudal_impulses 29954 non-null float64 \n", - " 16 status 29954 non-null int64 \n", - "dtypes: datetime64[ns](1), float64(15), int64(1)\n", - "memory usage: 4.1 MB\n", - "Negative dataset after subsampling None\n" - ] - } - ], - "source": [ - "n_positives = int(pos_data['status'].count())\n", - "sub_neg_data = neg_data.sample(n_positives, random_state = 42)\n", - "print(f\"Negative dataset after subsampling {sub_neg_data.info()}\")" - ] - }, - { - "cell_type": "markdown", - "id": "yQq9o7quu_ei", - "metadata": { - "id": "yQq9o7quu_ei" - }, - "source": [ - "Now, we merge the postive set and negative set into one" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "_Nmrpj12vIDK", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "_Nmrpj12vIDK", - "outputId": "b6e0ec55-adc9-4a2b-e6f8-0a62297361d9" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Merged dataset\n", - "\n", - "\n", - "Index: 59908 entries, 562564 to 1276653\n", - "Data columns (total 17 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 timestamp 59908 non-null datetime64[ns]\n", - " 1 TP2 59908 non-null float64 \n", - " 2 TP3 59908 non-null float64 \n", - " 3 H1 59908 non-null float64 \n", - " 4 DV_pressure 59908 non-null float64 \n", - " 5 Reservoirs 59908 non-null float64 \n", - " 6 Oil_temperature 59908 non-null float64 \n", - " 7 Motor_current 59908 non-null float64 \n", - " 8 COMP 59908 non-null float64 \n", - " 9 DV_eletric 59908 non-null float64 \n", - " 10 Towers 59908 non-null float64 \n", - " 11 MPG 59908 non-null float64 \n", - " 12 LPS 59908 non-null float64 \n", - " 13 Pressure_switch 59908 non-null float64 \n", - " 14 Oil_level 59908 non-null float64 \n", - " 15 Caudal_impulses 59908 non-null float64 \n", - " 16 status 59908 non-null int64 \n", - "dtypes: datetime64[ns](1), float64(15), int64(1)\n", - "memory usage: 8.2 MB\n" - ] - } - ], - "source": [ - "merged_data = pd.concat([pos_data, sub_neg_data], axis = 0)\n", - "print(f\"Merged dataset\\n\")\n", - "merged_data.info()" - ] - }, - { - "cell_type": "markdown", - "id": "18c5a153-7fb2-4b7d-86d9-a41322313752", - "metadata": { - "id": "18c5a153-7fb2-4b7d-86d9-a41322313752" - }, - "source": [ - "## Valeurs abirrantes" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "7a6abdcd", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "7a6abdcd", - "outputId": "9c9de07f-dfdf-4983-f929-a454d9d21260" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Dropping outliers ...\n", - "\n", - "Found 424 oulier(s) for feature TP3\n", - "Droping 424 from column TP3\n", - "59484 samples left\n", - "\n", - "Found 5 oulier(s) for feature DV_pressure\n", - "Droping 5 from column DV_pressure\n", - "59479 samples left\n", - "\n", - "Found 3 oulier(s) for feature Reservoirs\n", - "Droping 3 from column Reservoirs\n", - "59476 samples left\n", - "\n", - "Found 29 oulier(s) for feature Oil_temperature\n", - "Droping 29 from column Oil_temperature\n", - "59447 samples left\n", - "\n", - "Found 395 oulier(s) for feature LPS\n", - "Skipping .. data has Q1 equals to Q3\n", - "59447 rows left\n", - "\n", - "Found 402 oulier(s) for feature Pressure_switch\n", - "Skipping .. data has Q1 equals to Q3\n", - "59447 rows left\n", - "\n", - "Found 2897 oulier(s) for feature Oil_level\n", - "Skipping .. data has Q1 equals to Q3\n", - "59447 rows left\n", - "\n", - "Found 1948 oulier(s) for feature Caudal_impulses\n", - "Skipping .. data has Q1 equals to Q3\n", - "59447 rows left\n", - "\n", - "Found 2 oulier(s) for feature Oil_temperature\n", - "Droping 2 from column Oil_temperature\n", - "59445 samples left\n", - "\n", - "Found 395 oulier(s) for feature LPS\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 402 oulier(s) for feature Pressure_switch\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 2897 oulier(s) for feature Oil_level\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 1947 oulier(s) for feature Caudal_impulses\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 395 oulier(s) for feature LPS\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 402 oulier(s) for feature Pressure_switch\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 2897 oulier(s) for feature Oil_level\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 1947 oulier(s) for feature Caudal_impulses\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 395 oulier(s) for feature LPS\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 402 oulier(s) for feature Pressure_switch\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 2897 oulier(s) for feature Oil_level\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 1947 oulier(s) for feature Caudal_impulses\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 395 oulier(s) for feature LPS\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 402 oulier(s) for feature Pressure_switch\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 2897 oulier(s) for feature Oil_level\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "Found 1947 oulier(s) for feature Caudal_impulses\n", - "Skipping .. data has Q1 equals to Q3\n", - "59445 rows left\n", - "\n", - "\n", - "Dropping Completed ...\n", - "\n", - "Found 395 oulier(s) for feature LPS\n", - "Found 402 oulier(s) for feature Pressure_switch\n", - "Found 2897 oulier(s) for feature Oil_level\n", - "Found 1947 oulier(s) for feature Caudal_impulses\n" - ] - } - ], - "source": [ - "def investigate_outliers(data, c):\n", - " q1 = data[c].quantile(0.25)\n", - " q3 = data[c].quantile(0.75)\n", - " iqr = q3 - q1\n", - " ll = q1 - 1.5*iqr\n", - " ul = q3 + 1.5*iqr\n", - "\n", - " num_outliers = data[data[c] < ll][c].count() + data[data[c] > ul][c].count()\n", - " if num_outliers>0:\n", - " print(f\"Found {num_outliers} oulier(s) for feature {c}\")\n", - " return {'col': c, 'n_outliers': num_outliers, 'll': ll, 'ul': ul, 'q1': q1, 'q3':q3}\n", - "\n", - "print(\"\\nDropping outliers ...\\n\")\n", - "clean_data = merged_data.copy()\n", - "for i in range(5):\n", - " for c in clean_data.columns:\n", - " if c not in [\"Unnamed: 0\",\"timestamp\"]:\n", - " cue = investigate_outliers(clean_data, c)\n", - " if cue[\"n_outliers\"] > 0 and (cue[\"q1\"]!= cue[\"q3\"]):\n", - " print(f\"Droping {cue['n_outliers']} from column {c}\")\n", - " clean_data = clean_data[clean_data[c]> cue[\"ll\"]]\n", - " clean_data = clean_data[clean_data[c]< cue[\"ul\"]]\n", - " print(f\"{clean_data.shape[0]} samples left\\n\")\n", - " elif (cue[\"q1\"]== cue[\"q3\"]):\n", - " print(\"Skipping .. data has Q1 equals to Q3\")\n", - " print(f\"{clean_data.shape[0]} rows left\\n\")\n", - "\n", - "\n", - "print(\"\\nDropping Completed ...\\n\")\n", - "#Recheck data\n", - "for c in clean_data.columns:\n", - " if c not in [\"Unnamed: 0\",\"timestamp\",\"COMP\", 'status']:\n", - " cue = investigate_outliers(clean_data, c)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "vq_Xju3HwQU-", - "metadata": { - "id": "vq_Xju3HwQU-" - }, - "outputs": [], - "source": [ - "#Investigate the columns with the binary values\n", - "binary_cols = ['LPS', 'Pressure_switch', 'Oil_level', 'Caudal_impulses']\n", - "#Ensure the the binary data is binary\n", - "clean_data[binary_cols] = clean_data[binary_cols].apply(np.round)" - ] - }, - { - "cell_type": "markdown", - "id": "2Q6CWVJHSCiR", - "metadata": { - "id": "2Q6CWVJHSCiR" - }, - "source": [ - "### 7) Summary" - ] - }, - { - "cell_type": "markdown", - "id": "SVt4hpW5SJi-", - "metadata": { - "id": "SVt4hpW5SJi-" - }, - "source": [ - "In summary, prior to undergoing preprocessing, the dataset:\n", - "\n", - "- has unnecessary collumn\n", - "- has columns with wrong format\n", - "- is unlabeled\n", - "- is highly imbalanced\n", - "- has outliers\n", - "\n", - "Thus, throughout the preprocessing and data cleaning phase, we performed the following tasks:\n", - "\n", - "- remove unnecessary column\n", - "- format the timestamp column\n", - "- add column for target variable\n", - "- subsample to balance the dataset\n", - "- find and drop all outliers\n", - "\n", - "According to its documentation, the following preprocessing steps have been conducted before publishing the data, so we do not apply it in our work:\n", - "\n", - "- Data segmentation\n", - "- Normalization\n", - "- Feature Extraction" - ] - }, - { - "cell_type": "markdown", - "id": "AcoWfkxg3US9", - "metadata": { - "id": "AcoWfkxg3US9" - }, - "source": [ - "## III. Exploratory Data Analysis" - ] - }, - { - "cell_type": "markdown", - "id": "fiQbhtDt6bAB", - "metadata": { - "id": "fiQbhtDt6bAB" - }, - "source": [ - "### 1) Correlation" - ] - }, - { - "cell_type": "markdown", - "id": "OA6ITWCb7A8y", - "metadata": { - "id": "OA6ITWCb7A8y" - }, - "source": [ - "Describing the correlation between the features, the values closer to 1 or -1 represent a stronger relation." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "i9T0eAlo6-zg", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 606 - }, - "id": "i9T0eAlo6-zg", - "outputId": "aa9b7264-a06b-4617-88fb-1ac0a52b42e0" - }, - "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", - " \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", - " \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", - "
timestampTP2TP3H1DV_pressureReservoirsOil_temperatureMotor_currentCOMPDV_eletricTowersMPGLPSPressure_switchOil_levelCaudal_impulsesstatus
timestamp1.000.08-0.15-0.090.03-0.150.350.13-0.100.09-0.05-0.090.08-0.01-0.350.240.08
TP20.081.00-0.42-0.980.81-0.420.740.87-0.980.98-0.52-0.970.060.000.190.140.83
TP3-0.15-0.421.000.54-0.551.00-0.28-0.170.49-0.480.270.48-0.180.01-0.14-0.13-0.55
H1-0.09-0.980.541.00-0.830.54-0.73-0.840.99-0.990.540.99-0.070.01-0.20-0.15-0.86
DV_pressure0.030.81-0.55-0.831.00-0.550.730.72-0.830.83-0.45-0.83-0.050.020.210.170.92
Reservoirs-0.15-0.421.000.54-0.551.00-0.28-0.170.49-0.480.270.48-0.180.01-0.14-0.13-0.55
Oil_temperature0.350.74-0.28-0.730.73-0.281.000.79-0.750.76-0.41-0.750.100.020.100.110.81
Motor_current0.130.87-0.17-0.840.72-0.170.791.00-0.870.87-0.47-0.870.060.000.140.100.74
COMP-0.10-0.980.490.99-0.830.49-0.75-0.871.00-0.990.551.00-0.070.07-0.17-0.12-0.86
DV_eletric0.090.98-0.48-0.990.83-0.480.760.87-0.991.00-0.53-0.990.070.030.190.140.86
Towers-0.05-0.520.270.54-0.450.27-0.41-0.470.55-0.531.000.55-0.040.09-0.07-0.04-0.47
MPG-0.09-0.970.480.99-0.830.48-0.75-0.871.00-0.990.551.00-0.070.06-0.15-0.10-0.85
LPS0.080.06-0.18-0.07-0.05-0.180.100.06-0.070.07-0.04-0.071.000.010.020.020.08
Pressure_switch-0.010.000.010.010.020.010.020.000.070.030.090.060.011.000.200.260.02
Oil_level-0.350.19-0.14-0.200.21-0.140.100.14-0.170.19-0.07-0.150.020.201.000.120.22
Caudal_impulses0.240.14-0.13-0.150.17-0.130.110.10-0.120.14-0.04-0.100.020.260.121.000.18
status0.080.83-0.55-0.860.92-0.550.810.74-0.860.86-0.47-0.850.080.020.220.181.00
\n", - "
" - ], - "text/plain": [ - " timestamp TP2 TP3 H1 DV_pressure Reservoirs \\\n", - "timestamp 1.00 0.08 -0.15 -0.09 0.03 -0.15 \n", - "TP2 0.08 1.00 -0.42 -0.98 0.81 -0.42 \n", - "TP3 -0.15 -0.42 1.00 0.54 -0.55 1.00 \n", - "H1 -0.09 -0.98 0.54 1.00 -0.83 0.54 \n", - "DV_pressure 0.03 0.81 -0.55 -0.83 1.00 -0.55 \n", - "Reservoirs -0.15 -0.42 1.00 0.54 -0.55 1.00 \n", - "Oil_temperature 0.35 0.74 -0.28 -0.73 0.73 -0.28 \n", - "Motor_current 0.13 0.87 -0.17 -0.84 0.72 -0.17 \n", - "COMP -0.10 -0.98 0.49 0.99 -0.83 0.49 \n", - "DV_eletric 0.09 0.98 -0.48 -0.99 0.83 -0.48 \n", - "Towers -0.05 -0.52 0.27 0.54 -0.45 0.27 \n", - "MPG -0.09 -0.97 0.48 0.99 -0.83 0.48 \n", - "LPS 0.08 0.06 -0.18 -0.07 -0.05 -0.18 \n", - "Pressure_switch -0.01 0.00 0.01 0.01 0.02 0.01 \n", - "Oil_level -0.35 0.19 -0.14 -0.20 0.21 -0.14 \n", - "Caudal_impulses 0.24 0.14 -0.13 -0.15 0.17 -0.13 \n", - "status 0.08 0.83 -0.55 -0.86 0.92 -0.55 \n", - "\n", - " Oil_temperature Motor_current COMP DV_eletric Towers \\\n", - "timestamp 0.35 0.13 -0.10 0.09 -0.05 \n", - "TP2 0.74 0.87 -0.98 0.98 -0.52 \n", - "TP3 -0.28 -0.17 0.49 -0.48 0.27 \n", - "H1 -0.73 -0.84 0.99 -0.99 0.54 \n", - "DV_pressure 0.73 0.72 -0.83 0.83 -0.45 \n", - "Reservoirs -0.28 -0.17 0.49 -0.48 0.27 \n", - "Oil_temperature 1.00 0.79 -0.75 0.76 -0.41 \n", - "Motor_current 0.79 1.00 -0.87 0.87 -0.47 \n", - "COMP -0.75 -0.87 1.00 -0.99 0.55 \n", - "DV_eletric 0.76 0.87 -0.99 1.00 -0.53 \n", - "Towers -0.41 -0.47 0.55 -0.53 1.00 \n", - "MPG -0.75 -0.87 1.00 -0.99 0.55 \n", - "LPS 0.10 0.06 -0.07 0.07 -0.04 \n", - "Pressure_switch 0.02 0.00 0.07 0.03 0.09 \n", - "Oil_level 0.10 0.14 -0.17 0.19 -0.07 \n", - "Caudal_impulses 0.11 0.10 -0.12 0.14 -0.04 \n", - "status 0.81 0.74 -0.86 0.86 -0.47 \n", - "\n", - " MPG LPS Pressure_switch Oil_level Caudal_impulses \\\n", - "timestamp -0.09 0.08 -0.01 -0.35 0.24 \n", - "TP2 -0.97 0.06 0.00 0.19 0.14 \n", - "TP3 0.48 -0.18 0.01 -0.14 -0.13 \n", - "H1 0.99 -0.07 0.01 -0.20 -0.15 \n", - "DV_pressure -0.83 -0.05 0.02 0.21 0.17 \n", - "Reservoirs 0.48 -0.18 0.01 -0.14 -0.13 \n", - "Oil_temperature -0.75 0.10 0.02 0.10 0.11 \n", - "Motor_current -0.87 0.06 0.00 0.14 0.10 \n", - "COMP 1.00 -0.07 0.07 -0.17 -0.12 \n", - "DV_eletric -0.99 0.07 0.03 0.19 0.14 \n", - "Towers 0.55 -0.04 0.09 -0.07 -0.04 \n", - "MPG 1.00 -0.07 0.06 -0.15 -0.10 \n", - "LPS -0.07 1.00 0.01 0.02 0.02 \n", - "Pressure_switch 0.06 0.01 1.00 0.20 0.26 \n", - "Oil_level -0.15 0.02 0.20 1.00 0.12 \n", - "Caudal_impulses -0.10 0.02 0.26 0.12 1.00 \n", - "status -0.85 0.08 0.02 0.22 0.18 \n", - "\n", - " status \n", - "timestamp 0.08 \n", - "TP2 0.83 \n", - "TP3 -0.55 \n", - "H1 -0.86 \n", - "DV_pressure 0.92 \n", - "Reservoirs -0.55 \n", - "Oil_temperature 0.81 \n", - "Motor_current 0.74 \n", - "COMP -0.86 \n", - "DV_eletric 0.86 \n", - "Towers -0.47 \n", - "MPG -0.85 \n", - "LPS 0.08 \n", - "Pressure_switch 0.02 \n", - "Oil_level 0.22 \n", - "Caudal_impulses 0.18 \n", - "status 1.00 " - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "clean_data.corr().round(2)" - ] - }, - { - "cell_type": "markdown", - "id": "4AC8dXfm7IhS", - "metadata": { - "id": "4AC8dXfm7IhS" - }, - "source": [ - "We can see that our target variable \"status\" has high correlation with TP2, H1, DV_pressure, Oil_temparature, Motor_current, COMP, DV_electric and MPG. " - ] - }, - { - "cell_type": "markdown", - "id": "2qVh_sbv6fm0", - "metadata": { - "id": "2qVh_sbv6fm0" - }, - "source": [ - "## Correlation" - ] - }, - { - "cell_type": "markdown", - "id": "f2PO54CY7nwo", - "metadata": { - "id": "f2PO54CY7nwo" - }, - "source": [ - "Below shows a Heat map,which can be used to analyse trends, from the below heat map you can see the trends in correlation of data." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "aQrZeZUl7rBm", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 610 - }, - "id": "aQrZeZUl7rBm", - "outputId": "65c08aac-44e7-414c-aebc-5db06f84b7f6" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "sns.heatmap(clean_data.corr().round(2),annot=False )" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "hO6oX3xs8crF", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 82 - }, - "id": "hO6oX3xs8crF", - "outputId": "890a7941-e6f0-4623-8d7f-61c8ab593db7" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAACwoAAAC0CAYAAACO0zr8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAAsTAAALEwEAmpwYAACbJklEQVR4nOz9ebBt6Xnf933fd417OvO58+0BPaDRAAkCBAnKkiXIkixqMClHCoeUShWHZbrKkSopq1SRKpGsoiqVOK5ylSIxtikxdjEuiwJli0EkJIxKg2U5AEWA4AA00I2e+87nnnFPa3zf/LHWPmef27fv1Pc0ep/+fap23b3XXsO713reYd/z7HcZ7z0iIiIiIiIiIiIiIiIiIiIiIiIiIiJyutjvdQFERERERERERERERERERERERERERETk8VOisIiIiIiIiIiIiIiIiIiIiIiIiIiIyCmkRGEREREREREREREREREREREREREREZFTSInCIiIiIiIiIiIiIiIiIiIiIiIiIiIip5AShUVERERERERERERERERERERERERERE6hhUsU/tEf/VEP6KHH9/Lx0BS3enwIHg9NcavHh+Dx0BS3enwIHg9NcavHh+Dx0BS3enwIHg9NcavHh+Dx0BS3enwIHg9NcavHh+Dx0BS3enwIHg9NcavHh+Dx0BS3enwIHg9NcavHh+DxSBS7enyPH49EcavH9/jxSBS3enwIHg9k4RKFb9++/b0ugshDU9zKIlLcyiJS3MoiUtzKIlLcyiJS3MoiUtzKIlLcyiJS3MoiUtzKIlLcyiJS3MqiUuzKIlLcyiJS3MqiWLhEYREREREREREREREREREREREREREREbm/E0sUNsb8340xt4wx33yP940x5v9qjHnVGPM7xpjPnlRZREREREREREREREREREREREREREREPmrCE9z3fw38beCX3uP9PwY81z4+D/zn7b+P7Je++go727C2Dn/uR56/7/pZWVM5T2gNaRS8n0N/6GVlze4455tXdrm9O2Y8hgqIHcQWnG9eWwO0yyoPORABgYH2LRzgffPaAhjwQODBGah9s5+oPfa0hjqAxENpIG3XDdvtnAdjYOqaffXa5dMafNCs6w2Ydj3fHod2P4GBMRB7SNr3KwNhu13Zlte2+4Wm4NY1x7btNgQQdOHZc6u8eHn1A4mLrKy5eTDh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REROISUKi4iIiIiIiIiIiIiIiIiIiIiIiIiInEJKFBYRERERERERERERERERERERERERETmFlCgsIiIiIiIiIiIiIiIiIiIiIiIiIiJyCilRWERERERERERERERERERERERERERE5BRSorCIiIiIiIiIiIiIiIiIiIiIiIiIiMgppERhERERERERERERERERERERERERERGRU0iJwiIiIiIiIiIiIiIiIiIiIiIiIiIiIqeQEoVFREREREREREREREREREREREREREROISUKi4iIiIiIiIiIiIiIiIiIiIiIiIiInEJKFBYRERERERERERERERERERERERERETmFlCgsIiIiIiIiIiIiIiIiIiIiIiIiIiJyCilRWERERERERERERERERERERERERERE5BQ60URhY8yPGmNeNsa8aoz5y3d5/wljzD83xnzDGPM7xpg/fpLlERERERERERERERERERERERERERER+ag4sURhY0wA/Dzwx4AXgZ82xrx4x2r/B+CL3vvPAD8F/N9OqjwiIiIiIiIiIiIiIiIiIiIiIiIiIiIfJSc5o/APA69671/33hfALwM/fsc6Hlhqny8D106wPCIiIiIiIiIiIiIiIiIiIiIiIiIiIh8ZJ5kofBF4Z+71lXbZvL8O/FljzBXgy8BfuNuOjDE/a4z5mjHma1tbWydRVpHHTnEri0hxK4tIcSuLSHEri0hxK4tIcSuLSHEri0hxK4tIcSuLSHEri0hxK4tIcSuLSrEri0hxK4tIcSuL6CQThR/ETwP/tff+EvDHgf+HMeZdZfLe/4L3/nPe+89tbm5+4IUUeRSKW1lEiltZRIpbWUSKW1lEiltZRIpbWUSKW1lEiltZRIpbWUSKW1lEiltZRIpbWVSKXVlEiltZRIpbWUQnmSh8Fbg89/pSu2zezwBfBPDefwVIgY0TLJOIiIiIiIiIiIiIiIiIiIiIiIiIiMhHwkkmCv8G8Jwx5mljTAz8FPClO9Z5G/hDAMaYT9AkCms+bhERERERERERERERERERERERERERkffpxBKFvfcV8OeBXwO+DXzRe/8tY8zPGWN+rF3tLwL/vjHmt4G/B/wvvff+pMokIiIiIiIiIiIiIiIiIiIiIiIiIiLyURGe5M69918GvnzHsr829/wl4PeeZBlEREREREREREREREREREREREREREQ+ik5sRmERERERERERERERERERERERERERERH53lGisIiIiIiIiIiIiIiIiIiIiIiIiIiIyCmkRGEREREREREREREREREREREREREREZFTSInCIiIiIiIiIiIiIiIiIiIiIiIiIiIip5AShUVERERERERERERERERERERERERERE4hJQqLiIiIiIiIiIiIiIiIiIiIiIiIiIicQkoUFhEREREREREREREREREREREREREROYWUKCwiIiIiIiIiIiIiIiIiIiIiIiIiInIKKVFYRERERERERERERERERERERERERETkFFKisIiIiIiIiIiIiIiIiIiIiIiIiIiIyCmkRGEREREREREREREREREREREREREREZFTSInCIiIiIiIiIiIiIiIiIiIiIiIiIiIip5AShUVERERERERERERERERERERERERERE4hJQqLiIiIiIiIiIiIiIiIiIiIiIiIiIicQkoUFhEREREREREREREREREREREREREROYVONFHYGPOjxpiXjTGvGmP+8nus8xPGmJeMMd8yxvy3J1keERERERERERERERERERERERERERGRj4rwpHZsjAmAnwf+CHAF+A1jzJe89y/NrfMc8FeA3+u93zXGnDmp8oiIiIiIiIiIiIiIiIiIiIiIiIiIiHyUnOSMwj8MvOq9f917XwC/DPz4Hev8+8DPe+93Abz3t06wPCIiIiIiIiIiIiIiIiIiIiIiIiIiIh8ZD50obIxZNcZ8/wOsehF4Z+71lXbZvOeB540x/5Mx5qvGmB99j2P+rDHma8aYr21tbT1skUW+JxS3sogUt7KIFLeyiBS3sogUt7KIFLeyiBS3sogUt7KIFLeyiBS3sogUt7KIFLeyqBS7sogUt7KIFLeyiB4oUdgY8y+MMUvGmDXgN4G/Y4z5zx7D8UPgOeALwE+3+125cyXv/S947z/nvf/c5ubmYzisyMlT3MoiUtzKIlLcyiJS3MoiUtzKIlLcyiJS3MoiUtzKIlLcyiJS3MoiUtzKIlLcyqJS7MoiUtzKIlLcyiJ60BmFl733B8D/DPgl7/3ngT98n22uApfnXl9ql827AnzJe196798AXqFJHBYREREREREREREREREREREREREREZH34UEThUNjzHngJ4B/9IDb/AbwnDHmaWNMDPwU8KU71vlVmtmEMcZsAM8Drz/g/kVEREREREREREREREREREREREREROQ9PGii8M8Bvwa86r3/DWPMx4Dv3msD730F/Pl2u28DX/Tef8sY83PGmB9rV/s1YNsY8xLwz4G/5L3ffpQPIiIiIiIiIiIiIiIiIiIiIiIiIiIiIkfCB1nJe/8rwK/MvX4d+NMPsN2XgS/fseyvzT33wH/UPkREREREREREREREREREREREREREROQxeaBEYWPMfwX4O5d77/9Xj71EIiIiIiIiIiIiIiIiIiIiIiIiIiIi8r49UKIw8I/mnqfAvwtce/zFERERERERERERERERERERERERERERkcfhgRKFvff/3fxrY8zfA/7ViZRIRERERERERERERERERERERERERERE3jf7iNs9B5x5nAURERERERERERERERERERERERERERGRx+eBZhQ2xgwBP7foBvC/O5ESiYiIiIiIiIiIiIiIiIiIiIiIiIiIyPv2QInC3vvBSRdEREREREREREREREREREREREREREREHh/7ICsZY/7pgywTERERERERERERERERERERERERERGRD4d7zihsjEmBLrBhjFkFTPvWEnDxhMsmIiIiIiIiIiIiIiIiIiIiIiIiIiIij+ieicLAfwD8b4ELwNc5ShQ+AP72yRVLRERERERERERERERERERERERERERE3o97Jgp77/8m8DeNMX/Be/+3PqAyiYiIiIiIiIiIiIiIiIiIiIiIiIiIyPt0vxmFAfDe/y1jzKeAF4F0bvkvnVTBRERERERERERERERERERERERERERE5NE9UKKwMeY/Br5Akyj8ZeCPAf8KUKKwiIiIiIiIiIiIiIiIiIiIiIiIiIjIh5B9wPX+DPCHgBve+38P+DSwfGKlEhERERERERERERERERERERERERERkfflQROFp957B1TGmCXgFnD55IolIiIiIiIiIiIiIiIiIiIiIiIiIiIi70f4gOt9zRizAvwd4OvACPjKSRVKRERERERERERERERERERERERERERE3p8HShT23v+H7dP/whjz/wGWvPe/c3LFEhERERERERERERERERERERERERERkffDPshKxph/OnvuvX/Te/8788vusd2PGmNeNsa8aoz5y/dY708bY7wx5nMPVmwRERERERERERERERERERERERERERG5l3vOKGyMSYEusGGMWQVM+9YScPE+2wbAzwN/BLgC/IYx5kve+5fuWG8A/G+AX3+kTyAiIiIiIiIiIiIiIiIiIiIiIiIiIiLvcr8Zhf8D4OvAC+2/Xwe+Bvw/gb91n21/GHjVe/+6974Afhn48bus9zeA/wTIHqLcIiIiIiIiIiIiIiIiIiIiIiIiIiIicg/3TBT23v9N7/3TwP8R+IH2+X8FvA585T77vgi8M/f6CnfMQmyM+Sxw2Xv/j++1I2PMzxpjvmaM+drW1tZ9Divy4aC4lUWkuJVFpLiVRaS4lUWkuJVFpLiVRaS4lUWkuJVFpLiVRaS4lUWkuJVFpLiVRaXYlUWkuJVFpLiVRXS/GYVn/oz3/sAY8/uAfwv4u8B//n4ObIyxwH8G/MX7reu9/wXv/ee895/b3Nx8P4cV+cAobmURKW5lESluZREpbmURKW5lESluZREpbmURKW5lESluZREpbmURKW5lESluZVEpdmURKW5lESluZRE9aKJw3f77J4C/084AHN9nm6vA5bnXl9plMwPgU8C/MMa8CfwI8CVjzOcesEwiIiIiIiIiIiIiIiIiIiIiIiIiIiLyHh40UfiqMea/BH4S+LIxJnmAbX8DeM4Y87QxJgZ+CvjS7E3v/b73fsN7/5T3/ingq8CPee+/9tCfQkRERERERERERERERERERERERERERI550EThnwB+Dfij3vs9YA34S/fawHtfAX++3e7bwBe9998yxvycMebHHr3IIiIiIiIiIiIiIiIiIiIiIiIiIiIicj/hg6zkvZ8A//3c6+vA9QfY7svAl+9Y9tfeY90vPEhZRERERERERERERERERERERERERERE5P4edEZhERERERERERERERERERERERERERERWSBKFBYRERERERERERERERERERERERERETmFlCgsIiIiIiIiIiIiIiIiIiIiIiIiIiJyCilRWERERERERERERERERERERERERERE5BRSorCIiIiIiIiIiIiIiIiIiIiIiIiIiMgppERhERERERERERERERERERERERERERGRU0iJwiIiIiIiIiIiIiIiIiIiIiIiIiIiIqeQEoVFREREREREREREREREREREREREREROISUKi4iIiIiIiIiIiIiIiIiIiIiIiIiInEJKFBYRERERERERERERERERERERERERETmFlCgsIiIiIiIiIiIiIiIiIiIiIiIiIiJyCilRWERERERERERERERERERERERERERE5BRSorCIiIiIiIiIiIiIiIiIiIiIiIiIiMgppERhERERERERERERERERERERERERERGRU0iJwiIiIiIiIiIiIiIiIiIiIiIiIiIiIqfQiSYKG2N+1BjzsjHmVWPMX77L+/+RMeYlY8zvGGP+qTHmyZMsj4iIiIiIiIiIiIiIiIiIiIiIiIiIyEfFiSUKG2MC4OeBPwa8CPy0MebFO1b7BvA57/33A/8A+L+cVHlEREREREREREREREREREREREREREQ+Sk5yRuEfBl713r/uvS+AXwZ+fH4F7/0/995P2pdfBS6dYHlEREREREREREREREREREREREREREQ+Mk4yUfgi8M7c6yvtsvfyM8D/+25vGGN+1hjzNWPM17a2th5jEUVOjuJWFpHiVhaR4lYWkeJWFpHiVhaR4lYWkeJWFpHiVhaR4lYWkeJWFpHiVhaR4lYWlWJXFpHiVhaR4lYW0UkmCj8wY8yfBT4H/Kd3e997/wve+8957z+3ubn5wRZO5BEpbmURKW5lESluZREpbmURKW5lESluZREpbmURKW5lESluZREpbmURKW5lESluZVEpdmURKW5lESluZRGFJ7jvq8DludeX2mXHGGP+MPC/B/6A9z4/wfKIiIiIiIiIiIiIiIiIiIiIiIiIiIh8ZJzkjMK/ATxnjHnaGBMDPwV8aX4FY8xngP8S+DHv/a0TLIuIiIiIiIiIiIiIiIiIiIiIiIiIiMhHyoklCnvvK+DPA78GfBv4ovf+W8aYnzPG/Fi72n8K9IFfMcb8ljHmS++xOxEREREREREREREREREREREREREREXkI4Unu3Hv/ZeDLdyz7a3PP//BJHl9EREREREREREREREREREREREREROSj6sRmFBYREREREREREREREREREREREREREZHvHSUKi4iIiIiIiIiIiIiIiIiIiIiIiIiInEJKFBYRERERERERERERERERERERERERETmFlCgsIiIiIiIiIiIiIiIiIiIiIiIiIiJyCilRWERERERERERERERERERERERERERE5BRSorCIiIiIiIiIiIiIiIiIiIiIiIiIiMgppERhERERERERERERERERERERERERERGRU0iJwiIiIiIiIiIiIiIiIiIiIiIiIiIiIqeQEoVFRERERERE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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "sns.pairplot(clean_data, y_vars = ['status'] , plot_kws= {'alpha' : 0.1})" - ] - }, - { - "cell_type": "markdown", - "id": "9-5BlC1J-hyP", - "metadata": { - "id": "9-5BlC1J-hyP" - }, - "source": [ - "Drawing box plot to find outliers, I plot it on scale data so it is easier to visualize different features' range.\n", - "As we can see our preprocessing function work perfectly that leaves no outliers\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "4cbe88db", - "metadata": {}, - "outputs": [], - "source": [ - "clean_data.to_csv('RailGuadrs_Clean_Data.csv')\n", - "np.savez(\"RailGuadrs_Clean_Data.npz\", clean_data.to_numpy())" - ] - }, - { - "cell_type": "markdown", - "id": "a5967a34", - "metadata": {}, - "source": [ - "# Models\n" - ] - }, - { - "cell_type": "markdown", - "id": "345dacd5", - "metadata": {}, - "source": [ - "## LinearRegression" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "b3b380bd", - "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", - " \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", - "
TP2TP3H1DV_pressureReservoirsOil_temperatureMotor_currentCOMPDV_eletricTowersMPGLPSPressure_switchOil_levelCaudal_impulses
0-0.0188.2488.238-0.0248.24849.4500.04001.00.01.01.00.01.01.01.0
1-0.0188.2488.238-0.0248.24849.4500.04001.00.01.01.00.01.01.01.0
2-0.0188.2488.238-0.0248.24849.4500.04001.00.01.01.00.01.01.01.0
3-0.0188.2488.238-0.0248.24849.4500.04000.00.00.00.00.00.00.00.0
4-0.0188.2488.238-0.0248.24849.4500.04001.00.01.01.00.01.01.01.0
................................................
59440-0.0128.4848.466-0.0148.48858.1750.03251.00.01.01.00.01.01.01.0
59441-0.0109.1809.166-0.0189.18263.6500.04251.00.01.01.00.01.00.01.0
594427.7628.610-0.0040.5788.61077.8505.57000.01.01.00.00.01.01.01.0
59443-0.0148.7708.756-0.0168.77455.8250.03501.00.01.01.00.01.01.01.0
59444-0.0148.6068.596-0.0208.60864.1750.04251.00.01.01.00.01.01.01.0
\n", - "

59445 rows × 15 columns

\n", - "
" - ], - "text/plain": [ - " TP2 TP3 H1 DV_pressure Reservoirs Oil_temperature \\\n", - "0 -0.018 8.248 8.238 -0.024 8.248 49.450 \n", - "1 -0.018 8.248 8.238 -0.024 8.248 49.450 \n", - "2 -0.018 8.248 8.238 -0.024 8.248 49.450 \n", - "3 -0.018 8.248 8.238 -0.024 8.248 49.450 \n", - "4 -0.018 8.248 8.238 -0.024 8.248 49.450 \n", - "... ... ... ... ... ... ... \n", - "59440 -0.012 8.484 8.466 -0.014 8.488 58.175 \n", - "59441 -0.010 9.180 9.166 -0.018 9.182 63.650 \n", - "59442 7.762 8.610 -0.004 0.578 8.610 77.850 \n", - "59443 -0.014 8.770 8.756 -0.016 8.774 55.825 \n", - "59444 -0.014 8.606 8.596 -0.020 8.608 64.175 \n", - "\n", - " Motor_current COMP DV_eletric Towers MPG LPS Pressure_switch \\\n", - "0 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", - "1 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", - "2 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", - "3 0.0400 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "4 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", - "... ... ... ... ... ... ... ... \n", - "59440 0.0325 1.0 0.0 1.0 1.0 0.0 1.0 \n", - "59441 0.0425 1.0 0.0 1.0 1.0 0.0 1.0 \n", - "59442 5.5700 0.0 1.0 1.0 0.0 0.0 1.0 \n", - "59443 0.0350 1.0 0.0 1.0 1.0 0.0 1.0 \n", - "59444 0.0425 1.0 0.0 1.0 1.0 0.0 1.0 \n", - "\n", - " Oil_level Caudal_impulses \n", - "0 1.0 1.0 \n", - "1 1.0 1.0 \n", - "2 1.0 1.0 \n", - "3 0.0 0.0 \n", - "4 1.0 1.0 \n", - "... ... ... \n", - "59440 1.0 1.0 \n", - "59441 0.0 1.0 \n", - "59442 1.0 1.0 \n", - "59443 1.0 1.0 \n", - "59444 1.0 1.0 \n", - "\n", - "[59445 rows x 15 columns]" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_regression = pd.read_csv('RailGuadrs_Clean_Data.csv')\n", - "X = data_regression.iloc[:, 2:-1]\n", - "y = data_regression.iloc[:, -1]\n", - "X" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "8f31d383", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 1\n", - "1 1\n", - "2 1\n", - "3 1\n", - "4 1\n", - " ..\n", - "59440 0\n", - "59441 0\n", - "59442 0\n", - "59443 0\n", - "59444 0\n", - "Name: status, Length: 59445, dtype: int64" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "5b2d317e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(47556, 15) (11889, 15)\n" - ] - } - ], - "source": [ - "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n", - "print(X_train.shape, X_test.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "639c096d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
LogisticRegression(max_iter=10000)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" - ], - "text/plain": [ - "LogisticRegression(max_iter=10000)" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sklearn.preprocessing import StandardScaler\n", - "\n", - "\n", - "model_regression = LogisticRegression(max_iter=10000)\n", - "model_regression.fit(X_train, y_train)" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "5fb9ce49", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Index(['TP2', 'TP3', 'H1', 'DV_pressure', 'Reservoirs', 'Oil_temperature',\n", - " 'Motor_current', 'COMP', 'DV_eletric', 'Towers', 'MPG', 'LPS',\n", - " 'Pressure_switch', 'Oil_level', 'Caudal_impulses'],\n", - " dtype='object')\n", - "the coef of the model are : [[-0.34029583 0.04752702 -0.51335437 2.81933098 -0.17156532 0.41909646\n", - " -0.59126663 -2.45293933 -4.17565773 -0.11894046 -1.94093116 1.97198215\n", - " -0.82258566 1.53886918 1.16074698]]\n", - "the intercept is : [-23.28106631]\n" - ] - } - ], - "source": [ - "print(X_train.columns)\n", - "print(f\"the coef of the model are : {model_regression.coef_}\")\n", - "print(f\"the intercept is : {model_regression.intercept_}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "4fdb44dc", - "metadata": {}, - "outputs": [], - "source": [ - "y_pred = model_regression.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "id": "22607d7b", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "confusion_matrix = ConfusionMatrixDisplay.from_predictions(y_test, y_pred)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "af2a76f5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "the accuracy is 0.9851964000336445\n", - " precision recall f1-score support\n", - "\n", - " 0 0.99 0.98 0.99 6026\n", - " 1 0.98 0.99 0.99 5863\n", - "\n", - " accuracy 0.99 11889\n", - " macro avg 0.99 0.99 0.99 11889\n", - "weighted avg 0.99 0.99 0.99 11889\n", - "\n" - ] - } - ], - "source": [ - "print(f'the accuracy is {accuracy_score(y_test, y_pred)}')\n", - "print(classification_report(y_test, y_pred))" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "7852ca2d", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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T3VOeOHChadWgZNQp04dHn/8cTp06EDRokVp1KgRbre10nzkyJEMHz6cHj16MGHCBPr168dPP/0EQPfu3enevTsLFizgqaeeCoSHwuPxMHLkSP766y8uuOAC7r//fl555RX+7//+LxAnYztXqFCB7du3U7p0aZYtW8Z1113H2rVrKV68eLb1KVu2LH///feZNkuhw+k3yloRuQlwi0hNEXkP+O1kifIr4vGiLlCjEPMEn0/Zs+dYYNFFRISLuLiyVKtWMmzKEEjX03G73Xi93sCxX3GpKnFxcaxYsYIVK1awevVqfvzxRwBmzpzJfffdx/Lly7nkkksC6bPLNzcYNmxYYPFF8J9/aDaYSpUqsWPHCZekO3fupFKlSpniAXz++ed89913fP311yEVV2xsbDqLQ7Nnz+bw4cPUr1+fatWqsWjRIsaOHQtA6dKlOXToULr0R48epWTJksTFxbFs2bIc1fWKK64IWddQCim4rl6vl4SEBEqXLp0pXr9+/Vi2bBkLFiygVKlS1KpVC7AWyFx//fUA/O9//wssqgmmVatW/Pvvvxw4cCDLtl2xYgUANWrUQETo1atXut5mqHaOjo4OyNqkSRNq1KiRo0VGycnJxMaa91hGnH6r3A/EASnAN1huoAY5XKZjuDxplnHvKDNk6jQpKV7WrdvPzp1H2LXrWCA8nIrwVLjooovYv38/v//+O2B9/a9duxafz8eOHTu48soree2110hISODYsWNZ5nPFFVcwdepUEhMTOX78OFOmTMk0JNaqVSvGjx9PWloau3fvZt68eSHzGjx4cEBBB/9lHC4F6NixIz/++COHDh3i0KFD/Pjjj3Ts2DFTvB9++IHXX3+d6dOnB+bXMlKrVq10veixY8cyevRotm7dytatW9myZQtz5swhMTGRVq1aMX369MBw5+TJk2nYsCFut5u2bduSkpLCxx9/HMhr1apVIXuDCxcuDFnXjMOlAN26dQus9Jw4cSJt27YNqdj37dsHwPbt25k8eTI33WQ54KlYsSK//PILAHPnzqVmTcun5ubNm/0LC1m+fDkpKSmULl06y7atVKkS69atC2yMnzNnDnXq1Mm2nffv309aWhoA//77L5s2beKCCy4IeR2C2bhxI/Xq1TtpvLMNp4dMa6vqUGCow+XkCS6vD3UrEmkUolMcO5bKk0/+TOfOJTnvvNLExEQEvFQUJKKiopg4cSIPPPAACQkJeL1eBg0aRK1atbjllltISEhAVXnggQcoWbJklvk0btyY2267LTDX079//3TDpWANy82dO5e6detSpUoVWrZsecbyn3vuuTz11FNccsklADz99NOBRSD9+/fn7rvvpmnTpgwcOJCUlJTA0HCLFi348MMP0+VVtGhRatSowebNm6lYsSI//PBDujhFixbl8ssvZ8aMGfTu3ZuBAwdy+eWXIyKULVuW0aNHA9aw6ZQpUxg0aBCvvfYaMTExVKtWLd0WiNOhX79+9OnThwsvvJBzzz03sMhp165d9O/fn1mzLB8DPXr0ID4+nsjISEaMGBG4bqNGjeLBBx/E6/USExMTUNiTJk3iiy++IDIyktjYWMaPH4+IZNu2zzzzDK1atSIyMpKqVavy+eefA2TZzgsWLODpp58mMjISl8vFhx9+GMjrscce45tvviExMZHKlSvTv3//wOKhX3/9NfDbcALxf8E4krnIPCznvROB8aq6xrHCckDTpk116dLTd5m4olE9ltfxEt35YW7uMyAXJTMA/PjjPwwYMINt2xL4/vsO1K8fR4UKxYwRhELAlClTWLZsWbqVpobw8Ndff/HWW2/x5Zdfhjy/fv36QM/Uj4gsU9WmeSFfOHG0h6iqV4pIeSxnwR+JSHEsxVggnwq33UN0myHTXOfPP3fSseNXADRuXIEKFYpRqVL2CwMMBYfu3bsTH1/gHd4UCg4cOMALL7wQbjHyJY5PyKjqHlV9F7gbWAGE9GmY31FVIryKuCEipmi4xSl0NGtWiV694nj11Xb8+Wd/oow3kUJH//79wy2CAWvfY7Vq1cItRr7EUYUoInVE5FkRWQ34V5hWdrJMx/B4AFCX4o42CvFM2bPnGDfcMJE1a6yFCiLCuHE9ePzxywvMwhmDwVC4cHpRzafAeKCjqu5yuCxHUVshiluJNArxtFFVxoxZyUMPzebw4WQOHEjkp59uBYylfYPBEF6cnkM88+Vu+QRfaioA4lIiYo1CPB22bj3MgAEzmDPnXwCuvvpCPvywy0lSGQwGQ97giEIUkQmq2sseKg1exiqAqmoDJ8p1Ek21e4guiI4tFmZpChY+nzJixGKeeOJnjh/3cO65sbzzTiduvrm+6RUaDIZ8g1OTNQ/a/7sAXYP+/McFDvVYPUSXW4mJNatMT4WdO48wZIilDHv1imP9+vu45ZYG+VoZGvdPOXP/5OfNN99ERALuijLy119/0a9fv3Rh1113XSYD1KFkD67nxo0b6dy5MzVr1qRx48b06tWLvXv3nkq1MnHw4EHat29PzZo1ad++fSZLOX4ef/xx6tWrR7169Rg/fnwg/Oeff6Zx48Y0atSIyy+/nM2bN6dLN2nSJEQE/5avOXPm0KRJE+rXr0+TJk2YO3duIG6nTp1o2LAhcXFx3H333YFN934ytvOhQ4fo3r07DRo0oFmzZqxZc2Jn2x133EHZsmUzbcB/9NFH05VpCMJJVxrAazkJy6u/M3H/lPzPP7ruotr6xX0X6PJtmd3gGNKTmurVtDRf4PjTT5frlCnrc5w+O/dPeY1x/5S1+ydV1e3bt2uHDh20SpUqAddFGenZs6euWLEicHzo0CGtXLmy1q5dW//5559sZffXMykpSS+88EKdPn164Ny8efN09erVp11PVcvN0iuvvKKqqq+88kpIF1bfffedXnXVVerxePTYsWPatGlTTUhIUFXVmjVrBu7XESNGaN++fQPpjhw5oldccYU2b95clyxZoqqqy5cv1//++09VLbdSFStWDMT35+nz+fT666/XsWPHBs6FaudHH31Un332WVVVXb9+vbZt2zYQ/5dfftFly5Zlul+3bt2q7du3z7I9jPsn52gPPJ4h7OoQYfketecQ1S0UiXK62Qo2y5fv5o47pnHvvZcwYIDlneD22y8+Saps+H4I7FmdS9LZlK8PV796WkmN+6f0PPTQQ7z++utce+21IfM6evQoq1atSueqafLkyXTt2pVy5coxbtw4nnzyyZPK9M0339CyZUu6dj0xyNSmTZtTrFlmpk2bxvz58wHo27cvbdq04bXXXksXZ926dbRq1YqIiAgiIiJo0KABP/zwA7169crS/RPAU089xeOPP86wYcMCYcGWhuLi4khKSiIlJYXo6OiAUW6v10tqamq6UZRQ7bxu3TqGDBkCQO3atdm6dSt79+6lXLlytGrVKqSz46pVqxIfH8+ePXsoX778abZa4cSRIVMRuceeP7xIRFYF/W0BVjlRptN4bePE6nJRxOyRC0lSkochQ36iWbNRrFy5l5Ejl+LzFVjnJlmyadMm7rvvPtauXUvJkiWZNGlS4Jzf/dMDDzzA/fffz8SJE1m2bBl33HEHQ4daFgxfffVV/vrrL1atWpXOhNnff//N7NmzWbx4Mc899xwej4dly5YF3D/98ccfjBo1ir/++iudPMHun7744ot0BqGDORXj3jl1/zRt2jQqVaqUrV/CpUuXZhq287t/uvHGGwOGvU9GTt0/HT16NGQ9GzVqxLp16zLF37t3b8ATSfny5UMOwTZs2JAffviBxMREDhw4wLx58wIGukePHk3nzp2pXLkyX375ZUBBLV++nB07dnDNNddkKeukSZNo3LhxOsPuHTt2pGzZshQrVoyePXsCWbdzw4YNmTx5MgCLFy9m27Zt7Ny586Rt1LhxY3799deTxjvbcKqr8w3wPfAKMCQo/KiqHnSoTEfxpBwHQMVtFGIIFi7cRv/+M9i4MR4ReOihFrzwwpW5Y3btNHtyTmHcP1kkJiby8ssvB7x4ZEVG90979+5l06ZNAXulkZGRrFmzhnr16oWcVz7VueZixYoFPEecKiISsrwOHTqwZMkSLr30UsqUKUPLli0D7p+GDx/OrFmzaN68OcOGDePhhx/m448/5uGHHw7YIg3F2rVrefzxxzO13+zZs0lOTubmm29m7ty5XHbZZVm285AhQ3jwwQdp1KgR9evX5+KLLw7IlR1ly5Zl164CvRPOEZxSiKqqW0XkvownROTcgqgUPcmJAPhcLjNkGkRioofBg3/kgw+sBQN165bhk0+60aJFwbS/kBMyumlKSkoKHGd0/+T3dhHMzJkzWbBgATNmzOCll15i9erVIfN1wv1TTh0EV6pUKTCMCJaLoozDk//88w9btmwJ9Fp27txJ48aNWbx4cbqhuIzunyZMmMChQ4eoXt3yFX7kyBHGjh3LSy+9lMn908GDBwOOeuPi4gJeJbLj6NGjWTrJ/eabbzItiipXrhy7d++mQoUK7N69m7Jly4ZMO3To0EAv/6abbqJWrVrs37+flStX0rx5c8D6IOrUqRNHjx5lzZo1gTbbs2cP3bp1Y/r06TRt2pSdO3fSvXt3vvjiC2rUqJGprJiYGK699lqmTZtG+fLls23nzz77DLDuuerVq+fI24Vx/5QFTkxMAt/Z/7cA/9r//X//hmvC9EwW1ez4Yaquu6i2jh5cX30+38kTnCWkpnq1YcORGhHxvD799FxNTj61xSRZUVAW1QwbNkyfeeYZVVVt3bp1YOFESkqK1qhRQ3/77TdVVU1NTdU1a9ZoWlqabtmyJRBWoUIFPXToUKZFNXFxcbplyxZdtmyZ1q9fX48fP67Hjh3TuLg4Xb58uaqeWGwyadIk7dChg3q9Xt21a5eWLFkyVxbVVKtWTQ8ePKgHDx7UatWqaXx8fLZpqlatGnJRzfr16/Wyyy4LHLds2TLQLqqq//77r15wwQWqqjpjxgxt166dpqSkqKrqm2++qbfffruqqiYmJmqNGjX0u+++C6T95ZdfznhRzaOPPppuUc3gwYMzxfF6vXrgwAFVVV25cqXGxcWpx+NRj8ejpUuX1g0bNqiq6ujRo/X666/PlD743jh06JA2aNBAJ02alC7O0aNHddeuXapqLcrq1auXvvfee5nyCm7nQ4cOBdrq448/1j59+qSLm9UisC5duujvv/8esj3MoprcV7Jd7P/Vncg/HPh7iOqKyNfbBfKC+PhEVOG884oQGenmyy+7owoNGpQLt2j5hrPF/VNOqF27NgkJCRw9epT4+Hi2bduWbrtF9erVKVGiBH/++SddunRh2bJlNGnSBLfbTY0aNQLzrLGxsXz33XcMGjSIQYMGERkZSYMGDXjnnXfOqK5DhgyhV69efPLJJ1StWpUJEyYA1tznhx9+yOjRo/F4PIFeZ/Hixfnqq6+IiLBen6NGjaJHjx64XC5KlSoVWACVFe+//z6bN2/m+eef5/nnnwfgxx9/RFXp1q0bKSkp+Hw+rrzySu6+++5s81q/fj19+/ZFRIiLi+OTTz4JnLvxxhuZP38+Bw4coHLlyjz33HP069cPj8fD5s2bc3z9ziacdv90GbBCVY+LyC1AY+BtVd3uWKHZcCbunzZO+JS0p4exqEdx7nzpz1yWrGCgqnz77ToGDpxF27bVGTeup2NlhXJBYyi4DB8+nGLFihkD3/mAKVOmsHz58iw9XpzN7p+ctqI8EkgUkYbAI8A/QGgnXPkcr7+HGHHmS9oLIrt2HeX66yfQu/dE9u9PZM+eYyQmesItlqGAcM8996SbIzWED6/XyyOPPBJuMfIlTitErz3+fC3wvqqOAHJk90xEOonIBhHZLCJDQpx/WETW2ds5fhaRqrksezq8qSnWD9fZpRBVlU8+WU7duiOYOvVvihWL4qOPujB3bl+KFIkMt3iGAkJMTAx9+vQJtxgG4H//+1+2w/RnM04vlzwqIk8AfYArRMQFnPQtKiJuYATWxv6dwBIRma6qwZuI/gKaqmqiiNwDvA70zvUa2HhTkogENDLGqSLyHV6vj86dvw4Y477mmpp8+GEXKlc2jnsNBkPhw+keYm8gBbhDVfdg+UIcln0SAJoBm1X1X1VNBcZh9TIDqOo8VU20D//AYT+LaSnWsnGJPHuWKkdEuKhd+zzOO68I33xzPTNm3GiUocFgKLQ4qhBtJfg1UEJEugDJqvpFDpJWAnYEHe+0w7KiH5YhgEyIyAARWSoiS/fv359DyTNzQiEWbsPe69bt57ffTjT9yy+3Y926e7nxRuOZwmAwFG4cVYgi0gtYDPwP6AX8KSK5ujTRXr3alCx6nqr6sao2VdWmwdYyThVfciI+wFVIFWJqahovvPALjRp9yM03T+bYMct26znnRFGmjPH/aDAYCj9OD5kOBS5R1b6qeivWUOhTOUj3H3B+0HFlOywdInKVXUY3VU3JBXmzxJeShDcCIiILny/EJUv+o2nTj3n66fl4PD46dqyBk9txCgLG/VPO3T+999571K5dm7i4OB577LGQcXbv3k2XLumdQQ8aNIhKlSrh8/kCYaHaoVq1agF3R3v27OGGG26gRo0aNGnShM6dO7Nx48bTrSIAKSkp9O7dmwsvvJDmzZuHNIgN8M4771CvXj3i4uJ4++23A+ErVqygRYsWNGrUiKZNm7J48eLAufnz59OoUSPi4uJo3bp1IPzw4cP07NmT2rVrU6dOnYBFo6eeeooGDRrQqFEjOnTokMm82pIlS4iIiAhc3xUrVtCyZUvi4uJo0KBBOrdU/fr1o2HDhjRo0ICePXty7NgxwNoHebK9kmctTu76B1ZnOHZlDMsiXQSWhZvqQBSwEojLEOdirG0cNXMqz5lYqvnlwRt0SYPa+vWnT592HvmN48dTdfDgH9Xlek7hWa1R4x2dO/ffcIulqgXHUk1WnC3un+bOnavt2rXT5ORkVVXdu3dvyPweffRRnTp1auA4LS1Nq1Spos2bN9e5c+cGwkO1g98yi8/n0xYtWujIkSMD51asWKELFiw4o7qOGDFC77rrLlVVHTt2rPbq1StTnNWrV2tcXJweP35cPR6PtmvXTjdt2qSqqu3bt9dZs2apqurMmTO1devWqmpZkalTp45u27ZNVdO3za233qqjRo1SVcuq0aFDh1T1hPsnVdV33nknIJeqZS3nyiuv1KuvvjpwfTds2KAbN25UVdX//vtPy5cvHzKvhx56KGCN5/jx49qoUaMs28NYqnGOH0RkNuA3Z98bmHWyRKrqFZGBwGzADXyqqmtF5HmsCzMda4j0HOBbe25ru6p2c6ISAL6UZLxuiC5EPcSrr/6aBQu24XIJjz7akueeuzJfbqV4bfFr/H3w71zNs/a5tXm82el5ITPun04wcuRIhgwZEthjmJUd0EmTJvHiiy8GjufPn09cXBy9e/dm7NixXHnllSeVad68eURGRqaz3pKdl42cMm3aNJ599lkAevbsycCBA1HVdHPm69evp3nz5hQpYk2ZtG7dmsmTJ/PYY49l6f7pm2++4frrr6dKlSrAibZJSEhgwYIFAcPfUVFRgWvmd/8EcPz48XQyvPfee/To0YMlS5YEwmrVqhX4XbFiRcqWLcv+/fspWbJkIC9VJSkpKZBXkSJFqFatGosXLw5YQDJYOKoQVXWwiFwPXG4HfayqU3KYdhYZlKeqPh30+6pcEzQH+FJS8LghMjr0MFVB5KGHWnDwYBKffNKNZs2yW7NkCGbTpk2MHTuWUaNG0atXLyZNmsQtt9wCnHD/5PF4aN26NdOmTaNMmTKMHz+eoUOH8umnn/Lqq6+yZcsWoqOjOXz4cCDfv//+m3nz5nH06FEuuugi7rnnHlatWhVw/6SqNG/enNatW6cz3xbs/mnv3r3UrVuXO+64I5Pcp2LcO6funzZu3MjChQsZOnQoMTExvPHGGwFzb362bNlCqVKl0m3M97t/uvbaa3nyySfxeDxERmb/MZZT908AV1xxBUePHs0U/sYbb3DVVelfHcF1jYiIoESJEsTHxweMigPUq1ePoUOHEh8fT2xsLLNmzQqYPnv77bfp2LEjjz76KD6fL+B+a+PGjXg8Htq0acPRo0d58MEHufXWW9myZQtlypTh9ttvZ+XKlTRp0oR33nknYBh+6NChfPHFF5QoUYJ58+YFZJwyZQrz5s1LpxCDWbx4MampqemMhd9+++3MmjWLunXr8uabbwbCmzZtysKFC41CzIAjClFEagJvADWA1cCjqpr5aSpA+FJTrB5idMHddjBz5kY2bIjn4YctW5fXXVebLl1qERHh9FTymXG6PTmnMO6fTuD1ejl48CB//PEHS5YsoVevXvz777/pejYZ3T+lpqYya9Ys3nrrLYoVK0bz5s2ZPXs2Xbp0yXIl86mucF64cOHpVSgL6tSpw+OPP06HDh0oWrQojRo1CrhZGjlyJMOHD6dHjx5MmDCBfv368dNPP+H1elm2bBk///wzSUlJtGzZkhYtWuD1elm+fDnvvfcezZs358EHH+TVV18NmFJ76aWXeOmll3jllVd4//33ee655xg0aBCvvfYaLlfoZ3X37t306dOHMWPGpIvz2WefkZaWxv3338/48eO5/fbbAau3+vffuTvqUhhw6k34KfAd0ANYBrznUDl5hqZ68LohIqbgrbjcv/84N988mS5dxvLYY3NYs2Zf4Fx+V4b5kezcNGV0/7RixQpWrFjB6tWrA/7sZs6cyX333cfy5cu55JJLAunzwv1TTh0EV6pUKeAAFyyXQ5UqZR5FqFy5Mtdffz0iQrNmzXC5XIEFMH4yun+aPXs2hw8fpn79+lSrVo1FixYFnARndP8EljunkiVLEhcXx7Jly3JU1yuuuCJkXX/66ads6+r1eklISKB06dKZ4vXr149ly5axYMECSpUqFRiuHDNmDNdffz1gWYHxL6qpXLkyHTt2pGjRopx33nm0atWKlStXUrlyZSpXrhxwGdWzZ0+WL1+eqbybb7454Hx66dKl3HDDDVSrVo2JEydy7733MnXqVMByn3XNNdfw0ksvpTOa7sftdnPDDTekc2Rt3D+Fxqm3YTFVHaWqG1T1DaCaQ+XkHR4vaW6ILEAKUVUZN24Ndet+wDffrCY2NoJhw9pTp855J09sOCMuuugi9u/fH1g96PF4WLt2LT6fjx07dnDllVfy2muvkZCQEFj9F4orrriCqVOnkpiYyPHjx5kyZUomX3+tWrVi/PjxpKWlsXv37sAwW0YGDx4cUNDBfxmHS8Hy2v7jjz9y6NAhDh06xI8//kjHjh0zxbvuuusC5W3cuJHU1NR0Q41gzXMF96LHjh3L6NGj2bp1K1u3bmXLli3MmTOHxMREWrVqxfTp0wPDnZMnT6Zhw4a43W7atm1LSkoKH3/8cSCvVatWhewNLly4MGRdMw6XAnTr1i2winbixIm0bds2ZI903z7rQ3L79u1MnjyZm266CbDm7vx+GufOnUvNmjUBuPbaa1m0aBFer5fExET+/PNP6tSpQ/ny5Tn//PPZsGEDAD///HNg5fKmTZsC5U2bNo3atWsD1rCzv7169uzJBx98wHXXXUdqairdu3fn1ltvpWfPEzvaVJXNmzcHfk+fPj2Ql/9a1atXL1Mdz3acmkOMEZGLAf9dFRt8rKqZP4fyO7ZCjCogCvG//45wzz0zmTHDWpLetm11Ro3qygUXlAqzZGcHZ4v7pzvuuIM77riDevXqERUVxZgxYzIpk6JFi1KjRg02b95MxYoV+eGHHwIunfznL7/8cmbMmEHv3r0ZOHAgl19+OSJC2bJlGT16NGANm06ZMiUwfBgTE0O1atXSbYE4Hfr160efPn248MILOffccwOLnHbt2kX//v2ZNctaytCjRw/i4+OJjIxkxIgRges2atQoHnzwQbxeLzExMQGFXadOHTp16kSDBg1wuVz0798/oITee+89br75ZlJTU7ngggsCTn6HDBnChg0bcLlcVK1aNV07hWLChAksWLCA+Pj4wCKdzz//nAYNGtC3b1+OHDmCqtKwYUNGjhwZSPfrr78GFhIZTuCI+ycRCf2JaqGqGnqSw2HOxP3TT52akORNpNLwCTSuXz+XJct9brhhIuPHr6V48WjefLMD/fpdXKAszRj3T4WLKVOmsGzZsnQrTQ3h4a+//uKtt97iyy9DOx46m90/OeUg+ORrqAsYLk8avgglOjb/rjINXio+bFh7XC5h2LD2VKpUcBcCGQoH3bt3Jz4+PtxiGIADBw5k6QvxbMesqMghLq8PnxtiiuS/IdO0NB9vvvkb7dt/SVqaZfXj/PNL8M03PYwyNOQbjHPg/EH79u2pVq1auMXIlzi9Mb/Q4EpTSyHmsx7imjX7uOOOaSxZYpl4mjPnXzp1ujDMUhkMBkPBw/QQc4i/h1g0On98Q6SmpvHss/Np3PgjlizZReXKxZk58yajDA0Gg+E0cfTtLtaE1s3ABar6vIhUAcqr6uKTJM13uNMUdUFslDvcorB48X/cccc01q613Fndc09TXn31KooXjz5JSoPBYDBkhdPdnQ8AH9AWeB44CkwCLskuUX4kIg18biHKHf5O9cKF21i7dj81a57L6NHdaNWqarhFMhgMhgKP02/35qp6H5AMoKqHsLxXFDjcXquHGK6tC/v3Hw/8HjSoBW+/3ZGVK+82ytAhjPunnLl/ys71UTB//fUX/fr1Sxd23XXXZbKsEkr24Hpu3LiRzp07U7NmTRo3bkyvXr3Yu3fv6VQvwMGDB2nfvj01a9akffv2mSzl+Hn88cepV68e9erVS+dm6eeff6Zx48Y0atSIyy+/PLAh/qGHHgrcQ7Vq1QrsW8zOZVOwhZ2KFSsGTPsdOnSI7t2706BBA5o1a8aaNWsCaapVq0b9+vUD18BP7969A3lVq1YtYG5w9erV3HbbbWfUZoUWJ11pAH9ieatYbh+XAf4Kl2uPM3H/tLJubf3qxrqnnf50OXQoSfv3n6YlS76q//13JM/LDxfG/dPJyQ/un7JyfZSRnj176ooVKwLHhw4d0sqVK2vt2rX1n3/+yVZ2fz2TkpL0wgsv1OnTpwfOzZs3T1evXn3a9VRVHTx4cMA10iuvvKKPPfZYpjjfffedXnXVVerxePTYsWPatGnTgHulmjVrBu7XESNGaN++fTOlf/fdd/X2229X1exdNgVz/fXX65gxY1TVcp/17LPPqqrq+vXrtW3btoF4fvdY2fHwww/rc889Fzhu165dwC1VRoz7J+d4F5gClBWRl4CewP85XGauo6pEpoG687Z3OH36Bu65Zya7dh0lKsrNb7/toGfP3O+d5Hf2vPwyKetz1xBxdJ3alH/yydNKa9w/nSAr10fBHD16lFWrVqVz1TR58mS6du1KuXLlGDduHE/m4Fp88803tGzZkq5duwbC2rRpczrVS8e0adOYP38+AH379qVNmza89tpr6eKsW7eOVq1aERERQUREBA0aNOCHH36gV69eOWqDsWPH8txzzwHZu2zyc+TIEebOnRuwYLNu3TqGDBkCQO3atdm6dSt79+6lXLlyJ62fqjJhwgTmzp0bCOvatSvjxo3L0qHz2YrT7p++FpFlQDsss23Xqep6J8t0BI8HAHXnzYKaffuO88AD3zN+/FoAWraszCefdKNOnTInSWnIC4z7pxNk5foomKVLl2aymzl27FiefvppypUrR48ePXKkEHPq/uno0aOZ7L36+eabbzINee/duzfgiaR8+fIhh2AbNmzIc889xyOPPEJiYiLz5s0L5DN69Gg6d+5MbGwsxYsX548//kiXdtu2bWzZsiWkF5JQLpsApk6dSrt27QI+DRs2bMjkyZO54oorWLx4Mdu2bWPnzp2UK1cOEaFDhw6ICHfddRcDBgxIl9fChQspV65cwMYqWO6fXn31VaMQM+D0KtMqQCIwIzhMVbc7WW5uo36F6HJeIc6cuZG+facSH59EkSKRvPJKO+677xLc+WAxT7g43Z6cUxj3TyfIyvVRMBndP+3du5dNmzYF7JVGRkayZs0a6tWrF3KO/lTn7YsVK8aKFStOqz4iErK8Dh06sGTJEi699FLKlClDy5YtA+6fhg8fzqxZs2jevDnDhg3j4YcfDthfBRg3bhw9e/YMxPeTlcsmsD4Ygg0ZDBkyhAcffJBGjRpRv359Lr744kB+ixYtolKlSuzbt4/27dtTu3ZtWrVqlS6vjD37smXLsmvXrtNqo8KM00OmMwHF6h3GANWBDUCcw+XmKmkpKQBohPMKsWzZohw6lEz79hfw0UddqF7dGOPOb2R005SUlBQ4zuj+ye/tIpiZM2eyYMECZsyYwUsvvcTq1atD5uuE+6ec9hArVaoUGEYEy/1TqOHJMWPG8M477wCW66NQ1mgyun+aMGEChw4donr16oA1PDh27FheeumlTO6fDh48GPCeERcXF/AqkR2n2kMsV64cu3fvpkKFCuzevTvg2T4jQ4cOZejQoQDcdNNN1KpVi/3797Ny5cqAK6fevXvTqVOndOnGjRvHiBEj0oVl57LpwIEDLF68mClTTvhSL168eGD4VFWpXr06F1xwAUDALVfZsmXp3r07ixcvDihEr9fL5MmTM7nNMu6fQuNot0NV66tqA/t/TaAZkPkNkc9JSbbc82hE7n8/+HzKnDn/BI4vuaQSf/7Zn9mzbzHKsABztrh/ysr1UTB16tQJrLwEq8fyww8/BNwZLVu2LDCP2qZNG8aPH09qaipgeW648krLNPJNN93Eb7/9xsyZMwN5LViwIN2KSzjRQwz1F2qFcLD7pzFjxnDttddmipOWlhawxbpq1SpWrVpFhw4dKFWqFAkJCWzcaHmVmTNnTjrD2H///TeHDh1K54EkK5dNfiZOnEiXLl2IiYkJhB0+fDjQJqNHj6ZVq1YUL16c48ePB1xlHT9+nB9//DHd8PRPP/1E7dq1qVy5croyjPun0OSp2RVVXS4izfOyzNwgJcne8uCOzNV8N22Kp3//GSxYsI0ZM26kSxdrsr1p08yT8oaCxdni/ikr10fB1K5dm4SEBI4ePUp8fDzbtm1L1yuqXr06JUqU4M8//6RLly4sW7aMJk2a4Ha7qVGjRsAFUmxsLN999x2DBg1i0KBBREZG0qBBg0AP9XQZMmQIvXr14pNPPqFq1apMmDABsOY+P/zwQ0aPHo3H4wl8iBQvXpyvvvqKCPsDedSoUfTo0QOXy0WpUqUCC6DA6h3ecMMN6YZhs3LZ5B+GHzduXGABjZ/169fTt29fRIS4uDg++eQTwBp+7t69O2D1Bm+66aZ0PdRx48ZlGi4FmDdvHtdcc82ZNFuhxBH3T4HMRR4OOnQBjYHSqpr5UzMPOF33T7vXLuVwjz782bkit7318xnL4fX6eOut33nmmfkkJ3spW7Yon3zSLaAQDcb9U2Fj+PDhFCtWzBj4zgekpKTQunVrFi1aFFDqwZzN7p+cXqlRLOgvGmtOMfN4RD4nNdFaUi2RZ76cfeXKPbRoMZrHH/+J5GQvffs2ZP36+4wyNBRq7rnnnnRzpIbwsX37dl599dWQyvBsx7EWERE3UExVH3WqjLwi5dhBACTqzCahv/tuI927j8fr9VGlSgk+/rgLHTsaY9yGwk9MTAx9+vQJtxgGCFgfMmTGEYUoIhGq6hWRy5zIP69JPHqIaMAVFXPSuNnRunVVKlUqRteutXj55XYUK2a+mA0GgyG/4FQPcTHWfOEKEZkOfAsEjHGq6mSHynWEpGMJRAPu6FPrIR47lsobb/zG4MGXUrRoFMWKRbN69T1GERoMBkM+xOlB5BggHsvbhX8/ogIFSiEmH7OWNUdEF81xmjlz/mHAgO/YuvUwR46k8NZb1joiowwNBoMhf+KUQixrrzBdwwlF6Me5Za0OkZpoKcTIIqG9CwRz6FASjz76I59+ugKARo3K06dPAyfFMxgMBkMu4JRCdAPnkF4R+ilwCtFr70OMii2WbbwpU9Zz772z2LPnGNHRbp55pjWPPnopkZHhdypsOHXcbjf169fH6/VSvXp1vvzyy2z3DOaUzz//nKVLl/L++++fuZAGgyHXcEoh7lbV5x3KO8/xJCcCEF20ZJZxfv99B9dfb23oveyy8xk9uhu1a5+XF+IZHCI2NjZgE7Nv376MGDEiYLrLYDAUPpxSiOHxousQaamWHcbYc0pmGadly/Pp27chTZtW5N57L8HlKlRNEHZEnsvy3EcfdWHAAMsLwscfL+Ouu77LMq7qM6dVfsuWLVm1ahVgeSh48MEHA/YgP/vsMy666CI+//xzpk+fTmJiIv/88w/du3fn9ddfB+Czzz7jlVdeoWTJkjRs2DCwJ2/r1q3ccccdHDhwgDJlyvDZZ59RpUoVbrvtNmJjY/nrr7/Yt28fn376KV988QW///47zZs3D1g4MRgMuYdTG/PbOZRvWPClWAqxSPHSgbBt2w7TtetYVq7cEwj7/PPrGDiwmVGGhYy0tDR+/vlnunXrBlimyBYuXMhff/3F888/n8510YoVKxg/fjyrV69m/Pjx7Nixg927d/PMM8/w66+/smjRItatWxeIf//999O3b19WrVrFzTffHPCBCJaX9N9//53hw4fTrVs3HnroIdauXcvq1atP25uDwWDIGkd6iKp60Il8w4XaRnWLlSiNz6eMHLmEIUN+5tixVJKTvcyZYzYcO01Oe3YDBjQJ9BbPlKSkJBo1asR///1HnTp1Aq6cEhIS6Nu3L5s2bUJE8NjuwQDatWtHiRIlAKhbty7btm3jwIEDtGnTJuACqXfv3gFj0L///juTJ1uLrvv06ZPOP13Xrl0REerXr0+5cuWoX78+YHl92Lp1a8D2pcFgyB3yrZM9EekkIhtEZLOIDAlxPlpExtvn/xSRak7Joh5LIe6Jj6Z1688ZOPB7jh1LpWfPunz1VXenijWEGf8c4rZt21DVgAufp556iiuvvJI1a9YwY8aMdK6NctOFkz8vl8uVLl+Xy5XrrqEMBkM+VYi22bcRwNVAXeBGEcnot6UfcEhVLwSGA685JY83xctH8XVo124qixZtp3z5c5g0qRfffvs/ypU7+VYMQ8GmSJEivPvuu7z55pt4vV4SEhICPuhyMpfXvHlzfvnlF+Lj4/F4PHz77beBc5deemnA9dHXX3+dpR8/g8HgPPlSIWL5Tdysqv+qaiowjsxGwa8Fxti/JwLt5FRda+eQw0fdjDpYl5SUNG6/vRHr1t3L9dcbTwxnExdffDENGjRg7NixPPbYYzzxxBNcfPHFOeqpVahQgWeffZaWLVty2WWXpfMk8N577/HZZ5/RoEEDvvzyyzN2ZWQwGE4fR90/nS4i0hPopKr97eM+QHNVHRgUZ40dZ6d9/I8d50CGvAYAAwCqVKnSZNu2bacsz4Qn/8dvPyZxzSvv0L59jdOtluEUMO6fDIbwcDa7fyr0/j9U9WPgY7D8IZ5OHr1e/pZeL+eqWAaDwWDIZ+TXIdP/gPODjivbYSHjiEgEUALLbqrBYDAYDKdMflWIS4CaIlJdRKKAG4DpGeJMB/rav3sCczU/jv8aThtzOQ2GvOVsf+bypUJUVS8wEJgNrAcmqOpaEXleRLrZ0T4BSovIZuBhINPWDEPBJSYmhvj4+LP+ATUY8gpVJT4+npiYM/P7WpDJl4tqnKJp06a6dOnScIthyAEej4edO3em2+NnMBicJSYmhsqVKxMZGZku3CyqMRjCSGRkJNWrVw+3GAaD4SwiXw6ZGgwGg8GQ1xiFaDAYDAYDRiEaDAaDwQCcZYtqRGQ/cOqmaizOAw6cNFbhwtT57MDU+ezgTOpcVVXL5KYw+ZGzSiGeCSKy9GxYZRWMqfPZganz2cHZWOdTxQyZGgwGg8GAUYgGg8FgMABGIZ4KH4dbgDBg6nx2YOp8dnA21vmUMHOIBoPBYDBgeogGg8FgMABGIRoMBoPBABiFmAkR6SQiG0Rks4hk8qAhItEiMt4+/6eIVAuDmLlKDur8sIisE5FVIvKziFQNh5y5ycnqHBSvh4ioiBT45eo5qbOI9LKv9VoR+SavZcxNcnBfVxGReSLyl31vdw6HnLmJiHwqIvtEZE0W50VE3rXbZJWINM5rGfM1qmr+7D/ADfwDXABEASuBuhni3At8aP++ARgfbrnzoM5XAkXs3/ecDXW24xUDFgB/AE3DLXceXOeawF9AKfu4bLjldri+HwP32L/rAlvDLXcu1LsV0BhYk8X5zsD3gAAtgD/DLXN++jM9xPQ0Azar6r+qmgqMA67NEOdaYIz9eyLQTkQkD2XMbU5aZ1Wdp6qJ9uEfQOU8ljG3ycl1BngBeA0oDD6oclLnO4ERqnoIQFX35bGMuUlO6qtAcft3CWBXHsrnCKq6ADiYTZRrgS/U4g+gpIhUyBvp8j9GIaanErAj6HinHRYyjlqOjBOA0nkinTPkpM7B9MP6wizInLTO9lDS+ao6My8Fc5CcXOdaQC0R+VVE/hCRTnkmXe6Tk/o+C9wiIjuBWcD9eSNaWDnV5/2swvhDNOQYEbkFaAq0DrcsTiIiLuAt4LYwi5LXRGANm7bBGgVYICL1VfVwOIVykBuBz1X1TRFpCXwpIvVU1RduwQzhwfQQ0/MfcH7QcWU7LGQcEYnAGmqJzxPpnCEndUZErgKGAt1UNSWPZHOKk9W5GFAPmC8iW7HmWqYX8IU1ObnOO4HpqupR1S3ARiwFWRDJSX37ARMAVPV3IAbLAHZhJkfP+9mKUYjpWQLUFJHqIhKFtWhmeoY404G+9u+ewFy1Z6sLKCets4hcDHyEpQwL8rySn2zrrKoJqnqeqlZT1WpY86bdVHVpeMTNFXJyb0/F6h0iIudhDaH+m4cy5iY5qe92oB2AiNTBUoj781TKvGc6cKu92rQFkKCqu8MtVH7BDJkGoapeERkIzMZapfapqq4VkeeBpao6HfgEa2hlM9bk9Q3hk/jMyWGdhwHnAN/a64e2q2q3sAl9huSwzoWKHNZ5NtBBRNYBacBgVS2Qox85rO8jwCgReQhrgc1tBfzjFhEZi/VRc549N/oMEAmgqh9izZV2BjYDicDt4ZE0f2JMtxkMBoPBgBkyNRgMBoMBMArRYDAYDAbAKESDwWAwGACjEA0Gg8FgAIxCNBgMBoMBMArRkE8RkTQRWRH0Vy2buMdyobzPRWSLXdZy23LJqeYxWkTq2r+fzHDutzOV0c7H3y5rRGSGiJQ8SfxGp+PFQUQqiMh39u82IpIQdC1+ssOfFZH/guTpFiJ8nYjcGJTvGyLS9lTlMRjyArPtwpAvEZFjqnpObsfNJo/Pge9UdaKIdADeUNUGZ5DfGct0snxFZAywUVVfyib+bVieOgaeYjnDgEWqOk1E2gCPqmqXDHGeBY6p6hv2xvaFQFng6aDwmsAyoLSqesRyHTZKVTucijwGQ15geoiGAoGInCOWL8blIrJaRDJ5p7B7NQuCeixX2OEdROR3O+23InIyRbUAuNBO+7Cd1xoRGWSHFRWRmSKy0g7vbYfPF5GmIvIqEGvL8bV97pj9f5yIXBMk8+ci0lNE3CIyTESWiOWn7q4cNMvv2IaZRaSZXce/ROQ3EbnIttDyPNDblqW3LfunIrLYjhvKywdAD+CHHMgAgKquB7xkMH2mqpuwNoCXso+3AaVFpHxO8zYY8gqjEA35Fb9CWSEiU7BcMHVX1cZY/hnfFMnkdusmYLaqNgIaAivEMkH2f8BVdtqlwMMnKbsrsFpEmmBZ8miOZc/0TrHM2HUCdqlqQ1WtRwbFoapDgCRVbaSqN2fIezzQC8BWWO2AmVh2NRNU9RLgErus6lkJKCJuO63fqs7fwBWqejFWD+1l2+3R01j+Kxup6ngse7RzVbUZVjsOE5GiGfKuDhzKYLP2iqDrMTSEPM0BHxlMn4nlNWRTBpN/y4HLsqqbwRAujOk2Q34lyVZsAIhIJPCyiLTCevFWAsoBe4LSLAE+teNOVdUVItIay/nrr7b+jMLqWYVimIj8H9ZLvR+WwpmiqsdtGSYDV2ApwDdF5DWsYdaFp1Cv74F3RCQaS7EuUNUke5i2gYj0tOOVwDKsvSVD+lgRWWHXfz0wJyj+GHuIUrHNdYWgA9BNRB61j2OAKnZefiqQ2abnwoxDpjYPieUF5SjQW1XVbueHROR2LHuoXTOk2QdUzEI+gyFsGIVoKCjcDJQBmthzUVuxXuYBVHWBrTCvAT4XkbeAQ8AcVb0xY4YhGKyqE/0HItIuVCRV3Wj3fDoDL4rIz6r6fE4qoarJIjIf6Aj0xnJcC5YH8/tVdfZJskhS1UYiUgTLTud9wLtYzoznqWp3sRYgzc8ivQA9VHVDdmWQoW2zYbiqvpFVuL3Q5hMRqaGqfkfLMXYZBkO+wgyZGgoKJYB9tjK8EqiaMYK9YGOvqo4CRgONsTxVXCYi/jnBoiJSK4dlLgSuE5Ei9rBid2ChiFQEElX1KyzD541DpPXYPdVQjMcaivX3NsFSbvf404hIrYxDmcGoaiLwAPCInHBD5nfjc1tQ1KNY7qz8zAbu9w8320PAGdkIVMuq7FPBNqK9lBMeYsDqNa7JjfwNhtzEKERDQeFroKmIrAZuxZozy0gbYKWI/IXV+3pHVfdjKYixIrIKa7i0dk4KVNXlwOfAYuBPYLSq/gXUBxbbQ5fPAC+GSP4xsMq/qCYDP2I5Wf7JnucDS4GvA5aLyBosd1vZjuDYsqzCcnT7OvCKXffgdPOAuv5FNVg9yUhbtrX2ccZ8jwP/+D8icoHngYdFxGUr/AuxlKTBkK8w2y4MBkMmRKQ71vD0/zmQb2NVfSo38zUYcgMzh2gwGDKhqlNEpLQDWUcAbzqQr8FwxpgeosFgMBgMmDlEg8FgMBgAoxANBoPBYACMQjQYDAaDATAK0WAwGAwGwChEg8FgMBgA+H+EK2jxV1TwwgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "y_prob = model_regression.predict_proba(X_test)[:, 1]\n", - "for threshold in [0.2, 0.4, 0.6, 0.8]:\n", - " y_pred_threshold = (y_prob > threshold).astype(int)\n", - " fpr, tpr, _ = roc_curve(y_test, y_pred_threshold)\n", - " roc_auc = auc(fpr, tpr)\n", - " plt.plot(fpr, tpr, label='Threshold = {:.1f} (AUC = {:.8f})'.format(threshold, roc_auc))\n", - " #print(threshold, format(roc_auc))\n", - "# Plot the \"Random\" line as a dashed line from (0,0) to (1,1) for reference\n", - "plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--', label='Random')\n", - "\n", - "# Label axes and set the title for the plot\n", - "plt.xlabel('False Positive Rate (FPR)')\n", - "plt.ylabel('True Positive Rate (TPR) or Sensitivity')\n", - "plt.title('Receiver Operating Characteristic (ROC) Curve with Different Thresholds')\n", - "plt.legend(loc='lower right')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "87704362", - "metadata": {}, - "source": [ - "## Predict with LogisticRegression" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "f2e29c89", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'TP2': [-0.018],\n", - " 'TP3': [8.248],\n", - " 'H1': [8.238],\n", - " 'DV_pressure': [-0.024],\n", - " 'Reservoirs': [8.248],\n", - " 'Oil_temperature': [49.45],\n", - " 'Motor_current': [0.04],\n", - " 'COMP': [1.0],\n", - " 'DV_eletric': [0.0],\n", - " 'Towers': [1.0],\n", - " 'MPG': [1.0],\n", - " 'LPS': [0.0],\n", - " 'Pressure_switch': [1.0],\n", - " 'Oil_level': [1.0],\n", - " 'Caudal_impulses': [1.0]}" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Example: new sample based on the features\n", - "new_sample = {\n", - " 'TP2': [-0.018],\n", - " 'TP3': [8.248],\n", - " 'H1': [8.238],\n", - " 'DV_pressure': [-0.024],\n", - " 'Reservoirs': [8.248],\n", - " 'Oil_temperature': [49.450],\n", - " 'Motor_current': [0.0400],\n", - " 'COMP': [1.0],\n", - " 'DV_eletric': [0.0],\n", - " 'Towers': [1.0],\n", - " 'MPG': [1.0],\n", - " 'LPS': [0.0],\n", - " 'Pressure_switch': [1.0],\n", - " 'Oil_level': [1.0],\n", - " 'Caudal_impulses': [1.0]\n", - "}\n", - "\n", - "new_df = pd.DataFrame(new_sample)\n", - "new_sample\n" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "1eaab558", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Prediction (Class): [0]\n", - "Probability of class 1: [7.74749611e-11]\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ubuntu/.local/lib/python3.10/site-packages/sklearn/base.py:493: UserWarning: X does not have valid feature names, but LogisticRegression was fitted with feature names\n", - " warnings.warn(\n", - "/home/ubuntu/.local/lib/python3.10/site-packages/sklearn/base.py:493: UserWarning: X does not have valid feature names, but LogisticRegression was fitted with feature names\n", - " warnings.warn(\n" - ] - } - ], - "source": [ - "scaler = StandardScaler()\n", - "new_scaled = scaler.fit_transform(new_df) # Scaling the single sample\n", - "\n", - "# Predict the class using the logistic regression model\n", - "y_pred = model_regression.predict(new_scaled)\n", - "\n", - "# Alternatively, get the probability for class 1 (if you want the probability rather than the class label)\n", - "y_pred_prob = model_regression.predict_proba(new_scaled)[:, 1]\n", - "\n", - "# Output the prediction result\n", - "print(f\"Prediction (Class): {y_pred}\")\n", - "print(f\"Probability of class 1: {y_pred_prob}\")" - ] - }, - { - "cell_type": "markdown", - "id": "a354bad8", - "metadata": {}, - "source": [ - "# Naive Bayes\n" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "5f2a0161", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "from sklearn.compose import ColumnTransformer\n", - "from sklearn.pipeline import Pipeline\n", - "from sklearn.preprocessing import MinMaxScaler\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.naive_bayes import GaussianNB,MultinomialNB, BernoulliNB\n", - "from sklearn.metrics import classification_report, confusion_matrix\n", - "from sklearn.metrics import ConfusionMatrixDisplay\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "947daeee", - "metadata": {}, - "outputs": [], - "source": [ - "dataset = pd.read_csv('RailGuadrs_Clean_Data.csv')\n", - "features = ['timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure', 'Reservoirs',\n", - " 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric',\n", - " 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level', 'Caudal_impulses']\n", - "target = 'status'" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "0bb94307", - "metadata": {}, - "outputs": [], - "source": [ - "dataset['timestamp'] = pd.to_datetime(dataset['timestamp'], errors='coerce')\n", - "dataset['timestamp'] = (dataset['timestamp'] - dataset['timestamp'].min()) / np.timedelta64(1,'D')" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "a2d8baf9", - "metadata": {}, - "outputs": [], - "source": [ - "X = dataset[features]\n", - "y = dataset[target]\n", - "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)" - ] - }, - { - "cell_type": "code", - "execution_count": 85, - "id": "33956554", - "metadata": {}, - "outputs": [], - "source": [ - "gaussian_classifier = GaussianNB()\n", - "bernoulli_classifier = BernoulliNB()\n", - "\n", - "#Since the multinomial Naive Bayes can not handle negatives value dues to the fact that\n", - "#Naive Bayes based on applying Bayes' theorem with strong (naive) independence assumptions between the features.\n", - "#We need to add preprocessing step to move the data off the negative zone\n", - "\n", - "multinomial_classifier = Pipeline([('Normalizing',MinMaxScaler()),('MultinomialNB',MultinomialNB())])\n", - "\n", - "\n", - "# Train the models\n", - "gaussian_classifier.fit(X_train, y_train)\n", - "multinomial_classifier.fit(X_train, y_train)\n", - "bernoulli_classifier.fit(X_train, y_train)\n", - "\n", - "# Predictions\n", - "y_pred_gaussian = gaussian_classifier.predict(X_test)\n", - "y_pred_multinomial = multinomial_classifier.predict(X_test)\n", - "y_pred_bernoulli = bernoulli_classifier.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "35b39980", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Bernoulli Naive Bayes:\n", - " precision recall f1-score support\n", - "\n", - " 0 0.99 0.86 0.92 6053\n", - " 1 0.87 1.00 0.93 5836\n", - "\n", - " accuracy 0.93 11889\n", - " macro avg 0.93 0.93 0.93 11889\n", - "weighted avg 0.93 0.93 0.93 11889\n", - "\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Evaluate and compare the models\n", - "print(\"Bernoulli Naive Bayes:\")\n", - "print(classification_report(y_test, y_pred_bernoulli))\n", - "conf_matrix_bernoulli = confusion_matrix(y_test, y_pred_bernoulli)\n", - "disp_bernoulli = ConfusionMatrixDisplay(conf_matrix_bernoulli, display_labels=bernoulli_classifier.classes_)\n", - "disp_bernoulli.plot(cmap='Blues', values_format='d')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "7ea637f1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multinomial Naive Bayes:\n", - " precision recall f1-score support\n", - "\n", - " 0 1.00 0.86 0.92 6053\n", - " 1 0.87 1.00 0.93 5836\n", - "\n", - " accuracy 0.92 11889\n", - " macro avg 0.93 0.93 0.92 11889\n", - "weighted avg 0.93 0.92 0.92 11889\n", - "\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "print(\"Multinomial Naive Bayes:\")\n", - "print(classification_report(y_test, y_pred_multinomial))\n", - "conf_matrix_multinomial = confusion_matrix(y_test, y_pred_multinomial)\n", - "disp_multinomial = ConfusionMatrixDisplay(conf_matrix_multinomial, display_labels=multinomial_classifier.classes_)\n", - "disp_multinomial.plot(cmap='Blues', values_format='d')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "id": "91a9917d", - "metadata": {}, - "outputs": [], - "source": [ - "new_sample = {\n", - " 'timestamp': pd.to_datetime('2024-12-02 14:00:00'),\n", - " 'TP2': 0.01,\n", - " 'TP3': 8.2,\n", - " 'H1': 8.3,\n", - " 'DV_pressure': -0.03,\n", - " 'Reservoirs': 8.3,\n", - " 'Oil_temperature': 50.0,\n", - " 'Motor_current': 0.04,\n", - " 'COMP': 1.0,\n", - " 'DV_eletric': 0.0,\n", - " 'Towers': 1.0,\n", - " 'MPG': 1.0,\n", - " 'LPS': 0.0,\n", - " 'Pressure_switch': 1.0,\n", - " 'Oil_level': 1.0,\n", - " 'Caudal_impulses': 1.0\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "id": "096ae01e", - "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "The feature names should match those that were passed during fit.\nFeature names unseen at fit time:\n- timestamp\n", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/ipykernel_6226/1776991499.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;31m# Apply scaling if required (use the fitted scaler)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0mX_new_scaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mscaler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_new\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 21\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;31m# Predict using each classifier\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/sklearn/utils/_set_output.py\u001b[0m in \u001b[0;36mwrapped\u001b[0;34m(self, X, *args, **kwargs)\u001b[0m\n\u001b[1;32m 314\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 315\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mwrapped\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 316\u001b[0;31m \u001b[0mdata_to_wrap\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 317\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_to_wrap\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 318\u001b[0m \u001b[0;31m# only wrap the first output for cross decomposition\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/sklearn/preprocessing/_data.py\u001b[0m in \u001b[0;36mtransform\u001b[0;34m(self, X, copy)\u001b[0m\n\u001b[1;32m 1043\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1044\u001b[0m \u001b[0mcopy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcopy\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcopy\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1045\u001b[0;31m X = self._validate_data(\n\u001b[0m\u001b[1;32m 1046\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1047\u001b[0m \u001b[0mreset\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/sklearn/base.py\u001b[0m in \u001b[0;36m_validate_data\u001b[0;34m(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)\u001b[0m\n\u001b[1;32m 606\u001b[0m \u001b[0mvalidated\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 607\u001b[0m \"\"\"\n\u001b[0;32m--> 608\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_feature_names\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreset\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mreset\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 609\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 610\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0my\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_tags\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"requires_y\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.10/site-packages/sklearn/base.py\u001b[0m in \u001b[0;36m_check_feature_names\u001b[0;34m(self, X, reset)\u001b[0m\n\u001b[1;32m 533\u001b[0m )\n\u001b[1;32m 534\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 535\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 536\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 537\u001b[0m def _validate_data(\n", - "\u001b[0;31mValueError\u001b[0m: The feature names should match those that were passed during fit.\nFeature names unseen at fit time:\n- timestamp\n" - ] - } - ], - "source": [ - "# Ensure that the timestamp in new_sample is in datetime format\n", - "new_sample['timestamp'] = pd.to_datetime(new_sample['timestamp'])\n", - "\n", - "# Ensure dataset['timestamp'].min() is a datetime object, if it's not already\n", - "dataset_min_timestamp = pd.to_datetime(dataset['timestamp'].min())\n", - "\n", - "# Calculate the difference between the new sample's timestamp and the earliest timestamp in the dataset\n", - "timestamp_diff = new_sample['timestamp'] - dataset_min_timestamp\n", - "\n", - "# Convert the difference to days\n", - "new_sample['timestamp'] = timestamp_diff / np.timedelta64(1, 'D')\n", - "\n", - "# Convert the new sample into a DataFrame (since the model expects a DataFrame as input)\n", - "new_sample_df = pd.DataFrame([new_sample])\n", - "\n", - "# Separate features from the sample\n", - "X_new = new_sample_df[features]\n", - "\n", - "# Apply scaling if required (use the fitted scaler)\n", - "X_new_scaled = scaler.transform(X_new)\n", - "\n", - "# Predict using each classifier\n", - "y_pred_gaussian = gaussian_classifier.predict(X_new) # For Gaussian Naive Bayes\n", - "y_pred_multinomial = multinomial_classifier.predict(X_new_scaled) # For Multinomial Naive Bayes\n", - "y_pred_bernoulli = bernoulli_classifier.predict(X_new) # For Bernoulli Naive Bayes\n", - "\n", - "# Print predictions\n", - "print(f\"Prediction using Gaussian Naive Bayes: {y_pred_gaussian}\")\n", - "print(f\"Prediction using Multinomial Naive Bayes: {y_pred_multinomial}\")\n", - "print(f\"Prediction using Bernoulli Naive Bayes: {y_pred_bernoulli}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "id": "49728011", - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'X_new' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/ipykernel_6226/4134774280.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Predict using each classifier\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0my_pred_gaussian\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgaussian_classifier\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_new\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# For Gaussian Naive Bayes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0my_pred_multinomial\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmultinomial_classifier\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_new_scaled\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# For Multinomial Naive Bayes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0my_pred_bernoulli\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbernoulli_classifier\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_new\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# For Bernoulli Naive Bayes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'X_new' is not defined" - ] - } - ], - "source": [ - "# Predict using each classifier\n", - "y_pred_gaussian = gaussian_classifier.predict(X_new) # For Gaussian Naive Bayes\n", - "y_pred_multinomial = multinomial_classifier.predict(X_new_scaled) # For Multinomial Naive Bayes\n", - "y_pred_bernoulli = bernoulli_classifier.predict(X_new) # For Bernoulli Naive Bayes\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dccc4632", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# Print predictions\n", - "print(f\"Prediction using Gaussian Naive Bayes: {y_pred_gaussian}\")\n", - "print(f\"Prediction using Multinomial Naive Bayes: {y_pred_multinomial}\")\n", - "print(f\"Prediction using Bernoulli Naive Bayes: {y_pred_bernoulli}\")\n" - ] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [ - "tlgQsE5x3fEE", - "3eb2efc4-bd6e-4501-a39b-6f7ef141c8a1", - "5bca1be5-5d0e-4317-a375-dedbe9168c00", - "A8iLUYDTpjfI", - "18c5a153-7fb2-4b7d-86d9-a41322313752" - ], - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "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.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/machine_learning/data_preprocessing/RailGuadrs_Clean_Data.npz b/machine_learning/data_preprocessing/RailGuadrs_Clean_Data.npz new file mode 100644 index 0000000..8d07ad9 Binary files /dev/null and b/machine_learning/data_preprocessing/RailGuadrs_Clean_Data.npz differ diff --git a/machine_learning/data_preprocessing/bernoulli_nb_model.pkl b/machine_learning/data_preprocessing/bernoulli_nb_model.pkl new file mode 100644 index 0000000..574c5df Binary files /dev/null and b/machine_learning/data_preprocessing/bernoulli_nb_model.pkl differ diff --git a/machine_learning/data_preprocessing/data_processing.ipynb b/machine_learning/data_preprocessing/data_processing.ipynb new file mode 100644 index 0000000..94d0cc2 --- /dev/null +++ b/machine_learning/data_preprocessing/data_processing.ipynb @@ -0,0 +1,3535 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2U6-RcNVXpSP", + "metadata": { + "id": "2U6-RcNVXpSP" + }, + "source": [ + "# Data Processing\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "791292f6", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "791292f6", + "outputId": "c1bc410d-514d-4465-9e75-ae2d8815a639" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 59445 entries, 0 to 59444\n", + "Data columns (total 18 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 Unnamed: 0 59445 non-null int64 \n", + " 1 timestamp 59445 non-null object \n", + " 2 TP2 59445 non-null float64\n", + " 3 TP3 59445 non-null float64\n", + " 4 H1 59445 non-null float64\n", + " 5 DV_pressure 59445 non-null float64\n", + " 6 Reservoirs 59445 non-null float64\n", + " 7 Oil_temperature 59445 non-null float64\n", + " 8 Motor_current 59445 non-null float64\n", + " 9 COMP 59445 non-null float64\n", + " 10 DV_eletric 59445 non-null float64\n", + " 11 Towers 59445 non-null float64\n", + " 12 MPG 59445 non-null float64\n", + " 13 LPS 59445 non-null float64\n", + " 14 Pressure_switch 59445 non-null float64\n", + " 15 Oil_level 59445 non-null float64\n", + " 16 Caudal_impulses 59445 non-null float64\n", + " 17 status 59445 non-null int64 \n", + "dtypes: float64(15), int64(2), object(1)\n", + "memory usage: 8.2+ MB\n", + "None\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.metrics import classification_report, ConfusionMatrixDisplay, accuracy_score, confusion_matrix\n", + "from sklearn.metrics import roc_curve, auc\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "\n", + "\n", + "import numpy as np\n", + "\n", + "# data = pd.read_csv(\"MetroPT3.csv\")\n", + "data = pd.read_csv(\"RailGuadrs_Clean_Data.csv\")\n", + "print(data.info())" + ] + }, + { + "cell_type": "markdown", + "id": "7uLEBO473Bll", + "metadata": { + "id": "7uLEBO473Bll" + }, + "source": [ + "# Data Introduction" + ] + }, + { + "cell_type": "markdown", + "id": "i_iR7xMJVv-i", + "metadata": { + "id": "i_iR7xMJVv-i" + }, + "source": [ + "The MetroPT-3 dataset was designed to facilitate the development of predictive maintenance, anomaly detection, and remaining useful life (RUL) prediction models for train compressors using deep learning and machine learning techniques. It comprises multivariate time series data collected from various analog and digital sensors installed on a train compressor. The data, recorded between February and August 2020, includes 15 signals such as pressures, motor current, oil temperature, and electrical signals from air intake valves. This dataset is suitable for incremental training and contains no sensitive information. Data preprocessing involves segmentation, normalization, and feature extraction. While the dataset itself is unlabeled, failure reports provided by the company are available to evaluate the performance of anomaly detection, failure prediction, and RUL estimation algorithms. Notably, the dataset does not contain any missing values.\n", + "\n", + "\n", + "the link : https://archive.ics.uci.edu/dataset/791/metropt+3+dataset" + ] + }, + { + "cell_type": "markdown", + "id": "tlgQsE5x3fEE", + "metadata": { + "id": "tlgQsE5x3fEE" + }, + "source": [ + "## Data Overview" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8f0b8b88", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8f0b8b88", + "outputId": "5b149794-596b-4525-883d-3e218668cb76" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Unnamed: 0 TP2 TP3 H1 DV_pressure Reservoirs \\\n", + "count 59445.00 59445.00 59445.00 59445.00 59445.00 59445.00 \n", + "mean 784018.09 4.66 8.66 3.90 0.94 8.66 \n", + "std 334772.31 4.16 0.62 4.48 1.01 0.62 \n", + "min 31.00 -0.03 6.89 -0.03 -0.03 6.89 \n", + "25% 566189.00 -0.01 8.16 -0.01 -0.02 8.16 \n", + "50% 891860.00 7.27 8.59 -0.00 -0.01 8.59 \n", + "75% 906843.00 8.36 9.01 8.82 2.01 9.01 \n", + "max 1516860.00 10.61 10.24 10.25 4.95 10.24 \n", + "\n", + " Oil_temperature Motor_current COMP DV_eletric Towers \\\n", + "count 59445.00 59445.00 59445.00 59445.00 59445.00 \n", + "mean 68.98 3.74 0.43 0.57 0.72 \n", + "std 8.16 2.42 0.50 0.50 0.45 \n", + "min 43.00 0.02 0.00 0.00 0.00 \n", + "25% 62.45 0.04 0.00 0.00 0.00 \n", + "50% 72.95 5.34 0.00 1.00 1.00 \n", + "75% 75.48 5.61 1.00 1.00 1.00 \n", + "max 89.05 6.98 1.00 1.00 1.00 \n", + "\n", + " MPG LPS Pressure_switch Oil_level Caudal_impulses \\\n", + "count 59445.00 59445.00 59445.00 59445.00 59445.00 \n", + "mean 0.43 0.01 0.99 0.95 0.97 \n", + "std 0.49 0.08 0.08 0.22 0.18 \n", + "min 0.00 0.00 0.00 0.00 0.00 \n", + "25% 0.00 0.00 1.00 1.00 1.00 \n", + "50% 0.00 0.00 1.00 1.00 1.00 \n", + "75% 1.00 0.00 1.00 1.00 1.00 \n", + "max 1.00 1.00 1.00 1.00 1.00 \n", + "\n", + " status \n", + "count 59445.0 \n", + "mean 0.5 \n", + "std 0.5 \n", + "min 0.0 \n", + "25% 0.0 \n", + "50% 0.0 \n", + "75% 1.0 \n", + "max 1.0 \n", + "Index(['Unnamed: 0', 'timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure',\n", + " 'Reservoirs', 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric',\n", + " 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level',\n", + " 'Caudal_impulses', 'status'],\n", + " dtype='object')\n" + ] + } + ], + "source": [ + "print(data.describe().round(2))\n", + "print(data.columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1d44ba87-b80a-41fd-982b-061b6cdd81bb", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1d44ba87-b80a-41fd-982b-061b6cdd81bb", + "outputId": "560e566d-89de-4df0-ff59-3fe32fcd690e" + }, + "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": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.head()" + ] + }, + { + "cell_type": "markdown", + "id": "hI6sjTAB92g_", + "metadata": { + "id": "hI6sjTAB92g_" + }, + "source": [ + "## Cleaning\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "JAQC3yq4-FOa", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JAQC3yq4-FOa", + "outputId": "c86f8d17-72ac-448c-8ee3-40225240d371" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Index(['Unnamed: 0', 'timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure',\n", + " 'Reservoirs', 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric',\n", + " 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level',\n", + " 'Caudal_impulses', 'status'],\n", + " dtype='object')\n" + ] + } + ], + "source": [ + "print(data.columns)\n", + "data = data.drop('Unnamed: 0', axis= 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "db151043", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "timestamp 2020-02-01 00:05:07\n", + "TP2 -0.03\n", + "TP3 6.894\n", + "H1 -0.034\n", + "DV_pressure -0.032\n", + "Reservoirs 6.892\n", + "Oil_temperature 43.0\n", + "Motor_current 0.0225\n", + "COMP 0.0\n", + "DV_eletric 0.0\n", + "Towers 0.0\n", + "MPG 0.0\n", + "LPS 0.0\n", + "Pressure_switch 0.0\n", + "Oil_level 0.0\n", + "Caudal_impulses 0.0\n", + "status 0\n", + "dtype: object" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "data.min()" + ] + }, + { + "cell_type": "markdown", + "id": "3eb2efc4-bd6e-4501-a39b-6f7ef141c8a1", + "metadata": { + "id": "3eb2efc4-bd6e-4501-a39b-6f7ef141c8a1" + }, + "source": [ + "## Convert the timestamp collumn into pandas.DateTime data type standarzation" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3355db20", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "timestamp 2020-09-01 03:45:28\n", + "TP2 10.614\n", + "TP3 10.244\n", + "H1 10.246\n", + "DV_pressure 4.95\n", + "Reservoirs 10.242\n", + "Oil_temperature 89.05\n", + "Motor_current 6.98\n", + "COMP 1.0\n", + "DV_eletric 1.0\n", + "Towers 1.0\n", + "MPG 1.0\n", + "LPS 1.0\n", + "Pressure_switch 1.0\n", + "Oil_level 1.0\n", + "Caudal_impulses 1.0\n", + "status 1\n", + "dtype: object" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.max()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "d42c2fe5-79e9-4810-977c-ae7485ea5b52", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "d42c2fe5-79e9-4810-977c-ae7485ea5b52", + "outputId": "480f151c-875c-4011-8725-a8dbdc2c596e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current type of timestamp is \n", + "Current type of timestamp is \n" + ] + } + ], + "source": [ + "import datetime\n", + "\n", + "#Check the current type of timestamp\n", + "print(f\"Current type of timestamp is {type(data.timestamp[0])}\")\n", + "\n", + "#Convert timestamp to pandas.DateTime ISO 8601\n", + "data['timestamp'] = data['timestamp'].apply(pd.to_datetime, format = \"%Y-%m-%d %H:%M:%S\")\n", + "\n", + "#Re-check the type\n", + "print(f\"Current type of timestamp is {type(data.timestamp[0])}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "5d71d0fd", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5d71d0fd", + "outputId": "da58eaef-12e4-4444-86d7-6e4b654c45bd" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " timestamp TP2 TP3 H1 DV_pressure Reservoirs \\\n", + "0 2020-04-18 00:00:01 -0.018 8.248 8.238 -0.024 8.248 \n", + "1 2020-04-18 00:00:13 -0.018 8.248 8.238 -0.024 8.248 \n", + "2 2020-04-18 00:00:24 -0.018 8.248 8.238 -0.024 8.248 \n", + "3 2020-04-18 00:00:36 -0.018 8.248 8.238 -0.024 8.248 \n", + "4 2020-04-18 00:00:49 -0.018 8.248 8.238 -0.024 8.248 \n", + "5 2020-04-18 00:01:01 -0.018 8.248 8.238 -0.024 8.248 \n", + "6 2020-04-18 00:01:13 -0.018 8.248 8.238 -0.024 8.248 \n", + "7 2020-04-18 00:01:25 -0.018 8.248 8.238 -0.024 8.248 \n", + "8 2020-04-18 00:01:37 -0.018 8.248 8.238 -0.024 8.248 \n", + "9 2020-04-18 00:01:49 -0.018 8.248 8.238 -0.024 8.248 \n", + "\n", + " Oil_temperature Motor_current COMP DV_eletric Towers MPG LPS \\\n", + "0 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "1 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "2 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "3 49.45 0.04 0.0 0.0 0.0 0.0 0.0 \n", + "4 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "5 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "6 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "7 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "8 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "9 49.45 0.04 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " Pressure_switch Oil_level Caudal_impulses status \n", + "0 1.0 1.0 1.0 1 \n", + "1 1.0 1.0 1.0 1 \n", + "2 1.0 1.0 1.0 1 \n", + "3 0.0 0.0 0.0 1 \n", + "4 1.0 1.0 1.0 1 \n", + "5 1.0 1.0 1.0 1 \n", + "6 1.0 1.0 1.0 1 \n", + "7 1.0 1.0 1.0 1 \n", + "8 1.0 1.0 1.0 1 \n", + "9 0.0 0.0 0.0 1 \n" + ] + } + ], + "source": [ + "print(data.head(10))" + ] + }, + { + "cell_type": "markdown", + "id": "5bca1be5-5d0e-4317-a375-dedbe9168c00", + "metadata": { + "id": "5bca1be5-5d0e-4317-a375-dedbe9168c00" + }, + "source": [ + "## Add a label feature" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "g3txUZmdXZU8", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "g3txUZmdXZU8", + "outputId": "5aaa3394-881e-4869-eb84-855a86e51624" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " timestamp TP2 TP3 H1 DV_pressure Reservoirs \\\n", + "0 2020-04-18 00:00:01 -0.018 8.248 8.238 -0.024 8.248 \n", + "1 2020-04-18 00:00:13 -0.018 8.248 8.238 -0.024 8.248 \n", + "2 2020-04-18 00:00:24 -0.018 8.248 8.238 -0.024 8.248 \n", + "3 2020-04-18 00:00:36 -0.018 8.248 8.238 -0.024 8.248 \n", + "4 2020-04-18 00:00:49 -0.018 8.248 8.238 -0.024 8.248 \n", + "\n", + " Oil_temperature Motor_current COMP DV_eletric Towers MPG LPS \\\n", + "0 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "1 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "2 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "3 49.45 0.04 0.0 0.0 0.0 0.0 0.0 \n", + "4 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "\n", + " Pressure_switch Oil_level Caudal_impulses status \n", + "0 1.0 1.0 1.0 0 \n", + "1 1.0 1.0 1.0 0 \n", + "2 1.0 1.0 1.0 0 \n", + "3 0.0 0.0 0.0 0 \n", + "4 1.0 1.0 1.0 0 \n" + ] + } + ], + "source": [ + "#Create a new column for target variable called status, indicate the equipment has deficiencies and need to be maintained\n", + "# status = 0; system ups and running no No Failure\n", + "# status = 1; system downs and needs recovering ## Failure\n", + "labeled_data = data.copy()\n", + "labeled_data['status'] = 0\n", + "print(labeled_data.head(5))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ab649eb6", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ab649eb6", + "outputId": "a3f95a09-2407-4dfe-9941-e7802dba6193" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Timestamp('2020-04-18 00:00:00'), Timestamp('2020-05-29 23:30:00'), Timestamp('2020-06-05 10:00:00'), Timestamp('2020-07-15 14:30:00')] \n", + " 59\n" + ] + } + ], + "source": [ + "def to_datetime(xs):\n", + " result = []\n", + " format = \"%Y-%m-%d %H:%M:%S\"\n", + " for x in xs:\n", + " result.append(pd.to_datetime(x, format = format))\n", + " return result\n", + "\n", + "\n", + "failure_start_time = to_datetime([\"2020-04-18 00:00:00\", \"2020-05-29 23:30:00\", \"2020-06-05 10:00:00\", \"2020-07-15 14:30:00\"] )\n", + "failure_end_time = to_datetime([\"2020-04-18 23:59:00\", \"2020-05-30 06:00:00\", \"2020-06-07 14:30:00\", \"2020-07-15 19:00:00\"] )\n", + "\n", + "print(failure_start_time,\"\\n\", failure_end_time[0].minute)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "KqHsjSKPyFsT", + "metadata": { + "id": "KqHsjSKPyFsT" + }, + "outputs": [], + "source": [ + "def in_between(x, start, end):\n", + "\n", + " start_con = x >= start\n", + " end_con = x<= end\n", + "\n", + " inbetween_con = start_con and end_con\n", + " if inbetween_con:\n", + " return 1\n", + " else:\n", + " return 0" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "oig21csoXP3w", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "oig21csoXP3w", + "outputId": "ddaeae7d-d645-488d-e33d-c13da88cc78e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Found 29607 samples representing failure state\n" + ] + } + ], + "source": [ + "failure_indx = []\n", + "for i, (start_time, end_time) in enumerate(zip(failure_start_time, failure_end_time)):\n", + " mask = labeled_data['timestamp'].apply(in_between, start = start_time, end = end_time)\n", + " indx = labeled_data.index[mask == True].tolist()\n", + " failure_indx += indx\n", + "\n", + "\n", + "print(f\" Found {len(failure_indx)} samples representing failure state\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "b27kdTKUCR_S", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "b27kdTKUCR_S", + "outputId": "f13398b5-d843-4be6-a993-969dc4204fc4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 29838\n", + "1 29607\n", + "Name: status, dtype: int64\n", + "We have 29607 positve samples\n" + ] + } + ], + "source": [ + "#Set the sample with the timestamp falled between the failure time to 1\n", + "# labeled_data['status'].iloc[failure_indx] = 1\n", + "labeled_data.loc[failure_indx, 'status'] = 1\n", + "print(labeled_data['status'].value_counts())\n", + "print(f\"We have {labeled_data['status'][labeled_data['status']==1].count()} positve samples\" )" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "TROhLWInqqGr", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "TROhLWInqqGr", + "outputId": "69ab8657-212c-401b-ae32-5722b74dee5d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Example of Failure state \n", + " timestamp TP2 TP3 H1 DV_pressure Reservoirs \\\n", + "0 2020-04-18 00:00:01 -0.018 8.248 8.238 -0.024 8.248 \n", + "1 2020-04-18 00:00:13 -0.018 8.248 8.238 -0.024 8.248 \n", + "2 2020-04-18 00:00:24 -0.018 8.248 8.238 -0.024 8.248 \n", + "3 2020-04-18 00:00:36 -0.018 8.248 8.238 -0.024 8.248 \n", + "4 2020-04-18 00:00:49 -0.018 8.248 8.238 -0.024 8.248 \n", + "\n", + " Oil_temperature Motor_current COMP DV_eletric Towers MPG LPS \\\n", + "0 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "1 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "2 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "3 49.45 0.04 0.0 0.0 0.0 0.0 0.0 \n", + "4 49.45 0.04 1.0 0.0 1.0 1.0 0.0 \n", + "\n", + " Pressure_switch Oil_level Caudal_impulses status \n", + "0 1.0 1.0 1.0 1 \n", + "1 1.0 1.0 1.0 1 \n", + "2 1.0 1.0 1.0 1 \n", + "3 0.0 0.0 0.0 1 \n", + "4 1.0 1.0 1.0 1 \n" + ] + } + ], + "source": [ + "print(f\"Example of Failure state \\n {labeled_data[labeled_data['status']==1].head()}\")" + ] + }, + { + "cell_type": "markdown", + "id": "A8iLUYDTpjfI", + "metadata": { + "id": "A8iLUYDTpjfI" + }, + "source": [ + "## splite the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "sEyrVfNUsy98", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "sEyrVfNUsy98", + "outputId": "b92e948b-2d88-4c4b-b223-f35a89479d8d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Int64Index: 29607 entries, 0 to 29606\n", + "Data columns (total 17 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 timestamp 29607 non-null datetime64[ns]\n", + " 1 TP2 29607 non-null float64 \n", + " 2 TP3 29607 non-null float64 \n", + " 3 H1 29607 non-null float64 \n", + " 4 DV_pressure 29607 non-null float64 \n", + " 5 Reservoirs 29607 non-null float64 \n", + " 6 Oil_temperature 29607 non-null float64 \n", + " 7 Motor_current 29607 non-null float64 \n", + " 8 COMP 29607 non-null float64 \n", + " 9 DV_eletric 29607 non-null float64 \n", + " 10 Towers 29607 non-null float64 \n", + " 11 MPG 29607 non-null float64 \n", + " 12 LPS 29607 non-null float64 \n", + " 13 Pressure_switch 29607 non-null float64 \n", + " 14 Oil_level 29607 non-null float64 \n", + " 15 Caudal_impulses 29607 non-null float64 \n", + " 16 status 29607 non-null int64 \n", + "dtypes: datetime64[ns](1), float64(15), int64(1)\n", + "memory usage: 4.1 MB\n", + "Positive dataset\n", + " None\n", + "\n", + "\n", + "Int64Index: 29838 entries, 29607 to 59444\n", + "Data columns (total 17 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 timestamp 29838 non-null datetime64[ns]\n", + " 1 TP2 29838 non-null float64 \n", + " 2 TP3 29838 non-null float64 \n", + " 3 H1 29838 non-null float64 \n", + " 4 DV_pressure 29838 non-null float64 \n", + " 5 Reservoirs 29838 non-null float64 \n", + " 6 Oil_temperature 29838 non-null float64 \n", + " 7 Motor_current 29838 non-null float64 \n", + " 8 COMP 29838 non-null float64 \n", + " 9 DV_eletric 29838 non-null float64 \n", + " 10 Towers 29838 non-null float64 \n", + " 11 MPG 29838 non-null float64 \n", + " 12 LPS 29838 non-null float64 \n", + " 13 Pressure_switch 29838 non-null float64 \n", + " 14 Oil_level 29838 non-null float64 \n", + " 15 Caudal_impulses 29838 non-null float64 \n", + " 16 status 29838 non-null int64 \n", + "dtypes: datetime64[ns](1), float64(15), int64(1)\n", + "memory usage: 4.1 MB\n", + "Negative dataset\n", + " None\n", + "\n" + ] + } + ], + "source": [ + "#Seperate Positive samples and Negative sample\n", + "pos_data = labeled_data[labeled_data['status'] == 1]\n", + "neg_data = labeled_data[labeled_data['status'] == 0]\n", + "\n", + "#Print out the info of 2 dataset\n", + "print(f\"Positive dataset\\n {pos_data.info()}\\n\")\n", + "print(f\"Negative dataset\\n {neg_data.info()}\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "U9kT3KI0tbCz", + "metadata": { + "id": "U9kT3KI0tbCz" + }, + "source": [ + "As we can see, we have around 30K postive samples and 1500K negative sample. This indicates highly imbalanced dataset. Thus, we have to subsample the negative class to balance the training data. To achive this, we will randomly sample 30K negative sample from the set of 1500K sample." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "6_vdKBfat9fH", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6_vdKBfat9fH", + "outputId": "b5b61cdf-5878-48dc-c767-a884f24dbce4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Int64Index: 29607 entries, 36986 to 54892\n", + "Data columns (total 17 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 timestamp 29607 non-null datetime64[ns]\n", + " 1 TP2 29607 non-null float64 \n", + " 2 TP3 29607 non-null float64 \n", + " 3 H1 29607 non-null float64 \n", + " 4 DV_pressure 29607 non-null float64 \n", + " 5 Reservoirs 29607 non-null float64 \n", + " 6 Oil_temperature 29607 non-null float64 \n", + " 7 Motor_current 29607 non-null float64 \n", + " 8 COMP 29607 non-null float64 \n", + " 9 DV_eletric 29607 non-null float64 \n", + " 10 Towers 29607 non-null float64 \n", + " 11 MPG 29607 non-null float64 \n", + " 12 LPS 29607 non-null float64 \n", + " 13 Pressure_switch 29607 non-null float64 \n", + " 14 Oil_level 29607 non-null float64 \n", + " 15 Caudal_impulses 29607 non-null float64 \n", + " 16 status 29607 non-null int64 \n", + "dtypes: datetime64[ns](1), float64(15), int64(1)\n", + "memory usage: 4.1 MB\n", + "Negative dataset after subsampling None\n" + ] + } + ], + "source": [ + "n_positives = int(pos_data['status'].count())\n", + "sub_neg_data = neg_data.sample(n_positives, random_state = 42)\n", + "print(f\"Negative dataset after subsampling {sub_neg_data.info()}\")" + ] + }, + { + "cell_type": "markdown", + "id": "yQq9o7quu_ei", + "metadata": { + "id": "yQq9o7quu_ei" + }, + "source": [ + "Now, we merge the postive set and negative set into one" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "_Nmrpj12vIDK", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_Nmrpj12vIDK", + "outputId": "b6e0ec55-adc9-4a2b-e6f8-0a62297361d9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Merged dataset\n", + "\n", + "\n", + "Int64Index: 59214 entries, 0 to 54892\n", + "Data columns (total 17 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 timestamp 59214 non-null datetime64[ns]\n", + " 1 TP2 59214 non-null float64 \n", + " 2 TP3 59214 non-null float64 \n", + " 3 H1 59214 non-null float64 \n", + " 4 DV_pressure 59214 non-null float64 \n", + " 5 Reservoirs 59214 non-null float64 \n", + " 6 Oil_temperature 59214 non-null float64 \n", + " 7 Motor_current 59214 non-null float64 \n", + " 8 COMP 59214 non-null float64 \n", + " 9 DV_eletric 59214 non-null float64 \n", + " 10 Towers 59214 non-null float64 \n", + " 11 MPG 59214 non-null float64 \n", + " 12 LPS 59214 non-null float64 \n", + " 13 Pressure_switch 59214 non-null float64 \n", + " 14 Oil_level 59214 non-null float64 \n", + " 15 Caudal_impulses 59214 non-null float64 \n", + " 16 status 59214 non-null int64 \n", + "dtypes: datetime64[ns](1), float64(15), int64(1)\n", + "memory usage: 8.1 MB\n" + ] + } + ], + "source": [ + "merged_data = pd.concat([pos_data, sub_neg_data], axis = 0)\n", + "print(f\"Merged dataset\\n\")\n", + "merged_data.info()" + ] + }, + { + "cell_type": "markdown", + "id": "18c5a153-7fb2-4b7d-86d9-a41322313752", + "metadata": { + "id": "18c5a153-7fb2-4b7d-86d9-a41322313752" + }, + "source": [ + "## Valeurs abirrantes" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "7a6abdcd", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7a6abdcd", + "outputId": "9c9de07f-dfdf-4983-f929-a454d9d21260" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Dropping outliers ...\n", + "\n", + "Found 1 oulier(s) for feature Reservoirs\n", + "Droping 1 from column Reservoirs\n", + "59213 samples left\n", + "\n", + "Found 394 oulier(s) for feature LPS\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 400 oulier(s) for feature Pressure_switch\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 2870 oulier(s) for feature Oil_level\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 1930 oulier(s) for feature Caudal_impulses\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 394 oulier(s) for feature LPS\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 400 oulier(s) for feature Pressure_switch\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 2870 oulier(s) for feature Oil_level\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 1930 oulier(s) for feature Caudal_impulses\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 394 oulier(s) for feature LPS\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 400 oulier(s) for feature Pressure_switch\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 2870 oulier(s) for feature Oil_level\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 1930 oulier(s) for feature Caudal_impulses\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 394 oulier(s) for feature LPS\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 400 oulier(s) for feature Pressure_switch\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 2870 oulier(s) for feature Oil_level\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 1930 oulier(s) for feature Caudal_impulses\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 394 oulier(s) for feature LPS\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 400 oulier(s) for feature Pressure_switch\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 2870 oulier(s) for feature Oil_level\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "Found 1930 oulier(s) for feature Caudal_impulses\n", + "Skipping .. data has Q1 equals to Q3\n", + "59213 rows left\n", + "\n", + "\n", + "Dropping Completed ...\n", + "\n", + "Found 394 oulier(s) for feature LPS\n", + "Found 400 oulier(s) for feature Pressure_switch\n", + "Found 2870 oulier(s) for feature Oil_level\n", + "Found 1930 oulier(s) for feature Caudal_impulses\n" + ] + } + ], + "source": [ + "def investigate_outliers(data, c):\n", + " q1 = data[c].quantile(0.25)\n", + " q3 = data[c].quantile(0.75)\n", + " iqr = q3 - q1\n", + " ll = q1 - 1.5*iqr\n", + " ul = q3 + 1.5*iqr\n", + "\n", + " num_outliers = data[data[c] < ll][c].count() + data[data[c] > ul][c].count()\n", + " if num_outliers>0:\n", + " print(f\"Found {num_outliers} oulier(s) for feature {c}\")\n", + " return {'col': c, 'n_outliers': num_outliers, 'll': ll, 'ul': ul, 'q1': q1, 'q3':q3}\n", + "\n", + "print(\"\\nDropping outliers ...\\n\")\n", + "clean_data = merged_data.copy()\n", + "for i in range(5):\n", + " for c in clean_data.columns:\n", + " if c not in [\"Unnamed: 0\",\"timestamp\"]:\n", + " cue = investigate_outliers(clean_data, c)\n", + " if cue[\"n_outliers\"] > 0 and (cue[\"q1\"]!= cue[\"q3\"]):\n", + " print(f\"Droping {cue['n_outliers']} from column {c}\")\n", + " clean_data = clean_data[clean_data[c]> cue[\"ll\"]]\n", + " clean_data = clean_data[clean_data[c]< cue[\"ul\"]]\n", + " print(f\"{clean_data.shape[0]} samples left\\n\")\n", + " elif (cue[\"q1\"]== cue[\"q3\"]):\n", + " print(\"Skipping .. data has Q1 equals to Q3\")\n", + " print(f\"{clean_data.shape[0]} rows left\\n\")\n", + "\n", + "\n", + "print(\"\\nDropping Completed ...\\n\")\n", + "#Recheck data\n", + "for c in clean_data.columns:\n", + " if c not in [\"Unnamed: 0\",\"timestamp\",\"COMP\", 'status']:\n", + " cue = investigate_outliers(clean_data, c)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "vq_Xju3HwQU-", + "metadata": { + "id": "vq_Xju3HwQU-" + }, + "outputs": [], + "source": [ + "#Investigate the columns with the binary values\n", + "binary_cols = ['LPS', 'Pressure_switch', 'Oil_level', 'Caudal_impulses']\n", + "#Ensure the the binary data is binary\n", + "clean_data[binary_cols] = clean_data[binary_cols].apply(np.round)" + ] + }, + { + "cell_type": "markdown", + "id": "AcoWfkxg3US9", + "metadata": { + "id": "AcoWfkxg3US9" + }, + "source": [ + "## III. Exploratory Data Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "fiQbhtDt6bAB", + "metadata": { + "id": "fiQbhtDt6bAB" + }, + "source": [ + "### 1) Correlation" + ] + }, + { + "cell_type": "markdown", + "id": "OA6ITWCb7A8y", + "metadata": { + "id": "OA6ITWCb7A8y" + }, + "source": [ + "Describing the correlation between the features, the values closer to 1 or -1 represent a stronger relation." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "i9T0eAlo6-zg", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 606 + }, + "id": "i9T0eAlo6-zg", + "outputId": "aa9b7264-a06b-4617-88fb-1ac0a52b42e0" + }, + "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", + " \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", + " \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", + "
TP2TP3H1DV_pressureReservoirsOil_temperatureMotor_currentCOMPDV_eletricTowersMPGLPSPressure_switchOil_levelCaudal_impulsesstatus
TP21.00-0.42-0.980.81-0.420.740.87-0.980.98-0.52-0.970.060.000.190.140.83
TP3-0.421.000.54-0.551.00-0.28-0.170.49-0.480.270.48-0.180.01-0.14-0.13-0.55
H1-0.980.541.00-0.830.54-0.73-0.840.99-0.990.540.99-0.070.00-0.20-0.15-0.86
DV_pressure0.81-0.55-0.831.00-0.550.730.72-0.830.83-0.45-0.83-0.050.020.210.170.92
Reservoirs-0.421.000.54-0.551.00-0.28-0.170.49-0.480.270.48-0.180.01-0.14-0.13-0.55
Oil_temperature0.74-0.28-0.730.73-0.281.000.80-0.750.76-0.41-0.750.100.020.100.110.81
Motor_current0.87-0.17-0.840.72-0.170.801.00-0.870.87-0.47-0.870.060.000.140.100.74
COMP-0.980.490.99-0.830.49-0.75-0.871.00-0.990.551.00-0.070.06-0.18-0.12-0.86
DV_eletric0.98-0.48-0.990.83-0.480.760.87-0.991.00-0.53-0.990.070.030.190.140.86
Towers-0.520.270.54-0.450.27-0.41-0.470.55-0.531.000.54-0.040.09-0.07-0.04-0.47
MPG-0.970.480.99-0.830.48-0.75-0.871.00-0.990.541.00-0.070.06-0.15-0.10-0.86
LPS0.06-0.18-0.07-0.05-0.180.100.06-0.070.07-0.04-0.071.000.010.020.020.08
Pressure_switch0.000.010.000.020.010.020.000.060.030.090.060.011.000.200.260.02
Oil_level0.19-0.14-0.200.21-0.140.100.14-0.180.19-0.07-0.150.020.201.000.120.22
Caudal_impulses0.14-0.13-0.150.17-0.130.110.10-0.120.14-0.04-0.100.020.260.121.000.18
status0.83-0.55-0.860.92-0.550.810.74-0.860.86-0.47-0.860.080.020.220.181.00
\n", + "
" + ], + "text/plain": [ + " TP2 TP3 H1 DV_pressure Reservoirs Oil_temperature \\\n", + "TP2 1.00 -0.42 -0.98 0.81 -0.42 0.74 \n", + "TP3 -0.42 1.00 0.54 -0.55 1.00 -0.28 \n", + "H1 -0.98 0.54 1.00 -0.83 0.54 -0.73 \n", + "DV_pressure 0.81 -0.55 -0.83 1.00 -0.55 0.73 \n", + "Reservoirs -0.42 1.00 0.54 -0.55 1.00 -0.28 \n", + "Oil_temperature 0.74 -0.28 -0.73 0.73 -0.28 1.00 \n", + "Motor_current 0.87 -0.17 -0.84 0.72 -0.17 0.80 \n", + "COMP -0.98 0.49 0.99 -0.83 0.49 -0.75 \n", + "DV_eletric 0.98 -0.48 -0.99 0.83 -0.48 0.76 \n", + "Towers -0.52 0.27 0.54 -0.45 0.27 -0.41 \n", + "MPG -0.97 0.48 0.99 -0.83 0.48 -0.75 \n", + "LPS 0.06 -0.18 -0.07 -0.05 -0.18 0.10 \n", + "Pressure_switch 0.00 0.01 0.00 0.02 0.01 0.02 \n", + "Oil_level 0.19 -0.14 -0.20 0.21 -0.14 0.10 \n", + "Caudal_impulses 0.14 -0.13 -0.15 0.17 -0.13 0.11 \n", + "status 0.83 -0.55 -0.86 0.92 -0.55 0.81 \n", + "\n", + " Motor_current COMP DV_eletric Towers MPG LPS \\\n", + "TP2 0.87 -0.98 0.98 -0.52 -0.97 0.06 \n", + "TP3 -0.17 0.49 -0.48 0.27 0.48 -0.18 \n", + "H1 -0.84 0.99 -0.99 0.54 0.99 -0.07 \n", + "DV_pressure 0.72 -0.83 0.83 -0.45 -0.83 -0.05 \n", + "Reservoirs -0.17 0.49 -0.48 0.27 0.48 -0.18 \n", + "Oil_temperature 0.80 -0.75 0.76 -0.41 -0.75 0.10 \n", + "Motor_current 1.00 -0.87 0.87 -0.47 -0.87 0.06 \n", + "COMP -0.87 1.00 -0.99 0.55 1.00 -0.07 \n", + "DV_eletric 0.87 -0.99 1.00 -0.53 -0.99 0.07 \n", + "Towers -0.47 0.55 -0.53 1.00 0.54 -0.04 \n", + "MPG -0.87 1.00 -0.99 0.54 1.00 -0.07 \n", + "LPS 0.06 -0.07 0.07 -0.04 -0.07 1.00 \n", + "Pressure_switch 0.00 0.06 0.03 0.09 0.06 0.01 \n", + "Oil_level 0.14 -0.18 0.19 -0.07 -0.15 0.02 \n", + "Caudal_impulses 0.10 -0.12 0.14 -0.04 -0.10 0.02 \n", + "status 0.74 -0.86 0.86 -0.47 -0.86 0.08 \n", + "\n", + " Pressure_switch Oil_level Caudal_impulses status \n", + "TP2 0.00 0.19 0.14 0.83 \n", + "TP3 0.01 -0.14 -0.13 -0.55 \n", + "H1 0.00 -0.20 -0.15 -0.86 \n", + "DV_pressure 0.02 0.21 0.17 0.92 \n", + "Reservoirs 0.01 -0.14 -0.13 -0.55 \n", + "Oil_temperature 0.02 0.10 0.11 0.81 \n", + "Motor_current 0.00 0.14 0.10 0.74 \n", + "COMP 0.06 -0.18 -0.12 -0.86 \n", + "DV_eletric 0.03 0.19 0.14 0.86 \n", + "Towers 0.09 -0.07 -0.04 -0.47 \n", + "MPG 0.06 -0.15 -0.10 -0.86 \n", + "LPS 0.01 0.02 0.02 0.08 \n", + "Pressure_switch 1.00 0.20 0.26 0.02 \n", + "Oil_level 0.20 1.00 0.12 0.22 \n", + "Caudal_impulses 0.26 0.12 1.00 0.18 \n", + "status 0.02 0.22 0.18 1.00 " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clean_data.corr().round(2)" + ] + }, + { + "cell_type": "markdown", + "id": "4AC8dXfm7IhS", + "metadata": { + "id": "4AC8dXfm7IhS" + }, + "source": [ + "We can see that our target variable \"status\" has high correlation with TP2, H1, DV_pressure, Oil_temparature, Motor_current, COMP, DV_electric and MPG. " + ] + }, + { + "cell_type": "markdown", + "id": "2qVh_sbv6fm0", + "metadata": { + "id": "2qVh_sbv6fm0" + }, + "source": [ + "## Correlation" + ] + }, + { + "cell_type": "markdown", + "id": "f2PO54CY7nwo", + "metadata": { + "id": "f2PO54CY7nwo" + }, + "source": [ + "Below shows a Heat map,which can be used to analyse trends, from the below heat map you can see the trends in correlation of data." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "aQrZeZUl7rBm", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 610 + }, + "id": "aQrZeZUl7rBm", + "outputId": "65c08aac-44e7-414c-aebc-5db06f84b7f6" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sns.heatmap(clean_data.corr(),annot=False )" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "hO6oX3xs8crF", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 82 + }, + "id": "hO6oX3xs8crF", + "outputId": "890a7941-e6f0-4623-8d7f-61c8ab593db7" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAACwoAAAC0CAYAAACO0zr8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAACa50lEQVR4nOz9aaxtaX7f932fZ017PNM9595bd6ipq6uLxR7Y7OIkeqBlMaYmUrYUDoFAyCFMA4mEBBaESEgkCxSCxDFgQJYY25QZC50gopp2RHeoThhBoqNI7qa6m032XNU13/mecc9rfJ68WGufs8+tW3eqe6p7n/p9gF1377XX8Kxn/Z9h1Xn2s4z3HhERERERERERERERERERERERERERETld7Hc7ASIiIiIiIiIiIiIiIiIiIiIiIiIiIvL4aaCwiIiIiIiIiIiIiIiIiIiIiIiIiIjIKaSBwiIiIiIiIiIiIiIiIiIiIiIiIiIiIqeQBgqLiIiIiIiIiIiIiIiIiIiIiIiIiIicQhooLCIiIiIiIiIiIiIiIiIiIiIiIiIicgot3UDhn/qpn/KAXnp9N18PTXGr1/fA66EpbvX6Hng9NMWtXt8Dr4emuNXre+D10BS3en0PvB6a4lav74HXQ1Pc6vU98Hpoilu9vgdeD01xq9f3wOuhKW71+h54PTTFrV7fA6+HprjV63vg9UgUu3p9l1+PRHGr13f59UgUt3p9D7weyNINFN7Z2fluJ0HkoSluZRkpbmUZKW5lGSluZRkpbmUZKW5lGSluZRkpbmUZKW5lGSluZRkpbmUZKW5lWSl2ZRkpbmUZKW5lWSzdQGERERERERERERERERERERERERERERG5vxMbKGyM+b8YY24bY77+Lt8bY8x/box51RjzVWPMD55UWkRERERERERERERERERERERERERERD5owhPc998H/i7w6Xf5/o8DH25ePwL8F82/j+zTX3iFvV3YOAO/+KPP33f9tKgonSe0hlYUvJdDf89Li4r9ScbXr+6zsz9hMoESiB3EFpyvP1sDNMtKDxkQAYGB5isc4H392QIY8EDgwRmofL2fsPk+dZBbSDyUBlrNumGznfNgDMxcva9us3xWgQ/qdb0B06znm+PQ7CcwMAFiD0nzfWkgbLYrmvTaZr9QJ8y6+ti22YYAgg48d36dFy+vvy9xkRYVtwZTdkYZo1nBtKjw3pMXFWFoScKAaVYwTHMmI2g1+eoX9uGAMARXQVlBaOt8rwDbqt94A6GDwtTnHJRH6zDPr+Z6Vb7ZZ3PNfZPvEXWMLF6zzEFkIVjYLmj2lQPe1ekpm+tkmn8r6riITH2cCrC+2U8M06KOk6hZL7b1cYvmfUi9r9zU+7am3jZrvjdAUYEN6vfzWC2adJsYel1DXoIzHuea2Krq4xgLVV7vIw4giqCqmrgzUJYQJ9AKABMQWktWFsxyCMImrzw4B9ZCEhpK56kA4yAKwWIpnKNy9Xo+A1c2+ZSACepjEtVpN0AS1usGoaXTSlhNYs6ttVhrx3gMSWhZ7cSPP1DvYl7frq3Dz//Qh059HfpBcK82dDDN2RmlpHlJ6VxT19SFev4+DMyxbUrnGMwqxnlBVTqMMUSBIQwCksASRob1Tsz51c6piNv79Smu7Y35/CvXSQ8g8009Nq/DPAQWSgfYo3bPN3UI1PVuaOp62FUQBnV9QlPHQl2nJh6mBvYr2AigDdyirt82g6bjV8Gs+Y4V+NCFM1ze6LC10n5s+SGPz7W9MVf3Z6RZxbgocM5RVZDEAaE1pHnJwSxjMKz7UDF138fQtLmm6etUdVu92KezCeDrti+0UJR1Wxc5oDrqJ3hz9OvCqom3sCny835CUK967FVxFMe26b/N+wYpEPl6v/N+iGvacYCBr88lar4Pmv0YYBpAWNb9ooMKukG9XtbsL2r6HGXT96sW+pDz8y+a/YXU5cubpv8D0AIT1ZkY+LqM+SYNzgMWqqLpU7m63Q4qcEHdd/AeWkmdJ8Ya2lHEJMtJi7rPFjTn6pp8akVgMMwqj3GQRHfvJ5QFxFGdKc7UfVkf1ud0eF0NRNbS6bRYSyLWezHtOKCbxO9rP+Fxe9j7vNNg3q5c3x/z2u0R42lGFBpmZYUv65gkrePCuqN7gHkfP6vq/uT8HsoCuYfU1PV/QB0zMUflxDdlsexCtxvTikIMligwdKKQ0Bq+eWOP0Rg61OUjasp/2oNkDAfU+w9bEKb1/eS8TpjfGya27uvP5U36XfM5o+nzWoh78IlnNnnx4sYJ5/gHM84e1mCa8/nXbnP9YIp19X3T2ZUOgTUcTKZEQciFtR7Pnus9VL/iXv2o339jh29c2YNp/TlvYiNo7v/Lpu8TctQmze+Z53E0LxexB0zdXkD9ft72GKDswHPn1/ix58++16x63yhu5XF4v+NIcSuPg+JWlpHiVpaR4laWkeJWltH7HUe//ZW3uDrIuLSa8Kc++dSJH09OJ8WtLCO12/JBd2IDhb33/9wY8/Q9VvkZ4NPeew98wRizZox5wnt/41GO97d+6w/59S9cPfz81s0Zf/3PfOJd1z+Y5mSlO/ycFhVrS/qH8/s5mOa8uTPm9791i9eGE26NMq4epNwe5ZztRSRxSBLBziAnrxwXNxLiIGKU5mwPM+Ig4PxaQhwYxnnFzigHY2nFhtUkYprndOOQThKzM0nJcoc1cHmzhfcB17enXBvnxFHI82e7zLKUJ8/02KiHoRIYw7CouFEUDKcFW2ttzgcBKY5Xtif0kpggNBhjcHjiwJLljlGas9pNWGsF7E1SKh8ShPB0O2G3yDBRiKlgPy0oK09sIQpDhpOUlU6LaVVwtpuwPyswzjIqcy50Wnz+rR1+5MZZfvITl040Lg6mOV+7us83rg159daYvVkKeAbTnINpSTcK2epHrPQi3rg14tawYJRXvHC+TxRUBNg6ho2nFSVkZU5eOCpgsxszzevr1AlDUl/SshHDPGc6Lel1WiQhHExy0tLTaUYWhCZkVhaUFax1Q6JmYF/sDWtxQIHn1jgniCPe3pnQa4eUZcV6v8V4ljPKHBudiLVWxPYkZZg5eklAv2XZHxWcXWsRhwE745RbgxyL5ZmtDmWVA7Dea3Ntb8YoLUlLx0fOrlBUGbkzFM5QFjlrnRYrXUscBbyxPWU8q4iMpdMKqKoSYyxBaAiAvUnJRj8itBDZiKoqeXtvxvm1NlVVsdJqcXV/xEa/TVmWxEGAMw68ZZpV7E8LznRj+p2IMPCMpgXbk4rEGrpty2a3RUbFbOaYpBXWeIrKcX61Q+kKBpOSIAgonKOXRMzSnNV+zDRztOOQWZFTltCNLYNZdThYa60XE1nPYFbUg8HCgF5i8DbAes/BtCB3hg9tdbi40eXyeoePPLFKL4kYpAVPbnRPJGbn7qxvv311zF/9Ux89tXXoB8G92tC39ya8cnPEW7sT3toZUzhfD7ZwjsDapiaHTlNPe6CoPIOsYDjLmRQO7x3GQGwC2nFAYA29VsjFtR7Pn+/z/RdXlzpu79en+NIbO/zzP7zG9Tzlyl7O7YMpG/2ItPDMsorNXsSs8lSVZ5yWbHRivHFEFrABrnTgPWEUsj1K2eglzPKC8ytdbg6mZGU9OvJTFyO86fGbf3CLOIC8gl/61Dle4BZ/5cvwsfNdfuxijw8Dbfb4Nhu8MILXro157fIa3//kBi9eWHvP+SGPz5fe2OFLb+7z5s6Et/fHtKxllOcMphWtKOB8L6LdjbiyM+HNnZS8crx4YQVrS8rCk8QRlSuIgoSDWUoYGHwF692IaZZjg4B2EDDzJa0gZpimZIWnHUa0YsPuKCd3nk5cDwM2BMzyksBCvxMSGkNgHAkhXWOJY8NOmpNh2Z/k9Y928CSxpR0F7E4K2kn9QyhXVeyNK1Y6IaH1TDLHaieiHQcUpePWIOP2uOCFc30cJVFoiMOINCvZHmVkznNxrUtoC8Yzx0qnzWAyoRVFdNoBa52InWHKaObICk9WOXotSycK6h+2FY60dKx06zZ3OCuJQ0sUWCrvyQvHLPf02wHGelzlaUcRua8w3nBrlNMJAyrvWO2GdOOIcVpwY5BjvOfcWot+KyB1DlcZRpOCSV7SjgI2VxIiPDeHORhD5T3rnYRZmmFDQxiExKFlmtf9hE5k2Z0WdMIALLTjiLzMAUtZVvRbCd5URDZkkheUJdjAcrbX4vKZDmd7bZ7cbPPUZv996Sc8bg97n3cazNuVL72xw++/scure0M2+y0G45yCipCAWVEQmoDJLOPcZoey8nRbllVCbh5kVGnJjUnB1kpC5R0mibg9mJJVYK1layViLbQ81U+IyxJKyJxnZgw305JJ6citpR3VZWI1SRhMMwbTumwWzvD8uTZnugGd2JLt5AREzPIZN8eG9W7Cs92IW26KL2MGaUZgY4aTKcYGPHeux4axTHEMKWlPPVkbIOT6zpjSh2R5zvm1Dr9/bZ9/4/kL/OlPXj6xPP8gxtnDentvwj/8/Bt8/q1ddoYZ1w4KXjjbZqUX8tR6hxvjCbcPKj50tscPXNzgjzy/+UD9inv1o/7BF17jay/fZttVpKVjlsP2KMUYeHYzZj1JuDLO2RnmOCAODK0Q1jot9qY5K6GlD6y2IiamJGy1yGcl07Jklnms98TtkMp4NpKI1Bd848o+b9wc8D/7Nz58Mhn5GClu5XF4v+NIcSuPg+JWlpHiVpaR4laWkeJWltH7HUf/h3/8Vf7RV24efv7a9QF/7U9+/MSOJ6eT4laWkdptkaPJwb4bLgJXFj5fbZY9tE9/4ZVjhRng179wlU9/4ZW7rp8W1bE/RAFkpSMtqkc5/Pe0tKjYnaS8ceuAm2XBzVHOm7szrh1kWG+YlY5bB1PeuD1llsMkhcHMcXVvyrWDHDDsTku2hzl7s4KbBwWjtGRnnHPrIOPGIKV0lqyC64MZO6OMYVoRhhFZbnh7Z8r2rGSQeaa54+vXR3gCXrs9YYBhGkXMopA0CDEuoBUlvHFzyq3UYYKYjW6HN/czRrOSydSRpp5Z6jmYVjgXsDvKuT0s6YYtbg9zZrOK1wYpa50ug1HFcOowlSXNPWlheHtnRitp88bOlJiQG/sFvrLcHGaYKuTaIMf6gK+8dcAr1wcnFhdpUXF9f8rbu1OuDybcGs3YHRVc20+5speSFY6dSc7+tOBbV0fkFRxkniyHP7wyIi8Mu5OSWenqwdh7Myapo/SGaeq5upcR2Zi9ScX+tKRtYl6/PSYvDMaGXNufcWtYkBWwP3Vsjyr2JxVv7c7ICo/3FTcOMm6NStLCM67g2tRxe1big4BXbo6ZFY6391KwAd+8NiIrPa5y3BxmvLo7pXQwTiuu76dsD0swhu1hxu4wZ3tYUDkYzEq+cX1I5SyVD3lze8pgVjErHHkB/+qtA3qtNlf3Uq7vzWjHMVf2M/bGnr1hyXjmmGUltycFL9+cggnYHRe8tT1jmDqywnF1d8os8+yMM3anFZG1vLk9ZZLXf+xe6SR8+8aYWQm3xxnTzHN9P2V3UmCAa4OUG/tTRjPHaObYHhaM84rBuOCVWyN8btkf51wbpAxnJXnh+PaNIZPMU3rLm3szRrOS6wcznDXc2E8ZpwW3BylZAQfTgit7GQezkoO0YjAr2R5mbI8KSmcYpgXXBxnTwrM7ztiZFOxNC3bGOdcGOW9uT7iyN2VnOKMoK4azksE0f+wxO3e3+vY3fv8Gv/V7r57KOvSD4F5t6GCac21/yq1hys4oZW9ScHVvys444/Yo58Yg5WCaszvOuHKQsj3OuTFMubI/4/rBjO1Rzv44Z2dQv/an9Ta7k4LhtGRnnHJtb8L13dnSxu39+hTX9sZ88+oeN2c51/YyXr0xod+O2B45XttOCUPDzVHB1b2M28OUwFq+fWvKKC1IK7h5kNU/aLGGP7w6JjCGq/szrLG8tTtmd1KwN6koSsPKyhl+8w9uYagHCccWfv3Lt5j0nwbgazcn/MHtKZN+m0n/Ir/znd3mfcLkIOXtvSnbw9l7yg95fK7tjXn55ojbwxm3RimDacnLtyfsjUvGWcXeNOcgc3z72pCDSUlgLOMCfv+tIb4KmOSeW4MpUdDi+t4MV8FgXJFVnhsHGUEQszuu257ERLy1PaKqLJWzXBtk3BzUA333p47tQcnepOLaXsq0cOSV4+ZBwfaoJC8to8KxW3qujktyH3BzkLE7rtuvrILtUcWVvZTAGG4fFNw8yBimjnFet7mj1LM7qRjOKsazkrf3UtLK44GvXB3hHHVbPsq4sp/hgWnq+drVIVUVUHr42tUDeq0Wt0YltwcFg4knKwzbo4zbk4Lbo4LBzHF7lPP2Tkbq6pnP37w95mDmyEoYpY7bg5zbBxnT3DHNS64PMnYHBVlpuDXMmKSO6/spvnTcGqXsTyv2hjl7o5zrBzll5SkcfPPahL1RAWXAW7en7E4Kqspz7SDj9iBlb1oyLepzGqcl3745BGsZzSqu7k0ZTPLDfsLr2xl54dhP637IjcEM7y03DnKKynF1f0paeLabfe3NcnbHOTeHKW/tTtgez7g9yhjO0hPvJzxuD3ufdxrM25WbBxOu3B7zB9dHnO+02d6vy1XoQw4mBWVheO32lLVOh/HE4cuAuAoZ5rBfem7mjgmGV/ZSRhV8+8YET8Aw8xzMKq7u5QwLeGNUMQ5iDsKIaRzzrYOcqTPs5xU392bc2E9JM8fLNwZcP5hye1wwKWA4K3n5xpRZbpjODJ2wy5u7OVvdNfamjluDlBszx9nOGlf3UzphixuDjE6rzWBW8Z1bU0au/iFnq4oZmxBbJewMCjb7PW6PCrBRfX8wcXz5jV2+eW3vRPL8gxhnD2swzfn8Kzf50lt77I1y3j4oqIBv3p4xGOe8envChU4X5+E7t8a8tTvi5RvD+/Yr7tWP+v03dvjDq0MmYcik8Nwe5nz75gSAvHDgIq6NCq7vpUzSgu1xxc64JLQB3745Zm+csz2rGHrLd0YFK60OV/dm7MwqpqXh2ihnUtU/VBmMS97az1hL2rw9yrmyP+Xzr9w+qex8LBS38ji833GkuJXHQXEry0hxK8tIcSvLSHEry+j9jqPf/spbxwZbAvyjr9zkt7/y1okcT04nxa0sI7XbIrUTm1H4cTLG/DLwywBPPvnkO77f2737du+2vHT+oZYvs9J58tKxMy0ZjWaU9aSlh+58RDTUj96sqB/bebiM+hHLd67vqR+77Hy9vvP1Izu9rx+hXjooquN/+Kua/Y7TjLCwhAbGWUleQuUszkPqPJPZjNxZvIOqqh+lHDQJqlx9HCwUzpNVHu/r9TJgMkvJK+oZ4MoS5+rHcDsPRVGnr2jSZq3FVfVn52GWFRhTsTNJeZ7VR46Le8Vt6TzToiKrqnpASVlReXDNseZ5lFcOh8d4czwPm8dVG988Jpw6r21zrfBQVvX5VA7y0tfXqTlHx9G1mnOueeywAx8cHaMoweCoqAhMAOZ4vMwvr+PoccF+4T3NsSrqxyLPz+1YfjSPRq7c0bbzdYrq6HhF5Sm9I8tLfBAext3icRbfN09Or4/pF2IbqLynwuOaMYLeH+XjO8oETQwunlPzyhfKCwvbHT5S3C88gt01+WXrBfM8X9ynbbapmo3mx5yXXd8s9x6q0lF4T1ZUTPKS0vv60et3/LH9YTxqfXt1fDrr0A+Ce7WhWekoSk/V1LPzuM8qf1jeCu8pm20iV5G7ulyURb2d8/XLYKg8WO+b2IW8qMhKz6x85yCRh/HdjNv79SlGWcnesJ4lvSgW6tlmvXkbCnW5n9d/FUf18Lweg+Z7d1SPz+ueqoLBwfSuablSjA/f55U7/OwXvjP0WclKJnnF1sNngzyC+8XtKCvJqoq8qijKqm5LfVMOvQdvSPPyHW0u1G3ZPHYW+wmH7VNVvyoPVQl5PZlo3db5eTt5/BeFft7eN23UPHaLsk5PYQscEBIc60OWi+2gP95OwlFM03x/rL1r1j08H3fUXs9VC/2EvKTuJxSQ53UfcbGILuaV93XaXJMW7xfKFnVe+4Vt5v2KxX7J/CQX07Z4rDr/mzQsdLoO1z/axR156w/7Lovfz997f7T9/KcO8+s5T6vFU1R13V3HkWNWOFbaJ9tPeNwe9j7vNJi3H4NZyTiv73HSsqJsrnGe12XCmOaeprmPsYZ6xtUyIy9Kpq4kd47cO3JXl+Y74ykvS6bGs1cY8qoAYOpLfFU/OaDCUXlLUXqKiuM3D400yzFJTFCUVB4GeXYY25OiZDxN67piXgc19UxROSZlRVFV5BVM8wpH/WST+bq+uYfISs9gVg+UfhSP+/8nfBBlpWN7XFG4un6cm9dDZVUP+p3XLpO0YJJX9+1X3KsfdWucMU5npGmJKwxV0+Gcb5I5T1H4w3Zrrlr4UDmYVAWZcwyqoo5jHHhH6T2pr/Bl3V4E3jPNC/IC9osJN0ff3R9PKW7l/fC440hxK+8Hxa0sI8WtLCPFrSwjxa0so5OIo3vF7tVBdtdt3m25yN0obmUZvd9xu+hP/9mf48b23SdCeWJrg//nf/cPHz0Rcqq8H7Hy3RwofA1YfHbopWbZO3jvfw34NYCXXnrpHX9J2jhz9wO82/LQ3uUvnPdYvsxCa4hDy2YnZLvfJpyOj/1919zxArAWAuo/Ph8uA4IITPrObaypX6b51/v6fWjrVxRYjoYxQNAMNO21EqIoIDRAUFFOc3zlsQZa1tBtt5mWGcZCEDRpshAFENj62A6IrCEJDMbU68UBdNst4tkUi8GFIbkriYI6fVFUpy+yUAa2Xh7Un52DdhIRErDZbR3m4aO4V9yG1tCJApIgIAwMURgQFCW2OVZg6j+AxoGlrDzmjiQEtr4m1kAU1u9DW+fPfHnYnG9gIQ5NfZ1sfX3m6yz+RdU2eTrf9/zfKARrLMYHYOo//po70gLNPptrYjg+uMiao+sXGN4xxiAM6o3m19UuHCMKjmItCgyhsSRxSByAnXIsb+wd7y31cQMDlVmIbSAwBofBBvX6xizkI3eUCerYOnZOTfbFC+WFhe2sBVsdL0eBbV6AN0d57hf2OU9LYI7OoWryKG8GhdCUtyC0RMaQRAHduH4EPEASPvpk8Y9a317qnc469IPgXm1oElqi0BA09ey8nCeBoWhGYUTGYJoBI6EN8Dgq68kjQ+AN1hmsMYdxbYxpYhfiKCAJDe0wWNq4vV+fop+EbKyEXB/auv3hqK6DozYUmnJPsw4L9XHzHTTfL9T187onCGB1rXPXtFyOesAOULcr9WcwHBy+B+gkId04ePhMkEdyv7jtJyFJEBAHAVEYYE1BYAyWukxZA604JJtV73hESLgQO4v9hIKjtscGdVwFIcRhfVMQBGD9vJ3kWD/BzNv7piw7c9QPwRsiG1I5h236ZPMYD03djs33udhOwlFM03wfNu3+fAemSbvz4O1Rez0XBGDKer04pO4nRJY4htyZY32Dxf6JMXXa7DxPXP2jJVvWpx0Yc5RWjtrkxX7JPI3zfpNZyLN5OY6aPtjiBT5c/2gXx/LWGnOYx3f22+dpn28/L7E2gKCqf0RmDRgMUVDX3XUcWdpRffYnWd8+bg97n3cazNuP1XZIL67LUysMCIOCoIQ4hrA8agOiAGjukVqhJTBtBlFKpwBnHThHbEMgf0c8xWFIJwzZiEJKG+CBbVORBAFTWxFgCYwhCg1RcPxHeXOtJKYVWDpRSGBgNU4wTDFANwrpdVpYMyVaqHusqe8Ru2FAK7ZMMkflIYliRkF6uK5p7iGS0LDaTjjTix4pTx/3/0/4IEpCy1YvILJ1/Tg3r4fCAFpRcFjHdlsR3Ti4b7/iXv2oc72EXqtNYEqmLiVo/u+VbdqVxBqqyDR13pFg4UNgoRtEBN6xGkTcCnIs9Y1zaEpaJiAOAygrrDV04og4qliPupzvtx82mx4rxa28Hx53HClu5f2guJVlpLiVZaS4lWWkuJVldBJxdK/YvbSa3HWbd1sucjeKW1lG73fcLrqxvcdzf/5X7vrdq/+3v/HoCZBT5/2Ile/mQOHPAn/RGPMbwI8AA+/9jUfZ0S/+6PO8dXN2bJrwX/rRS/zijz5/1/VbUfCOR1wmoaUVnb7BMa0o4Ey3xTPn1tjfy5j0YwyeMDDcHuW0Q8tap0MSwc4grwcatS1xL2GU5mwPM850QrZWYuLAEAeWnZGnbyyt2LCaREzznCSwrHfaxKEhyx1lWZDEAU9udgi3p+SVI44sz5/tMstSPnS2xyoeinrQS1FVeFuRpgXPnO9wLrCkVc7eZMrT6wlBaDDG4PDEgcHagFGas95NWGsF7E1Szq7EBCE83U7YnU5Y7YeYCvbTglZsiK3nyc02w8mMZzY7TKuCJ9YT9mcF51cSRmXOxX4LZyo++eQZnr+wemJx0YoCLqx32J1kjNKSaeqJwhQI6SWWg2lJNwpZ70Q8dbbDG7dGrCWGkYEXzveJgop2FNYxbCoubLTJypy8cHRahs1uzDTP2egGdMKQmc959myPYZ4zLUourrdJQjiY5KwbS6cZUbTVS5iVBWUV8MRaSGTqQSaxh7XYUmC4Nc55/nyPt3cmbK3ElGXFixf7jGc5eWU534lYa0VsT1J6rYBeEtNvWfZHBVurLeIwwFvHrUHOajvkma0OZZUDjqe3OlzbmzFKPcY4PnZxjXE649JGi8IZZnnO5fUWK11DHAUMMguErBhLpxVQVSVnehFBGBMAZWXZ6CeEFlZsTFWVvJ3mPL3VoaoqVla6XN0f8cITPcqyZDVJcMbRiVtMs4r9acHF1Rb9TkQY1COUtlxEYg3dtmWz2yKjYr0XE4cB1niKyvHkZo/SFZRlxdMbbQrn6CURszTnifUW08zRjkNmRU5gIrqxZTCrpyj0wFovJrKewaxgpRWRhAGdyNBOEqz3hKYe/HRxNebiRpfL6x02V9pEYcBKO2S1Ez/2mJ27W3378z/4BH/mR547lXXoB8H92tCL6x0mWUVaVEyykn47rAewO0dg7eFg905TT3vq2b8HWchwljMpHN47jIHYBLTjgMAaeq2QzV6LixtdLpxpL23c3q9PcXGjx4uXNtjZneECh8Nw+2DKVj+i32oxyyrO9yNWOyFV5RmnJS+c6+CNI7Jwfi3BlQ7vPJ+41GN7lHJpvc0sL3jqTI+bgylZ6cF6hsNd/qc/cI7f/INbxAHkFfzSp87RHb0JwMfOd/mBsx26oxmwx7/z4TPNewuX13hyo8PWynd3UIwcubjR4yPn07qfkDuysuRcL2aU5wymFa0oYC2xPLGxwpWdCQezlF4EL15YwdiSbmxI4g5FlXJho83BLGW1F+ArWF+JmWY5Z3oh7SBg5gue2uozTFMC57m4mtCKDbujnPWOpRMHgMd0Y2Z5SWDhTL/+gUpgHAkhXWOI45CdNOf8asJ+aFip6pltV9oB7Shmd1Jwdq1u11xVUZaelU6L0HqsCer14oAkstwaZAyBT17q4yjrgYJhTC8O2B5ldFqGD6+tENiC0MDHLq0xmEw414/otANWO/UPGrb6CVnhySpHr2XpRAHOQFU4Umt5+myPyHqGM0ccWqIgpPKevHAYDP12UD+hovKstRNyX9FLWtwa5ZxrRVTesdoN6cYRcWS4Mcgx3vPixS79VkDqKp4622E0KZjkJRfXEjZXEiLqp3504oTKey5vdJmlGf12wHovIQ4t07zuJ3RWLbvToumvWdpxRF7mPLFW98MurSd4U9FPEiZ5QSsEG1jO9lpcPtNhq9fmbD9hpd068X7C4/aw93mnwbxdOb/W5fLZGT8wyXh1b8jWeot4bCgoWetGzIqCD53tcDCdcm6zQ1lV5IFnNQiZhoaV2HKjqHh6o0XlHS880eX2YMpKYrDWsrUSsRLCU/2AuMyhrGdo/b61mJtpiY8Duq2IdmSpvOcjK6sMphmDacbtcUEchDx/rk079nRiz7SY8PSZmO3JARsdy3o34Ym25db0gEvrLQZpyhOrCcPJlNV2wHPnOvQNTMuSNCjpeU8WlGyuRlzfGXO2H5Hldb99tWP51DNnePHixonk+Qcxzh7Waifmx54/z9u7Mz7/1i7Oe64dFLxwts1KL+Sp9Q7XxxOsgQ+d7fHUmT4feWLlvv2Ke/WjfvCZTV6+NeBrL99mGhmClZh+K2Z7lBJHFmzBxX6CM56dYU4biAND6SpeON9jb5qzElr6OC73I4bplEsbbfJZybQsudiPsd4TJ5ZWy7CRRBxkM57sJ1xe7/Bjz5894Vx9bxS38ji833GkuJXHQXEry0hxK8tIcSvLSHEry+j9jqM/9cmn+Nr1Af/oKzcPl/27nzzPn/rkUydyPDmdFLeyjNRui9RObKCwMeYfAD8BbBpjrgL/MRABeO//S+BzwJ8AXgWmwL//Xo731//MJ3jqfJu93XrE//0K81onJi0qSucJrTnVA9zWOjEvPLHKuZUWX7+6z87+hMmkfsR07OoZUZ2vP1sDNMtKDxn1RZvPADd/HLP3C7OyNbOkBb6e+axqZjILm+/Ts5BbSDyUBlrNumGznWtmIJ41U9F2m+WzCr5/4wyBr2dfNf7oEbtuPoOir9M2OQOxh6T5vjQQNtsVTXqPzeZmwbrm0czNNgQQdOC58+u8eHn9xONirRPzQ89s8uRGh52nM0azgmlR4b0nLyrC0JKEAdOs4JMX15iMoNXk67HHVANhWD/Gt6yOZhGsANuq33gDoYPC1OcclEfrMM+v5nrNH1sdNtd8PkN0RB0jh9fsSchcPRNzsLBd0Owrp36Ed9jEUtBcw6CZASp1EJmjmQatb/ZzCaZFHSdRs15s6+MWzfuQel8/tH6G0h/NWJw13xvqxzDbhVn/LFB4MM+AiaHXNeQlOLOFmz++uXmcuLFQ5fU+4qCehbqqmrgzUJYQJ9AKABMQWktWFszyembGiOZx5q6epTAJDaXz9YyKbj67o6Vwjso1jzzPwJVNPiX1rIZVVWfCfIbRJKzXDUJLp5WwmsScW2ux1o7xGJLQvi+Dfxbr27V1+Pkf+tCprkM/CO7Vhj650WW1FfHMmQ7p0+uUzjV1TV2o5+/DxenbgNI5BrOKcV5QlQ7T/PAgDAKSwBJGhvVOzPnVztLH7f36FC89s8kTqy0+/8p1fmAFMt/UY6auK6yvZ7wrHWA5bPe8O5p11TXtZkld34dBXZ9wsd4H1HVq4uGjP7HCfgUbAbSBW6zwl/912Ayajl8Fs2CFFwBW4EMXznBZg4S/J81j5+r+jDSrGBcFzjmqCpI4ILSGNC85uJwxGNZ9qJi67zOfwbdqZv71Vd1WL/bpbMLhj1RCC0VZt3WRA6qjfoJfmMV3/kj3sCny835CPZT4+KviKI5t03+b9w1SIGqecjDvh7imHQcY+Ppcoub7wB3NhjwN6hlVWwYOKugG9XqZ36pn/W36HOVGk46FPuT8/ItmfyHNbMWm6f8AtMBEdSYGvi5jvkmD84CFqmj6VK5ut4MKXFD3HbyHVjJ/moKhHUVMspy0qPtsQXOursmnVlTPADyrPMZBEt29n1AWEEd1pjhT92V92MwMPb+uBiJr6XRarCUR672YdhzQTeL3rZ/wuD3sfd5pMG9X/s0XzvPhcz1euz1iPM2IQsOsrPBlHZOkdVxYd3QPYIEX+pBVdX9yfg9lgfwipKZuG+ZP2Yg5Kie+KYsvdKHbjWlFIQZLFBg6UUhoDd+8scdoDB3q8hE15T/tQTKGA+r9hy0IU3iWtcM6wVL37RNb9/Xncgdhvy4TANnKet3ntRD34BPPbJ7YIOG5D2KcPawnN7r88r/1PB977TbXD6ZYV983nV3pEFjDwWRKFIRcWOvx7LneA/cr7tWP+oUf/RAfObfKN67s1f/XiDpegqa/lBj41BmYzu+T5083orlvdUdPaKio/58BG3VfDABz1PYYoOzAc+fXvucHCc8pbuVxeL/jSHErj4PiVpaR4laWkeJWlpHiVpbR+x1Hf+1PfpyPXVjl6iDj0mqiwZbySBS3sozUbouc4EBh7/0v3Od7D/wvH+cxH7YQf5AGtrWigCfWOjzxLo8ll++OVhTw1Gafpzb73+2kiDwUdZpOn3td09VOvJSDy+50knF7vz7FxY0ef07lRh7BxY0eFzd63+1kiHxXfRD7HfN25fnzazx/fu27m5gFn/rQ5nc7CSfmgxhnD2u1E/NTH7v02Pd7r37UDz6zyQ8+c3rj7r1S3Mrj8H7HkeJWHgfFrSwjxa0sI8WtLCPFrSyj9zuONMhSHgfFrSwjtdvyQWfvv4qIiIiIiIiIiIiIiIiIiIiIiIiIiIgsGw0UFhEREREREREREREREREREREREREROYU0UFhEREREREREREREREREREREREREROQU0kBhERERERERERERERERERERERERERGRU0gDhUVERERERERERERERERERERERERERE4hDRQWERERERERERERERERERERERERERE5hTRQWERERERERERERERERERERERERERE5BTSQGEREREREREREREREREREREREREREZFTSAOFRURERERERERERERERERERERERERETiENFBYRERERERERERERERERERERERERETmFNFBYRERERERERERERERERERERERERETkFNJAYRERERERERERERERERERERERERERkVNIA4VFREREREREREREREREREREREREREROIQ0UFhEREREREREREREREREREREREREROYU0UFhEREREREREREREREREREREREREROQU0kBhERERERERERERERERERERERERERGRU+hEBwobY37KGPOyMeZVY8xfvcv3TxpjftcY8xVjzFeNMX/iJNMjIiIiIiIiIiIiIiIiIiIiIiIiIiLyQXFiA4WNMQHwq8AfB14EfsEY8+Idq/3vgM947z8J/Dzwfz6p9IiIiIiIiIiIiIiIiIiIiIiIiIiIiHyQnOSMwj8MvOq9f917nwO/AfzMHet4YKV5vwpcP8H0iIiIiIiIiIiIiIiIiIiIiIiIiIiIfGCc5EDhi8CVhc9Xm2WL/ibw540xV4HPAX/pbjsyxvyyMeZLxpgvbW9vn0RaRR47xa0sI8WtLCPFrSwjxa0sI8WtLCPFrSwjxa0sI8WtLCPFrSwjxa0sI8WtLCPFrSwrxa4sI8WtLCPFrSyjkxwo/CB+Afj73vtLwJ8A/q/GmHekyXv/a977l7z3L21tbb3viRR5FIpbWUaKW1lGiltZRopbWUaKW1lGiltZRopbWUaKW1lGiltZRopbWUaKW1lGiltZVopdWUaKW1lGiltZRic5UPgacHnh86Vm2aJfAj4D4L3/PNACNk8wTSIiIiIiIiIiIiIiIiIiIiIiIiIiIh8IJzlQ+IvAh40xzxhjYuDngc/esc7bwL8NYIz5PuqBwpqPW0RERERERERERERERERERERERERE5D06sYHC3vsS+IvA7wDfAj7jvf+GMeZXjDE/3az2l4H/wBjzh8A/AP6C996fVJpEREREREREREREREREREREREREREQ+KMKT3Ln3/nPA5+5Y9jcW3n8T+PGTTIOIiIiIiIiIiIiIiIiIiIiIiIiIiMgH0YnNKCwiIiIiIiIiIiIiIiIiIiIiIiIiIiLfPRooLCIiIiIiIiIiIiIiIiIiIiIiIiIicgppoLCIiIiIiIiIiIiIiIiIiIiIiIiIiMgppIHCIiIiIiIiIiIiIiIiIiIiIiIiIiIip5AGCouIiIiIiIiIiIiIiIiIiIiIiIiIiJxCGigsIiIiIiIiIiIiIiIiIiIiIiIiIiJyCmmgsIiIiIiIiIiIiIiIiIiIiIiIiIiIyCmkgcIiIiIiIiIiIiIiIiIiIiIiIiIiIiKnkAYKi4iIiIiIiIiIiIiIiIiIiIiIiIiInEIaKCwiIiIiIiIiIiIiIiIiIiIiIiIiInIKaaCwiIiIiIiIiIiIiIiIiIiIiIiIiIjIKaSBwiIiIiIiIiIiIiIiIiIiIiIiIiIiIqeQBgqLiIiIiIiIiIiIiIiIiIiIiIiIiIicQhooLCIiIiIiIiIiIiIiIiIiIiIiIiIicgppoLCIiIiIiIiIiIiIiIiIiIiIiIiIiMgpdKIDhY0xP2WMedkY86ox5q++yzo/a4z5pjHmG8aY//tJpkdEREREREREREREREREREREREREROSDIjypHRtjAuBXgZ8ErgJfNMZ81nv/zYV1Pgz8NeDHvff7xpizJ5UeERERERERERERERERERERERERERGRD5KTnFH4h4FXvfeve+9z4DeAn7ljnf8A+FXv/T6A9/72CaZHRERERERERERERERERERERERERETkA+OhBwobY9aNMR9/gFUvAlcWPl9tli16HnjeGPMvjTFfMMb81Lsc85eNMV8yxnxpe3v7YZMs8l2huJVlpLiVZaS4lWWkuJVlpLiVZaS4lWWkuJVlpLiVZaS4lWWkuJVlpLiVZaS4lWWl2JVlpLiVZaS4lWX0QAOFjTH/gzFmxRizAfw+8PeMMf/ZYzh+CHwY+AngF5r9rt25kvf+17z3L3nvX9ra2noMhxU5eYpbWUaKW1lGiltZRopbWUaKW1lGiltZRopbWUaKW1lGiltZRopbWUaKW1lGiltZVopdWUaKW1lGiltZRg86o/Cq934I/HvAp733PwL8sftscw24vPD5UrNs0VXgs977wnv/BvAK9cBhEREREREREREREREREREREREREREReQ8edKBwaIx5AvhZ4LcfcJsvAh82xjxjjImBnwc+e8c6v0U9mzDGmE3geeD1B9y/iIiIiIiIiIiIiIiIiIiIiIiIiIiIvIsHHSj8K8DvAK96779ojHkW+M69NvDel8BfbLb7FvAZ7/03jDG/Yoz56Wa13wF2jTHfBH4X+Cve+91HORERERERERERERERERERERERERERERE5Ej7ISt773wR+c+Hz68CffYDtPgd87o5lf2PhvQf+o+YlIiIiIiIiIiIiIiIiIiIiIiIiIiIij8kDDRQ2xvw3gL9zuff+f/7YUyQiIiIiIiIiIiIiIiIiIiIiIiIiIiLv2QMNFAZ+e+F9C/h3geuPPzkiIiIiIiIiIiIiIiIiIiIiIiIiIiLyODzQQGHv/X+3+NkY8w+Af3EiKRIREREREREREREREREREREREREREZH3zD7idh8Gzj7OhIiIiIiIiIiIiIiIiIiIiIiIiIiIiMjj80AzChtjRoBfWHQT+N+cSIpERERERERERERERERERERERERERETkPXuggcLe+/5JJ0REREREREREREREREREREREREREREQeH/sgKxlj/umDLBMREREREREREREREREREREREREREZHvDfecUdgY0wI6wKYxZh0wzVcrwMUTTpuIiIiIiIiIiIiIiIiIiIiIiIiIiIg8onsOFAb+Q+B/DVwAvszRQOEh8HdPLlkiIiIiIiIiIiIiIiIiIiIiIiIiIiLyXtxzoLD3/m8Df9sY85e893/nfUqTiIiIiIiIiIiIiIiIiIiIiIiIiIiIvEf3m1EYAO/93zHGfBR4EWgtLP/0SSVMREREREREREREREREREREREREREREHt0DDRQ2xvzHwE9QDxT+HPDHgX8BaKCwiIiIiIiIiIiIiIiIiIiIiIiIiIjI9yD7gOv9OeDfBm567/994BPA6omlSkRERERERERERERERERERERERERERN6TBx0oPPPeO6A0xqwAt4HLJ5csEREREREREREREREREREREREREREReS/CB1zvS8aYNeDvAV8GxsDnTypRIiIiIiIiIiIiIiIiIiIiIiIiIiIi8t480EBh7/3/onn7Xxpj/t/Aivf+qyeXLBEREREREREREREREREREREREREREXkv7IOsZIz5p/P33vs3vfdfXVx2j+1+yhjzsjHmVWPMX73Hen/WGOONMS89WLJFRERERERERERERERERERERERERETkXu45o7AxpgV0gE1jzDpgmq9WgIv32TYAfhX4SeAq8EVjzGe999+8Y70+8L8Cfu+RzkBERERERERERERERERERERERERERETe4X4zCv+HwJeBF5p/vwx8Cfjvgb9zn21/GHjVe/+69z4HfgP4mbus97eA/wRIHyLdIiIiIiIiIiIiIiIiIiIiIiIiIiIicg/3HCjsvf/b3vtngP898APN+/8GeB34/H32fRG4svD5KnfMQmyM+UHgsvf+H99rR8aYXzbGfMkY86Xt7e37HFbke4PiVpaR4laWkeJWlpHiVpaR4laWkeJWlpHiVpaR4laWkeJWlpHiVpaR4laWkeJWlpViV5aR4laWkeJWltH9ZhSe+3Pe+6Ex5l8D/ijwXwP/xXs5sDHGAv8Z8Jfvt673/te89y9571/a2tp6L4cVed8obmUZKW5lGSluZRkpbmUZKW5lGSluZRkpbmUZKW5lGSluZRkpbmUZKW5lGSluZVkpdmUZKW5lGSluZRk96EDhqvn3TwJ/r5kBOL7PNteAywufLzXL5vrAR4H/wRjzJvCjwGeNMS89YJpERERERERERERERERERERERERERETkXTzoQOFrxpj/Cvg54HPGmOQBtv0i8GFjzDPGmBj4eeCz8y+99wPv/ab3/mnv/dPAF4Cf9t5/6aHPQkRERERERERERERERERERERERERERI550IHCPwv8DvDveO8PgA3gr9xrA+99CfzFZrtvAZ/x3n/DGPMrxpiffvQki4iIiIiIiIiIiIiIiIiIiIiIiIiIyP2ED7KS934K/D8WPt8AbjzAdp8DPnfHsr/xLuv+xIOkRURERERERERERERERERERERERERERO7vQWcUFhERERERERERERERERERERERERERkSWigcIiIiIiIiIiIiIiIiIiIiIiIiIiIiKnkAYKi4iIiIiIiIiIiIiIiIiIiIiIiIiInEIaKCwiIiIiIiIiIiIiIiIiIiIiIiIiInIKaaCwiIiIiIiIiIiIiIiIiIiIiIiIiIjIKaSBwiIiIiIiIiIiIiIiIiIiIiIiIiIiIqeQBgqLiIiIiIiIiIiIiIiIiIiIiIiIiIicQhooLCIiIiIiIiIiIiIiIiIiIiIiIiIicgppoLCIiIiIiIiIiIiIiIiIiIiIiIiIiMgppIHCIiIiIiIiIiIiIiIiIiIiIiIiIiIip5AGCouIiIiIiIiIiIiIiIiIiIiIiIiIiJxCGigsIiIiIiIiIiIiIiIiIiIiIiIiIiJyCmmgsIiIiIiIiIiIiIiIiIiIiIiIiIiIyCmkgcIiIiIiIiIiIiIiIiIiIiIiIiIiIiKnkAYKi4iIiIiIiIiIiIiIiIiIiIiIiIiInEInOlDYGPNTxpiXjTGvGmP+6l2+/4+MMd80xnzVGPNPjTFPnWR6REREREREREREREREREREREREREREPihObKCwMSYAfhX448CLwC8YY168Y7WvAC957z8O/LfA/+mk0iMiIiIiIiIiIiIiIiIiIiIiIiIiIvJBcpIzCv8w8Kr3/nXvfQ78BvAziyt473/Xez9tPn4BuHSC6REREREREREREREREREREREREREREfnAOMmBwheBKwufrzbL3s0vAf+vu31hjPllY8yXjDFf2t7efoxJFDk5iltZRopbWUaKW1lGiltZRopbWUaKW1lGiltZRopbWUaKW1lGiltZRopbWUaKW1lWil1ZRopbWUaKW1lGJzlQ+IEZY/488BLwn97te+/9r3nvX/Lev7S1tfX+Jk7kESluZRkpbmUZKW5lGSluZRkpbmUZKW5lGSluZRkpbmUZKW5lGSluZRkpbmUZKW5lWSl2ZRkpbmUZKW5lGYUnuO9rwOWFz5eaZccYY/4Y8L8F/k3vfXaC6REREREREREREREREREREREREREREfnAOMkZhb8IfNgY84wxJgZ+Hvjs4grGmE8C/xXw09772yeYFhERERERERERERERERERERERERERkQ+UExso7L0vgb8I/A7wLeAz3vtvGGN+xRjz081q/ynQA37TGPMHxpjPvsvuRERERERERERERERERERERERERERE5CGEJ7lz7/3ngM/dsexvLLz/Yyd5fBERERERERERERERERERERERERERkQ+qE5tRWERERERERERERERERERERERERERERL57NFBYRERERERERERERERERERERERERETkFNJAYRERERERERERERERERERERERERERkVNIA4VFREREREREREREREREREREREREREROIQ0UFhEREREREREREREREREREREREREROYU0UFhEREREREREREREREREREREREREROQU0kBhERERERERERERERERERERERERERGRU0gDhUVERERERERERERERERERERERERERE4hDRQWERERERERERERERERERERERERERE5hTRQWERERERERERERERERERERERERERE5BTSQGEREREREREREREREREREREREREREZFTSAOFRURERERERERERERERERERERERERETiENFBYRERERERERERERERERERERERERETmFNFBYRERERERERERERERERERERERERETkFNJAYRERERERERERERERERERERERERERkVNIA4VFREREREREREREREREREREREREREROofAkd26M+SngbwMB8F977/+Pd3yfAJ8GPgXsAj/nvX/zUY71m194hckBHFSw0YF229DrtOnGIaO0ICtKVjsJ51cTbGDxDqLA0GvFHEwzhrOSTsvSiyNuH2SkZUVgDJWH0EKnFTCYlmRVSWID1nsxm72EVhwBkOYFk7wiiSydKGRvnJFVFe04pBdHjIsC76AbB7TiiLysGGcF06zEANPMMUhzWmHISisgCAyV93TikLyqGM5KXOUByCuPNWAwTIoCA3jAGsN6O6bbDtgfF2SlwxqIAoupc5xObEkLx8GsYJqmZM7hHPRbEd1WQiuwDLOM3WGGCaAXBQRBSF5kzAqwtr6YAFkFZQFJG6yD0kNsoXT1y3gwBkwJxkJlwE0gCCCvIAnAVuCTej+mOZEOkBrYr2A9gKCCcQCJq/eTVdAK6nWdqY8TUL9Pm+8skAOBB2vAV+ACKCuIm+8LV58PFZgmTUFQF4rWGvzpT32IVjQ/25OTFhWTrCQvq6OFHpqLRhwGOOdIC0cYGEJryEpH5RxxEJC7ihv7M0ZZyVo74vnzqyRRQOk8s6xgb5zx6u0h26MUXJ1XlQeXg/OQ9GBrpYP3higwZGXFNM0JrSGKI6qqYjDLoQAcFBUEMUQOKqDKoE399cxBYuo8dx68gaq51h7IXV2ejG9O0dRp8R6iJrZm/ijGAg9YmDXXNQIy6viKbbMPB77ZJ9SxE/k6+yx1PpbN57DJ08KD9fX1LysIg/r7ytfbeAPVPD48BKaJqYXv3fxcWDhXBy1brzf1sGLrtMya8+rZ+lxp9jd/76n3Zxe+D6n3581RfM/LDa7+bE293xZ1/nU3Q37i+y6x2okfV3je1RvbQ/6/37rJwQjWu3Bhs8eZbkw7CSidAwdhYOi1EkpXMc1L8LDRbREG5jCW17vJYRkbTHOy0pGE9q7pT4uK0nlCa46Vy7stX1wGPPB278Wd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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sns.pairplot(clean_data, y_vars = ['status'] , plot_kws= {'alpha' : 0.1})" + ] + }, + { + "cell_type": "markdown", + "id": "9-5BlC1J-hyP", + "metadata": { + "id": "9-5BlC1J-hyP" + }, + "source": [ + "Drawing box plot to find outliers, I plot it on scale data so it is easier to visualize different features' range.\n", + "As we can see our preprocessing function work perfectly that leaves no outliers\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "4cbe88db", + "metadata": {}, + "outputs": [], + "source": [ + "clean_data.to_csv('RailGuadrs_Clean_Data.csv')\n", + "np.savez(\"RailGuadrs_Clean_Data.npz\", clean_data.to_numpy())" + ] + }, + { + "cell_type": "markdown", + "id": "a5967a34", + "metadata": {}, + "source": [ + "# Models\n" + ] + }, + { + "cell_type": "markdown", + "id": "345dacd5", + "metadata": {}, + "source": [ + "## LinearRegression" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "b3b380bd", + "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", + " \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", + "
TP2TP3H1DV_pressureReservoirsOil_temperatureMotor_currentCOMPDV_eletricTowersMPGLPSPressure_switchOil_levelCaudal_impulses
0-0.0188.2488.238-0.0248.24849.4500.04001.00.01.01.00.01.01.01.0
1-0.0188.2488.238-0.0248.24849.4500.04001.00.01.01.00.01.01.01.0
2-0.0188.2488.238-0.0248.24849.4500.04001.00.01.01.00.01.01.01.0
3-0.0188.2488.238-0.0248.24849.4500.04000.00.00.00.00.00.00.00.0
4-0.0188.2488.238-0.0248.24849.4500.04001.00.01.01.00.01.01.01.0
................................................
592089.3628.940-0.014-0.0188.93864.0006.00500.01.01.00.00.01.01.01.0
59209-0.0129.4089.394-0.0229.41056.5250.04001.00.01.01.00.01.01.01.0
59210-0.0148.8488.834-0.0248.84658.5750.04001.00.01.01.00.01.01.01.0
59211-0.0148.1828.166-0.0188.18255.9000.03501.00.01.01.00.01.01.01.0
59212-0.0109.7149.704-0.0189.71268.7253.73751.00.01.01.00.01.00.01.0
\n", + "

59213 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " TP2 TP3 H1 DV_pressure Reservoirs Oil_temperature \\\n", + "0 -0.018 8.248 8.238 -0.024 8.248 49.450 \n", + "1 -0.018 8.248 8.238 -0.024 8.248 49.450 \n", + "2 -0.018 8.248 8.238 -0.024 8.248 49.450 \n", + "3 -0.018 8.248 8.238 -0.024 8.248 49.450 \n", + "4 -0.018 8.248 8.238 -0.024 8.248 49.450 \n", + "... ... ... ... ... ... ... \n", + "59208 9.362 8.940 -0.014 -0.018 8.938 64.000 \n", + "59209 -0.012 9.408 9.394 -0.022 9.410 56.525 \n", + "59210 -0.014 8.848 8.834 -0.024 8.846 58.575 \n", + "59211 -0.014 8.182 8.166 -0.018 8.182 55.900 \n", + "59212 -0.010 9.714 9.704 -0.018 9.712 68.725 \n", + "\n", + " Motor_current COMP DV_eletric Towers MPG LPS Pressure_switch \\\n", + "0 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "1 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "2 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "3 0.0400 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "4 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "... ... ... ... ... ... ... ... \n", + "59208 6.0050 0.0 1.0 1.0 0.0 0.0 1.0 \n", + "59209 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "59210 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "59211 0.0350 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "59212 3.7375 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "\n", + " Oil_level Caudal_impulses \n", + "0 1.0 1.0 \n", + "1 1.0 1.0 \n", + "2 1.0 1.0 \n", + "3 0.0 0.0 \n", + "4 1.0 1.0 \n", + "... ... ... \n", + "59208 1.0 1.0 \n", + "59209 1.0 1.0 \n", + "59210 1.0 1.0 \n", + "59211 1.0 1.0 \n", + "59212 0.0 1.0 \n", + "\n", + "[59213 rows x 15 columns]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_regression = pd.read_csv('RailGuadrs_Clean_Data.csv')\n", + "X = data_regression.iloc[:, 2:-1]\n", + "y = data_regression.iloc[:, -1]\n", + "X" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "8f31d383", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 1\n", + "1 1\n", + "2 1\n", + "3 1\n", + "4 1\n", + " ..\n", + "59208 0\n", + "59209 0\n", + "59210 0\n", + "59211 0\n", + "59212 0\n", + "Name: status, Length: 59213, dtype: int64" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "5b2d317e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(47370, 15) (11843, 15)\n" + ] + }, + { + "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", + " \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", + "
TP2TP3H1DV_pressureReservoirsOil_temperatureMotor_currentCOMPDV_eletricTowersMPGLPSPressure_switchOil_levelCaudal_impulses
37015-0.0108.1308.118-0.0188.13254.2000.04001.00.01.01.00.01.01.01.0
39048-0.0149.6369.624-0.0229.63659.4003.86001.00.01.01.00.01.01.01.0
170977.9548.160-0.0082.0848.16275.0755.56250.01.01.00.00.01.01.01.0
28049.0148.816-0.0102.0108.82074.1505.69500.01.01.00.00.01.01.01.0
47985-0.0169.8009.790-0.0269.79864.1253.75001.00.01.01.00.01.01.01.0
................................................
45891-0.0168.2888.278-0.0228.28853.0000.04251.00.01.01.00.01.01.01.0
52416-0.0148.3908.380-0.0168.39859.2000.04001.00.01.01.00.01.01.01.0
42613-0.0128.8588.842-0.0208.86257.0750.03751.00.01.01.00.01.01.01.0
43567-0.0108.1468.136-0.0148.15263.2750.03751.00.01.01.00.01.01.01.0
27329.0528.856-0.0082.0208.86074.0255.84750.01.01.00.00.01.01.01.0
\n", + "

47370 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " TP2 TP3 H1 DV_pressure Reservoirs Oil_temperature \\\n", + "37015 -0.010 8.130 8.118 -0.018 8.132 54.200 \n", + "39048 -0.014 9.636 9.624 -0.022 9.636 59.400 \n", + "17097 7.954 8.160 -0.008 2.084 8.162 75.075 \n", + "2804 9.014 8.816 -0.010 2.010 8.820 74.150 \n", + "47985 -0.016 9.800 9.790 -0.026 9.798 64.125 \n", + "... ... ... ... ... ... ... \n", + "45891 -0.016 8.288 8.278 -0.022 8.288 53.000 \n", + "52416 -0.014 8.390 8.380 -0.016 8.398 59.200 \n", + "42613 -0.012 8.858 8.842 -0.020 8.862 57.075 \n", + "43567 -0.010 8.146 8.136 -0.014 8.152 63.275 \n", + "2732 9.052 8.856 -0.008 2.020 8.860 74.025 \n", + "\n", + " Motor_current COMP DV_eletric Towers MPG LPS Pressure_switch \\\n", + "37015 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "39048 3.8600 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "17097 5.5625 0.0 1.0 1.0 0.0 0.0 1.0 \n", + "2804 5.6950 0.0 1.0 1.0 0.0 0.0 1.0 \n", + "47985 3.7500 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "... ... ... ... ... ... ... ... \n", + "45891 0.0425 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "52416 0.0400 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "42613 0.0375 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "43567 0.0375 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "2732 5.8475 0.0 1.0 1.0 0.0 0.0 1.0 \n", + "\n", + " Oil_level Caudal_impulses \n", + "37015 1.0 1.0 \n", + "39048 1.0 1.0 \n", + "17097 1.0 1.0 \n", + "2804 1.0 1.0 \n", + "47985 1.0 1.0 \n", + "... ... ... \n", + "45891 1.0 1.0 \n", + "52416 1.0 1.0 \n", + "42613 1.0 1.0 \n", + "43567 1.0 1.0 \n", + "2732 1.0 1.0 \n", + "\n", + "[47370 rows x 15 columns]" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n", + "print(X_train.shape, X_test.shape)\n", + "X_train" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "639c096d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of iterations: [100]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Saad-rougi\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python39\\site-packages\\sklearn\\linear_model\\_logistic.py:444: ConvergenceWarning: lbfgs failed to converge (status=1):\n", + "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", + "\n", + "Increase the number of iterations (max_iter) or scale the data as shown in:\n", + " https://scikit-learn.org/stable/modules/preprocessing.html\n", + "Please also refer to the documentation for alternative solver options:\n", + " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", + " n_iter_i = _check_optimize_result(\n" + ] + } + ], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "\n", + "scaler = StandardScaler()\n", + "X_train_scaled = scaler.fit_transform(X_train) \n", + "\n", + "model_regression = LogisticRegression()\n", + "model_regression.fit(X_train_scaled, y_train)\n", + "print(f\"Number of iterations: {model_regression.n_iter_}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "5fb9ce49", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Index(['TP2', 'TP3', 'H1', 'DV_pressure', 'Reservoirs', 'Oil_temperature',\n", + " 'Motor_current', 'COMP', 'DV_eletric', 'Towers', 'MPG', 'LPS',\n", + " 'Pressure_switch', 'Oil_level', 'Caudal_impulses'],\n", + " dtype='object')\n", + "the coef of the model are : [[-1.73254207 0.1511405 -2.31108265 2.87848383 -0.15164017 3.36245929\n", + " -1.48750712 -1.88760664 -3.3206557 -0.05062239 -1.89496984 0.24348983\n", + " 0.00667381 0.52991201 0.38831483]]\n", + "the intercept is : [-1.17986783]\n" + ] + } + ], + "source": [ + "print(X_train.columns)\n", + "print(f\"the coef of the model are : {model_regression.coef_}\")\n", + "print(f\"the intercept is : {model_regression.intercept_}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "e75270a7", + "metadata": {}, + "outputs": [], + "source": [ + "X_test_scaled = scaler.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "4fdb44dc", + "metadata": {}, + "outputs": [], + "source": [ + "y_pred = model_regression.predict(X_test_scaled)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "22607d7b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "confusion_matrix = ConfusionMatrixDisplay.from_predictions(y_test, y_pred)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "af2a76f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "the accuracy is 0.9864054715865912\n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 0.98 0.99 5963\n", + " 1 0.98 0.99 0.99 5880\n", + "\n", + " accuracy 0.99 11843\n", + " macro avg 0.99 0.99 0.99 11843\n", + "weighted avg 0.99 0.99 0.99 11843\n", + "\n" + ] + } + ], + "source": [ + "print(f'the accuracy is {accuracy_score(y_test, y_pred)}')\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7852ca2d", + "metadata": {}, + "outputs": [], + "source": [ + "y_prob = model_regression.predict_proba(X_test)[:, 1]\n", + "for threshold in [0.2, 0.4, 0.6, 0.8]:\n", + " y_pred_threshold = (y_prob > threshold).astype(int)\n", + " fpr, tpr, _ = roc_curve(y_test, y_pred_threshold)\n", + " roc_auc = auc(fpr, tpr)\n", + " plt.plot(fpr, tpr, label='Threshold = {:.1f} (AUC = {:.8f})'.format(threshold, roc_auc))\n", + " #print(threshold, format(roc_auc))\n", + "# Plot the \"Random\" line as a dashed line from (0,0) to (1,1) for reference\n", + "plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--', label='Random')\n", + "\n", + "# Label axes and set the title for the plot\n", + "plt.xlabel('False Positive Rate (FPR)')\n", + "plt.ylabel('True Positive Rate (TPR) or Sensitivity')\n", + "plt.title('Receiver Operating Characteristic (ROC) Curve with Different Thresholds')\n", + "plt.legend(loc='lower right')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "87704362", + "metadata": {}, + "source": [ + "## Predict with LogisticRegression" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "f2e29c89", + "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", + "
timestampTP2TP3H1DV_pressureReservoirsOil_temperatureMotor_currentCOMPDV_eletricTowersMPGLPSPressure_switchOil_levelCaudal_impulses
0193.293044-0.0188.2488.238-0.0248.24849.450.041.00.01.01.00.01.01.01.0
\n", + "
" + ], + "text/plain": [ + " timestamp TP2 TP3 H1 DV_pressure Reservoirs Oil_temperature \\\n", + "0 193.293044 -0.018 8.248 8.238 -0.024 8.248 49.45 \n", + "\n", + " Motor_current COMP DV_eletric Towers MPG LPS Pressure_switch \\\n", + "0 0.04 1.0 0.0 1.0 1.0 0.0 1.0 \n", + "\n", + " Oil_level Caudal_impulses \n", + "0 1.0 1.0 " + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Example: new sample based on the features\n", + "new_sample = {\n", + " 'timestamp': [193.293044], \n", + " 'TP2': [-0.018],\n", + " 'TP3': [8.248],\n", + " 'H1': [8.238],\n", + " 'DV_pressure': [-0.024],\n", + " 'Reservoirs': [8.248],\n", + " 'Oil_temperature': [49.450],\n", + " 'Motor_current': [0.0400],\n", + " 'COMP': [1.0],\n", + " 'DV_eletric': [0.0],\n", + " 'Towers': [1.0],\n", + " 'MPG': [1.0],\n", + " 'LPS': [0.0],\n", + " 'Pressure_switch': [1.0],\n", + " 'Oil_level': [1.0],\n", + " 'Caudal_impulses': [1.0]\n", + "}\n", + "\n", + "new_df = pd.DataFrame(new_sample)\n", + "new_df" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "fe9833e3", + "metadata": {}, + "outputs": [], + "source": [ + "training_feature_names = X_train.columns\n", + "new_df = new_df[training_feature_names]" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "1eaab558", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Prediction (Class): [0]\n", + "Probability of class 1: [2.85628828e-05]\n" + ] + } + ], + "source": [ + "new_scaled = scaler.transform(new_df)\n", + "\n", + "# Predict the class and probability\n", + "y_pred = model_regression.predict(new_scaled)\n", + "y_pred_prob = model_regression.predict_proba(new_scaled)[:, 1]\n", + "\n", + "print(f\"Prediction (Class): {y_pred}\")\n", + "print(f\"Probability of class 1: {y_pred_prob}\")" + ] + }, + { + "cell_type": "markdown", + "id": "7b5b794b", + "metadata": {}, + "source": [ + "# Deploy the Model" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "114bb5c9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['scaler_logistic.pkl']" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import joblib\n", + "\n", + "# Save the trained logistic regression model\n", + "joblib.dump(model_regression, 'logistic_regression_model.pkl')\n", + "\n", + "# Save the scaler\n", + "joblib.dump(scaler, 'scaler_logistic.pkl')\n" + ] + }, + { + "cell_type": "markdown", + "id": "a354bad8", + "metadata": {}, + "source": [ + "# Naive Bayes\n" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "5f2a0161", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.naive_bayes import GaussianNB,MultinomialNB, BernoulliNB\n", + "from sklearn.metrics import classification_report, confusion_matrix\n", + "from sklearn.metrics import ConfusionMatrixDisplay\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "947daeee", + "metadata": {}, + "outputs": [], + "source": [ + "dataset = pd.read_csv('RailGuadrs_Clean_Data.csv')\n", + "\n", + "\n", + "# Features and target\n", + "features = ['timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure', 'Reservoirs',\n", + " 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric',\n", + " 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level', 'Caudal_impulses']\n", + "target = 'status'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "0bb94307", + "metadata": {}, + "outputs": [], + "source": [ + "# Convert timestamp to a scaled numeric value\n", + "dataset['timestamp'] = pd.to_datetime(dataset['timestamp'], errors='coerce')\n", + "dataset['timestamp'] = (dataset['timestamp'] - dataset['timestamp'].min()) / np.timedelta64(1, 'D')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "a2d8baf9", + "metadata": {}, + "outputs": [], + "source": [ + "X = dataset[features]\n", + "y = dataset[target]\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "d46dcc65", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize classifiers\n", + "gaussian_classifier = GaussianNB()\n", + "bernoulli_classifier = BernoulliNB()" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "ebaa4a54", + "metadata": {}, + "outputs": [], + "source": [ + "# MultinomialNB requires non-negative features, use MinMaxScaler for preprocessing\n", + "multinomial_classifier = Pipeline([\n", + " ('Normalize', MinMaxScaler()),\n", + " ('MultinomialNB', MultinomialNB())\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "3a9ac539", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
BernoulliNB()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "BernoulliNB()" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Train the models\n", + "gaussian_classifier.fit(X_train, y_train)\n", + "multinomial_classifier.fit(X_train, y_train)\n", + "bernoulli_classifier.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "7b48dcc8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "GaussianNB Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 0.91 0.95 5938\n", + " 1 0.91 1.00 0.95 5905\n", + "\n", + " accuracy 0.95 11843\n", + " macro avg 0.95 0.95 0.95 11843\n", + "weighted avg 0.95 0.95 0.95 11843\n", + "\n", + "\n", + "MultinomialNB Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 0.86 0.92 5938\n", + " 1 0.87 1.00 0.93 5905\n", + "\n", + " accuracy 0.93 11843\n", + " macro avg 0.93 0.93 0.93 11843\n", + "weighted avg 0.94 0.93 0.93 11843\n", + "\n", + "\n", + "BernoulliNB Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 0.86 0.92 5938\n", + " 1 0.88 0.99 0.93 5905\n", + "\n", + " accuracy 0.93 11843\n", + " macro avg 0.94 0.93 0.93 11843\n", + "weighted avg 0.94 0.93 0.93 11843\n", + "\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Evaluate each model\n", + "for name, model in [\n", + " (\"GaussianNB\", gaussian_classifier),\n", + " (\"MultinomialNB\", multinomial_classifier),\n", + " (\"BernoulliNB\", bernoulli_classifier)\n", + "]:\n", + " y_pred = model.predict(X_test)\n", + " print(f\"\\n{name} Classification Report:\")\n", + " print(classification_report(y_test, y_pred))\n", + " ConfusionMatrixDisplay.from_predictions(y_test, y_pred).plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "91a9917d", + "metadata": {}, + "outputs": [], + "source": [ + "new_sample = {\n", + " 'timestamp': [1.5], # Replace with a realistic scaled timestamp\n", + " 'TP2': [-0.018],\n", + " 'TP3': [8.248],\n", + " 'H1': [8.238],\n", + " 'DV_pressure': [-0.024],\n", + " 'Reservoirs': [8.248],\n", + " 'Oil_temperature': [49.450],\n", + " 'Motor_current': [0.0400],\n", + " 'COMP': [1.0],\n", + " 'DV_eletric': [0.0],\n", + " 'Towers': [1.0],\n", + " 'MPG': [1.0],\n", + " 'LPS': [0.0],\n", + " 'Pressure_switch': [1.0],\n", + " 'Oil_level': [1.0],\n", + " 'Caudal_impulses': [1.0]\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "096ae01e", + "metadata": {}, + "outputs": [], + "source": [ + "# Create DataFrame\n", + "new_df = pd.DataFrame(new_sample)\n", + "\n", + "# Ensure column order matches training data\n", + "training_feature_names = [\n", + " 'timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure', 'Reservoirs',\n", + " 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric',\n", + " 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level', 'Caudal_impulses'\n", + "]\n", + "new_df = new_df[training_feature_names]" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "63168077", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Prediction (Class): ['Not Failure']\n", + "Probability of Failure: [1.04476067e-252]\n" + ] + } + ], + "source": [ + "# Predict the class and probability for the new sample\n", + "y_pred_gaussian = gaussian_classifier.predict(new_df)\n", + "y_pred_gaussian_prob = gaussian_classifier.predict_proba(new_df)[:, 1]\n", + "\n", + "# Map the prediction to class labels\n", + "class_labels = {0: \"Not Failure\", 1: \"Failure\"}\n", + "predicted_label = [class_labels[label] for label in y_pred_gaussian]\n", + "\n", + "# Output the results\n", + "print(f\"Prediction (Class): {predicted_label}\")\n", + "print(f\"Probability of Failure: {y_pred_gaussian_prob}\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "d4943784", + "metadata": {}, + "source": [ + "## Deploy the Naive bayes" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "aac570cd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['bernoulli_nb_model.pkl']" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "joblib.dump(gaussian_classifier, 'gaussian_nb_model.pkl')\n", + "joblib.dump(multinomial_classifier, 'multinomial_nb_model.pkl')\n", + "joblib.dump(bernoulli_classifier, 'bernoulli_nb_model.pkl')" + ] + }, + { + "cell_type": "markdown", + "id": "1cc35ef5", + "metadata": {}, + "source": [ + "# XGBoost" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "200f0a2e", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from xgboost import XGBClassifier\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import classification_report, ConfusionMatrixDisplay\n", + "from sklearn.preprocessing import MinMaxScaler\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0271d69b", + "metadata": {}, + "outputs": [], + "source": [ + "# Load dataset\n", + "df = pd.read_csv('RailGuadrs_Clean_Data.csv')\n", + "\n", + "# Convert timestamp to numerical values\n", + "df['timestamp'] = pd.to_datetime(df['timestamp'], errors='coerce')\n", + "df['timestamp'] = (df['timestamp'] - df['timestamp'].min()) / pd.Timedelta(days=1)\n", + "\n", + "# Drop unnecessary columns\n", + "df = df.drop(columns=['Unnamed: 0'])\n", + "\n", + "# Display the first rows of the cleaned dataset\n", + "print(df.head())\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ef549f6", + "metadata": {}, + "outputs": [], + "source": [ + "# Features and target\n", + "X = df.drop(columns=['status']) # All columns except 'status'\n", + "y = df['status'] # Target column\n", + "\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "print(\"Training set size:\", X_train.shape)\n", + "print(\"Test set size:\", X_test.shape)\n", + "\n", + "# Normalize features\n", + "scaler = MinMaxScaler()\n", + "X_train = scaler.fit_transform(X_train)\n", + "X_test = scaler.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a513e63a", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize XGBoost model\n", + "xgb_model = XGBClassifier(\n", + " max_depth=6,\n", + " n_estimators=100,\n", + " learning_rate=0.1,\n", + " objective='binary:logistic',\n", + " random_state=42\n", + ")\n", + "\n", + "# Train the model\n", + "xgb_model.fit(X_train, y_train)\n", + "\n", + "print(\"Model training completed!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2cadfc9b", + "metadata": {}, + "outputs": [], + "source": [ + "y_pred = xgb_model.predict(X_test)\n", + "\n", + "# Print classification report\n", + "print(\"Classification Report:\")\n", + "print(classification_report(y_test, y_pred))\n", + "\n", + "# Display confusion matrix\n", + "ConfusionMatrixDisplay.from_predictions(y_test, y_pred)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0e67566f", + "metadata": {}, + "outputs": [], + "source": [ + "import joblib\n", + "\n", + "# Save the model\n", + "joblib.dump(xgb_model, 'xgb_model.pkl')\n", + "\n", + "# Save the scaler\n", + "joblib.dump(scaler, 'scaler_xgb.pkl')\n", + "\n", + "print(\"Model and scaler saved successfully!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "267f1a79", + "metadata": {}, + "outputs": [], + "source": [ + "# Load the saved model\n", + "xgb_model = joblib.load('xgb_model.pkl')\n", + "scaler = joblib.load('scaler_xgb.pkl')\n", + "\n", + "\n", + "# Example new data\n", + "new_sample = {\n", + " 'timestamp': [1.5], # Replace with a realistic scaled timestamp\n", + " 'TP2': [30.018],\n", + " 'TP3': [8.248],\n", + " 'H1': [25.238],\n", + " 'DV_pressure': [5.024],\n", + " 'Reservoirs': [-88.248],\n", + " 'Oil_temperature': [80.450],\n", + " 'Motor_current': [10.0400],\n", + " 'COMP': [0.0],\n", + " 'DV_eletric': [0.0],\n", + " 'Towers': [0.0],\n", + " 'MPG': [0.0],\n", + " 'LPS': [1.0],\n", + " 'Pressure_switch': [0.0],\n", + " 'Oil_level': [1.0],\n", + " 'Caudal_impulses': [1.0]\n", + "}\n", + "\n", + "\n", + "# Convert to DataFrame\n", + "new_df = pd.DataFrame(new_sample)\n", + "\n", + "# Scale the new data\n", + "new_df_scaled = scaler.transform(new_df)\n", + "\n", + "# Predict\n", + "prediction = xgb_model.predict(new_df_scaled)\n", + "print(\"Prediction (Class):\", \"Failure\" if prediction[0] == 1 else \"Normal\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "073fec92", + "metadata": {}, + "source": [ + "# DeepLearning" + ] + }, + { + "cell_type": "markdown", + "id": "3b9b652f", + "metadata": {}, + "source": [ + "## dataset Preparation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9d026785", + "metadata": {}, + "outputs": [], + "source": [ + "# Load dataset\n", + "df = pd.read_csv('RailGuadrs_Clean_Data.csv')\n", + "\n", + "# Drop unnecessary columns\n", + "df = df.drop(columns=['Unnamed: 0', 'timestamp'])\n", + "\n", + "# Drop any remaining NaN values\n", + "df = df.dropna()\n", + "\n", + "# Features and target\n", + "X = df.drop(columns=['status']) # All columns except 'status'\n", + "y = df['status'] # Target column\n", + "\n", + "# Train-test split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "# Normalize the data\n", + "scaler = MinMaxScaler()\n", + "X_train = scaler.fit_transform(X_train)\n", + "X_test = scaler.transform(X_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ff70ee1", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Dense\n", + "from tensorflow.keras.optimizers import Adam\n", + "\n", + "\n", + "\n", + "# Load dataset\n", + "df = pd.read_csv('RailGuadrs_Clean_Data.csv')\n", + "\n", + "# Convert timestamp to numerical values\n", + "df['timestamp'] = pd.to_datetime(df['timestamp'], errors='coerce')\n", + "df['timestamp'] = (df['timestamp'] - df['timestamp'].min()) / pd.Timedelta(days=1)\n", + "\n", + "# Drop unnecessary columns\n", + "df = df.drop(columns=['Unnamed: 0'])\n", + "\n", + "# Features and target\n", + "X = df.drop(columns=['status'])\n", + "y = df['status']\n", + "\n", + "# Train-test split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "# Normalize features\n", + "scaler = MinMaxScaler()\n", + "X_train = scaler.fit_transform(X_train)\n", + "X_test = scaler.transform(X_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bde4f5d9", + "metadata": {}, + "outputs": [], + "source": [ + "# Load dataset\n", + "df = pd.read_csv('RailGuadrs_Clean_Data.csv')\n", + "\n", + "# Convert timestamp to numerical values\n", + "df['timestamp'] = pd.to_datetime(df['timestamp'], errors='coerce')\n", + "df['timestamp'] = (df['timestamp'] - df['timestamp'].min()) / pd.Timedelta(days=1)\n", + "\n", + "# Drop unnecessary columns\n", + "df = df.drop(columns=['Unnamed: 0'])\n", + "\n", + "# Features and target\n", + "X = df.drop(columns=['status'])\n", + "y = df['status']\n", + "\n", + "# Train-test split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "# Normalize features\n", + "scaler = MinMaxScaler()\n", + "X_train = scaler.fit_transform(X_train)\n", + "X_test = scaler.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66fa2edc", + "metadata": {}, + "outputs": [], + "source": [ + "# Define the model\n", + "model = Sequential([\n", + " Dense(64, activation='relu', input_shape=(X_train.shape[1],)), # Input layer + first hidden layer\n", + " Dense(32, activation='relu'), # Second hidden layer\n", + " Dense(1, activation='sigmoid') # Output layer for binary classification\n", + "])\n", + "\n", + "# Compile the model\n", + "model.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=['accuracy'])\n", + "\n", + "\n", + "\n", + "# Train the model\n", + "history = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.2, verbose=1)\n", + "\n", + "# Evaluate the model\n", + "loss, accuracy = model.evaluate(X_test, y_test, verbose=0)\n", + "print(f\"Test Accuracy: {accuracy * 100:.2f}%\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3049693", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.metrics import classification_report, ConfusionMatrixDisplay\n", + "\n", + "# Predict on the test set\n", + "y_pred = (model.predict(X_test) > 0.5).astype(\"int32\")\n", + "\n", + "# Print classification report\n", + "print(\"Classification Report:\")\n", + "print(classification_report(y_test, y_pred))\n", + "\n", + "# Confusion matrix\n", + "ConfusionMatrixDisplay.from_predictions(y_test, y_pred)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fce7a239", + "metadata": {}, + "outputs": [], + "source": [ + "# Save the model\n", + "model.save('neural_net_model.h5')\n", + "\n", + "# Save the scaler\n", + "import joblib\n", + "joblib.dump(scaler, 'scaler_net.pkl')\n", + "\n", + "print(\"Model and scaler saved successfully!\")\n" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + "tlgQsE5x3fEE", + "3eb2efc4-bd6e-4501-a39b-6f7ef141c8a1", + "5bca1be5-5d0e-4317-a375-dedbe9168c00", + "A8iLUYDTpjfI", + "18c5a153-7fb2-4b7d-86d9-a41322313752" + ], + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/machine_learning/data_preprocessing/deploy8.py b/machine_learning/data_preprocessing/deploy8.py new file mode 100644 index 0000000..1fdb444 --- /dev/null +++ b/machine_learning/data_preprocessing/deploy8.py @@ -0,0 +1,98 @@ +import json +import joblib +import numpy as np +import pandas as pd +from kafka import KafkaConsumer, KafkaProducer +from datetime import datetime, timedelta + +# Load pre-trained model and scaler +model = joblib.load('xgb_model.pkl') # Replace with your model file +scaler = joblib.load('scaler_xgb.pkl') # Replace with your scaler file + +# Kafka Consumer for incoming sensor data +consumer = KafkaConsumer( + 'cleaned_sensor_data', # Topic name for incoming data + bootstrap_servers='localhost:9092', + value_deserializer=lambda m: json.loads(m.decode('utf-8')) +) + +# Kafka Producer for anomaly predictions +producer = KafkaProducer( + bootstrap_servers='localhost:9092', + value_serializer=lambda v: json.dumps(v).encode('utf-8') +) + +# Time window for predicting future anomalies +time_window = timedelta(hours=8) # 8-hour prediction window + +# Helper function: Preprocess incoming data +def preprocess_data(data): + """ + Preprocess incoming data to match the model's expected input format. + """ + feature_order = [ + 'timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure', 'Reservoirs', + 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric', + 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level', 'Caudal_impulses' + ] + # Convert timestamp to numerical value + data['timestamp'] = (datetime.fromisoformat(data['timestamp'][:-6]) - datetime(2024, 1, 1)).total_seconds() / (24 * 3600) + # Ensure data is in a DataFrame + sample = pd.DataFrame([data], columns=feature_order) + return sample + +# Helper function: Simulate future data +def simulate_future_data(current_data, steps=48): + """ + Generate synthetic future data based on current trends. + """ + future_data = [] + for _ in range(steps): # 48 steps for 10-minute intervals + # Generate synthetic data by adding small noise + future_sample = current_data.mean() + np.random.normal(0, 0.1, size=current_data.shape[1]) + future_data.append(future_sample) + return pd.DataFrame(future_data, columns=current_data.columns) + +# Real-time data processing loop +for message in consumer: + try: + # Parse the incoming sensor data + sensor_data = message.value + sample_df = preprocess_data(sensor_data) + sample_scaled = scaler.transform(sample_df) + + # Predict current anomaly + prediction = model.predict(sample_scaled) + anomaly = int(prediction[0]) # 1 = Failure, 0 = Normal + + # Simulate future data using historical trends + simulated_data = simulate_future_data(sample_df, steps=48) # Simulate next 8 hours + simulated_data_scaled = scaler.transform(simulated_data) + + # Predict anomalies on future data + future_anomalies = model.predict(simulated_data_scaled) + anomaly_rate = np.mean(future_anomalies) # Average anomaly rate + + # Determine dynamic threshold (IQR-based) + q1 = np.percentile(future_anomalies, 25) + q3 = np.percentile(future_anomalies, 75) + iqr = q3 - q1 + dynamic_threshold = q3 + 3 * iqr # based on https://ieeexplore-ieee-org.ezproxy.universite-paris-saclay.fr/stamp/stamp.jsp?tp=&arnumber=9564181 + + # Predict maintenance flag + maintenance_flag = anomaly_rate > dynamic_threshold + + # Prepare and send prediction to Kafka + prediction_message = { + "timestamp": sensor_data['timestamp'], + "current_anomaly": anomaly, + "future_anomaly_rate": float(anomaly_rate), + "maintenance_flag": int(maintenance_flag), + "dynamic_threshold": float(dynamic_threshold) + } + producer.send('future_anomaly_predictions', prediction_message) + + print(f"Processed data: {sensor_data}, Prediction: {prediction_message}") + + except Exception as e: + print(f"Error processing message: {e}") diff --git a/machine_learning/data_preprocessing/deploy_shap.py b/machine_learning/data_preprocessing/deploy_shap.py new file mode 100644 index 0000000..d1630d1 --- /dev/null +++ b/machine_learning/data_preprocessing/deploy_shap.py @@ -0,0 +1,122 @@ +import json +import joblib +import numpy as np +import pandas as pd +from kafka import KafkaConsumer, KafkaProducer +from datetime import datetime, timedelta +import shap + +# Load pre-trained model and scaler +model = joblib.load('/home/ubuntu/railGuard/machine_learning/data_preprocessing/xgb_model.pkl') # Replace with your model file +scaler = joblib.load('/home/ubuntu/railGuard/machine_learning/data_preprocessing/scaler_xgb.pkl') # Replace with your scaler file + +# Kafka Consumer for incoming sensor data +consumer = KafkaConsumer( + 'cleaned_sensor_data', # Topic name for incoming data + bootstrap_servers='localhost:9092', + value_deserializer=lambda m: json.loads(m.decode('utf-8')) +) + +# Kafka Producer for anomaly predictions +producer = KafkaProducer( + bootstrap_servers='localhost:9092', + value_serializer=lambda v: json.dumps(v).encode('utf-8') +) + +# Time window for predicting future anomalies +time_window = timedelta(hours=8) # 8-hour prediction window + +# Feature names (ensure they match the model's training data) +feature_names = [ + 'timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure', 'Reservoirs', + 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric', + 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level', 'Caudal_impulses' +] + +# Cache to store historical data for threshold calculation +history_cache = [] # Store historical anomaly rates +cache_limit = 1000 # Maximum number of entries to keep in the cache + +# Helper function: Preprocess incoming data +def preprocess_data(data): + """ + Preprocess incoming data to match the model's expected input format. + """ + # Convert timestamp to numerical value + data['timestamp'] = (datetime.fromisoformat(data['timestamp'][:-6]) - datetime(2024, 1, 1)).total_seconds() / (24 * 3600) + # Ensure data is in a DataFrame + sample = pd.DataFrame([data], columns=feature_names) + return sample + +# Helper function: Simulate future data +def simulate_future_data(current_data, steps=48): + """ + Generate synthetic future data based on current trends. + """ + future_data = [] + for _ in range(steps): # 48 steps for 10-minute intervals + # Generate synthetic data by adding small noise + future_sample = current_data.mean() + np.random.normal(0, 0.1, size=current_data.shape[1]) + future_data.append(future_sample) + return pd.DataFrame(future_data, columns=current_data.columns) + +# SHAP Explainer initialization +explainer = shap.TreeExplainer(model) + +# Real-time data processing loop +for message in consumer: + try: + # Parse the incoming sensor data + sensor_data = message.value + sample_df = preprocess_data(sensor_data) + sample_scaled = scaler.transform(sample_df) + + # Predict current anomaly + prediction = model.predict(sample_scaled) + anomaly = int(prediction[0]) # 1 = Failure, 0 = Normal + + # Store anomaly rate in the history cache + if len(history_cache) >= cache_limit: + history_cache.pop(0) # Remove oldest entry to maintain cache size + history_cache.append(anomaly) + + # Calculate anomaly rate over the history cache + anomaly_rate = np.mean(history_cache) + + # Compute SHAP values for anomaly explanation + shap_values = explainer.shap_values(sample_scaled) + responsible_feature = feature_names[np.argmax(shap_values[0])] + + # Simulate future data using historical trends + simulated_data = simulate_future_data(sample_df, steps=48) # Simulate next 8 hours + simulated_data_scaled = scaler.transform(simulated_data) + + # Predict anomalies on future data + future_anomalies = model.predict(simulated_data_scaled) + future_anomaly_rate = np.mean(future_anomalies) # Average anomaly rate + + # Determine dynamic threshold (IQR-based) + q1 = np.percentile(history_cache, 25) + q3 = np.percentile(history_cache, 75) + iqr = q3 - q1 + dynamic_threshold = q3 + 1.5 * iqr + + # Predict maintenance flag + maintenance_flag = future_anomaly_rate > dynamic_threshold + + # Prepare and send prediction to Kafka + prediction_message = { + "timestamp": sensor_data['timestamp'], + "current_anomaly": anomaly, + "future_anomaly_rate": float(future_anomaly_rate), + "maintenance_flag": int(maintenance_flag), + "dynamic_threshold": float(dynamic_threshold), + "anomaly_rate_last_cache": float(anomaly_rate), + "responsible_feature": responsible_feature + } + producer.send('future_anomaly_predictions', prediction_message) + + print(f"Processed data: {sensor_data}, Prediction: {prediction_message}") + + except Exception as e: + print(f"Error processing message: {e}") diff --git a/machine_learning/data_preprocessing/deployement.py b/machine_learning/data_preprocessing/deployement.py new file mode 100644 index 0000000..bfb3d05 --- /dev/null +++ b/machine_learning/data_preprocessing/deployement.py @@ -0,0 +1,226 @@ +import json +import joblib +import numpy as np +import pandas as pd +from kafka import KafkaConsumer +from kafka import KafkaProducer +from datetime import datetime, timedelta + +# Load the pre-trained model and scaler +model = joblib.load('/home/ubuntu/railGuard/machine_learning/data_preprocessing/xgb_model.pkl') # Replace with your model file +scaler = joblib.load('/home/ubuntu/railGuard/machine_learning/data_preprocessing/scaler_xgb.pkl') # Replace with your scaler file + +# Kafka Consumer to read sensor data +consumer = KafkaConsumer( + 'cleaned_sensor_data', # Topic name for incoming data + bootstrap_servers='localhost:9092', + value_deserializer=lambda m: json.loads(m.decode('utf-8')) +) + +# Kafka Producer to send predictions +producer = KafkaProducer( + bootstrap_servers='localhost:9092', + value_serializer=lambda v: json.dumps(v).encode('utf-8') +) + +# Aggregated results for predictive maintenance +anomaly_count = [] + +time_window = timedelta(hours=8) # Prediction window for maintenance + +anomaly_rates = [] # List to store anomaly rates for dynamic threshold calculation + +k = 3 # Multiplier for IQR in dynamic threshold calculation + +# Helper function to preprocess incoming data +def preprocess_data(data): + """ + Preprocess incoming data to match the model's expected input format. + """ + feature_order = [ + 'timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure', 'Reservoirs', + 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric', + 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level', 'Caudal_impulses' + ] + + # Extract timestamp as numerical value (days since start) + data['timestamp'] = (datetime.fromisoformat(data['timestamp'][:-6]) - datetime(2024, 1, 1)).total_seconds() / (24 * 3600) + + # Ensure data is a DataFrame with feature names + sample = pd.DataFrame([data], columns=feature_order) + return sample + +# Real-time processing loop +for message in consumer: + # Parse the incoming message + sensor_data = message.value + try: + # Preprocess the incoming data + sample_df = preprocess_data(sensor_data) + sample_scaled = scaler.transform(sample_df) + + # Predict anomaly + prediction = model.predict(sample_scaled) + anomaly = int(prediction[0]) # 1 = Failure, 0 = Normal + + # Store result for predictive maintenance + anomaly_count.append((datetime.now(), anomaly)) + + # Filter data for the last 8 hours + anomaly_count = [(t, a) for t, a in anomaly_count if t > datetime.now() - time_window] + + # Calculate anomaly rate + total_count = len(anomaly_count) + # moyenne + anomaly_rate = sum(a for _, a in anomaly_count) / total_count if total_count > 0 else 0 + anomaly_rates.append(anomaly_rate) + + # Update threshold dynamically + dynamic_threshold = 0.3 # Default threshold ## based on MetroPt 3 repport + + if len(anomaly_rates) > 10: # Use a minimum window of 10 rates + q1 = np.percentile(anomaly_rates, 25) + q3 = np.percentile(anomaly_rates, 75) + iqr = q3 - q1 + dynamic_threshold = q3 + k * iqr # k=3 + + # Check if maintenance is required + maintenance_flag = anomaly_rate > dynamic_threshold ## maintenance if + + # Send prediction to Kafka + prediction_message = { + "timestamp": sensor_data['timestamp'], + "anomaly": anomaly, + "anomaly_rate": anomaly_rate, + "maintenance_flag": int(maintenance_flag), # Convert to int for JSON serialization + "dynamic_threshold": float(dynamic_threshold) + } + producer.send('anomaly_predictions', prediction_message) + + print(f"Processed data: {sensor_data}, Prediction: {prediction_message}") + + except Exception as e: + print(f"Error processing message: {e}") + +# import json +# import joblib +# import numpy as np +# import pandas as pd +# from kafka import KafkaConsumer, KafkaProducer +# from datetime import datetime, timedelta +# # import shap + +# # Load pre-trained model and scaler +# model = joblib.load('/home/ubuntu/railGuard/machine_learning/data_preprocessing/xgb_model.pkl') # Replace with your model file +# scaler = joblib.load('/home/ubuntu/railGuard/machine_learning/data_preprocessing/scaler_xgb.pkl') # Replace with your scaler file + +# # Kafka Consumer for incoming sensor data +# consumer = KafkaConsumer( +# 'cleaned_sensor_data', # Topic name for incoming data +# bootstrap_servers='localhost:9092', +# value_deserializer=lambda m: json.loads(m.decode('utf-8')) +# ) + +# # Kafka Producer for anomaly predictions +# producer = KafkaProducer( +# bootstrap_servers='localhost:9092', +# value_serializer=lambda v: json.dumps(v).encode('utf-8') +# ) + +# # Time window for predicting future anomalies +# time_window = timedelta(hours=8) # 8-hour prediction window + +# # Feature names (ensure they match the model's training data) +# feature_names = [ +# 'timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure', 'Reservoirs', +# 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric', +# 'Towers', 'MPG', 'LPS', 'Pressure_switch', 'Oil_level', 'Caudal_impulses' +# ] + +# # Cache to store historical data for threshold calculation +# history_cache = [] # Store historical anomaly rates +# cache_limit = 1000 # Maximum number of entries to keep in the cache + +# # Helper function: Preprocess incoming data +# def preprocess_data(data): +# """ +# Preprocess incoming data to match the model's expected input format. +# """ +# # Convert timestamp to numerical value +# data['timestamp'] = (datetime.fromisoformat(data['timestamp'][:-6]) - datetime(2024, 1, 1)).total_seconds() / (24 * 3600) +# # Ensure data is in a DataFrame +# sample = pd.DataFrame([data], columns=feature_names) +# return sample + +# # Helper function: Simulate future data +# def simulate_future_data(current_data, steps=48): +# """ +# Generate synthetic future data based on current trends. +# """ +# future_data = [] +# for _ in range(steps): # 48 steps for 10-minute intervals +# # Generate synthetic data by adding small noise +# future_sample = current_data.mean() + np.random.normal(0, 0.1, size=current_data.shape[1]) +# future_data.append(future_sample) +# return pd.DataFrame(future_data, columns=current_data.columns) + +# # SHAP Explainer initialization +# # explainer = shap.TreeExplainer(model) + +# # Real-time data processing loop +# for message in consumer: +# try: +# # Parse the incoming sensor data +# sensor_data = message.value +# sample_df = preprocess_data(sensor_data) +# sample_scaled = scaler.transform(sample_df) + +# # Predict current anomaly +# prediction = model.predict(sample_scaled) +# anomaly = int(prediction[0]) # 1 = Failure, 0 = Normal + +# # Store anomaly rate in the history cache +# if len(history_cache) >= cache_limit: +# history_cache.pop(0) # Remove oldest entry to maintain cache size +# history_cache.append(anomaly) + +# # Calculate anomaly rate over the history cache +# anomaly_rate = np.mean(history_cache) + +# # Compute SHAP values for anomaly explanation +# # shap_values = explainer.shap_values(sample_scaled) +# # responsible_feature = feature_names[np.argmax(shap_values[0])] + +# # Simulate future data using historical trends +# simulated_data = simulate_future_data(sample_df, steps=48) # Simulate next 8 hours +# simulated_data_scaled = scaler.transform(simulated_data) + +# # Predict anomalies on future data +# future_anomalies = model.predict(simulated_data_scaled) +# future_anomaly_rate = np.mean(future_anomalies) # Average anomaly rate + +# # Determine dynamic threshold (IQR-based) +# q1 = np.percentile(history_cache, 25) +# q3 = np.percentile(history_cache, 75) +# iqr = q3 - q1 +# dynamic_threshold = q3 + 1.5 * iqr + +# # Predict maintenance flag +# maintenance_flag = future_anomaly_rate > dynamic_threshold + +# # Prepare and send prediction to Kafka +# prediction_message = { +# "timestamp": sensor_data['timestamp'], +# "current_anomaly": anomaly, +# "future_anomaly_rate": float(future_anomaly_rate), +# "maintenance_flag": int(maintenance_flag), +# "dynamic_threshold": float(dynamic_threshold), +# "anomaly_rate_last_cache": float(anomaly_rate), +# # "responsible_feature": responsible_feature +# } +# producer.send('future_anomaly_predictions', prediction_message) + +# print(f"Processed data: {sensor_data}, Prediction: {prediction_message}") + +# except Exception as e: +# print(f"Error processing message: {e}") diff --git a/machine_learning/data_preprocessing/gaussian_nb_model.pkl b/machine_learning/data_preprocessing/gaussian_nb_model.pkl new file mode 100644 index 0000000..c0c6618 Binary files /dev/null and b/machine_learning/data_preprocessing/gaussian_nb_model.pkl differ diff --git a/machine_learning/data_preprocessing/logistic_regression_model.pkl b/machine_learning/data_preprocessing/logistic_regression_model.pkl new file mode 100644 index 0000000..339bdc9 Binary files /dev/null and b/machine_learning/data_preprocessing/logistic_regression_model.pkl differ diff --git a/machine_learning/data_preprocessing/multinomial_nb_model.pkl b/machine_learning/data_preprocessing/multinomial_nb_model.pkl new file mode 100644 index 0000000..9734438 Binary files /dev/null and b/machine_learning/data_preprocessing/multinomial_nb_model.pkl differ diff --git a/machine_learning/data_preprocessing/neural_net_model.h5 b/machine_learning/data_preprocessing/neural_net_model.h5 new file mode 100644 index 0000000..50158f3 Binary files /dev/null and b/machine_learning/data_preprocessing/neural_net_model.h5 differ diff --git a/machine_learning/data_preprocessing/scaler.pkl b/machine_learning/data_preprocessing/scaler.pkl new file mode 100644 index 0000000..e85da16 Binary files /dev/null and b/machine_learning/data_preprocessing/scaler.pkl differ diff --git a/machine_learning/data_preprocessing/scaler_logistic.pkl b/machine_learning/data_preprocessing/scaler_logistic.pkl new file mode 100644 index 0000000..e85da16 Binary files /dev/null and b/machine_learning/data_preprocessing/scaler_logistic.pkl differ diff --git a/machine_learning/data_preprocessing/scaler_net.pkl b/machine_learning/data_preprocessing/scaler_net.pkl new file mode 100644 index 0000000..e85da16 Binary files /dev/null and b/machine_learning/data_preprocessing/scaler_net.pkl differ diff --git a/machine_learning/data_preprocessing/scaler_xgb.pkl b/machine_learning/data_preprocessing/scaler_xgb.pkl new file mode 100644 index 0000000..e85da16 Binary files /dev/null and b/machine_learning/data_preprocessing/scaler_xgb.pkl differ diff --git a/machine_learning/data_preprocessing/test.py b/machine_learning/data_preprocessing/test.py new file mode 100644 index 0000000..7715732 --- /dev/null +++ b/machine_learning/data_preprocessing/test.py @@ -0,0 +1,55 @@ +import joblib +import pandas as pd + +# Load the saved model and scaler +model_regression = joblib.load('/home/ubuntu/railGuard/machine_learning/data_preprocessing/logistic_regression_model.pkl') ## please change the absolut path if different +scaler = joblib.load('/home/ubuntu/railGuard/machine_learning/data_preprocessing/scaler.pkl') + +def predict_new_data(new_data): + # Ensure the new data is a DataFrame with the correct columns + training_feature_names = [ + 'timestamp', 'TP2', 'TP3', 'H1', 'DV_pressure', 'Reservoirs', + 'Oil_temperature', 'Motor_current', 'COMP', 'DV_eletric', 'Towers', + 'MPG', 'LPS', 'Pressure_switch', 'Oil_level', 'Caudal_impulses' + ] + new_df = pd.DataFrame(new_data)[training_feature_names] + + # Scale the new data using the pre-fitted scaler + new_scaled = scaler.transform(new_df) + + # Predict the class and probability + y_pred = model_regression.predict(new_scaled) + y_pred_prob = model_regression.predict_proba(new_scaled)[:, 1] + + return y_pred, y_pred_prob + +# Example new data >>> repect the same body +new_sample = { + 'timestamp': [150], # Replace with realistic timestamp + 'TP2': [-0.018], + 'TP3': [8.248], + 'H1': [8.238], + 'DV_pressure': [-0.024], + 'Reservoirs': [8.248], + 'Oil_temperature': [49.450], + 'Motor_current': [0.0400], + 'COMP': [1.0], + 'DV_eletric': [0.0], + 'Towers': [1.0], + 'MPG': [1.0], + 'LPS': [0.0], + 'Pressure_switch': [1.0], + 'Oil_level': [1.0], + 'Caudal_impulses': [1.0] +} + +# Predict for the new sample +class_labels = {0: "Not Failure", 1: "Failure"} + +y_pred, y_pred_prob = predict_new_data(new_sample) + +y_pred_label = [class_labels[label] for label in y_pred] + +print(f"Prediction (Class): {y_pred_label}") +print(f"Probability of Failure: {y_pred_prob}") + diff --git a/machine_learning/data_preprocessing/xgb_model.pkl b/machine_learning/data_preprocessing/xgb_model.pkl new file mode 100644 index 0000000..10aa172 Binary files /dev/null and b/machine_learning/data_preprocessing/xgb_model.pkl differ diff --git a/spark_jars/commons-pool2-2.11.1.jar b/spark_jars/commons-pool2-2.11.1.jar new file mode 100644 index 0000000..8da8a82 Binary files /dev/null and b/spark_jars/commons-pool2-2.11.1.jar differ diff --git a/spark_jars/kafka-clients-3.5.2.jar b/spark_jars/kafka-clients-3.5.2.jar new file mode 100644 index 0000000..f5771e8 Binary files /dev/null and b/spark_jars/kafka-clients-3.5.2.jar differ diff --git a/spark_jars/spark-sql-kafka-0-10_2.12-3.5.3.jar b/spark_jars/spark-sql-kafka-0-10_2.12-3.5.3.jar new file mode 100644 index 0000000..10800a4 Binary files /dev/null and b/spark_jars/spark-sql-kafka-0-10_2.12-3.5.3.jar differ diff --git a/spark_jars/spark-token-provider-kafka-0-10_2.12-3.5.3.jar b/spark_jars/spark-token-provider-kafka-0-10_2.12-3.5.3.jar new file mode 100644 index 0000000..9080d5b Binary files /dev/null and b/spark_jars/spark-token-provider-kafka-0-10_2.12-3.5.3.jar differ