diff --git a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb new file mode 100644 index 00000000..e7047b14 --- /dev/null +++ b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb @@ -0,0 +1,2915 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "68c4d65d", + "metadata": {}, + "source": [ + "# GPA Prediction Starter Notebook\n", + "\n", + "Welcome to the GPA Prediction Starter Notebook for our project! 🚀\n", + "\n", + "In this notebook, you'll find a ready-to-use Python script that provides a solid foundation for building a GPA predictor based on the data from `year1_gpa.csv`.\n", + "\n", + "## Getting Started\n", + "\n", + "To get started, follow these steps:\n", + "\n", + "1. **Clone the Repository**: Begin by cloning this repository to your local machine.\n", + "\n", + "2. **Organize Your Data**: Ensure that your GPA data is organized in the `Data` directory, particularly the `year1_gpa.csv` file.\n", + "\n", + "3. **Open the Notebook**: Open this notebook in a Jupyter environment.\n", + "\n", + "4. **Follow the Code**: The notebook contains commented code that guides you through the process of setting up the data, building and training the model, and evaluating its performance.\n", + "\n", + "5. **Experiment and Contribute**: Feel free to experiment with different models,engineering features, hyperparameters, or preprocessing techniques. If you come up with improvements, consider contributing them back to the project!\n", + "\n", + "## Important Notes\n", + "\n", + "- Ensure that you have the necessary Python libraries, such as Pandas, NumPy, and scikit-learn, installed in your environment.\n", + "- If you encounter any issues or have questions, don't hesitate to reach out. We're here to help!\n", + "\n", + "Happy coding, and let's build an amazing GPA predictor together! \n" + ] + }, + { + "cell_type": "code", + "execution_count": 234, + "id": "6ee4356f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Importation complete\n" + ] + } + ], + "source": [ + "# Import necessary libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "import joblib\n", + "import openpyxl\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler\n", + "from sklearn.preprocessing import OrdinalEncoder, LabelEncoder\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n", + "from sklearn.metrics import mean_squared_error, r2_score\n", + "from sklearn.model_selection import GridSearchCV\n", + "\n", + "import warnings\n", + "# Ignore warnings\n", + "warnings.filterwarnings('ignore')\n", + "print(\"Importation complete\")" + ] + }, + { + "cell_type": "code", + "execution_count": 235, + "id": "ea57f719", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['ID', 'Start time', 'Completion time', 'Email', 'Name',\n", + " 'Last modified time', 'Jamb score', 'English', 'Maths', 'Subject 3',\n", + " 'Subject 4', 'Subject 5', 'What was your age in Year One', 'Gender',\n", + " 'Do you have a disability?', 'Did you attend extra tutorials? ',\n", + " 'How would you rate your participation in extracurricular activities (tech, music, partying, fellowship, etc.) in Year One?',\n", + " 'How would you rate your class attendance in Year One',\n", + " 'How well did you participate in class activities (Assignments, Asking and Answering Questions, Writing Notes....)',\n", + " 'Rate your use of extra materials for study in Year One (Youtube, Other books, others).',\n", + " 'Morning', 'Afternoon', 'Evening', 'Late Night',\n", + " 'How many days per week did you do reading on average in Year One?',\n", + " 'On average, How many hours per day was used for personal study in Year One',\n", + " 'Did you teach your peers in Year One',\n", + " 'How many courses did you offer in Year One?',\n", + " 'Did you fall sick in Year One? if yes, How many times do you remember (0 if none)',\n", + " 'What was your study mode in Year 1',\n", + " 'Did you study the course your originally applied for?',\n", + " 'What was your monthly allowance in Year One?',\n", + " 'Rate the teaching style / method of the lectures received in Year One',\n", + " 'What type of higher institution did you attend in Year One\\n',\n", + " 'What was your CGPA in Year One?',\n", + " 'What grading system does your school use ( if others, type numbers only)'],\n", + " dtype='object')" + ] + }, + "execution_count": 235, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load the GPA data from year1_gpa.csv\n", + "#data_path = \"../Data/year1_gpa.csv\" # Adjust the path as needed\n", + "#gpa_data = pd.read_csv(data_path,encoding='latin1')\n", + "#READ EXCEL FILE IN PANDAS\n", + "gpa_data = pd.read_excel('year1_gpa.xlsx')\n", + "gpa_data.columns" + ] + }, + { + "cell_type": "markdown", + "id": "6f2fa180", + "metadata": {}, + "source": [ + "## Data Preprocessing\n", + "In the preprocessing stage, we carefully handle the GPA dataset by addressing missing values, performing feature engineering, and ensuring uniform data formatting to prepare it for accurate model training and prediction." + ] + }, + { + "cell_type": "code", + "execution_count": 236, + "id": "319ebe42", + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idstart_timecompletion_timeemailnamelast_modified_timejamb_scoreenglishmathssubject_3...taught_peerscourses_offeredtimes_fell_sickstudy_modestudied_original_courseWhat was your monthly allowance in Year One?teaching_style_ratinginstitution_typecgpa_year_onegrading_system
022023-09-30 09:42:212023-09-30 09:43:00anonymousNaNNaN300BAA...Yes, but just a few times16 to 202Full TimeYesNaN6Public (Federal)4.835
132023-09-30 10:06:492023-09-30 10:12:07anonymousNaNNaN313BAA...Yes, but just a few times13 to 161Full TimeYesNaN6Public (Federal)4.805
242023-10-02 07:00:322023-10-02 07:13:14anonymousNaNNaN249CBB...No, I studied alone5 to 86Full TimeNoNaN2Public (Federal)3.15
352023-10-02 10:47:152023-10-02 10:52:56anonymousNaNNaN213CBB...No, I studied alone16 to 200Full TimeNoNaN1Public (State)3.335
462023-10-02 10:51:422023-10-02 10:53:39anonymousNaNNaN345CAA...Yes, but just a few times0 to 42Full TimeYesNaN5Public (Federal)4.65
..................................................................
1261282023-10-10 11:20:092023-10-10 11:24:17anonymousNaNNaN295ACB...No, I studied alone9 to 120Full TimeNo11 to 20k2Public (Federal)3.275
1271292023-10-10 15:46:052023-10-10 15:50:41anonymousNaNNaN288BAA...Yes, but just a few times16 to 200Full TimeYes21 to 30k2Public (Federal)4.815
1281302023-10-12 06:59:262023-10-12 07:02:08anonymousNaNNaN316CAB...No, I studied alone5 to 80Full TimeYes11 to 20k5Public (Federal)4.665
1291312023-10-14 12:05:322023-10-14 12:08:26anonymousNaNNaN282BAB...Yes, but just a few times9 to 121Full TimeYes6 to 10k7Public (State)4.775
1301322023-10-14 14:55:132023-10-14 15:19:46anonymousNaNNaN323BAA...Yes, but just a few times5 to 80Full TimeYes11 to 20k4Public (Federal)4.565
\n", + "

131 rows × 36 columns

\n", + "
" + ], + "text/plain": [ + " id start_time completion_time email name \\\n", + "0 2 2023-09-30 09:42:21 2023-09-30 09:43:00 anonymous NaN \n", + "1 3 2023-09-30 10:06:49 2023-09-30 10:12:07 anonymous NaN \n", + "2 4 2023-10-02 07:00:32 2023-10-02 07:13:14 anonymous NaN \n", + "3 5 2023-10-02 10:47:15 2023-10-02 10:52:56 anonymous NaN \n", + "4 6 2023-10-02 10:51:42 2023-10-02 10:53:39 anonymous NaN \n", + ".. ... ... ... ... ... \n", + "126 128 2023-10-10 11:20:09 2023-10-10 11:24:17 anonymous NaN \n", + "127 129 2023-10-10 15:46:05 2023-10-10 15:50:41 anonymous NaN \n", + "128 130 2023-10-12 06:59:26 2023-10-12 07:02:08 anonymous NaN \n", + "129 131 2023-10-14 12:05:32 2023-10-14 12:08:26 anonymous NaN \n", + "130 132 2023-10-14 14:55:13 2023-10-14 15:19:46 anonymous NaN \n", + "\n", + " last_modified_time jamb_score english maths subject_3 ... \\\n", + "0 NaN 300 B A A ... \n", + "1 NaN 313 B A A ... \n", + "2 NaN 249 C B B ... \n", + "3 NaN 213 C B B ... \n", + "4 NaN 345 C A A ... \n", + ".. ... ... ... ... ... ... \n", + "126 NaN 295 A C B ... \n", + "127 NaN 288 B A A ... \n", + "128 NaN 316 C A B ... \n", + "129 NaN 282 B A B ... \n", + "130 NaN 323 B A A ... \n", + "\n", + " taught_peers courses_offered times_fell_sick study_mode \\\n", + "0 Yes, but just a few times 16 to 20 2 Full Time \n", + "1 Yes, but just a few times 13 to 16 1 Full Time \n", + "2 No, I studied alone 5 to 8 6 Full Time \n", + "3 No, I studied alone 16 to 20 0 Full Time \n", + "4 Yes, but just a few times 0 to 4 2 Full Time \n", + ".. ... ... ... ... \n", + "126 No, I studied alone 9 to 12 0 Full Time \n", + "127 Yes, but just a few times 16 to 20 0 Full Time \n", + "128 No, I studied alone 5 to 8 0 Full Time \n", + "129 Yes, but just a few times 9 to 12 1 Full Time \n", + "130 Yes, but just a few times 5 to 8 0 Full Time \n", + "\n", + " studied_original_course What was your monthly allowance in Year One? \\\n", + "0 Yes NaN \n", + "1 Yes NaN \n", + "2 No NaN \n", + "3 No NaN \n", + "4 Yes NaN \n", + ".. ... ... \n", + "126 No 11 to 20k \n", + "127 Yes 21 to 30k \n", + "128 Yes 11 to 20k \n", + "129 Yes 6 to 10k \n", + "130 Yes 11 to 20k \n", + "\n", + " teaching_style_rating institution_type cgpa_year_one grading_system \n", + "0 6 Public (Federal) 4.83 5 \n", + "1 6 Public (Federal) 4.80 5 \n", + "2 2 Public (Federal) 3.1 5 \n", + "3 1 Public (State) 3.33 5 \n", + "4 5 Public (Federal) 4.6 5 \n", + ".. ... ... ... ... \n", + "126 2 Public (Federal) 3.27 5 \n", + "127 2 Public (Federal) 4.81 5 \n", + "128 5 Public (Federal) 4.66 5 \n", + "129 7 Public (State) 4.77 5 \n", + "130 4 Public (Federal) 4.56 5 \n", + "\n", + "[131 rows x 36 columns]" + ] + }, + "execution_count": 236, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "\n", + "# Dictionary to map old column names to new names\n", + "new_column_names = {\n", + " 'ID': 'id',\n", + " 'Start time': 'start_time',\n", + " 'Completion time': 'completion_time',\n", + " 'Email': 'email',\n", + " 'Name': 'name',\n", + " 'Last modified time': 'last_modified_time',\n", + " 'Jamb score': 'jamb_score',\n", + " 'English': 'english',\n", + " 'Maths': 'maths',\n", + " 'Subject 3': 'subject_3',\n", + " 'Subject 4': 'subject_4',\n", + " 'Subject 5': 'subject_5',\n", + " 'What was your age in Year One': 'age_in_year_one',\n", + " 'Gender': 'gender',\n", + " 'Do you have a disability?': 'has_disability',\n", + " 'Did you attend extra tutorials? ': 'attended_tutorials',\n", + " 'How would you rate your participation in extracurricular activities (tech, music, partying, fellowship, etc.) in Year One?': 'extracurricular_participation',\n", + " 'How would you rate your class attendance in Year One': 'class_attendance_rating',\n", + " 'How well did you participate in class activities (Assignments, Asking and Answering Questions, Writing Notes....)': 'class_participation_rating',\n", + " 'Did you use extra materials for study in Year One? (Youtube, Other books, others)': 'used_extra_study_materials',\n", + " 'Morning': 'morning_study',\n", + " 'Afternoon': 'afternoon_study',\n", + " 'Evening': 'evening_study',\n", + " 'Late Night': 'late_night_study',\n", + " 'How many days per week did you do reading on average in Year One?': 'days_per_week_reading',\n", + " 'On average, How many hours per day was used for personal study in Year One': 'hours_per_day_personal_study',\n", + " 'Did you teach your peers in Year One': 'taught_peers',\n", + " 'How many courses did you offer in Year One?': 'courses_offered',\n", + " 'Did you fall sick in Year One? if yes, How many times do you remember (0 if none)': 'times_fell_sick',\n", + " 'What was your study mode in Year 1': 'study_mode',\n", + " 'Did you study the course your originally applied for?': 'studied_original_course',\n", + " 'Rate your financial status in Year One': 'financial_status_rating',\n", + " 'Rate the teaching style / method of the lectures received in Year One': 'teaching_style_rating',\n", + " 'What type of higher institution did you attend in Year One\\n': 'institution_type',\n", + " 'What was your CGPA in Year One?': 'cgpa_year_one',\n", + " 'What grading system does your school use ( if others, type numbers only)': 'grading_system'\n", + "}\n", + "\n", + "# Rename columns using the dictionary\n", + "gpa_data.rename(columns=new_column_names, inplace=True)\n", + "\n", + "# Print the DataFrame with updated column names\n", + "gpa_data\n" + ] + }, + { + "cell_type": "code", + "execution_count": 237, + "id": "9607b662", + "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", + "
idjamb_scoreenglishmathssubject_3subject_4subject_5age_in_year_onegenderhas_disability...taught_peerscourses_offeredtimes_fell_sickstudy_modestudied_original_courseWhat was your monthly allowance in Year One?teaching_style_ratinginstitution_typecgpa_year_onegrading_system
02300BAABB16MaleNo...Yes, but just a few times16 to 202Full TimeYesNaN6Public (Federal)4.835
13313BAAAB17MaleNo...Yes, but just a few times13 to 161Full TimeYesNaN6Public (Federal)4.805
24249CBBBC22MaleNo...No, I studied alone5 to 86Full TimeNoNaN2Public (Federal)3.15
35213CBBCB17FemaleNo...No, I studied alone16 to 200Full TimeNoNaN1Public (State)3.335
46345CAAAA18MaleNo...Yes, but just a few times0 to 42Full TimeYesNaN5Public (Federal)4.65
\n", + "

5 rows × 31 columns

\n", + "
" + ], + "text/plain": [ + " id jamb_score english maths subject_3 subject_4 subject_5 \\\n", + "0 2 300 B A A B B \n", + "1 3 313 B A A A B \n", + "2 4 249 C B B B C \n", + "3 5 213 C B B C B \n", + "4 6 345 C A A A A \n", + "\n", + " age_in_year_one gender has_disability ... taught_peers \\\n", + "0 16 Male No ... Yes, but just a few times \n", + "1 17 Male No ... Yes, but just a few times \n", + "2 22 Male No ... No, I studied alone \n", + "3 17 Female No ... No, I studied alone \n", + "4 18 Male No ... Yes, but just a few times \n", + "\n", + " courses_offered times_fell_sick study_mode studied_original_course \\\n", + "0 16 to 20 2 Full Time Yes \n", + "1 13 to 16 1 Full Time Yes \n", + "2 5 to 8 6 Full Time No \n", + "3 16 to 20 0 Full Time No \n", + "4 0 to 4 2 Full Time Yes \n", + "\n", + " What was your monthly allowance in Year One? teaching_style_rating \\\n", + "0 NaN 6 \n", + "1 NaN 6 \n", + "2 NaN 2 \n", + "3 NaN 1 \n", + "4 NaN 5 \n", + "\n", + " institution_type cgpa_year_one grading_system \n", + "0 Public (Federal) 4.83 5 \n", + "1 Public (Federal) 4.80 5 \n", + "2 Public (Federal) 3.1 5 \n", + "3 Public (State) 3.33 5 \n", + "4 Public (Federal) 4.6 5 \n", + "\n", + "[5 rows x 31 columns]" + ] + }, + "execution_count": 237, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# List of columns to drop\n", + "columns_to_drop = ['start_time', 'completion_time', 'email', 'name', 'last_modified_time']\n", + "\n", + "# Drop the specified columns\n", + "gpa_data.drop(columns=columns_to_drop, inplace=True)\n", + "\n", + "# Print the DataFrame after dropping columns\n", + "gpa_data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 238, + "id": "4c7b7b4f", + "metadata": {}, + "outputs": [], + "source": [ + "#separte columns into numeric and categorical\n", + "\n", + "numerical_cols = []\n", + "categorical_cols = []\n", + "for i in gpa_data.columns:\n", + " #print(i, gpa_data[i].dtype)\n", + " if gpa_data[i].dtype == 'object':\n", + " categorical_cols.append(i)\n", + " else:\n", + " numerical_cols.append(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 239, + "id": "b622ddd5", + "metadata": {}, + "outputs": [], + "source": [ + "# Cleaning and Transforming the Grading System and CGPA Year One Columns\n", + "gpa_data['grading_system'] = gpa_data['grading_system'].replace('A', np.nan)\n", + "gpa_data['cgpa_year_one'] = gpa_data['cgpa_year_one'].replace(\"no idea \", np.nan)\n", + "gpa_data['cgpa_year_one'] = gpa_data['cgpa_year_one'].replace(\"3.o\", np.nan)" + ] + }, + { + "cell_type": "code", + "execution_count": 240, + "id": "2d3add7a", + "metadata": {}, + "outputs": [], + "source": [ + "#convert grading system and cgpa year one to numeric\n", + "gpa_data['grading_system'] = pd.to_numeric(gpa_data['grading_system'])\n", + "gpa_data['cgpa_year_one'] = pd.to_numeric(gpa_data['cgpa_year_one'])\n", + "gpa_data['GPA_normal'] = gpa_data['cgpa_year_one'] / gpa_data['grading_system']" + ] + }, + { + "cell_type": "code", + "execution_count": 241, + "id": "aa2316ae", + "metadata": {}, + "outputs": [], + "source": [ + "#Prefered study time column\n", + "gpa_data['preferred_study_time'] = gpa_data[['morning_study', 'afternoon_study', 'evening_study', 'late_night_study']].idxmax(axis=1)\n", + "gpa_data.drop(['morning_study', 'afternoon_study', 'evening_study', 'late_night_study'], axis=1, inplace=True)" + ] + }, + { + "cell_type": "markdown", + "id": "68d7cb1f", + "metadata": {}, + "source": [ + "### Exploratory Data Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 242, + "id": "7b8a79d7", + "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", + "
idjamb_scoreage_in_year_oneextracurricular_participationclass_attendance_ratingclass_participation_ratingRate your use of extra materials for study in Year One (Youtube, Other books, others).days_per_week_readinghours_per_day_personal_studytimes_fell_sickteaching_style_ratingcgpa_year_onegrading_systemGPA_normal
count131.000000131.000000131.000000131.000000131.000000131.000000121.000000131.000000131.00000131.000000131.000000129.000000130.000000128.000000
mean67.000000262.30534417.8091604.1984737.2595426.6564896.9504134.0725194.845421.5038174.4809164.0301864.9384620.820315
std37.96050638.7041821.7807282.4726812.6619482.7949712.5718061.8262223.792131.8948272.0544550.6846020.5392190.135057
min2.000000180.00000014.0000001.0000001.0000001.0000001.0000000.0000000.000000.0000001.0000001.9000004.0000000.369000
25%34.500000234.00000017.0000002.0000006.0000004.0000005.0000003.0000002.000000.0000003.0000003.6000005.0000000.741875
50%67.000000263.00000017.0000004.0000008.0000007.0000007.0000004.0000004.000001.0000004.0000004.2300005.0000000.851400
75%99.500000291.00000019.0000006.0000009.5000009.0000009.0000006.0000006.000002.0000006.0000004.5700005.0000000.920000
max132.000000372.00000026.00000010.00000010.00000010.00000010.0000007.00000020.0000010.00000010.0000004.92000010.0000001.125000
\n", + "
" + ], + "text/plain": [ + " id jamb_score age_in_year_one extracurricular_participation \\\n", + "count 131.000000 131.000000 131.000000 131.000000 \n", + "mean 67.000000 262.305344 17.809160 4.198473 \n", + "std 37.960506 38.704182 1.780728 2.472681 \n", + "min 2.000000 180.000000 14.000000 1.000000 \n", + "25% 34.500000 234.000000 17.000000 2.000000 \n", + "50% 67.000000 263.000000 17.000000 4.000000 \n", + "75% 99.500000 291.000000 19.000000 6.000000 \n", + "max 132.000000 372.000000 26.000000 10.000000 \n", + "\n", + " class_attendance_rating class_participation_rating \\\n", + "count 131.000000 131.000000 \n", + "mean 7.259542 6.656489 \n", + "std 2.661948 2.794971 \n", + "min 1.000000 1.000000 \n", + "25% 6.000000 4.000000 \n", + "50% 8.000000 7.000000 \n", + "75% 9.500000 9.000000 \n", + "max 10.000000 10.000000 \n", + "\n", + " Rate your use of extra materials for study in Year One (Youtube, Other books, others). \\\n", + "count 121.000000 \n", + "mean 6.950413 \n", + "std 2.571806 \n", + "min 1.000000 \n", + "25% 5.000000 \n", + "50% 7.000000 \n", + "75% 9.000000 \n", + "max 10.000000 \n", + "\n", + " days_per_week_reading hours_per_day_personal_study times_fell_sick \\\n", + "count 131.000000 131.00000 131.000000 \n", + "mean 4.072519 4.84542 1.503817 \n", + "std 1.826222 3.79213 1.894827 \n", + "min 0.000000 0.00000 0.000000 \n", + "25% 3.000000 2.00000 0.000000 \n", + "50% 4.000000 4.00000 1.000000 \n", + "75% 6.000000 6.00000 2.000000 \n", + "max 7.000000 20.00000 10.000000 \n", + "\n", + " teaching_style_rating cgpa_year_one grading_system GPA_normal \n", + "count 131.000000 129.000000 130.000000 128.000000 \n", + "mean 4.480916 4.030186 4.938462 0.820315 \n", + "std 2.054455 0.684602 0.539219 0.135057 \n", + "min 1.000000 1.900000 4.000000 0.369000 \n", + "25% 3.000000 3.600000 5.000000 0.741875 \n", + "50% 4.000000 4.230000 5.000000 0.851400 \n", + "75% 6.000000 4.570000 5.000000 0.920000 \n", + "max 10.000000 4.920000 10.000000 1.125000 " + ] + }, + "execution_count": 242, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gpa_data.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 243, + "id": "f07cd3a7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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RYsW1dy5c+Xh4SFJunjxorp27ap//vlHK1eutDghnCkxMVFjx4696dTLnGqb+6Smpmrs2LGaPHmy4uLiJEn+/v7q37+/hgwZonz58uno0aNycXFR6dKlLU4LmIfyYaF9+/apZcuWSk5OVs2aNSVJu3fvloeHh1asWMG3oVzm+eef17p169S5c+cMp14eOHCgRclghoSEBElXp9lH7nb58uUMv2CUKVPGokTZD+XDYklJSVqwYIH2798vSapatapeeOEFeXp6WpwMzubr66sffvjBPrgYQO4SHR2tHj166LfffnNYbhiGbDabfZwPGPNhuQIFCqhnz55Wx4AJChcurCJFilgdA1mMAYh510svvSRXV1d9//33Ge7dxP+jfFjsr7/+0po1azLcRTd8+HCLUiErjB49WsOHD9ecOXOYwyUXYwBi3rVr1y5t375dVapUsTpKtsdhFwtNnz5dr776qooVK6aAgACHlmyz2fhWlMvUrl1bBw8elGEYCg4OTjf1Mp83kLPVr19fEyZMUOPGja2Oku2x58NC7777rt577z0NGTLE6igwAd+C8y4GIOYN77//vt58802NGTMmwytXM9j4/7Hnw0Le3t7atWuXypUrZ3UUAFmAAYh5y7Up9G8c68HnnR57PizUsWNH/fTTT+rdu7fVUWCSc+fOafHixTp48KAGDx6sIkWKaMeOHfL391epUqWsjgcnYwBi3sIsxneOPR8WCg8P10cffaQ2bdpkuItuwIABFiVDVtizZ49atGghHx8fHT58WFFRUSpXrpzeeustHT16VHPnzrU6IpysYMGCDEDMI1JSUvT4449r2rRpqlixotVxsj3Kh4XKli1708dsNhszXuYyLVq0UJ06dTRu3DgVKlRIu3fvVrly5fTbb7+pU6dOOnz4sNUR4WQMQMxb/Pz89Ntvv1E+7gDlwyKGYejo0aMqXrw4E4rlET4+PtqxY4fKly/vUD6OHDmiypUr69KlS1ZHhJOtXr1ab731FgMQ84hBgwbJ3d1dY8eOtTpKtseYD4sYhqGKFSvq999/pyXnEe7u7vYptq8XHR0tPz8/CxIhq7Vo0ULS1es4XY8BiLnTlStXNGvWLK1cuVJ169ZVwYIFHR7/6KOPLEqW/VA+LOLi4qKKFSvq7NmzlI884sknn9SoUaP05ZdfSrp6aO3o0aMaMmSIQkNDLU6H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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def univariate_analysis(col):\n", + " '''\n", + " Simple Bar plot for univariate analysis\n", + " '''\n", + "\n", + " gpa_data[col].value_counts().sort_values().plot(kind='bar')\n", + " plt.title(col.upper())\n", + " plt.show()\n", + "\n", + "univariate_analysis('preferred_study_time')" + ] + }, + { + "cell_type": "code", + "execution_count": 244, + "id": "947ad304", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAH7CAYAAAAw6r78AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABiVklEQVR4nO3deXRMZx8H8O9kT0RCyGpJYhc0IkQTS5BUbEVpEUpqa+0qeFulIlTDq9ZSSu0NQfHWvjTEErHFvu8SS0JsiQQhed4/nNwaM0lmYmIy1/dzzpxj7nOX333mmvnm3jvPKIQQAkREREQyYaTvAoiIiIh0ieGGiIiIZIXhhoiIiGSF4YaIiIhkheGGiIiIZIXhhoiIiGSF4YaIiIhkheGGiIiIZIXhhoiIiGSF4YaIiIhkheHmHa1evRoKhQLr169XafP09IRCocDu3btV2sqXLw8/Pz/puZubG9q0aaN2GzExMVAoFPjrr7/Utv/2229QKBSoX7++0nQ3NzcoFIp8H0uWLFG73latWqFkyZJ4+xc6jh8/DoVCAVdXV5Vldu3aBYVCgfnz5ytNP3/+PBQKBSwsLPD48WO128vOzsayZctQv3592NnZoXjx4qhSpQp69OiBgwcPql0GAKKioqBQKPD777+rbe/fvz9MTU1x8uRJAIAQAsuXL0fjxo1RokQJWFlZoVatWhg/fjzS09NVls/rtTl69KhKH44bN06pf01NTeHm5oYhQ4bkuu9v++qrr6BQKGBjY4Nnz56ptF++fFla/y+//KLSnpCQgH79+sHNzQ3m5uZwcHBA+/btERsbqzJvzvGlUCgQHx+vthZra2sAwJIlSzQ6ptzc3JT6IiUlRe1+qutbhUKBQYMGKU3T9jXOT6dOnaBQKPDdd9+pbc/v/1xetapz9uxZfPnllyhTpgzMzc3h4uKCbt264ezZs0rz6er9JIePjw8UCgXmzp2rtq6c19PCwgK3b99WaW/SpAlq1qypMj0rKwuLFy9GkyZNYGdnB3Nzc7i5uaFnz544evSoyvpze+T1/zq37ee8rw0ePFhlfk1et0mTJkGhUGD79u1q21u1agVbW1vcuXMHAPKsv1+/fmrXoenxlfMwNjaGg4MDPv/8c5w/fz7X2tXR9NgCCvZ65/U50qJFC2m+AwcO4IsvvkD58uVhbW0NPz8/7NmzR6t90SUTvW1ZJho2bAgA2L9/Pz777DNpempqKs6cOQMTExPExsaiadOmUltiYiISExPRpUsXndQQGRkJNzc3HD58GFeuXEGlSpUAADNmzMDTp0+l+bZs2YKVK1di+vTpKF26tDRd3Ztizr5t3boVZ86cQa1ataTpsbGxMDExQUJCAm7duoWyZcsqteUs+6Y///wTTk5OePToEf766y/06dNHZXtDhgzBnDlz0K5dO3Tr1g0mJia4ePEitm7digoVKuDjjz9WW2eXLl2wdOlSfP/992jfvj0cHR2ltsOHD2P+/PkYPnw4PD09kZWVha5du2L16tVo1KgRxo0bBysrK+zbtw/h4eFYs2YN/vnnH6V1FNTcuXNhbW2N9PR0REdH49dff8WxY8ewf/9+jZY3MTFBRkYGNm7ciE6dOim1RUZGwsLCAs+fP1dZLjY2Fq1atQIA9OnTBx4eHkhKSsKSJUvQqFEjzJw5U+0HA/A6jGzcuDHXmho3bozly5crTevTpw98fHzw9ddfS9NywpCuaPMa5yc1NRUbN26Em5sbVq5cKX3YFZZ169YhODgYdnZ26N27N9zd3XHjxg0sXLgQf/31F6KioqT3Dl2+n1y+fBlHjhyBm5sbIiMj0b9//1xrfPHiBSZNmoRff/013/159uwZOnTogG3btqFx48b44YcfYGdnhxs3bmD16tVYunQpEhISlN4Xxo8fD3d3d5V15bxXFcSCBQswatQouLi4aLXc8OHDsWLFCgwYMABnzpyBpaWl1LZmzRps3boVc+bMUVrvJ598gh49eqisq0qVKirTtDm+hgwZgnr16uHly5c4deoU5s2bh5iYGJw5cwZOTk757os2x9abtHm9AaB27doYPny4yvQ3+6hbt25wd3fHiBEjIITAnDlz0KJFCxw/fhzVqlXTaDs6Jeidubu7Cx8fH6Vp27ZtEwqFQgQHB4ugoCClthUrVggA4u+//5amubq6itatW6td/+7duwUAsWbNGpW2a9euCQBi3bp1wt7eXowbNy7XOqdMmSIAiOvXr2u0X3v27BEAxG+//aY0vUuXLqJt27bC2tparFy5UqmtefPmolSpUiI7O1ualp2dLdzc3ERoaKj47LPPRJMmTVS2lZSUJBQKhejbt69KW3Z2tkhOTs6z1uvXrwsrKysRHBwsTXv16pWoXbu2cHNzE+np6UIIIX7++WcBQIwY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lARHR0elaY6OjkhNTcWzZ8/ULhMREQFbW1vpwZuJiYiI5M2gwk1BjBo1Ck+ePJEeiYmJ+i6JiIiICpFBfRXcyckJycnJStOSk5NhY2MDS0tLtcuYm5vD3Nz8fZRHRERERYBBnbnx9fVFdHS00rSdO3fC19dXTxURERFRUaPXcPP06VOcOHECJ06cAPD6q94nTpxAQkICgNeXlHr06CHN369fP1y7dg3/+c9/cOHCBfz2229YvXo1hg0bpo/yiYiIqAjSa7g5evQovLy84OXlBQAIDQ2Fl5cXxo4dCwC4e/euFHQAwN3dHZs3b8bOnTvh6emJqVOn4o8//uDXwImIiEiiEEIIfRfxPqWmpsLW1hZPnjzhIH5EREQGQpvPb4O654aIiIgoPww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrBvXzC0RERAS4fb9Z3yVo5Mak1nrZLs/cEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkayY6LsAIqKizu37zfouIV83JrXWdwkaYV/S+8AzN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkK/xtKSKZMoTf8AH4Oz5EpHs8c0NERESywnBDREREsqL3cDNnzhy4ubnBwsIC9evXx+HDh/Ocf8aMGahatSosLS1Rrlw5DBs2DM+fP39P1RIREVFRp9dws2rVKoSGhiIsLAzHjh2Dp6cngoKCcO/ePbXzr1ixAt9//z3CwsJw/vx5LFy4EKtWrcIPP/zwnisnIiKiokqv4WbatGno27cvevbsCQ8PD8ybNw9WVlZYtGiR2vkPHDiABg0aoGvXrnBzc0Pz5s0RHByc79keIiIi+nDoLdxkZmYiPj4egYGB/xZjZITAwEDExcWpXcbPzw/x8fFSmLl27Rq2bNmCVq1a5bqdFy9eIDU1VelBRERE8qW3r4KnpKQgKysLjo6OStMdHR1x4cIFtct07doVKSkpaNiwIYQQePXqFfr165fnZamIiAiEh4frtHYiIiIquvR+Q7E2YmJi8PPPP+O3337DsWPHsG7dOmzevBkTJkzIdZlRo0bhyZMn0iMxMfE9VkxERETvm97O3JQuXRrGxsZITk5Wmp6cnAwnJye1y/z444/o3r07+vTpAwCoVasW0tPT8fXXX2P06NEwMlLNaubm5jA3N9f9DlChMYTB5zjwHBFR0aW3cGNmZgZvb29ER0ejffv2AIDs7GxER0dj0KBBapfJyMhQCTDGxsYAACFEodabH34gExERFQ16/fmF0NBQhISEoG7duvDx8cGMGTOQnp6Onj17AgB69OiBMmXKICIiAgDw6aefYtq0afDy8kL9+vVx5coV/Pjjj/j000+lkENEREQfNr2Gm86dO+P+/fsYO3YskpKSULt2bWzbtk26yTghIUHpTM2YMWOgUCgwZswY3L59G/b29vj0008xceJEfe0CERERFTF6/+HMQYMG5XoZKiYmRum5iYkJwsLCEBYW9h4qIyIiIkNkUN+WIiIiIsoPww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckK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3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrBSJcDNnzhy4ubnBwsIC9evXx+HDh3Odd8GCBWjUqBFKliyJkiVLIjAwMM/5iYiI6MOi93CzatUqhIaGIiwsDMeOHYOnpyeCgoJw7949tfPHxMQgODgYu3fvRlxcHMqVK4fmzZvj9u3b77lyIiIiKor0Hm6mTZuGvn37omfPnvDw8MC8efNgZWWFRYsWqZ0/MjISAwYMQO3atVGtWjX88ccfyM7ORnR09HuunIiIiIoivYabzMxMxMfHIzAwUJpmZGSEwMBAxMXFabSOjIwMvHz5EnZ2dmrbX7x4gdTUVKUHERERyZdew01KSgqysrLg6OioNN3R0RFJSUkareO7776Di4uLUkB6U0REBGxtbaVHuXLl3rluIiIiKrr0flnqXUyaNAlRUVFYv349LCws1M4zatQoPHnyRHokJia+5yqJiIjofTLR58ZLly4NY2NjJCcnK01PTk6Gk5NTnsv+8ssvmDRpEv755x989NFHuc5nbm4Oc3NzndRLRERERZ9ez9yYmZnB29tb6WbgnJuDfX19c13uv//9LyZMmIBt27ahbt2676NUIiIiMhB6PXMDAKGhoQgJCUHdunXh4+ODGTNmID09HT179gQA9OjRA2XKlEFERAQAYPLkyRg7dixWrFgBNzc36d4ca2trWFtb620/iIiIqGjQe7jp3Lkz7t+/j7FjxyIpKQm1a9fGtm3bpJuMExISYGT07wmmuXPnIjMzE59//rnSesLCwjBu3Lj3WToREREVQXoPNwAwaNAgDBo0SG1bTEyM0vMbN24UfkFERERksAz621JEREREb2O4ISIiIllhuCEiIiJZYbghIiIiWWG4ISIiIllhuCEiIiJZYbghIiIiWWG4ISIiIllh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rl274tatW1iwYAF69eqV57yVK1dGQkICoqKicPXqVcyaNQvr16/XeFvFihVD//79MXLkSGzbtg3nzp1D3759kZGRofR13yZNmmD79u0wMTFBtWrVpGmRkZFKx1j58uVhZmaGX3/9FdeuXcOGDRswYcIELXsACAsLw8qVKxEWFobz58/j9OnTmDx5MoDXZy66deuGHj16YN26dbh+/ToOHz6MiIiIPM9yFaaxY8di2bJlCA8Px9mzZ3H+/HlERUVhzJgxAF6fBX758qXUL8uXL8e8efMKtC1fX18MHToUI0eOxNSpU3H16lVcuHABY8aMwcyZMzF16tQ8A/HbwsPDERERgVmzZuHSpUs4ffo0Fi9ejGnTpqnM9/vvvxeoZtIdhhvSiaZNm+LZs2eoVKmS0oedv78/0tLSULVqVelavaa++eYbdOjQAZ07d0b9+vXx4MEDpbM4wOt7L6pWrYq6devC3t4esbGxua7P398fWVlZUrixs7ODh4cHnJyclM4+jBkzBnXq1EFQUBCaNGkCJycnpYECbWxssHfvXrRq1QpVqlTBmDFjMHXq1HwHPss5tf72X9kKhQJ///03SpYsicaNGyMwMBAVKlTAqlWrpHmCgoLw448/4j//+Q/q1auHtLQ09OjRI78u1BkrKyts374dDx8+RL169fD5558jICBA67FCxo8fjxs3bqBixYqwt7d/p5psbW3RsWNHWFtb5zuQY9u2bTFs2DAMGjQItWvXxoEDB/Djjz9qtb1JkyahY8eO6N69O+rUqYMrV65g+/btKFmypDRPo0aNkJ2drRRkmjRponTcAa/PxC1ZsgRr1qyBh4cHJk2ahF9++UWrenLWvWbNGmzYsAG1a9dGs2bNcPjwYal98eLF6NGjB4YPH46qVauiffv2OHLkiMq9b+9LUFAQNm3ahB07dqBevXr4+OOPMX36dOlsmKenJ6ZNm4bJkyejZs2aiIyMRERERIG3N2PGDPz2229YuXIlatasibp162Lv3r343//+p3I2Jz99+vTBH3/8gcWLF6NWrVrw9/fHkiVLVC5FJyQk4O7duwWumXRDIbS544qICmzfvn0ICAhAYmKiVmc7KHcBAQGoUaMGb94kIiUMN0SF7MWLF7h//z5CQkLg5OSEyMhIfZdk8B49eoSYmBh8/vnnOHfunFb3/RCR/PGGYqJCtnLlSvTu3Ru1a9fGsmXL9F2OLHh5eeHRo0eYPHkygw0RqeCZGyIiIpIV3lBMREREssJwQ0RERLLCcENERESywnBDREREssJwQ0RERLLCcENERESywnBDREREssJwQ0RERLLCcENERESy8n9tbOdwsmbRngAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gpa_data.columns\n", + "\n", + "def bivariate_analysis(col):\n", + " '''\n", + " Simple Bar plot for bivariate analysis with the targest variable\n", + " '''\n", + " gpa_data.groupby(col)['GPA_normal'].mean().sort_values().plot(kind='bar')\n", + " plt.title(col.upper())\n", + " plt.ylabel(\"GPA normal\")\n", + " plt.show()\n", + "\n", + "bivariate_analysis('What was your monthly allowance in Year One?')" + ] + }, + { + "cell_type": "code", + "execution_count": 245, + "id": "82ff069e", + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idjamb_scoreenglishmathssubject_3subject_4subject_5age_in_year_onegenderhas_disability...times_fell_sickstudy_modestudied_original_courseWhat was your monthly allowance in Year One?teaching_style_ratinginstitution_typecgpa_year_onegrading_systemGPA_normalpreferred_study_time
02300455441610...2016614.835.00.9660
13313455541710...1016614.805.00.9601
24249344432210...6006213.105.00.6201
35213344341700...0006123.335.00.6663
46345355551810...2016514.605.00.9202
..................................................................
126128295534431700...0001213.275.00.6543
127129288455551800...0012214.815.00.9622
128130316354441610...0011514.665.00.9322
129131282454451810...1015724.775.00.9541
130132323455541610...0011414.565.00.9120
\n", + "

131 rows × 29 columns

\n", + "
" + ], + "text/plain": [ + " id jamb_score english maths subject_3 subject_4 subject_5 \\\n", + "0 2 300 4 5 5 4 4 \n", + "1 3 313 4 5 5 5 4 \n", + "2 4 249 3 4 4 4 3 \n", + "3 5 213 3 4 4 3 4 \n", + "4 6 345 3 5 5 5 5 \n", + ".. ... ... ... ... ... ... ... \n", + "126 128 295 5 3 4 4 3 \n", + "127 129 288 4 5 5 5 5 \n", + "128 130 316 3 5 4 4 4 \n", + "129 131 282 4 5 4 4 5 \n", + "130 132 323 4 5 5 5 4 \n", + "\n", + " age_in_year_one gender has_disability ... times_fell_sick \\\n", + "0 16 1 0 ... 2 \n", + "1 17 1 0 ... 1 \n", + "2 22 1 0 ... 6 \n", + "3 17 0 0 ... 0 \n", + "4 18 1 0 ... 2 \n", + ".. ... ... ... ... ... \n", + "126 17 0 0 ... 0 \n", + "127 18 0 0 ... 0 \n", + "128 16 1 0 ... 0 \n", + "129 18 1 0 ... 1 \n", + "130 16 1 0 ... 0 \n", + "\n", + " study_mode studied_original_course \\\n", + "0 0 1 \n", + "1 0 1 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 0 1 \n", + ".. ... ... \n", + "126 0 0 \n", + "127 0 1 \n", + "128 0 1 \n", + "129 0 1 \n", + "130 0 1 \n", + "\n", + " What was your monthly allowance in Year One? teaching_style_rating \\\n", + "0 6 6 \n", + "1 6 6 \n", + "2 6 2 \n", + "3 6 1 \n", + "4 6 5 \n", + ".. ... ... \n", + "126 1 2 \n", + "127 2 2 \n", + "128 1 5 \n", + "129 5 7 \n", + "130 1 4 \n", + "\n", + " institution_type cgpa_year_one grading_system GPA_normal \\\n", + "0 1 4.83 5.0 0.966 \n", + "1 1 4.80 5.0 0.960 \n", + "2 1 3.10 5.0 0.620 \n", + "3 2 3.33 5.0 0.666 \n", + "4 1 4.60 5.0 0.920 \n", + ".. ... ... ... ... \n", + "126 1 3.27 5.0 0.654 \n", + "127 1 4.81 5.0 0.962 \n", + "128 1 4.66 5.0 0.932 \n", + "129 2 4.77 5.0 0.954 \n", + "130 1 4.56 5.0 0.912 \n", + "\n", + " preferred_study_time \n", + "0 0 \n", + "1 1 \n", + "2 1 \n", + "3 3 \n", + "4 2 \n", + ".. ... \n", + "126 3 \n", + "127 2 \n", + "128 2 \n", + "129 1 \n", + "130 0 \n", + "\n", + "[131 rows x 29 columns]" + ] + }, + "execution_count": 245, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Ordinal encoding map\n", + "ordinal_encoding_map = {'A': 5, 'B': 4, 'C': 3, 'D': 2, 'E': 1, 'F': 0}\n", + "\n", + "# Features to encode\n", + "features_to_encode = ['english', 'maths', 'subject_3', 'subject_4', 'subject_5']\n", + "\n", + "# Apply ordinal encoding for the specified features\n", + "gpa_data[features_to_encode] = gpa_data[features_to_encode].apply(lambda col: col.map(ordinal_encoding_map))\n", + "\n", + "# Perform label encoding for other categorical columns\n", + "categorical_columns = gpa_data.select_dtypes(include=['object']).columns\n", + "label_encoder = LabelEncoder()\n", + "\n", + "for col in categorical_columns:\n", + " gpa_data[col] = label_encoder.fit_transform(gpa_data[col])\n", + "\n", + "# Print the DataFrame after engineering\n", + "gpa_data\n" + ] + }, + { + "cell_type": "code", + "execution_count": 246, + "id": "d5b953ff", + "metadata": {}, + "outputs": [], + "source": [ + "#create an average score for the five subjects\n", + "gpa_data['avg_subject_score'] = gpa_data[['english', 'maths', 'subject_3', 'subject_4', 'subject_5']].mean(axis=1)\n", + "gpa_data.drop(['english', 'maths', 'subject_3', 'subject_4', 'subject_5'], axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 247, + "id": "f304fad2", + "metadata": {}, + "outputs": [], + "source": [ + "#Based on Bivariate Analysis, the following do not have a significant relationship with the target variable and are dropped\n", + "\n", + "gpa_data.drop([\n", + " 'has_disability',\n", + " 'courses_offered',\n", + " 'times_fell_sick',\n", + " 'study_mode',\n", + " 'studied_original_course',\n", + " 'gender'\n", + "], axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 248, + "id": "b6582188", + "metadata": {}, + "outputs": [], + "source": [ + "gpa_data.drop(['cgpa_year_one', 'grading_system'], axis=1, inplace=True)\n", + "gpa_data.dropna(inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 249, + "id": "48ece681", + "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", + "
idjamb_scoreage_in_year_oneDid you attend extra tutorials?extracurricular_participationclass_attendance_ratingclass_participation_ratingRate your use of extra materials for study in Year One (Youtube, Other books, others).days_per_week_readinghours_per_day_personal_studytaught_peersWhat was your monthly allowance in Year One?teaching_style_ratinginstitution_typeGPA_normalpreferred_study_timeavg_subject_score
101224520157810.07.06.015510.75634.0
11132451801154.04.03.035120.78233.2
1214288220610107.07.01.030810.95033.8
13152601602643.02.05.035410.85423.2
14162091807624.02.01.030420.78033.0
\n", + "
" + ], + "text/plain": [ + " id jamb_score age_in_year_one Did you attend extra tutorials?  \\\n", + "10 12 245 20 1 \n", + "11 13 245 18 0 \n", + "12 14 288 22 0 \n", + "13 15 260 16 0 \n", + "14 16 209 18 0 \n", + "\n", + " extracurricular_participation class_attendance_rating \\\n", + "10 5 7 \n", + "11 1 1 \n", + "12 6 10 \n", + "13 2 6 \n", + "14 7 6 \n", + "\n", + " class_participation_rating \\\n", + "10 8 \n", + "11 5 \n", + "12 10 \n", + "13 4 \n", + "14 2 \n", + "\n", + " Rate your use of extra materials for study in Year One (Youtube, Other books, others). \\\n", + "10 10.0 \n", + "11 4.0 \n", + "12 7.0 \n", + "13 3.0 \n", + "14 4.0 \n", + "\n", + " days_per_week_reading hours_per_day_personal_study taught_peers \\\n", + "10 7.0 6.0 1 \n", + "11 4.0 3.0 3 \n", + "12 7.0 1.0 3 \n", + "13 2.0 5.0 3 \n", + "14 2.0 1.0 3 \n", + "\n", + " What was your monthly allowance in Year One? teaching_style_rating \\\n", + "10 5 5 \n", + "11 5 1 \n", + "12 0 8 \n", + "13 5 4 \n", + "14 0 4 \n", + "\n", + " institution_type GPA_normal preferred_study_time avg_subject_score \n", + "10 1 0.756 3 4.0 \n", + "11 2 0.782 3 3.2 \n", + "12 1 0.950 3 3.8 \n", + "13 1 0.854 2 3.2 \n", + "14 2 0.780 3 3.0 " + ] + }, + "execution_count": 249, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gpa_data.head()" + ] + }, + { + "cell_type": "markdown", + "id": "956dd850", + "metadata": {}, + "source": [ + "## Machine Learning Modeling\n", + "\n", + "In this section, we will walk through the steps involved in building and evaluating a machine learning model for our GPA prediction task.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 250, + "id": "b769a337", + "metadata": {}, + "outputs": [], + "source": [ + "X = gpa_data.drop(['id', 'GPA_normal'], axis=1) # Features excluding 'id' and 'GPA_normal'\n", + "y = gpa_data['GPA_normal'] # Target variable\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)" + ] + }, + { + "cell_type": "markdown", + "id": "4803d47f", + "metadata": {}, + "source": [ + "### Model Training" + ] + }, + { + "cell_type": "code", + "execution_count": 251, + "id": "2f085dfc", + "metadata": {}, + "outputs": [], + "source": [ + "scaler = StandardScaler()\n", + "X_train = scaler.fit_transform(X_train)\n", + "X_test = scaler.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 252, + "id": "ccd31944", + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Dense, Activation\n", + "from tensorflow.keras.optimizers import Adam\n" + ] + }, + { + "cell_type": "code", + "execution_count": 253, + "id": "c837833a", + "metadata": {}, + "outputs": [], + "source": [ + "model = Sequential()\n", + "# change '94' with the other side of the X_train shape\n", + "model.add(Dense(94,activation='relu'))\n", + "model.add(Dense(94,activation='relu'))\n", + "model.add(Dense(94,activation='relu'))\n", + "model.add(Dense(94,activation='relu'))\n", + "# output would be one\n", + "model.add(Dense(1))" + ] + }, + { + "cell_type": "code", + "execution_count": 254, + "id": "8ed31fec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/400\n", + "1/1 [==============================] - 3s 3s/step - loss: 0.7435 - val_loss: 0.4304\n", + "Epoch 2/400\n", + "1/1 [==============================] - 0s 85ms/step - loss: 0.4718 - val_loss: 0.2372\n", + "Epoch 3/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 0.2729 - val_loss: 0.1135\n", + "Epoch 4/400\n", + "1/1 [==============================] - 0s 83ms/step - loss: 0.1432 - val_loss: 0.0627\n", + "Epoch 5/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 0.0833 - val_loss: 0.0785\n", + "Epoch 6/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 0.0874 - val_loss: 0.1245\n", + "Epoch 7/400\n", + "1/1 [==============================] - 0s 93ms/step - loss: 0.1227 - val_loss: 0.1538\n", + "Epoch 8/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 0.1448 - val_loss: 0.1500\n", + "Epoch 9/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 0.1370 - val_loss: 0.1231\n", + "Epoch 10/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 0.1092 - val_loss: 0.0895\n", + "Epoch 11/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 0.0768 - val_loss: 0.0610\n", + "Epoch 12/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 0.0506 - val_loss: 0.0428\n", + "Epoch 13/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 0.0353 - val_loss: 0.0350\n", + "Epoch 14/400\n", + "1/1 [==============================] - 0s 86ms/step - loss: 0.0297 - val_loss: 0.0351\n", + "Epoch 15/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 0.0307 - val_loss: 0.0393\n", + "Epoch 16/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 0.0345 - val_loss: 0.0441\n", + "Epoch 17/400\n", + "1/1 [==============================] - 0s 74ms/step - loss: 0.0383 - val_loss: 0.0478\n", + "Epoch 18/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 0.0400 - val_loss: 0.0495\n", + "Epoch 19/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 0.0390 - val_loss: 0.0490\n", + "Epoch 20/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 0.0355 - val_loss: 0.0468\n", + "Epoch 21/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 0.0303 - val_loss: 0.0440\n", + "Epoch 22/400\n", + "1/1 [==============================] - 0s 86ms/step - loss: 0.0246 - val_loss: 0.0414\n", + "Epoch 23/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 0.0196 - val_loss: 0.0401\n", + "Epoch 24/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 0.0164 - val_loss: 0.0405\n", + "Epoch 25/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 0.0155 - val_loss: 0.0422\n", + "Epoch 26/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 0.0165 - val_loss: 0.0448\n", + "Epoch 27/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 0.0184 - val_loss: 0.0469\n", + "Epoch 28/400\n", + "1/1 [==============================] - 0s 81ms/step - loss: 0.0197 - val_loss: 0.0477\n", + "Epoch 29/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 0.0197 - val_loss: 0.0471\n", + "Epoch 30/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 0.0180 - val_loss: 0.0454\n", + "Epoch 31/400\n", + "1/1 [==============================] - 0s 95ms/step - loss: 0.0154 - val_loss: 0.0435\n", + "Epoch 32/400\n", + "1/1 [==============================] - 0s 89ms/step - loss: 0.0126 - val_loss: 0.0419\n", + "Epoch 33/400\n", + "1/1 [==============================] - 0s 74ms/step - loss: 0.0104 - val_loss: 0.0408\n", + "Epoch 34/400\n", + "1/1 [==============================] - 0s 81ms/step - loss: 0.0091 - val_loss: 0.0404\n", + "Epoch 35/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 0.0086 - val_loss: 0.0403\n", + "Epoch 36/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 0.0087 - val_loss: 0.0403\n", + "Epoch 37/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 0.0090 - val_loss: 0.0403\n", + "Epoch 38/400\n", + "1/1 [==============================] - 0s 87ms/step - loss: 0.0091 - val_loss: 0.0401\n", + "Epoch 39/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 0.0089 - val_loss: 0.0396\n", + "Epoch 40/400\n", + "1/1 [==============================] - 0s 83ms/step - loss: 0.0083 - val_loss: 0.0389\n", + "Epoch 41/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 0.0075 - val_loss: 0.0382\n", + "Epoch 42/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 0.0066 - val_loss: 0.0377\n", + "Epoch 43/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 0.0058 - val_loss: 0.0374\n", + "Epoch 44/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 0.0053 - val_loss: 0.0375\n", + "Epoch 45/400\n", + "1/1 [==============================] - 0s 82ms/step - loss: 0.0050 - val_loss: 0.0377\n", + "Epoch 46/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 0.0050 - val_loss: 0.0380\n", + "Epoch 47/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 0.0050 - val_loss: 0.0381\n", + "Epoch 48/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 0.0050 - val_loss: 0.0380\n", + "Epoch 49/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 0.0047 - val_loss: 0.0377\n", + "Epoch 50/400\n", + "1/1 [==============================] - 0s 83ms/step - loss: 0.0043 - val_loss: 0.0373\n", + "Epoch 51/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 0.0038 - val_loss: 0.0368\n", + "Epoch 52/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 0.0034 - val_loss: 0.0364\n", + "Epoch 53/400\n", + "1/1 [==============================] - 0s 86ms/step - loss: 0.0030 - val_loss: 0.0362\n", + "Epoch 54/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 0.0028 - val_loss: 0.0360\n", + "Epoch 55/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 0.0027 - val_loss: 0.0359\n", + "Epoch 56/400\n", + "1/1 [==============================] - 0s 89ms/step - loss: 0.0027 - val_loss: 0.0359\n", + "Epoch 57/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 0.0026 - val_loss: 0.0358\n", + "Epoch 58/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 0.0025 - val_loss: 0.0357\n", + "Epoch 59/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 0.0023 - val_loss: 0.0356\n", + "Epoch 60/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 0.0020 - val_loss: 0.0355\n", + "Epoch 61/400\n", + "1/1 [==============================] - 0s 87ms/step - loss: 0.0018 - val_loss: 0.0354\n", + "Epoch 62/400\n", + "1/1 [==============================] - 0s 86ms/step - loss: 0.0017 - val_loss: 0.0354\n", + "Epoch 63/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 0.0016 - val_loss: 0.0354\n", + "Epoch 64/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 0.0015 - val_loss: 0.0354\n", + "Epoch 65/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 0.0015 - val_loss: 0.0353\n", + "Epoch 66/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 0.0014 - val_loss: 0.0351\n", + "Epoch 67/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 0.0013 - val_loss: 0.0348\n", + "Epoch 68/400\n", + "1/1 [==============================] - 0s 93ms/step - loss: 0.0012 - val_loss: 0.0346\n", + "Epoch 69/400\n", + "1/1 [==============================] - 0s 86ms/step - loss: 0.0011 - val_loss: 0.0344\n", + "Epoch 70/400\n", + "1/1 [==============================] - 0s 90ms/step - loss: 9.6394e-04 - val_loss: 0.0342\n", + "Epoch 71/400\n", + "1/1 [==============================] - 0s 85ms/step - loss: 8.9374e-04 - val_loss: 0.0341\n", + "Epoch 72/400\n", + "1/1 [==============================] - 0s 81ms/step - loss: 8.4990e-04 - val_loss: 0.0340\n", + "Epoch 73/400\n", + "1/1 [==============================] - 0s 90ms/step - loss: 8.1570e-04 - val_loss: 0.0339\n", + "Epoch 74/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 7.7539e-04 - val_loss: 0.0339\n", + "Epoch 75/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 7.2045e-04 - val_loss: 0.0339\n", + "Epoch 76/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 6.5496e-04 - val_loss: 0.0339\n", + "Epoch 77/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 5.9033e-04 - val_loss: 0.0339\n", + "Epoch 78/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 5.3720e-04 - val_loss: 0.0340\n", + "Epoch 79/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 5.0000e-04 - val_loss: 0.0341\n", + "Epoch 80/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 4.7530e-04 - val_loss: 0.0341\n", + "Epoch 81/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 4.5479e-04 - val_loss: 0.0342\n", + "Epoch 82/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 4.3004e-04 - val_loss: 0.0342\n", + "Epoch 83/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 3.9842e-04 - val_loss: 0.0342\n", + "Epoch 84/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 3.6309e-04 - val_loss: 0.0342\n", + "Epoch 85/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 3.3006e-04 - val_loss: 0.0342\n", + "Epoch 86/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 3.0419e-04 - val_loss: 0.0342\n", + "Epoch 87/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 2.8579e-04 - val_loss: 0.0342\n", + "Epoch 88/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 2.7203e-04 - val_loss: 0.0342\n", + "Epoch 89/400\n", + "1/1 [==============================] - 0s 81ms/step - loss: 2.5827e-04 - val_loss: 0.0342\n", + "Epoch 90/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 2.4171e-04 - val_loss: 0.0342\n", + "Epoch 91/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 2.2265e-04 - val_loss: 0.0342\n", + "Epoch 92/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 2.0366e-04 - val_loss: 0.0342\n", + "Epoch 93/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.8759e-04 - val_loss: 0.0342\n", + "Epoch 94/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.7563e-04 - val_loss: 0.0342\n", + "Epoch 95/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.6692e-04 - val_loss: 0.0341\n", + "Epoch 96/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.5906e-04 - val_loss: 0.0341\n", + "Epoch 97/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 1.5009e-04 - val_loss: 0.0341\n", + "Epoch 98/400\n", + "1/1 [==============================] - 0s 82ms/step - loss: 1.3962e-04 - val_loss: 0.0340\n", + "Epoch 99/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 1.2874e-04 - val_loss: 0.0339\n", + "Epoch 100/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 1.1915e-04 - val_loss: 0.0339\n", + "Epoch 101/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 1.1169e-04 - val_loss: 0.0338\n", + "Epoch 102/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.0604e-04 - val_loss: 0.0338\n", + "Epoch 103/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 1.0098e-04 - val_loss: 0.0338\n", + "Epoch 104/400\n", + "1/1 [==============================] - 0s 85ms/step - loss: 9.5458e-05 - val_loss: 0.0338\n", + "Epoch 105/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 8.9257e-05 - val_loss: 0.0337\n", + "Epoch 106/400\n", + "1/1 [==============================] - 0s 87ms/step - loss: 8.2979e-05 - val_loss: 0.0337\n", + "Epoch 107/400\n", + "1/1 [==============================] - 0s 116ms/step - loss: 7.7390e-05 - val_loss: 0.0337\n", + "Epoch 108/400\n", + "1/1 [==============================] - 0s 110ms/step - loss: 7.2913e-05 - val_loss: 0.0337\n", + "Epoch 109/400\n", + "1/1 [==============================] - 0s 133ms/step - loss: 6.9342e-05 - val_loss: 0.0337\n", + "Epoch 110/400\n", + "1/1 [==============================] - 0s 97ms/step - loss: 6.6053e-05 - val_loss: 0.0337\n", + "Epoch 111/400\n", + "1/1 [==============================] - 0s 82ms/step - loss: 6.2577e-05 - val_loss: 0.0337\n", + "Epoch 112/400\n", + "1/1 [==============================] - 0s 74ms/step - loss: 5.8793e-05 - val_loss: 0.0337\n", + "Epoch 113/400\n", + "1/1 [==============================] - 0s 74ms/step - loss: 5.5082e-05 - val_loss: 0.0337\n", + "Epoch 114/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 5.1845e-05 - val_loss: 0.0337\n", + "Epoch 115/400\n", + "1/1 [==============================] - 0s 85ms/step - loss: 4.9225e-05 - val_loss: 0.0336\n", + "Epoch 116/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 4.7093e-05 - val_loss: 0.0336\n", + "Epoch 117/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 4.5059e-05 - val_loss: 0.0336\n", + "Epoch 118/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 4.2863e-05 - val_loss: 0.0336\n", + "Epoch 119/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 4.0560e-05 - val_loss: 0.0336\n", + "Epoch 120/400\n", + "1/1 [==============================] - 0s 81ms/step - loss: 3.8368e-05 - val_loss: 0.0336\n", + "Epoch 121/400\n", + "1/1 [==============================] - 0s 83ms/step - loss: 3.6456e-05 - val_loss: 0.0336\n", + "Epoch 122/400\n", + "1/1 [==============================] - 0s 74ms/step - loss: 3.4855e-05 - val_loss: 0.0336\n", + "Epoch 123/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 3.3409e-05 - val_loss: 0.0336\n", + "Epoch 124/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 3.1954e-05 - val_loss: 0.0336\n", + "Epoch 125/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 3.0432e-05 - val_loss: 0.0336\n", + "Epoch 126/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 2.8895e-05 - val_loss: 0.0336\n", + "Epoch 127/400\n", + "1/1 [==============================] - 0s 85ms/step - loss: 2.7483e-05 - val_loss: 0.0335\n", + "Epoch 128/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 2.6256e-05 - val_loss: 0.0335\n", + "Epoch 129/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 2.5182e-05 - val_loss: 0.0335\n", + "Epoch 130/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 2.4171e-05 - val_loss: 0.0335\n", + "Epoch 131/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 2.3154e-05 - val_loss: 0.0335\n", + "Epoch 132/400\n", + "1/1 [==============================] - 0s 87ms/step - loss: 2.2108e-05 - val_loss: 0.0335\n", + "Epoch 133/400\n", + "1/1 [==============================] - 0s 82ms/step - loss: 2.1089e-05 - val_loss: 0.0335\n", + "Epoch 134/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 2.0148e-05 - val_loss: 0.0335\n", + "Epoch 135/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 1.9295e-05 - val_loss: 0.0335\n", + "Epoch 136/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.8506e-05 - val_loss: 0.0335\n", + "Epoch 137/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.7728e-05 - val_loss: 0.0335\n", + "Epoch 138/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.6943e-05 - val_loss: 0.0335\n", + "Epoch 139/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 1.6167e-05 - val_loss: 0.0335\n", + "Epoch 140/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 1.5429e-05 - val_loss: 0.0335\n", + "Epoch 141/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 1.4776e-05 - val_loss: 0.0335\n", + "Epoch 142/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 1.4183e-05 - val_loss: 0.0335\n", + "Epoch 143/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 1.3604e-05 - val_loss: 0.0335\n", + "Epoch 144/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 1.3022e-05 - val_loss: 0.0335\n", + "Epoch 145/400\n", + "1/1 [==============================] - 0s 81ms/step - loss: 1.2447e-05 - val_loss: 0.0335\n", + "Epoch 146/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 1.1897e-05 - val_loss: 0.0335\n", + "Epoch 147/400\n", + "1/1 [==============================] - 0s 74ms/step - loss: 1.1393e-05 - val_loss: 0.0335\n", + "Epoch 148/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 1.0920e-05 - val_loss: 0.0335\n", + "Epoch 149/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 1.0459e-05 - val_loss: 0.0335\n", + "Epoch 150/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.0008e-05 - val_loss: 0.0335\n", + "Epoch 151/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 9.5746e-06 - val_loss: 0.0335\n", + "Epoch 152/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 9.1597e-06 - val_loss: 0.0335\n", + "Epoch 153/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 8.7741e-06 - val_loss: 0.0335\n", + "Epoch 154/400\n", + "1/1 [==============================] - 0s 83ms/step - loss: 8.4095e-06 - val_loss: 0.0335\n", + "Epoch 155/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 8.0569e-06 - val_loss: 0.0335\n", + "Epoch 156/400\n", + "1/1 [==============================] - 0s 81ms/step - loss: 7.7106e-06 - val_loss: 0.0335\n", + "Epoch 157/400\n", + "1/1 [==============================] - 0s 82ms/step - loss: 7.3731e-06 - val_loss: 0.0335\n", + "Epoch 158/400\n", + "1/1 [==============================] - 0s 82ms/step - loss: 7.0494e-06 - val_loss: 0.0335\n", + "Epoch 159/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 6.7486e-06 - val_loss: 0.0335\n", + "Epoch 160/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 6.4607e-06 - val_loss: 0.0335\n", + "Epoch 161/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 6.1843e-06 - val_loss: 0.0335\n", + "Epoch 162/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 5.9148e-06 - val_loss: 0.0335\n", + "Epoch 163/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 5.6566e-06 - val_loss: 0.0335\n", + "Epoch 164/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 5.4063e-06 - val_loss: 0.0335\n", + "Epoch 165/400\n", + "1/1 [==============================] - 0s 91ms/step - loss: 5.1673e-06 - val_loss: 0.0335\n", + "Epoch 166/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 4.9402e-06 - val_loss: 0.0335\n", + "Epoch 167/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 4.7257e-06 - val_loss: 0.0335\n", + "Epoch 168/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 4.5210e-06 - val_loss: 0.0335\n", + "Epoch 169/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 4.3223e-06 - val_loss: 0.0335\n", + "Epoch 170/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 4.1337e-06 - val_loss: 0.0335\n", + "Epoch 171/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 3.9538e-06 - val_loss: 0.0335\n", + "Epoch 172/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 3.7805e-06 - val_loss: 0.0335\n", + "Epoch 173/400\n", + "1/1 [==============================] - 0s 74ms/step - loss: 3.6130e-06 - val_loss: 0.0335\n", + "Epoch 174/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 3.4513e-06 - val_loss: 0.0335\n", + "Epoch 175/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 3.2965e-06 - val_loss: 0.0335\n", + "Epoch 176/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 3.1479e-06 - val_loss: 0.0335\n", + "Epoch 177/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 3.0074e-06 - val_loss: 0.0335\n", + "Epoch 178/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 2.8744e-06 - val_loss: 0.0335\n", + "Epoch 179/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 2.7466e-06 - val_loss: 0.0335\n", + "Epoch 180/400\n", + "1/1 [==============================] - 0s 83ms/step - loss: 2.6221e-06 - val_loss: 0.0335\n", + "Epoch 181/400\n", + "1/1 [==============================] - 0s 81ms/step - loss: 2.5027e-06 - val_loss: 0.0335\n", + "Epoch 182/400\n", + "1/1 [==============================] - 0s 82ms/step - loss: 2.3875e-06 - val_loss: 0.0335\n", + "Epoch 183/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 2.2799e-06 - val_loss: 0.0335\n", + "Epoch 184/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 2.1773e-06 - val_loss: 0.0335\n", + "Epoch 185/400\n", + "1/1 [==============================] - 0s 272ms/step - loss: 2.0788e-06 - val_loss: 0.0335\n", + "Epoch 186/400\n", + "1/1 [==============================] - 0s 121ms/step - loss: 1.9822e-06 - val_loss: 0.0335\n", + "Epoch 187/400\n", + "1/1 [==============================] - 0s 83ms/step - loss: 1.8902e-06 - val_loss: 0.0335\n", + "Epoch 188/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 1.8038e-06 - val_loss: 0.0335\n", + "Epoch 189/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 1.7207e-06 - val_loss: 0.0335\n", + "Epoch 190/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 1.6408e-06 - val_loss: 0.0335\n", + "Epoch 191/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 1.5648e-06 - val_loss: 0.0335\n", + "Epoch 192/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 1.4922e-06 - val_loss: 0.0335\n", + "Epoch 193/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 1.4219e-06 - val_loss: 0.0335\n", + "Epoch 194/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.3549e-06 - val_loss: 0.0335\n", + "Epoch 195/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 1.2906e-06 - val_loss: 0.0335\n", + "Epoch 196/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 1.2297e-06 - val_loss: 0.0335\n", + "Epoch 197/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 1.1717e-06 - val_loss: 0.0335\n", + "Epoch 198/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 1.1154e-06 - val_loss: 0.0335\n", + "Epoch 199/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.0616e-06 - val_loss: 0.0335\n", + "Epoch 200/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 1.0105e-06 - val_loss: 0.0335\n", + "Epoch 201/400\n", + "1/1 [==============================] - 0s 184ms/step - loss: 9.6170e-07 - val_loss: 0.0335\n", + "Epoch 202/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 9.1527e-07 - val_loss: 0.0335\n", + "Epoch 203/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 8.7048e-07 - val_loss: 0.0335\n", + "Epoch 204/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 8.2825e-07 - val_loss: 0.0335\n", + "Epoch 205/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 7.8823e-07 - val_loss: 0.0335\n", + "Epoch 206/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 7.4930e-07 - val_loss: 0.0335\n", + "Epoch 207/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 7.1221e-07 - val_loss: 0.0335\n", + "Epoch 208/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 6.7793e-07 - val_loss: 0.0335\n", + "Epoch 209/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 6.4510e-07 - val_loss: 0.0335\n", + "Epoch 210/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 6.1324e-07 - val_loss: 0.0335\n", + "Epoch 211/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 5.8250e-07 - val_loss: 0.0335\n", + "Epoch 212/400\n", + "1/1 [==============================] - 0s 81ms/step - loss: 5.5271e-07 - val_loss: 0.0335\n", + "Epoch 213/400\n", + "1/1 [==============================] - 0s 89ms/step - loss: 5.2489e-07 - val_loss: 0.0335\n", + "Epoch 214/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 4.9868e-07 - val_loss: 0.0335\n", + "Epoch 215/400\n", + "1/1 [==============================] - 0s 81ms/step - loss: 4.7376e-07 - val_loss: 0.0335\n", + "Epoch 216/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 4.4985e-07 - val_loss: 0.0335\n", + "Epoch 217/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 4.2708e-07 - val_loss: 0.0335\n", + "Epoch 218/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 4.0558e-07 - val_loss: 0.0335\n", + "Epoch 219/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 3.8531e-07 - val_loss: 0.0335\n", + "Epoch 220/400\n", + "1/1 [==============================] - 0s 74ms/step - loss: 3.6566e-07 - val_loss: 0.0335\n", + "Epoch 221/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 3.4710e-07 - val_loss: 0.0335\n", + "Epoch 222/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 3.2931e-07 - val_loss: 0.0335\n", + "Epoch 223/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 3.1230e-07 - val_loss: 0.0335\n", + "Epoch 224/400\n", + "1/1 [==============================] - 0s 82ms/step - loss: 2.9620e-07 - val_loss: 0.0335\n", + "Epoch 225/400\n", + "1/1 [==============================] - 0s 99ms/step - loss: 2.8099e-07 - val_loss: 0.0335\n", + "Epoch 226/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 2.6645e-07 - val_loss: 0.0335\n", + "Epoch 227/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 2.5264e-07 - val_loss: 0.0335\n", + "Epoch 228/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 2.3943e-07 - val_loss: 0.0335\n", + "Epoch 229/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 2.2689e-07 - val_loss: 0.0335\n", + "Epoch 230/400\n", + "1/1 [==============================] - 0s 247ms/step - loss: 2.1503e-07 - val_loss: 0.0335\n", + "Epoch 231/400\n", + "1/1 [==============================] - 0s 101ms/step - loss: 2.0370e-07 - val_loss: 0.0335\n", + "Epoch 232/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 1.9288e-07 - val_loss: 0.0335\n", + "Epoch 233/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 1.8254e-07 - val_loss: 0.0335\n", + "Epoch 234/400\n", + "1/1 [==============================] - 0s 77ms/step - loss: 1.7273e-07 - val_loss: 0.0335\n", + "Epoch 235/400\n", + "1/1 [==============================] - 0s 106ms/step - loss: 1.6366e-07 - val_loss: 0.0335\n", + "Epoch 236/400\n", + "1/1 [==============================] - 0s 95ms/step - loss: 1.5490e-07 - val_loss: 0.0335\n", + "Epoch 237/400\n", + "1/1 [==============================] - 0s 84ms/step - loss: 1.4649e-07 - val_loss: 0.0335\n", + "Epoch 238/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 1.3850e-07 - val_loss: 0.0335\n", + "Epoch 239/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 1.3099e-07 - val_loss: 0.0335\n", + "Epoch 240/400\n", + "1/1 [==============================] - 0s 74ms/step - loss: 1.2389e-07 - val_loss: 0.0335\n", + "Epoch 241/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 1.1714e-07 - val_loss: 0.0335\n", + "Epoch 242/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 1.1069e-07 - val_loss: 0.0335\n", + "Epoch 243/400\n", + "1/1 [==============================] - 1s 576ms/step - loss: 1.0456e-07 - val_loss: 0.0335\n", + "Epoch 244/400\n", + "1/1 [==============================] - 0s 113ms/step - loss: 9.8805e-08 - val_loss: 0.0335\n", + "Epoch 245/400\n", + "1/1 [==============================] - 0s 91ms/step - loss: 9.3329e-08 - val_loss: 0.0334\n", + "Epoch 246/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 8.8136e-08 - val_loss: 0.0334\n", + "Epoch 247/400\n", + "1/1 [==============================] - 0s 73ms/step - loss: 8.3327e-08 - val_loss: 0.0334\n", + "Epoch 248/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 7.8706e-08 - val_loss: 0.0334\n", + "Epoch 249/400\n", + "1/1 [==============================] - 0s 74ms/step - loss: 7.4307e-08 - val_loss: 0.0334\n", + "Epoch 250/400\n", + "1/1 [==============================] - 0s 95ms/step - loss: 7.0147e-08 - val_loss: 0.0334\n", + "Epoch 251/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 6.6143e-08 - val_loss: 0.0334\n", + "Epoch 252/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 6.2335e-08 - val_loss: 0.0334\n", + "Epoch 253/400\n", + "1/1 [==============================] - 0s 83ms/step - loss: 5.8794e-08 - val_loss: 0.0334\n", + "Epoch 254/400\n", + "1/1 [==============================] - 0s 98ms/step - loss: 5.5464e-08 - val_loss: 0.0334\n", + "Epoch 255/400\n", + "1/1 [==============================] - 0s 101ms/step - loss: 5.2285e-08 - val_loss: 0.0334\n", + "Epoch 256/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 4.9288e-08 - val_loss: 0.0334\n", + "Epoch 257/400\n", + "1/1 [==============================] - 0s 101ms/step - loss: 4.6436e-08 - val_loss: 0.0334\n", + "Epoch 258/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 4.3725e-08 - val_loss: 0.0334\n", + "Epoch 259/400\n", + "1/1 [==============================] - 0s 91ms/step - loss: 4.1186e-08 - val_loss: 0.0334\n", + "Epoch 260/400\n", + "1/1 [==============================] - 0s 110ms/step - loss: 3.8791e-08 - val_loss: 0.0334\n", + "Epoch 261/400\n", + "1/1 [==============================] - 0s 78ms/step - loss: 3.6514e-08 - val_loss: 0.0334\n", + "Epoch 262/400\n", + "1/1 [==============================] - 0s 88ms/step - loss: 3.4356e-08 - val_loss: 0.0334\n", + "Epoch 263/400\n", + "1/1 [==============================] - 0s 115ms/step - loss: 3.2324e-08 - val_loss: 0.0334\n", + "Epoch 264/400\n", + "1/1 [==============================] - 0s 117ms/step - loss: 3.0404e-08 - val_loss: 0.0334\n", + "Epoch 265/400\n", + "1/1 [==============================] - 0s 95ms/step - loss: 2.8589e-08 - val_loss: 0.0334\n", + "Epoch 266/400\n", + "1/1 [==============================] - 0s 100ms/step - loss: 2.6857e-08 - val_loss: 0.0334\n", + "Epoch 267/400\n", + "1/1 [==============================] - 0s 90ms/step - loss: 2.5224e-08 - val_loss: 0.0334\n", + "Epoch 268/400\n", + "1/1 [==============================] - 0s 76ms/step - loss: 2.3700e-08 - val_loss: 0.0334\n", + "Epoch 269/400\n", + "1/1 [==============================] - 0s 475ms/step - loss: 2.2267e-08 - val_loss: 0.0334\n", + "Epoch 270/400\n", + "1/1 [==============================] - 0s 129ms/step - loss: 2.0906e-08 - val_loss: 0.0334\n", + "Epoch 271/400\n", + "1/1 [==============================] - 0s 92ms/step - loss: 1.9644e-08 - val_loss: 0.0334\n", + "Epoch 272/400\n", + "1/1 [==============================] - 0s 79ms/step - loss: 1.8440e-08 - val_loss: 0.0334\n", + "Epoch 273/400\n", + "1/1 [==============================] - 0s 75ms/step - loss: 1.7308e-08 - val_loss: 0.0334\n", + "Epoch 274/400\n", + "1/1 [==============================] - 0s 89ms/step - loss: 1.6239e-08 - val_loss: 0.0334\n", + "Epoch 275/400\n", + "1/1 [==============================] - 0s 114ms/step - loss: 1.5232e-08 - val_loss: 0.0334\n", + "Epoch 276/400\n", + "1/1 [==============================] - 0s 145ms/step - loss: 1.4281e-08 - val_loss: 0.0334\n", + "Epoch 277/400\n", + "1/1 [==============================] - 0s 298ms/step - loss: 1.3387e-08 - val_loss: 0.0334\n", + "Epoch 278/400\n", + "1/1 [==============================] - 0s 125ms/step - loss: 1.2543e-08 - val_loss: 0.0334\n", + "Epoch 279/400\n", + "1/1 [==============================] - 0s 98ms/step - loss: 1.1761e-08 - val_loss: 0.0334\n", + "Epoch 280/400\n", + "1/1 [==============================] - 0s 191ms/step - loss: 1.1025e-08 - val_loss: 0.0334\n", + "Epoch 281/400\n", + "1/1 [==============================] - 0s 87ms/step - loss: 1.0323e-08 - val_loss: 0.0334\n", + "Epoch 282/400\n", + "1/1 [==============================] - 0s 92ms/step - loss: 9.6584e-09 - val_loss: 0.0334\n", + "Epoch 283/400\n", + "1/1 [==============================] - 0s 111ms/step - loss: 9.0398e-09 - val_loss: 0.0334\n", + "Epoch 284/400\n", + "1/1 [==============================] - 0s 168ms/step - loss: 8.4634e-09 - val_loss: 0.0334\n", + "Epoch 285/400\n", + "1/1 [==============================] - 0s 143ms/step - loss: 7.9182e-09 - val_loss: 0.0334\n", + "Epoch 286/400\n", + "1/1 [==============================] - 0s 102ms/step - loss: 7.4079e-09 - val_loss: 0.0334\n", + "Epoch 287/400\n", + "1/1 [==============================] - 0s 115ms/step - loss: 6.9297e-09 - val_loss: 0.0334\n", + "Epoch 288/400\n", + "1/1 [==============================] - 0s 90ms/step - loss: 6.4812e-09 - val_loss: 0.0334\n", + "Epoch 289/400\n", + "1/1 [==============================] - 0s 92ms/step - loss: 6.0553e-09 - val_loss: 0.0334\n", + "Epoch 290/400\n", + "1/1 [==============================] - 0s 120ms/step - loss: 5.6560e-09 - val_loss: 0.0334\n", + "Epoch 291/400\n", + "1/1 [==============================] - 0s 128ms/step - loss: 5.2860e-09 - val_loss: 0.0334\n", + "Epoch 292/400\n", + "1/1 [==============================] - 0s 124ms/step - loss: 4.9372e-09 - val_loss: 0.0334\n", + "Epoch 293/400\n", + "1/1 [==============================] - 0s 109ms/step - loss: 4.6097e-09 - val_loss: 0.0334\n", + "Epoch 294/400\n", + "1/1 [==============================] - 0s 127ms/step - loss: 4.3015e-09 - val_loss: 0.0334\n", + "Epoch 295/400\n", + "1/1 [==============================] - 0s 140ms/step - loss: 4.0190e-09 - val_loss: 0.0334\n", + "Epoch 296/400\n", + "1/1 [==============================] - 0s 111ms/step - loss: 3.7519e-09 - val_loss: 0.0334\n", + "Epoch 297/400\n", + "1/1 [==============================] - 0s 111ms/step - loss: 3.5002e-09 - val_loss: 0.0334\n", + "Epoch 298/400\n", + "1/1 [==============================] - 0s 121ms/step - loss: 3.2643e-09 - val_loss: 0.0334\n", + "Epoch 299/400\n", + "1/1 [==============================] - 0s 104ms/step - loss: 3.0402e-09 - val_loss: 0.0334\n", + "Epoch 300/400\n", + "1/1 [==============================] - 0s 108ms/step - loss: 2.8324e-09 - val_loss: 0.0334\n", + "Epoch 301/400\n", + "1/1 [==============================] - 0s 86ms/step - loss: 2.6413e-09 - val_loss: 0.0334\n", + "Epoch 302/400\n", + "1/1 [==============================] - 0s 159ms/step - loss: 2.4614e-09 - val_loss: 0.0334\n", + "Epoch 303/400\n", + "1/1 [==============================] - 0s 196ms/step - loss: 2.2926e-09 - val_loss: 0.0334\n", + "Epoch 304/400\n", + "1/1 [==============================] - 0s 108ms/step - loss: 2.1344e-09 - val_loss: 0.0334\n", + "Epoch 305/400\n", + "1/1 [==============================] - 0s 108ms/step - loss: 1.9871e-09 - val_loss: 0.0334\n", + "Epoch 306/400\n", + "1/1 [==============================] - 0s 407ms/step - loss: 1.8491e-09 - val_loss: 0.0334\n", + "Epoch 307/400\n", + "1/1 [==============================] - 0s 132ms/step - loss: 1.7207e-09 - val_loss: 0.0334\n", + "Epoch 308/400\n", + "1/1 [==============================] - 0s 116ms/step - loss: 1.6003e-09 - val_loss: 0.0334\n", + "Epoch 309/400\n", + "1/1 [==============================] - 0s 134ms/step - loss: 1.4900e-09 - val_loss: 0.0334\n", + "Epoch 310/400\n", + "1/1 [==============================] - 0s 132ms/step - loss: 1.3837e-09 - val_loss: 0.0334\n", + "Epoch 311/400\n", + "1/1 [==============================] - 0s 109ms/step - loss: 1.2845e-09 - val_loss: 0.0334\n", + "Epoch 312/400\n", + "1/1 [==============================] - 0s 115ms/step - loss: 1.1941e-09 - val_loss: 0.0334\n", + "Epoch 313/400\n", + "1/1 [==============================] - 0s 209ms/step - loss: 1.1088e-09 - val_loss: 0.0334\n", + "Epoch 314/400\n", + "1/1 [==============================] - 0s 166ms/step - loss: 1.0308e-09 - val_loss: 0.0334\n", + "Epoch 315/400\n", + "1/1 [==============================] - 0s 146ms/step - loss: 9.5759e-10 - val_loss: 0.0334\n", + "Epoch 316/400\n", + "1/1 [==============================] - 0s 169ms/step - loss: 8.8967e-10 - val_loss: 0.0334\n", + "Epoch 317/400\n", + "1/1 [==============================] - 0s 137ms/step - loss: 8.2548e-10 - val_loss: 0.0334\n", + "Epoch 318/400\n", + "1/1 [==============================] - 0s 104ms/step - loss: 7.6519e-10 - val_loss: 0.0334\n", + "Epoch 319/400\n", + "1/1 [==============================] - 0s 170ms/step - loss: 7.0920e-10 - val_loss: 0.0334\n", + "Epoch 320/400\n", + "1/1 [==============================] - 0s 188ms/step - loss: 6.5673e-10 - val_loss: 0.0334\n", + "Epoch 321/400\n", + "1/1 [==============================] - 0s 197ms/step - loss: 6.0908e-10 - val_loss: 0.0334\n", + "Epoch 322/400\n", + "1/1 [==============================] - 0s 154ms/step - loss: 5.6416e-10 - val_loss: 0.0334\n", + "Epoch 323/400\n", + "1/1 [==============================] - 0s 151ms/step - loss: 5.2305e-10 - val_loss: 0.0334\n", + "Epoch 324/400\n", + "1/1 [==============================] - 0s 105ms/step - loss: 4.8374e-10 - val_loss: 0.0334\n", + "Epoch 325/400\n", + "1/1 [==============================] - 0s 183ms/step - loss: 4.4788e-10 - val_loss: 0.0334\n", + "Epoch 326/400\n", + "1/1 [==============================] - 0s 134ms/step - loss: 4.1464e-10 - val_loss: 0.0334\n", + "Epoch 327/400\n", + "1/1 [==============================] - 0s 152ms/step - loss: 3.8344e-10 - val_loss: 0.0334\n", + "Epoch 328/400\n", + "1/1 [==============================] - 0s 185ms/step - loss: 3.5482e-10 - val_loss: 0.0334\n", + "Epoch 329/400\n", + "1/1 [==============================] - 0s 127ms/step - loss: 3.2794e-10 - val_loss: 0.0334\n", + "Epoch 330/400\n", + "1/1 [==============================] - 0s 182ms/step - loss: 3.0320e-10 - val_loss: 0.0334\n", + "Epoch 331/400\n", + "1/1 [==============================] - 0s 349ms/step - loss: 2.8014e-10 - val_loss: 0.0334\n", + "Epoch 332/400\n", + "1/1 [==============================] - 0s 226ms/step - loss: 2.5881e-10 - val_loss: 0.0334\n", + "Epoch 333/400\n", + "1/1 [==============================] - 0s 168ms/step - loss: 2.3936e-10 - val_loss: 0.0334\n", + "Epoch 334/400\n", + "1/1 [==============================] - 0s 145ms/step - loss: 2.2113e-10 - val_loss: 0.0334\n", + "Epoch 335/400\n", + "1/1 [==============================] - 0s 152ms/step - loss: 2.0395e-10 - val_loss: 0.0334\n", + "Epoch 336/400\n", + "1/1 [==============================] - 0s 244ms/step - loss: 1.8827e-10 - val_loss: 0.0334\n", + "Epoch 337/400\n", + "1/1 [==============================] - 0s 113ms/step - loss: 1.7367e-10 - val_loss: 0.0334\n", + "Epoch 338/400\n", + "1/1 [==============================] - 0s 114ms/step - loss: 1.6047e-10 - val_loss: 0.0334\n", + "Epoch 339/400\n", + "1/1 [==============================] - 0s 114ms/step - loss: 1.4776e-10 - val_loss: 0.0334\n", + "Epoch 340/400\n", + "1/1 [==============================] - 0s 123ms/step - loss: 1.3597e-10 - val_loss: 0.0334\n", + "Epoch 341/400\n", + "1/1 [==============================] - 0s 122ms/step - loss: 1.2519e-10 - val_loss: 0.0334\n", + "Epoch 342/400\n", + "1/1 [==============================] - 0s 125ms/step - loss: 1.1549e-10 - val_loss: 0.0334\n", + "Epoch 343/400\n", + "1/1 [==============================] - 0s 124ms/step - loss: 1.0625e-10 - val_loss: 0.0334\n", + "Epoch 344/400\n", + "1/1 [==============================] - 0s 110ms/step - loss: 9.7846e-11 - val_loss: 0.0334\n", + "Epoch 345/400\n", + "1/1 [==============================] - 0s 196ms/step - loss: 8.9997e-11 - val_loss: 0.0334\n", + "Epoch 346/400\n", + "1/1 [==============================] - 0s 162ms/step - loss: 8.2739e-11 - val_loss: 0.0334\n", + "Epoch 347/400\n", + "1/1 [==============================] - 0s 111ms/step - loss: 7.6130e-11 - val_loss: 0.0334\n", + "Epoch 348/400\n", + "1/1 [==============================] - 0s 95ms/step - loss: 6.9914e-11 - val_loss: 0.0334\n", + "Epoch 349/400\n", + "1/1 [==============================] - 0s 97ms/step - loss: 6.4226e-11 - val_loss: 0.0334\n", + "Epoch 350/400\n", + "1/1 [==============================] - 0s 105ms/step - loss: 5.9073e-11 - val_loss: 0.0334\n", + "Epoch 351/400\n", + "1/1 [==============================] - 0s 95ms/step - loss: 5.4250e-11 - val_loss: 0.0334\n", + "Epoch 352/400\n", + "1/1 [==============================] - 0s 96ms/step - loss: 5.0024e-11 - val_loss: 0.0334\n", + "Epoch 353/400\n", + "1/1 [==============================] - 0s 108ms/step - loss: 4.5892e-11 - val_loss: 0.0334\n", + "Epoch 354/400\n", + "1/1 [==============================] - 0s 115ms/step - loss: 4.2105e-11 - val_loss: 0.0334\n", + "Epoch 355/400\n", + "1/1 [==============================] - 0s 95ms/step - loss: 3.8544e-11 - val_loss: 0.0334\n", + "Epoch 356/400\n", + "1/1 [==============================] - 0s 88ms/step - loss: 3.5476e-11 - val_loss: 0.0334\n", + "Epoch 357/400\n", + "1/1 [==============================] - 0s 91ms/step - loss: 3.2602e-11 - val_loss: 0.0334\n", + "Epoch 358/400\n", + "1/1 [==============================] - 0s 109ms/step - loss: 2.9843e-11 - val_loss: 0.0334\n", + "Epoch 359/400\n", + "1/1 [==============================] - 0s 109ms/step - loss: 2.7400e-11 - val_loss: 0.0334\n", + "Epoch 360/400\n", + "1/1 [==============================] - 0s 261ms/step - loss: 2.5114e-11 - val_loss: 0.0334\n", + "Epoch 361/400\n", + "1/1 [==============================] - 0s 136ms/step - loss: 2.2903e-11 - val_loss: 0.0334\n", + "Epoch 362/400\n", + "1/1 [==============================] - 0s 88ms/step - loss: 2.0969e-11 - val_loss: 0.0334\n", + "Epoch 363/400\n", + "1/1 [==============================] - 0s 94ms/step - loss: 1.9230e-11 - val_loss: 0.0334\n", + "Epoch 364/400\n", + "1/1 [==============================] - 0s 164ms/step - loss: 1.7562e-11 - val_loss: 0.0334\n", + "Epoch 365/400\n", + "1/1 [==============================] - 0s 108ms/step - loss: 1.6203e-11 - val_loss: 0.0334\n", + "Epoch 366/400\n", + "1/1 [==============================] - 0s 101ms/step - loss: 1.4792e-11 - val_loss: 0.0334\n", + "Epoch 367/400\n", + "1/1 [==============================] - 0s 95ms/step - loss: 1.3467e-11 - val_loss: 0.0334\n", + "Epoch 368/400\n", + "1/1 [==============================] - 0s 86ms/step - loss: 1.2321e-11 - val_loss: 0.0334\n", + "Epoch 369/400\n", + "1/1 [==============================] - 0s 89ms/step - loss: 1.1305e-11 - val_loss: 0.0334\n", + "Epoch 370/400\n", + "1/1 [==============================] - 0s 90ms/step - loss: 1.0272e-11 - val_loss: 0.0334\n", + "Epoch 371/400\n", + "1/1 [==============================] - 0s 91ms/step - loss: 9.4096e-12 - val_loss: 0.0334\n", + "Epoch 372/400\n", + "1/1 [==============================] - 0s 91ms/step - loss: 8.6648e-12 - val_loss: 0.0334\n", + "Epoch 373/400\n", + "1/1 [==============================] - 0s 87ms/step - loss: 7.9082e-12 - val_loss: 0.0334\n", + "Epoch 374/400\n", + "1/1 [==============================] - 0s 96ms/step - loss: 7.1894e-12 - val_loss: 0.0334\n", + "Epoch 375/400\n", + "1/1 [==============================] - 0s 91ms/step - loss: 6.5999e-12 - val_loss: 0.0334\n", + "Epoch 376/400\n", + "1/1 [==============================] - 0s 92ms/step - loss: 6.0189e-12 - val_loss: 0.0334\n", + "Epoch 377/400\n", + "1/1 [==============================] - 0s 114ms/step - loss: 5.5108e-12 - val_loss: 0.0334\n", + "Epoch 378/400\n", + "1/1 [==============================] - 0s 154ms/step - loss: 5.0018e-12 - val_loss: 0.0334\n", + "Epoch 379/400\n", + "1/1 [==============================] - 0s 174ms/step - loss: 4.5547e-12 - val_loss: 0.0334\n", + "Epoch 380/400\n", + "1/1 [==============================] - 0s 134ms/step - loss: 4.1672e-12 - val_loss: 0.0334\n", + "Epoch 381/400\n", + "1/1 [==============================] - 0s 117ms/step - loss: 3.8238e-12 - val_loss: 0.0334\n", + "Epoch 382/400\n", + "1/1 [==============================] - 0s 112ms/step - loss: 3.5054e-12 - val_loss: 0.0334\n", + "Epoch 383/400\n", + "1/1 [==============================] - 0s 100ms/step - loss: 3.1470e-12 - val_loss: 0.0334\n", + "Epoch 384/400\n", + "1/1 [==============================] - 0s 123ms/step - loss: 2.8618e-12 - val_loss: 0.0334\n", + "Epoch 385/400\n", + "1/1 [==============================] - 0s 86ms/step - loss: 2.6107e-12 - val_loss: 0.0334\n", + "Epoch 386/400\n", + "1/1 [==============================] - 0s 89ms/step - loss: 2.4156e-12 - val_loss: 0.0334\n", + "Epoch 387/400\n", + "1/1 [==============================] - 0s 98ms/step - loss: 2.2376e-12 - val_loss: 0.0334\n", + "Epoch 388/400\n", + "1/1 [==============================] - 0s 80ms/step - loss: 2.0183e-12 - val_loss: 0.0334\n", + "Epoch 389/400\n", + "1/1 [==============================] - 0s 102ms/step - loss: 1.8470e-12 - val_loss: 0.0334\n", + "Epoch 390/400\n", + "1/1 [==============================] - 0s 94ms/step - loss: 1.6702e-12 - val_loss: 0.0334\n", + "Epoch 391/400\n", + "1/1 [==============================] - 0s 123ms/step - loss: 1.5348e-12 - val_loss: 0.0334\n", + "Epoch 392/400\n", + "1/1 [==============================] - 0s 102ms/step - loss: 1.4069e-12 - val_loss: 0.0334\n", + "Epoch 393/400\n", + "1/1 [==============================] - 0s 150ms/step - loss: 1.3060e-12 - val_loss: 0.0334\n", + "Epoch 394/400\n", + "1/1 [==============================] - 0s 400ms/step - loss: 1.1940e-12 - val_loss: 0.0334\n", + "Epoch 395/400\n", + "1/1 [==============================] - 0s 150ms/step - loss: 1.1034e-12 - val_loss: 0.0334\n", + "Epoch 396/400\n", + "1/1 [==============================] - 0s 105ms/step - loss: 9.9836e-13 - val_loss: 0.0334\n", + "Epoch 397/400\n", + "1/1 [==============================] - 0s 87ms/step - loss: 9.2791e-13 - val_loss: 0.0334\n", + "Epoch 398/400\n", + "1/1 [==============================] - 0s 93ms/step - loss: 8.4311e-13 - val_loss: 0.0334\n", + "Epoch 399/400\n", + "1/1 [==============================] - 0s 95ms/step - loss: 7.6604e-13 - val_loss: 0.0334\n", + "Epoch 400/400\n", + "1/1 [==============================] - 0s 102ms/step - loss: 7.1304e-13 - val_loss: 0.0334\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 254, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.compile(optimizer='adam',loss='mse')\n", + "model.fit(x=X_train,y=y_train.values,\n", + " validation_data=(X_test,y_test.values),\n", + " batch_size=128,epochs=400)" + ] + }, + { + "cell_type": "markdown", + "id": "ab53c71a", + "metadata": {}, + "source": [ + "### Model Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 255, + "id": "9c958bb3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:6 out of the last 9 calls to .predict_function at 0x000002856D3070A0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n", + "1/1 [==============================] - 0s 261ms/step\n", + "Root Mean Squared Error (RMSE): 0.1828910029979454\n" + ] + } + ], + "source": [ + "# Predict on the test set\n", + "y_pred = model.predict(X_test)\n", + "\n", + "# Evaluate the model\n", + "rmse = mean_squared_error(y_test, y_pred, squared=False)\n", + "print('Root Mean Squared Error (RMSE):', rmse)" + ] + }, + { + "cell_type": "code", + "execution_count": 260, + "id": "f1001b85", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Our predictions\n", + "plt.scatter(y_test,y_pred)\n", + "plt.xlabel(\"Actual\")\n", + "plt.ylabel(\"Predicted\")\n", + "\n", + "# Perfect predictions\n", + "plt.plot(y_test,y_test,'r');" + ] + }, + { + "cell_type": "markdown", + "id": "a8f50adc", + "metadata": {}, + "source": [ + "### Save the model" + ] + }, + { + "cell_type": "code", + "execution_count": 257, + "id": "71e95e8b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model saved to linear_regression_model.joblib\n" + ] + } + ], + "source": [ + "# Save the model to a file\n", + "model_filename = 'linear_regression_model.joblib'\n", + "joblib.dump(model, model_filename)\n", + "\n", + "print('Model saved to', model_filename)" + ] + }, + { + "cell_type": "markdown", + "id": "94594dfe", + "metadata": {}, + "source": [ + "### Tips to Improve Model Performance\n", + "\n", + "1. **Data Quality:**\n", + " - Ensure clean, high-quality data without missing values or outliers.\n", + "\n", + "2. **Feature Engineering:**\n", + " - Create relevant and new features that capture essential patterns in the data.\n", + "\n", + "3. **Model Selection:**\n", + " - Choose appropriate models and tune hyperparameters for better performance.\n", + "\n", + "4. **Ensemble Learning:**\n", + " - Combine multiple models to improve accuracy and robustness.\n", + "\n", + "5. **Regularization:**\n", + " - Implement regularization to prevent overfitting.\n", + "\n", + "7. **Domain Understanding:**\n", + " - Understand the problem domain to make informed model decisions.\n", + "\n", + "8. **Feedback Loop:**\n", + " - Continuously iterate and improve the model based on feedback and new data.\n", + "\n", + "---\n", + "\n", + "## HAPPY HACKING!!\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1052270e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}