From e5eb41566323e2714722a4eaca1f2591cf84fff3 Mon Sep 17 00:00:00 2001 From: Margaret Awojide <49078266+awojidetola@users.noreply.github.com> Date: Tue, 17 Oct 2023 10:37:20 +0100 Subject: [PATCH 1/8] Create README.MD --- Project_3/GPA_Prediction_awojidetola/README.MD | 1 + 1 file changed, 1 insertion(+) create mode 100644 Project_3/GPA_Prediction_awojidetola/README.MD diff --git a/Project_3/GPA_Prediction_awojidetola/README.MD b/Project_3/GPA_Prediction_awojidetola/README.MD new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Project_3/GPA_Prediction_awojidetola/README.MD @@ -0,0 +1 @@ + From f414c5f6fad8f88eb03f3118967de3bba6aac70f Mon Sep 17 00:00:00 2001 From: Margaret Awojide <49078266+awojidetola@users.noreply.github.com> Date: Tue, 17 Oct 2023 10:45:14 +0100 Subject: [PATCH 2/8] Add files via upload --- .../GPA_Prediction.ipynb | 356 ++++++++++++++++++ 1 file changed, 356 insertions(+) create mode 100644 Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb 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..871ca736 --- /dev/null +++ b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb @@ -0,0 +1,356 @@ +{ + "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": null, + "id": "6ee4356f", + "metadata": {}, + "outputs": [], + "source": [ + "# Import necessary libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.metrics import mean_squared_error\n", + "from sklearn.preprocessing import OrdinalEncoder, LabelEncoder\n", + "import warnings\n", + "import joblib\n", + "# Set display options to show all columns\n", + "pd.set_option('display.max_columns', None)\n", + "\n", + "# Ignore warnings\n", + "warnings.filterwarnings('ignore')\n", + "print(\"Importation complete\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea57f719", + "metadata": {}, + "outputs": [], + "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", + "gpa_data.columns\n" + ] + }, + { + "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": null, + "id": "319ebe42", + "metadata": {}, + "outputs": [], + "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": null, + "id": "9607b662", + "metadata": {}, + "outputs": [], + "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" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "74b3bddd", + "metadata": {}, + "outputs": [], + "source": [ + "# Separate columns into numeric and categorical\n", + "numeric_columns = gpa_data.select_dtypes(include=[np.number]).columns.tolist()\n", + "categorical_columns = gpa_data.select_dtypes(include=[np.object]).columns.tolist()\n", + "\n", + "# Print the lists\n", + "print(\"Numeric Columns:\")\n", + "print(numeric_columns)\n", + "\n", + "print(\"\\nCategorical Columns:\")\n", + "print(categorical_columns)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82ff069e", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "# 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", + "# Create GPA_normal and drop unnecessary columns\n", + "gpa_data['GPA_normal'] = gpa_data['cgpa_year_one'] / gpa_data['grading_system']\n", + "gpa_data.drop(['grading_system', 'cgpa_year_one'], axis=1, inplace=True)\n", + "\n", + "\n", + "# Print the DataFrame after engineering\n", + "gpa_data\n" + ] + }, + { + "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": "markdown", + "id": "4803d47f", + "metadata": {}, + "source": [ + "### Model Training" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99913bf8", + "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)\n", + "\n", + "# Initialize the Linear Regression model\n", + "model = LinearRegression()\n", + "\n", + "# Train the model\n", + "model.fit(X_train, y_train)" + ] + }, + { + "cell_type": "markdown", + "id": "ab53c71a", + "metadata": {}, + "source": [ + "### Model Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9c958bb3", + "metadata": {}, + "outputs": [], + "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": "markdown", + "id": "a8f50adc", + "metadata": {}, + "source": [ + "### Save the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71e95e8b", + "metadata": {}, + "outputs": [], + "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.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From a35a3e9cb8d08a07fb727c36bc649bd186465c0f Mon Sep 17 00:00:00 2001 From: Margaret Awojide <49078266+awojidetola@users.noreply.github.com> Date: Tue, 17 Oct 2023 10:52:45 +0100 Subject: [PATCH 3/8] add starter notebook --- .../GPA_Prediction.ipynb | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb index 871ca736..c432aa68 100644 --- a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb +++ b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb @@ -35,10 +35,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "6ee4356f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Importation complete\n" + ] + } + ], "source": [ "# Import necessary libraries\n", "import pandas as pd\n", @@ -49,8 +57,6 @@ "from sklearn.preprocessing import OrdinalEncoder, LabelEncoder\n", "import warnings\n", "import joblib\n", - "# Set display options to show all columns\n", - "pd.set_option('display.max_columns', None)\n", "\n", "# Ignore warnings\n", "warnings.filterwarnings('ignore')\n", @@ -59,15 +65,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "ea57f719", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "EmptyDataError", + "evalue": "No columns to parse from file", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mEmptyDataError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\Users\\USER\\Desktop\\HacktoberFest\\GPA_Prediction.ipynb Cell 3\u001b[0m line \u001b[0;36m2\n\u001b[0;32m 1\u001b[0m \u001b[39m# Load the GPA data from year1_gpa.csv\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m gpa_data \u001b[39m=\u001b[39m pd\u001b[39m.\u001b[39;49mread_csv(\u001b[39m\"\u001b[39;49m\u001b[39myear1_gpa.csv\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[0;32m 3\u001b[0m gpa_data\u001b[39m.\u001b[39mcolumns\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\pandas\\io\\parsers\\readers.py:948\u001b[0m, in \u001b[0;36mread_csv\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[0;32m 935\u001b[0m kwds_defaults \u001b[39m=\u001b[39m _refine_defaults_read(\n\u001b[0;32m 936\u001b[0m dialect,\n\u001b[0;32m 937\u001b[0m delimiter,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 944\u001b[0m dtype_backend\u001b[39m=\u001b[39mdtype_backend,\n\u001b[0;32m 945\u001b[0m )\n\u001b[0;32m 946\u001b[0m kwds\u001b[39m.\u001b[39mupdate(kwds_defaults)\n\u001b[1;32m--> 948\u001b[0m \u001b[39mreturn\u001b[39;00m _read(filepath_or_buffer, kwds)\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\pandas\\io\\parsers\\readers.py:611\u001b[0m, in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m 608\u001b[0m _validate_names(kwds\u001b[39m.\u001b[39mget(\u001b[39m\"\u001b[39m\u001b[39mnames\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mNone\u001b[39;00m))\n\u001b[0;32m 610\u001b[0m \u001b[39m# Create the parser.\u001b[39;00m\n\u001b[1;32m--> 611\u001b[0m parser \u001b[39m=\u001b[39m TextFileReader(filepath_or_buffer, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwds)\n\u001b[0;32m 613\u001b[0m \u001b[39mif\u001b[39;00m chunksize \u001b[39mor\u001b[39;00m iterator:\n\u001b[0;32m 614\u001b[0m \u001b[39mreturn\u001b[39;00m parser\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\pandas\\io\\parsers\\readers.py:1448\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[1;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[0;32m 1445\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39moptions[\u001b[39m\"\u001b[39m\u001b[39mhas_index_names\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m kwds[\u001b[39m\"\u001b[39m\u001b[39mhas_index_names\u001b[39m\u001b[39m\"\u001b[39m]\n\u001b[0;32m 1447\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandles: IOHandles \u001b[39m|\u001b[39m \u001b[39mNone\u001b[39;00m \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m-> 1448\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_engine \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_make_engine(f, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mengine)\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\pandas\\io\\parsers\\readers.py:1723\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[1;34m(self, f, engine)\u001b[0m\n\u001b[0;32m 1720\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(msg)\n\u001b[0;32m 1722\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m-> 1723\u001b[0m \u001b[39mreturn\u001b[39;00m mapping[engine](f, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49moptions)\n\u001b[0;32m 1724\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m:\n\u001b[0;32m 1725\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandles \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\pandas\\io\\parsers\\c_parser_wrapper.py:93\u001b[0m, in \u001b[0;36mCParserWrapper.__init__\u001b[1;34m(self, src, **kwds)\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[39mif\u001b[39;00m kwds[\u001b[39m\"\u001b[39m\u001b[39mdtype_backend\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m==\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mpyarrow\u001b[39m\u001b[39m\"\u001b[39m:\n\u001b[0;32m 91\u001b[0m \u001b[39m# Fail here loudly instead of in cython after reading\u001b[39;00m\n\u001b[0;32m 92\u001b[0m import_optional_dependency(\u001b[39m\"\u001b[39m\u001b[39mpyarrow\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m---> 93\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_reader \u001b[39m=\u001b[39m parsers\u001b[39m.\u001b[39;49mTextReader(src, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwds)\n\u001b[0;32m 95\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39munnamed_cols \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_reader\u001b[39m.\u001b[39munnamed_cols\n\u001b[0;32m 97\u001b[0m \u001b[39m# error: Cannot determine type of 'names'\u001b[39;00m\n", + "File \u001b[1;32mparsers.pyx:586\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader.__cinit__\u001b[1;34m()\u001b[0m\n", + "\u001b[1;31mEmptyDataError\u001b[0m: No columns to parse from file" + ] + } + ], "source": [ "# Load the GPA data from year1_gpa.csv\n", - "data_path = \"Data\\year1_gpa.csv\" # Adjust the path as needed\n", + "data_path = \"../Data/year1_gpa.csv\" # Adjust the path as needed\n", "gpa_data = pd.read_csv(data_path,encoding='latin1')\n", - "gpa_data.columns\n" + "gpa_data.columns" ] }, { @@ -348,7 +372,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.11.3" } }, "nbformat": 4, From 8d4a9ea994892931fe23a70dd0548143981ff3e6 Mon Sep 17 00:00:00 2001 From: Margaret Awojide <49078266+awojidetola@users.noreply.github.com> Date: Wed, 18 Oct 2023 16:58:37 +0100 Subject: [PATCH 4/8] Add files via upload --- .../GPA_Prediction.ipynb | 1268 ++++++++++++++++- 1 file changed, 1232 insertions(+), 36 deletions(-) diff --git a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb index c432aa68..2b91b380 100644 --- a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb +++ b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "id": "6ee4356f", "metadata": {}, "outputs": [ @@ -57,6 +57,7 @@ "from sklearn.preprocessing import OrdinalEncoder, LabelEncoder\n", "import warnings\n", "import joblib\n", + "import openpyxl\n", "\n", "# Ignore warnings\n", "warnings.filterwarnings('ignore')\n", @@ -65,32 +66,48 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "id": "ea57f719", "metadata": {}, "outputs": [ { - "ename": "EmptyDataError", - "evalue": "No columns to parse from file", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mEmptyDataError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32mc:\\Users\\USER\\Desktop\\HacktoberFest\\GPA_Prediction.ipynb Cell 3\u001b[0m line \u001b[0;36m2\n\u001b[0;32m 1\u001b[0m \u001b[39m# Load the GPA data from year1_gpa.csv\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m gpa_data \u001b[39m=\u001b[39m pd\u001b[39m.\u001b[39;49mread_csv(\u001b[39m\"\u001b[39;49m\u001b[39myear1_gpa.csv\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[0;32m 3\u001b[0m gpa_data\u001b[39m.\u001b[39mcolumns\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\pandas\\io\\parsers\\readers.py:948\u001b[0m, in \u001b[0;36mread_csv\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[0;32m 935\u001b[0m kwds_defaults \u001b[39m=\u001b[39m _refine_defaults_read(\n\u001b[0;32m 936\u001b[0m dialect,\n\u001b[0;32m 937\u001b[0m delimiter,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 944\u001b[0m dtype_backend\u001b[39m=\u001b[39mdtype_backend,\n\u001b[0;32m 945\u001b[0m )\n\u001b[0;32m 946\u001b[0m kwds\u001b[39m.\u001b[39mupdate(kwds_defaults)\n\u001b[1;32m--> 948\u001b[0m \u001b[39mreturn\u001b[39;00m _read(filepath_or_buffer, kwds)\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\pandas\\io\\parsers\\readers.py:611\u001b[0m, in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m 608\u001b[0m _validate_names(kwds\u001b[39m.\u001b[39mget(\u001b[39m\"\u001b[39m\u001b[39mnames\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mNone\u001b[39;00m))\n\u001b[0;32m 610\u001b[0m \u001b[39m# Create the parser.\u001b[39;00m\n\u001b[1;32m--> 611\u001b[0m parser \u001b[39m=\u001b[39m TextFileReader(filepath_or_buffer, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwds)\n\u001b[0;32m 613\u001b[0m \u001b[39mif\u001b[39;00m chunksize \u001b[39mor\u001b[39;00m iterator:\n\u001b[0;32m 614\u001b[0m \u001b[39mreturn\u001b[39;00m parser\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\pandas\\io\\parsers\\readers.py:1448\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[1;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[0;32m 1445\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39moptions[\u001b[39m\"\u001b[39m\u001b[39mhas_index_names\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m kwds[\u001b[39m\"\u001b[39m\u001b[39mhas_index_names\u001b[39m\u001b[39m\"\u001b[39m]\n\u001b[0;32m 1447\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandles: IOHandles \u001b[39m|\u001b[39m \u001b[39mNone\u001b[39;00m \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m-> 1448\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_engine \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_make_engine(f, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mengine)\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\pandas\\io\\parsers\\readers.py:1723\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[1;34m(self, f, engine)\u001b[0m\n\u001b[0;32m 1720\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(msg)\n\u001b[0;32m 1722\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m-> 1723\u001b[0m \u001b[39mreturn\u001b[39;00m mapping[engine](f, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49moptions)\n\u001b[0;32m 1724\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m:\n\u001b[0;32m 1725\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandles \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\pandas\\io\\parsers\\c_parser_wrapper.py:93\u001b[0m, in \u001b[0;36mCParserWrapper.__init__\u001b[1;34m(self, src, **kwds)\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[39mif\u001b[39;00m kwds[\u001b[39m\"\u001b[39m\u001b[39mdtype_backend\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m==\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mpyarrow\u001b[39m\u001b[39m\"\u001b[39m:\n\u001b[0;32m 91\u001b[0m \u001b[39m# Fail here loudly instead of in cython after reading\u001b[39;00m\n\u001b[0;32m 92\u001b[0m import_optional_dependency(\u001b[39m\"\u001b[39m\u001b[39mpyarrow\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m---> 93\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_reader \u001b[39m=\u001b[39m parsers\u001b[39m.\u001b[39;49mTextReader(src, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwds)\n\u001b[0;32m 95\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39munnamed_cols \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_reader\u001b[39m.\u001b[39munnamed_cols\n\u001b[0;32m 97\u001b[0m \u001b[39m# error: Cannot determine type of 'names'\u001b[39;00m\n", - "File \u001b[1;32mparsers.pyx:586\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader.__cinit__\u001b[1;34m()\u001b[0m\n", - "\u001b[1;31mEmptyDataError\u001b[0m: No columns to parse from file" - ] + "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": 9, + "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", + "#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" ] }, @@ -105,10 +122,398 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "319ebe42", "metadata": {}, - "outputs": [], + "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": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\n", "\n", @@ -161,10 +566,398 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "9607b662", "metadata": {}, - "outputs": [], + "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...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
..................................................................
126128295ACBBC17FemaleNo...No, I studied alone9 to 120Full TimeNo11 to 20k2Public (Federal)3.275
127129288BAAAA18FemaleNo...Yes, but just a few times16 to 200Full TimeYes21 to 30k2Public (Federal)4.815
128130316CABBB16MaleNo...No, I studied alone5 to 80Full TimeYes11 to 20k5Public (Federal)4.665
129131282BABBA18MaleNo...Yes, but just a few times9 to 121Full TimeYes6 to 10k7Public (State)4.775
130132323BAAAB16MaleNo...Yes, but just a few times5 to 80Full TimeYes11 to 20k4Public (Federal)4.565
\n", + "

131 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", + "126 128 295 A C B B C \n", + "127 129 288 B A A A A \n", + "128 130 316 C A B B B \n", + "129 131 282 B A B B A \n", + "130 132 323 B A A A B \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", + "126 17 Female No ... No, I studied alone \n", + "127 18 Female No ... Yes, but just a few times \n", + "128 16 Male No ... No, I studied alone \n", + "129 18 Male No ... Yes, but just a few times \n", + "130 16 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", + "126 9 to 12 0 Full Time No \n", + "127 16 to 20 0 Full Time Yes \n", + "128 5 to 8 0 Full Time Yes \n", + "129 9 to 12 1 Full Time Yes \n", + "130 5 to 8 0 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", + "126 11 to 20k 2 \n", + "127 21 to 30k 2 \n", + "128 11 to 20k 5 \n", + "129 6 to 10k 7 \n", + "130 11 to 20k 4 \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", + "126 Public (Federal) 3.27 5 \n", + "127 Public (Federal) 4.81 5 \n", + "128 Public (Federal) 4.66 5 \n", + "129 Public (State) 4.77 5 \n", + "130 Public (Federal) 4.56 5 \n", + "\n", + "[131 rows x 31 columns]" + ] + }, + "execution_count": 11, + "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", @@ -178,29 +971,432 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "74b3bddd", + "execution_count": 26, + "id": "4c7b7b4f", "metadata": {}, "outputs": [], "source": [ - "# Separate columns into numeric and categorical\n", - "numeric_columns = gpa_data.select_dtypes(include=[np.number]).columns.tolist()\n", - "categorical_columns = gpa_data.select_dtypes(include=[np.object]).columns.tolist()\n", + "#separte columns into numeric and categorical\n", "\n", - "# Print the lists\n", - "print(\"Numeric Columns:\")\n", - "print(numeric_columns)\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)\n", "\n", - "print(\"\\nCategorical Columns:\")\n", - "print(categorical_columns)\n" + "#cgpa_year_one should be numerical and it is the target variable" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "id": "82ff069e", "metadata": {}, - "outputs": [], + "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...hours_per_day_personal_studytaught_peerscourses_offeredtimes_fell_sickstudy_modestudied_original_courseWhat was your monthly allowance in Year One?teaching_style_ratinginstitution_typeGPA_normal
02300455441610...6.03220166143.0
13313455541710...10.03110166141.5
24249344432210...8.0146006216.0
35213344341700...2.0120006129.0
46345355551810...3.03020165135.5
..................................................................
126128295534431700...0.5150001217.5
127129288455551800...4.03200122142.0
128130316354441610...1.01400115137.0
129131282454451810...5.03510157240.0
130132323455541610...5.03400114134.5
\n", + "

131 rows × 30 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 ... \\\n", + "0 16 1 0 ... \n", + "1 17 1 0 ... \n", + "2 22 1 0 ... \n", + "3 17 0 0 ... \n", + "4 18 1 0 ... \n", + ".. ... ... ... ... \n", + "126 17 0 0 ... \n", + "127 18 0 0 ... \n", + "128 16 1 0 ... \n", + "129 18 1 0 ... \n", + "130 16 1 0 ... \n", + "\n", + " hours_per_day_personal_study taught_peers courses_offered \\\n", + "0 6.0 3 2 \n", + "1 10.0 3 1 \n", + "2 8.0 1 4 \n", + "3 2.0 1 2 \n", + "4 3.0 3 0 \n", + ".. ... ... ... \n", + "126 0.5 1 5 \n", + "127 4.0 3 2 \n", + "128 1.0 1 4 \n", + "129 5.0 3 5 \n", + "130 5.0 3 4 \n", + "\n", + " times_fell_sick study_mode studied_original_course \\\n", + "0 2 0 1 \n", + "1 1 0 1 \n", + "2 6 0 0 \n", + "3 0 0 0 \n", + "4 2 0 1 \n", + ".. ... ... ... \n", + "126 0 0 0 \n", + "127 0 0 1 \n", + "128 0 0 1 \n", + "129 1 0 1 \n", + "130 0 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 GPA_normal \n", + "0 1 43.0 \n", + "1 1 41.5 \n", + "2 1 6.0 \n", + "3 2 9.0 \n", + "4 1 35.5 \n", + ".. ... ... \n", + "126 1 7.5 \n", + "127 1 42.0 \n", + "128 1 37.0 \n", + "129 2 40.0 \n", + "130 1 34.5 \n", + "\n", + "[131 rows x 30 columns]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\n", "\n", @@ -372,7 +1568,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.10.0" } }, "nbformat": 4, From bb8fc018dc47d597f6825381f2661d2694b104fe Mon Sep 17 00:00:00 2001 From: Margaret Awojide <49078266+awojidetola@users.noreply.github.com> Date: Wed, 18 Oct 2023 17:28:32 +0100 Subject: [PATCH 5/8] fixed bugs -- improved data preprocessing - properly divided columns as categorical and numerical - treated erroneous values in GPA_normal --- .../GPA_Prediction.ipynb | 472 +++++++----------- 1 file changed, 174 insertions(+), 298 deletions(-) diff --git a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb index 2b91b380..eedb1d27 100644 --- a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb +++ b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 72, "id": "6ee4356f", "metadata": {}, "outputs": [ @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 73, "id": "ea57f719", "metadata": {}, "outputs": [ @@ -97,7 +97,7 @@ " dtype='object')" ] }, - "execution_count": 9, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } @@ -122,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 74, "id": "319ebe42", "metadata": {}, "outputs": [ @@ -509,7 +509,7 @@ "[131 rows x 36 columns]" ] }, - "execution_count": 10, + "execution_count": 74, "metadata": {}, "output_type": "execute_result" } @@ -566,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 75, "id": "9607b662", "metadata": {}, "outputs": [ @@ -735,225 +735,51 @@ " 4.6\n", " 5\n", " \n", - " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " \n", - " \n", - " 126\n", - " 128\n", - " 295\n", - " A\n", - " C\n", - " B\n", - " B\n", - " C\n", - " 17\n", - " Female\n", - " No\n", - " ...\n", - " No, I studied alone\n", - " 9 to 12\n", - " 0\n", - " Full Time\n", - " No\n", - " 11 to 20k\n", - " 2\n", - " Public (Federal)\n", - " 3.27\n", - " 5\n", - " \n", - " \n", - " 127\n", - " 129\n", - " 288\n", - " B\n", - " A\n", - " A\n", - " A\n", - " A\n", - " 18\n", - " Female\n", - " No\n", - " ...\n", - " Yes, but just a few times\n", - " 16 to 20\n", - " 0\n", - " Full Time\n", - " Yes\n", - " 21 to 30k\n", - " 2\n", - " Public (Federal)\n", - " 4.81\n", - " 5\n", - " \n", - " \n", - " 128\n", - " 130\n", - " 316\n", - " C\n", - " A\n", - " B\n", - " B\n", - " B\n", - " 16\n", - " Male\n", - " No\n", - " ...\n", - " No, I studied alone\n", - " 5 to 8\n", - " 0\n", - " Full Time\n", - " Yes\n", - " 11 to 20k\n", - " 5\n", - " Public (Federal)\n", - " 4.66\n", - " 5\n", - " \n", - " \n", - " 129\n", - " 131\n", - " 282\n", - " B\n", - " A\n", - " B\n", - " B\n", - " A\n", - " 18\n", - " Male\n", - " No\n", - " ...\n", - " Yes, but just a few times\n", - " 9 to 12\n", - " 1\n", - " Full Time\n", - " Yes\n", - " 6 to 10k\n", - " 7\n", - " Public (State)\n", - " 4.77\n", - " 5\n", - " \n", - " \n", - " 130\n", - " 132\n", - " 323\n", - " B\n", - " A\n", - " A\n", - " A\n", - " B\n", - " 16\n", - " Male\n", - " No\n", - " ...\n", - " Yes, but just a few times\n", - " 5 to 8\n", - " 0\n", - " Full Time\n", - " Yes\n", - " 11 to 20k\n", - " 4\n", - " Public (Federal)\n", - " 4.56\n", - " 5\n", - " \n", " \n", "\n", - "

131 rows × 31 columns

\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", - "126 128 295 A C B B C \n", - "127 129 288 B A A A A \n", - "128 130 316 C A B B B \n", - "129 131 282 B A B B A \n", - "130 132 323 B A A A B \n", + " 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", - "126 17 Female No ... No, I studied alone \n", - "127 18 Female No ... Yes, but just a few times \n", - "128 16 Male No ... No, I studied alone \n", - "129 18 Male No ... Yes, but just a few times \n", - "130 16 Male No ... Yes, but just a few times \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", - "126 9 to 12 0 Full Time No \n", - "127 16 to 20 0 Full Time Yes \n", - "128 5 to 8 0 Full Time Yes \n", - "129 9 to 12 1 Full Time Yes \n", - "130 5 to 8 0 Full Time Yes \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", - "126 11 to 20k 2 \n", - "127 21 to 30k 2 \n", - "128 11 to 20k 5 \n", - "129 6 to 10k 7 \n", - "130 11 to 20k 4 \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", - "126 Public (Federal) 3.27 5 \n", - "127 Public (Federal) 4.81 5 \n", - "128 Public (Federal) 4.66 5 \n", - "129 Public (State) 4.77 5 \n", - "130 Public (Federal) 4.56 5 \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", - "[131 rows x 31 columns]" + "[5 rows x 31 columns]" ] }, - "execution_count": 11, + "execution_count": 75, "metadata": {}, "output_type": "execute_result" } @@ -966,12 +792,12 @@ "gpa_data.drop(columns=columns_to_drop, inplace=True)\n", "\n", "# Print the DataFrame after dropping columns\n", - "gpa_data" + "gpa_data.head()" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 76, "id": "4c7b7b4f", "metadata": {}, "outputs": [], @@ -985,14 +811,38 @@ " if gpa_data[i].dtype == 'object':\n", " categorical_cols.append(i)\n", " else:\n", - " numerical_cols.append(i)\n", - "\n", - "#cgpa_year_one should be numerical and it is the target variable" + " numerical_cols.append(i)" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 85, + "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": 86, + "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": 88, "id": "82ff069e", "metadata": {}, "outputs": [ @@ -1028,8 +878,6 @@ " gender\n", " has_disability\n", " ...\n", - " hours_per_day_personal_study\n", - " taught_peers\n", " courses_offered\n", " times_fell_sick\n", " study_mode\n", @@ -1037,6 +885,8 @@ " What was your monthly allowance in Year One?\n", " teaching_style_rating\n", " institution_type\n", + " cgpa_year_one\n", + " grading_system\n", " GPA_normal\n", " \n", " \n", @@ -1054,8 +904,6 @@ " 1\n", " 0\n", " ...\n", - " 6.0\n", - " 3\n", " 2\n", " 2\n", " 0\n", @@ -1063,7 +911,9 @@ " 6\n", " 6\n", " 1\n", - " 43.0\n", + " 4.83\n", + " 5.0\n", + " 0.966\n", " \n", " \n", " 1\n", @@ -1078,8 +928,6 @@ " 1\n", " 0\n", " ...\n", - " 10.0\n", - " 3\n", " 1\n", " 1\n", " 0\n", @@ -1087,7 +935,9 @@ " 6\n", " 6\n", " 1\n", - " 41.5\n", + " 4.80\n", + " 5.0\n", + " 0.960\n", " \n", " \n", " 2\n", @@ -1102,8 +952,6 @@ " 1\n", " 0\n", " ...\n", - " 8.0\n", - " 1\n", " 4\n", " 6\n", " 0\n", @@ -1111,7 +959,9 @@ " 6\n", " 2\n", " 1\n", - " 6.0\n", + " 3.10\n", + " 5.0\n", + " 0.620\n", " \n", " \n", " 3\n", @@ -1126,8 +976,6 @@ " 0\n", " 0\n", " ...\n", - " 2.0\n", - " 1\n", " 2\n", " 0\n", " 0\n", @@ -1135,7 +983,9 @@ " 6\n", " 1\n", " 2\n", - " 9.0\n", + " 3.33\n", + " 5.0\n", + " 0.666\n", " \n", " \n", " 4\n", @@ -1150,8 +1000,6 @@ " 1\n", " 0\n", " ...\n", - " 3.0\n", - " 3\n", " 0\n", " 2\n", " 0\n", @@ -1159,7 +1007,9 @@ " 6\n", " 5\n", " 1\n", - " 35.5\n", + " 4.60\n", + " 5.0\n", + " 0.920\n", " \n", " \n", " ...\n", @@ -1198,8 +1048,6 @@ " 0\n", " 0\n", " ...\n", - " 0.5\n", - " 1\n", " 5\n", " 0\n", " 0\n", @@ -1207,7 +1055,9 @@ " 1\n", " 2\n", " 1\n", - " 7.5\n", + " 3.27\n", + " 5.0\n", + " 0.654\n", " \n", " \n", " 127\n", @@ -1222,8 +1072,6 @@ " 0\n", " 0\n", " ...\n", - " 4.0\n", - " 3\n", " 2\n", " 0\n", " 0\n", @@ -1231,7 +1079,9 @@ " 2\n", " 2\n", " 1\n", - " 42.0\n", + " 4.81\n", + " 5.0\n", + " 0.962\n", " \n", " \n", " 128\n", @@ -1246,8 +1096,6 @@ " 1\n", " 0\n", " ...\n", - " 1.0\n", - " 1\n", " 4\n", " 0\n", " 0\n", @@ -1255,7 +1103,9 @@ " 1\n", " 5\n", " 1\n", - " 37.0\n", + " 4.66\n", + " 5.0\n", + " 0.932\n", " \n", " \n", " 129\n", @@ -1270,8 +1120,6 @@ " 1\n", " 0\n", " ...\n", - " 5.0\n", - " 3\n", " 5\n", " 1\n", " 0\n", @@ -1279,7 +1127,9 @@ " 5\n", " 7\n", " 2\n", - " 40.0\n", + " 4.77\n", + " 5.0\n", + " 0.954\n", " \n", " \n", " 130\n", @@ -1294,8 +1144,6 @@ " 1\n", " 0\n", " ...\n", - " 5.0\n", - " 3\n", " 4\n", " 0\n", " 0\n", @@ -1303,11 +1151,13 @@ " 1\n", " 4\n", " 1\n", - " 34.5\n", + " 4.56\n", + " 5.0\n", + " 0.912\n", " \n", " \n", "\n", - "

131 rows × 30 columns

\n", + "

131 rows × 32 columns

\n", "" ], "text/plain": [ @@ -1324,31 +1174,18 @@ "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 ... \\\n", - "0 16 1 0 ... \n", - "1 17 1 0 ... \n", - "2 22 1 0 ... \n", - "3 17 0 0 ... \n", - "4 18 1 0 ... \n", - ".. ... ... ... ... \n", - "126 17 0 0 ... \n", - "127 18 0 0 ... \n", - "128 16 1 0 ... \n", - "129 18 1 0 ... \n", - "130 16 1 0 ... \n", - "\n", - " hours_per_day_personal_study taught_peers courses_offered \\\n", - "0 6.0 3 2 \n", - "1 10.0 3 1 \n", - "2 8.0 1 4 \n", - "3 2.0 1 2 \n", - "4 3.0 3 0 \n", - ".. ... ... ... \n", - "126 0.5 1 5 \n", - "127 4.0 3 2 \n", - "128 1.0 1 4 \n", - "129 5.0 3 5 \n", - "130 5.0 3 4 \n", + " age_in_year_one gender has_disability ... courses_offered \\\n", + "0 16 1 0 ... 2 \n", + "1 17 1 0 ... 1 \n", + "2 22 1 0 ... 4 \n", + "3 17 0 0 ... 2 \n", + "4 18 1 0 ... 0 \n", + ".. ... ... ... ... ... \n", + "126 17 0 0 ... 5 \n", + "127 18 0 0 ... 2 \n", + "128 16 1 0 ... 4 \n", + "129 18 1 0 ... 5 \n", + "130 16 1 0 ... 4 \n", "\n", " times_fell_sick study_mode studied_original_course \\\n", "0 2 0 1 \n", @@ -1376,30 +1213,28 @@ "129 5 7 \n", "130 1 4 \n", "\n", - " institution_type GPA_normal \n", - "0 1 43.0 \n", - "1 1 41.5 \n", - "2 1 6.0 \n", - "3 2 9.0 \n", - "4 1 35.5 \n", - ".. ... ... \n", - "126 1 7.5 \n", - "127 1 42.0 \n", - "128 1 37.0 \n", - "129 2 40.0 \n", - "130 1 34.5 \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", - "[131 rows x 30 columns]" + "[131 rows x 32 columns]" ] }, - "execution_count": 27, + "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "\n", - "\n", "# Ordinal encoding map\n", "ordinal_encoding_map = {'A': 5, 'B': 4, 'C': 3, 'D': 2, 'E': 1, 'F': 0}\n", "\n", @@ -1416,15 +1251,56 @@ "for col in categorical_columns:\n", " gpa_data[col] = label_encoder.fit_transform(gpa_data[col])\n", "\n", - "# Create GPA_normal and drop unnecessary columns\n", - "gpa_data['GPA_normal'] = gpa_data['cgpa_year_one'] / gpa_data['grading_system']\n", - "gpa_data.drop(['grading_system', 'cgpa_year_one'], axis=1, inplace=True)\n", - "\n", - "\n", "# Print the DataFrame after engineering\n", "gpa_data\n" ] }, + { + "cell_type": "code", + "execution_count": 32, + "id": "bc37e80a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "subject_4 int64\n", + "subject_5 int64\n", + "age_in_year_one int64\n", + "gender int32\n", + "has_disability int32\n", + "Did you attend extra tutorials?  int32\n", + "extracurricular_participation int64\n", + "class_attendance_rating int64\n", + "class_participation_rating int64\n", + "Rate your use of extra materials for study in Year One (Youtube, Other books, others). float64\n", + "morning_study int64\n", + "afternoon_study int64\n", + "evening_study int64\n", + "late_night_study int64\n", + "days_per_week_reading float64\n", + "hours_per_day_personal_study float64\n", + "taught_peers int32\n", + "courses_offered int32\n", + "times_fell_sick int64\n", + "study_mode int32\n", + "studied_original_course int32\n", + "What was your monthly allowance in Year One? int32\n", + "teaching_style_rating int64\n", + "institution_type int32\n", + "GPA_normal float64\n", + "dtype: object" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gpa_data.dtypes.tail(25)" + ] + }, { "cell_type": "markdown", "id": "956dd850", From c78b7a53a276c66afd551859849de55a72080c84 Mon Sep 17 00:00:00 2001 From: Margaret Awojide <49078266+awojidetola@users.noreply.github.com> Date: Wed, 18 Oct 2023 17:33:00 +0100 Subject: [PATCH 6/8] fixed bugs -- missing values treated missing values before modelling phase --- .../GPA_Prediction.ipynb | 86 +++++++++---------- 1 file changed, 40 insertions(+), 46 deletions(-) diff --git a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb index eedb1d27..6b277b52 100644 --- a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb +++ b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb @@ -1257,48 +1257,12 @@ }, { "cell_type": "code", - "execution_count": 32, - "id": "bc37e80a", + "execution_count": 91, + "id": "f95fc73e", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "subject_4 int64\n", - "subject_5 int64\n", - "age_in_year_one int64\n", - "gender int32\n", - "has_disability int32\n", - "Did you attend extra tutorials?  int32\n", - "extracurricular_participation int64\n", - "class_attendance_rating int64\n", - "class_participation_rating int64\n", - "Rate your use of extra materials for study in Year One (Youtube, Other books, others). float64\n", - "morning_study int64\n", - "afternoon_study int64\n", - "evening_study int64\n", - "late_night_study int64\n", - "days_per_week_reading float64\n", - "hours_per_day_personal_study float64\n", - "taught_peers int32\n", - "courses_offered int32\n", - "times_fell_sick int64\n", - "study_mode int32\n", - "studied_original_course int32\n", - "What was your monthly allowance in Year One? int32\n", - "teaching_style_rating int64\n", - "institution_type int32\n", - "GPA_normal float64\n", - "dtype: object" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "gpa_data.dtypes.tail(25)" + "gpa_data.dropna(inplace=True)" ] }, { @@ -1321,10 +1285,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 92, "id": "99913bf8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "LinearRegression()" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], "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", @@ -1349,10 +1327,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 93, "id": "9c958bb3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Root Mean Squared Error (RMSE): 0.030622339915251526\n" + ] + } + ], "source": [ "# Predict on the test set\n", "y_pred = model.predict(X_test)\n", @@ -1372,10 +1358,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 94, "id": "71e95e8b", "metadata": {}, - "outputs": [], + "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", From fd5a2192339a5dc997b99d1666a846a0ed43202b Mon Sep 17 00:00:00 2001 From: Margaret Awojide <49078266+awojidetola@users.noreply.github.com> Date: Wed, 18 Oct 2023 17:34:39 +0100 Subject: [PATCH 7/8] Delete Project_3/GPA_Prediction_awojidetola/README.MD --- Project_3/GPA_Prediction_awojidetola/README.MD | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Project_3/GPA_Prediction_awojidetola/README.MD diff --git a/Project_3/GPA_Prediction_awojidetola/README.MD b/Project_3/GPA_Prediction_awojidetola/README.MD deleted file mode 100644 index 8b137891..00000000 --- a/Project_3/GPA_Prediction_awojidetola/README.MD +++ /dev/null @@ -1 +0,0 @@ - From 0b4baceb88b4e1095225bf923ddcd7284e6adffe Mon Sep 17 00:00:00 2001 From: Margaret Awojide <49078266+awojidetola@users.noreply.github.com> Date: Fri, 20 Oct 2023 00:56:06 +0100 Subject: [PATCH 8/8] made corrections --- .../GPA_Prediction.ipynb | 1641 ++++++++++++++++- 1 file changed, 1555 insertions(+), 86 deletions(-) diff --git a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb index 6b277b52..e7047b14 100644 --- a/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb +++ b/Project_3/GPA_Prediction_awojidetola/GPA_Prediction.ipynb @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 234, "id": "6ee4356f", "metadata": {}, "outputs": [ @@ -51,14 +51,20 @@ "# Import necessary libraries\n", "import pandas as pd\n", "import numpy as np\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.linear_model import LinearRegression\n", - "from sklearn.metrics import mean_squared_error\n", - "from sklearn.preprocessing import OrdinalEncoder, LabelEncoder\n", - "import warnings\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\")" @@ -66,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 235, "id": "ea57f719", "metadata": {}, "outputs": [ @@ -97,7 +103,7 @@ " dtype='object')" ] }, - "execution_count": 73, + "execution_count": 235, "metadata": {}, "output_type": "execute_result" } @@ -122,7 +128,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 236, "id": "319ebe42", "metadata": {}, "outputs": [ @@ -509,7 +515,7 @@ "[131 rows x 36 columns]" ] }, - "execution_count": 74, + "execution_count": 236, "metadata": {}, "output_type": "execute_result" } @@ -566,7 +572,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 237, "id": "9607b662", "metadata": {}, "outputs": [ @@ -779,7 +785,7 @@ "[5 rows x 31 columns]" ] }, - "execution_count": 75, + "execution_count": 237, "metadata": {}, "output_type": "execute_result" } @@ -797,7 +803,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 238, "id": "4c7b7b4f", "metadata": {}, "outputs": [], @@ -816,7 +822,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 239, "id": "b622ddd5", "metadata": {}, "outputs": [], @@ -829,7 +835,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 240, "id": "2d3add7a", "metadata": {}, "outputs": [], @@ -842,7 +848,334 @@ }, { "cell_type": "code", - "execution_count": 88, + "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+WIiIiIsoPww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJiokmM4WGhmq8wmnTpmlVwJw5czBlyhQkJSXB09MTv/76K3x8fHKd//Hjxxg9ejTWrVuHhw8fwtXVFTNmzECrVq202i4RERHJk0bh5vjx4xqtTKFQaLXxVatWITQ0FPPmzUP9+vUxY8YMBAUF4eLFi3BwcFCZPzMzE5988gkcHBzw119/oUyZMrh58yZKlCih1XaJiIhIvjQKN7t37y6UjU+bNg19+/ZFz549AQDz5s3D5s2bsWjRInz//fcq8y9atAgPHz7EgQMHYGpqCgBwc3MrlNqIiIjIMOntnpvMzEzEx8cjMDDw32KMjBAYGIi4uDi1y2zYsAG+vr4YOHAgHB0dUbNmTfz888/IysrKdTsvXrxAamqq0oOIiIjkS6MzN287evQoVq9ejYSEBGRmZiq1rVu3TqN1pKSkICsrC46OjkrTHR0dceHCBbXLXLt2Dbt27UK3bt2wZcsWXLlyBQMGDMDLly8RFhamdpmIiAiEh4drVBMREREZPq3P3ERFRcHPzw/nz5/H+vXr8fLlS5w9exa7du2Cra1tYdQoyc7OhoODA+bPnw9vb2907twZo0ePxrx583JdZtSoUXjy5In0SExMLNQaiYiISL+0PnPz888/Y/r06Rg4cCCKFy+OmTNnwt3dHd988w2cnZ01Xk/p0qVhbGyM5ORkpenJyclwcnJSu4yzszNMTU1hbGwsTatevTqSkpKQmZkJMzMzlWXMzc1hbm6ucV1ERERk2LQ+c3P16lW0bt0aAGBmZob09HQoFAoMGzYM8+fP13g9ZmZm8Pb2RnR0tDQtOzsb0dHR8PX1VbtMgwYNcOXKFWRnZ0vTLl26BGdnZ7XBhoiIiD48WoebkiVLIi0tDQBQpkwZnDlzBsDr8WcyMjK0WldoaCgWLFiApUuX4vz58+jfvz/S09Olb0/16NEDo0aNkubv378/Hj58iKFDh+LSpUvYvHkzfv75ZwwcOFDb3SAiIiKZ0vqyVOPGjbFz507UqlULX3zxBYYOHYpdu3Zh586dCAgI0GpdnTt3xv379zF27FgkJSWhdu3a2LZtm3STcUJCAoyM/s1f5cqVw/bt2zFs2DB89NFHKFOmDIYOHYrvvvtO290gIiIimdI63MyePRvPnz8HAIwePRqmpqY4cOAAOnbsiDFjxmhdwKBBgzBo0CC1bTExMSrTfH19cfDgQa23Q0RERB8GrcONnZ2d9G8jIyO1g+0RERER6UuBxrkBgHv37uHevXtKN/cCwEcfffTORREREREVlNbhJj4+HiEhITh//jyEEEptCoUiz9GCiYiIiAqb1uGmV69eqFKlChYuXAhHR0etfyyTiIiIqDBpHW6uXbuGtWvXolKlSoVRDxEREdE70Xqcm4CAAJw8ebIwaiEiIiJ6Z1qfufnjjz8QEhKCM2fOoGbNmjA1NVVqb9u2rc6KIyIiItKW1uEmLi4OsbGx2Lp1q0obbygmIiIifdP6stTgwYPx5Zdf4u7du8jOzlZ6MNgQERGRvmkdbh48eIBhw4ZJP5FAREREVJRoHW46dOiA3bt3F0YtRERERO9M63tuqlSpglGjRmH//v2oVauWyg3FQ4YM0VlxRERERNoq0LelrK2tsWfPHuzZs0epTaFQMNwQERGRXmkVboQQiImJgYODAywtLQurJiIiIqIC0+qeGyEEKleujFu3bhVWPURERETvRKtwY2RkhMqVK+PBgweFVQ8RERHRO9H621KTJk3CyJEjcebMmcKoh4iIiOidaH1DcY8ePZCRkQFPT0+YmZmp3Hvz8OFDnRVHREREpC2tw82MGTMKoQwiIiIi3dA63ISEhBRGHUREREQ6oXW4AYCsrCz873//w/nz5wEANWrUQNu2bWFsbKzT4oiIiIi0pXW4uXLlClq1aoXbt2+jatWqAICIiAiUK1cOmzdvRsWKFXVeJBEREZGmtP621JAhQ1CxYkUkJibi2LFjOHbsGBISEuDu7s7RiYmIiEjvtD5zs2fPHhw8eBB2dnbStFKlSmHSpElo0KCBTosjIiIi0pbWZ27Mzc2RlpamMv3p06cwMzPTSVFEREREBaV1uGnTpg2+/vprHDp0CEIICCFw8OBB9OvXD23bti2MGomIiIg0pnW4mTVrFipWrAhfX19YWFjAwsICDRo0QKVKlTBz5szCqJGIiIhIY1rfc1OiRAn8/fffuHz5Mi5cuAAAqF69OipVqqTz4oiIiIi0VaBxbgCgcuXKqFy5si5rISIiInpnWoebrKwsLFmyBNHR0bh37x6ys7OV2nft2qWz4oiIiIi0pXW4GTp0KJYsWYLWrVujZs2aUCgUhVEXERERUYFoHW6ioqKwevVqtGrVqjDqISIiInonWn9byszMjDcPExERUZGldbgZPnw4Zs6cCSFEYdRDRERE9E60viy1f/9+7N69G1u3bkWNGjVgamqq1L5u3TqdFUdERESkrQKNc/PZZ58VRi1ERERE70zrcLN48eLCqIOIiIhIJ7S+54aIiIioKGO4ISIiIllhuCEiIiJZYbghIiIiWdFZuHn8+DFmz56tq9URERERFcg7h5vo6Gh07doVzs7OCAsL00VNRERERAVWoHCTmJiI8ePHw93dHc2bN4dCocD69euRlJSk6/qIiIiItKJxuHn58iXWrFmDoKAgVK1aFSdOnMCUKVNgZGSE0aNHo0WLFiqjFRMRERG9bxoP4lemTBlUq1YNX375JaKiolCyZEkAQHBwcKEVR0RERKQtjc/cvHr1CgqFAgqFAsbGxoVZExEREVGBaRxu7ty5g6+//horV66Ek5MTOnbsiPXr10OhUBRmfURERERa0TjcWFhYoFu3bti1axdOnz6NatWqYciQIXj16hUmTpyInTt3IisrqzBrJSIiIspXgb4tVbFiRUycOBE3b97E5s2b8eLFC7Rp0waOjo66ro+IiIhIK1r9KvjBgwexceNGZGZmIiAgAC1atEDLli3RsmVL3L9/H8uXLy+sOomIiIg0onG4+euvv9C5c2dYWlrC1NQU06ZNw+TJkzFixAgAgL29PUJDQwutUCIiIiJNaHxZKiIiAn379sWTJ0/w6NEj/PTTT/j5558LszYiIiIirWkcbi5evIgRI0ZIXwMfPnw40tLScO/evUIrjoiIiEhbGoebjIwM2NjYSM/NzMxgYWGBp0+fFkphRERERAWh1Q3Ff/zxB6ytraXnr169wpIlS1C6dGlp2pAhQ3RXHREREZGWNA435cuXx4IFC5SmOTk5KX1DSqFQMNwQERGRXmkcbm7cuFGIZRARERHpRoEG8SMiIiIqqjQ+c/Ps2TNER0ejTZs2AIBRo0bhxYsXUruxsTEmTJgACwsL3VdJREREpCGNw83SpUuxefNmKdzMnj0bNWrUgKWlJQDgwoULcHFxwbBhwwqnUiIiIiINaHxZKjIyEl9//bXStBUrVmD37t3YvXs3pkyZgtWrV+u8QCIiIiJtaBxurly5glq1aknPLSwsYGT07+I+Pj44d+5cgYqYM2cO3NzcYGFhgfr16+Pw4cMaLRcVFQWFQoH27dsXaLtEREQkPxqHm8ePHyvdY3P//n24ublJz7Ozs5XaNbVq1SqEhoYiLCwMx44dg6enJ4KCgvId+fjGjRsYMWIEGjVqpPU2iYiISL40Djdly5bFmTNncm0/deoUypYtq3UB06ZNQ9++fdGzZ094eHhg3rx5sLKywqJFi3JdJisrC926dUN4eDgqVKig9TaJiIhIvjQON61atcLYsWPx/PlzlbZnz54hPDwcrVu31mrjmZmZiI+PR2Bg4L8FGRkhMDAQcXFxuS43fvx4ODg4oHfv3vlu48WLF0hNTVV6EBERkXxp/G2pH374AatXr0bVqlUxaNAgVKlSBcDrH9ScPXs2Xr16hR9++EGrjaekpCArKwuOjo5K0x0dHXHhwgW1y+zfvx8LFy7EiRMnNNpGREQEwsPDtaqLiIiIDJfG4cbR0REHDhxA//798f3330MIAeD1Ty588skn+O2331RCiq6lpaWhe/fuWLBggdLvWeVl1KhRCA0NlZ6npqaiXLlyhVUiERER6ZlWP5zp7u6Obdu24eHDh7hy5QoAoFKlSrCzsyvQxkuXLg1jY2MkJycrTU9OToaTk5PK/FevXsWNGzfw6aefStOys7MBACYmJrh48SIqVqyotIy5uTnMzc0LVB8REREZHq3CTQ47Ozv4+Pi888bNzMzg7e2N6Oho6evc2dnZiI6OxqBBg1Tmr1atGk6fPq00bcyYMUhLS8PMmTN5RoaIiIgKFm50KTQ0FCEhIahbty58fHwwY8YMpKeno2fPngCAHj16oEyZMoiIiICFhQVq1qyptHyJEiUAQGU6ERERfZj0Hm46d+6M+/fvY+zYsUhKSkLt2rWxbds26f6dhIQEpcECiYiIiPKi93ADAIMGDVJ7GQoAYmJi8lx2yZIlui+IiIiIDBZPiRAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrBSJcDNnzhy4ubnBwsIC9evXx+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": [ @@ -878,7 +1211,6 @@ " gender\n", " has_disability\n", " ...\n", - " courses_offered\n", " times_fell_sick\n", " study_mode\n", " studied_original_course\n", @@ -888,6 +1220,7 @@ " cgpa_year_one\n", " grading_system\n", " GPA_normal\n", + " preferred_study_time\n", " \n", " \n", " \n", @@ -905,7 +1238,6 @@ " 0\n", " ...\n", " 2\n", - " 2\n", " 0\n", " 1\n", " 6\n", @@ -914,6 +1246,7 @@ " 4.83\n", " 5.0\n", " 0.966\n", + " 0\n", " \n", " \n", " 1\n", @@ -929,7 +1262,6 @@ " 0\n", " ...\n", " 1\n", - " 1\n", " 0\n", " 1\n", " 6\n", @@ -938,6 +1270,7 @@ " 4.80\n", " 5.0\n", " 0.960\n", + " 1\n", " \n", " \n", " 2\n", @@ -952,7 +1285,6 @@ " 1\n", " 0\n", " ...\n", - " 4\n", " 6\n", " 0\n", " 0\n", @@ -962,6 +1294,7 @@ " 3.10\n", " 5.0\n", " 0.620\n", + " 1\n", " \n", " \n", " 3\n", @@ -976,7 +1309,6 @@ " 0\n", " 0\n", " ...\n", - " 2\n", " 0\n", " 0\n", " 0\n", @@ -986,6 +1318,7 @@ " 3.33\n", " 5.0\n", " 0.666\n", + " 3\n", " \n", " \n", " 4\n", @@ -1000,7 +1333,6 @@ " 1\n", " 0\n", " ...\n", - " 0\n", " 2\n", " 0\n", " 1\n", @@ -1010,6 +1342,7 @@ " 4.60\n", " 5.0\n", " 0.920\n", + " 2\n", " \n", " \n", " ...\n", @@ -1048,7 +1381,6 @@ " 0\n", " 0\n", " ...\n", - " 5\n", " 0\n", " 0\n", " 0\n", @@ -1058,6 +1390,7 @@ " 3.27\n", " 5.0\n", " 0.654\n", + " 3\n", " \n", " \n", " 127\n", @@ -1072,7 +1405,6 @@ " 0\n", " 0\n", " ...\n", - " 2\n", " 0\n", " 0\n", " 1\n", @@ -1082,6 +1414,7 @@ " 4.81\n", " 5.0\n", " 0.962\n", + " 2\n", " \n", " \n", " 128\n", @@ -1096,7 +1429,6 @@ " 1\n", " 0\n", " ...\n", - " 4\n", " 0\n", " 0\n", " 1\n", @@ -1106,6 +1438,7 @@ " 4.66\n", " 5.0\n", " 0.932\n", + " 2\n", " \n", " \n", " 129\n", @@ -1120,7 +1453,6 @@ " 1\n", " 0\n", " ...\n", - " 5\n", " 1\n", " 0\n", " 1\n", @@ -1130,6 +1462,7 @@ " 4.77\n", " 5.0\n", " 0.954\n", + " 1\n", " \n", " \n", " 130\n", @@ -1144,7 +1477,6 @@ " 1\n", " 0\n", " ...\n", - " 4\n", " 0\n", " 0\n", " 1\n", @@ -1154,10 +1486,11 @@ " 4.56\n", " 5.0\n", " 0.912\n", + " 0\n", " \n", " \n", "\n", - "

131 rows × 32 columns

\n", + "

131 rows × 29 columns

\n", "" ], "text/plain": [ @@ -1174,31 +1507,31 @@ "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 ... courses_offered \\\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 ... 4 \n", - "3 17 0 0 ... 2 \n", - "4 18 1 0 ... 0 \n", + "2 22 1 0 ... 6 \n", + "3 17 0 0 ... 0 \n", + "4 18 1 0 ... 2 \n", ".. ... ... ... ... ... \n", - "126 17 0 0 ... 5 \n", - "127 18 0 0 ... 2 \n", - "128 16 1 0 ... 4 \n", - "129 18 1 0 ... 5 \n", - "130 16 1 0 ... 4 \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", - " times_fell_sick study_mode studied_original_course \\\n", - "0 2 0 1 \n", - "1 1 0 1 \n", - "2 6 0 0 \n", - "3 0 0 0 \n", - "4 2 0 1 \n", - ".. ... ... ... \n", - "126 0 0 0 \n", - "127 0 0 1 \n", - "128 0 0 1 \n", - "129 1 0 1 \n", - "130 0 0 1 \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", @@ -1213,23 +1546,36 @@ "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", + " 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 32 columns]" + "[131 rows x 29 columns]" ] }, - "execution_count": 88, + "execution_count": 245, "metadata": {}, "output_type": "execute_result" } @@ -1257,14 +1603,257 @@ }, { "cell_type": "code", - "execution_count": 91, - "id": "f95fc73e", + "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", @@ -1275,6 +1864,20 @@ "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", @@ -1285,36 +1888,873 @@ }, { "cell_type": "code", - "execution_count": 92, - "id": "99913bf8", + "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/html": [ - "
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" - ], "text/plain": [ - "LinearRegression()" + "" ] }, - "execution_count": 92, + "execution_count": 254, "metadata": {}, "output_type": "execute_result" } ], "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)\n", - "\n", - "# Initialize the Linear Regression model\n", - "model = LinearRegression()\n", - "\n", - "# Train the model\n", - "model.fit(X_train, y_train)" + "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)" ] }, { @@ -1327,7 +2767,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 255, "id": "9c958bb3", "metadata": {}, "outputs": [ @@ -1335,7 +2775,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Root Mean Squared Error (RMSE): 0.030622339915251526\n" + "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" ] } ], @@ -1348,6 +2790,33 @@ "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", @@ -1358,7 +2827,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 257, "id": "71e95e8b", "metadata": {}, "outputs": [