{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":8552606,"sourceType":"datasetVersion","datasetId":4965286}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"A **neural network model** for **regression** is a powerful computational tool designed to predict continuous outcomes based on input data. It consists of **multiple layers** of **interconnected neurons**, each performing a weighted sum of inputs followed by an **activation function** to introduce **non-linearity**. The model typically includes an input layer that takes the raw data, several hidden layers that capture complex patterns and relationships within the data, and an output layer that produces the predicted continuous value. During training, the model **adjusts its weights** through a process called **backpropagation**, which **minimizes the loss function**, often mean squared error, between the predicted and actual values. Neural networks for regression are highly effective for modeling intricate, non-linear relationships and are widely used in applications such as financial forecasting, house price prediction, and scientific data analysis.","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"markdown","source":"### Read the Data","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\nX_data = pd.read_csv('/kaggle/input/house-price-ready-to-modeling/X_HousePrice.csv')\nX_data = X_data.set_index(['Unnamed: 0', 'Unnamed: 1'])\nX_data.info()\n\nX_train = X_data.loc['train']\nX_test = X_data.loc['test']\n\ny_data = pd.read_csv('/kaggle/input/house-price-ready-to-modeling/y_HousePrice.csv')\ny_data = y_data.set_index(['Unnamed: 0', 'Id'])\ny_data.info()\n\ny_train = y_data.loc['train']\ny_test = y_data.loc['test']\n\ny_train_log = np.log(y_train.copy()).squeeze()\ny_test_log = np.log(y_test.copy()).squeeze()","metadata":{"execution":{"iopub.status.busy":"2024-06-28T15:56:35.811936Z","iopub.execute_input":"2024-06-28T15:56:35.812351Z","iopub.status.idle":"2024-06-28T15:56:36.325200Z","shell.execute_reply.started":"2024-06-28T15:56:35.812316Z","shell.execute_reply":"2024-06-28T15:56:36.323941Z"},"trusted":true},"execution_count":1,"outputs":[{"name":"stdout","text":"<class 'pandas.core.frame.DataFrame'>\nMultiIndex: 1439 entries, ('train', 0) to ('test', 437)\nData columns (total 42 columns):\n #   Column                         Non-Null Count  Dtype  \n---  ------                         --------------  -----  \n 0   num__LotFrontage               1439 non-null   float64\n 1   num__LotArea                   1439 non-null   float64\n 2   num__OverallQual               1439 non-null   float64\n 3   num__OverallCond               1439 non-null   float64\n 4   num__BsmtUnfSF                 1439 non-null   float64\n 5   num__TotalBsmtSF               1439 non-null   float64\n 6   num__1stFlrSF                  1439 non-null   float64\n 7   num__GrLivArea                 1439 non-null   float64\n 8   num__BsmtFullBath              1439 non-null   float64\n 9   num__HalfBath                  1439 non-null   float64\n 10  num__TotRmsAbvGrd              1439 non-null   float64\n 11  num__Fireplaces                1439 non-null   float64\n 12  num__GarageCars                1439 non-null   float64\n 13  num__MoSold                    1439 non-null   float64\n 14  num__AgeBuilt                  1439 non-null   float64\n 15  num__AgeRemodAdd               1439 non-null   float64\n 16  num__AgeGarageBlt              1439 non-null   float64\n 17  num__AgeSold                   1439 non-null   float64\n 18  nom__MSZoning_RM               1439 non-null   float64\n 19  nom__LotShape_Reg              1439 non-null   float64\n 20  nom__LandContour_Not Lvl       1439 non-null   float64\n 21  nom__LandSlope_Not Gtl         1439 non-null   float64\n 22  nom__Neighborhood_CollgCr      1439 non-null   float64\n 23  nom__Neighborhood_Sawyer       1439 non-null   float64\n 24  nom__RoofStyle_Not Gable       1439 non-null   float64\n 25  nom__Exterior2nd_Stucco        1439 non-null   float64\n 26  nom__GarageType_Attchd         1439 non-null   float64\n 27  nom__GarageType_Basment        1439 non-null   float64\n 28  nom__Fence_non-existent        1439 non-null   float64\n 29  nom__SaleCondition_Not Normal  1439 non-null   float64\n 30  ord__MSSubClass                1439 non-null   float64\n 31  ord__ExterQual                 1439 non-null   float64\n 32  ord__BsmtQual                  1439 non-null   float64\n 33  ord__BsmtExposure              1439 non-null   float64\n 34  ord__BsmtFinType1              1439 non-null   float64\n 35  ord__BsmtFinSF1                1439 non-null   float64\n 36  ord__BsmtFinType2              1439 non-null   float64\n 37  ord__KitchenQual               1439 non-null   float64\n 38  ord__FireplaceQu               1439 non-null   float64\n 39  ord__GarageArea                1439 non-null   float64\n 40  ord__GarageCond                1439 non-null   float64\n 41  ord__OpenPorchSF               1439 non-null   float64\ndtypes: float64(42)\nmemory usage: 516.7+ KB\n<class 'pandas.core.frame.DataFrame'>\nMultiIndex: 1439 entries, ('train', 708) to ('test', 1121)\nData columns (total 1 columns):\n #   Column     Non-Null Count  Dtype\n---  ------     --------------  -----\n 0   SalePrice  1439 non-null   int64\ndtypes: int64(1)\nmemory usage: 59.2+ KB\n","output_type":"stream"}]},{"cell_type":"markdown","source":"### Train and Validate the Neural Network Model","metadata":{}},{"cell_type":"markdown","source":"consider these model parameters:  \n\n#### hidden_layer_sizes\n- **Type**: array-like of shape (n_layers - 2,)\n- **Default**: (100,)\n- **Description**: The ith element represents the number of neurons in the ith hidden layer.\n\n#### activation\n- **Type**: {'identity', 'logistic', 'tanh', 'relu'}\n- **Default**: 'relu'\n- **Description**: Activation function for the hidden layer.\n    - **'identity'**: No-op activation, useful to implement linear bottleneck, returns f(x) = x.\n    - **'logistic'**: The logistic sigmoid function, returns f(x) = 1 / (1 + exp(-x)).\n    - **'tanh'**: The hyperbolic tan function, returns f(x) = tanh(x).\n    - **'relu'**: The rectified linear unit function, returns f(x) = max(0, x).\n\n#### solver\n- **Type**: {'lbfgs', 'sgd', 'adam'}\n- **Default**: 'adam'\n- **Description**: The solver for weight optimization.\n    - **'lbfgs'**: An optimizer in the family of quasi-Newton methods.\n    - **'sgd'**: Refers to stochastic gradient descent.\n    - **'adam'**: Refers to a stochastic gradient-based optimizer proposed by Kingma, Diederik, and Jimmy Ba.\n    - **Note**: The default solver 'adam' works well on relatively large datasets (with thousands of training samples or more) in terms of both training time and validation score. For small datasets, 'lbfgs' can converge faster and perform better.\n\n#### alpha\n- **Type**: float\n- **Default**: 0.0001\n- **Description**: Strength of the L2 regularization term. The L2 regularization term is divided by the sample size when added to the loss.\n    - **Example**: For an example usage and visualization of varying regularization, see [Varying regularization in Multi-layer Perceptron](https://scikit-learn.org/stable/auto_examples/neural_networks/plot_mlp_alpha.html).\n\n#### batch_size\n- **Type**: int\n- **Default**: 'auto'\n- **Description**: Size of minibatches for stochastic optimizers. If the solver is 'lbfgs', the classifier will not use minibatch. When set to \"auto\", batch_size=min(200, n_samples).\n\n#### learning_rate\n- **Type**: {'constant', 'invscaling', 'adaptive'}\n- **Default**: 'constant'\n- **Description**: Learning rate schedule for weight updates.\n    - **'constant'**: A constant learning rate given by 'learning_rate_init'.\n    - **'invscaling'**: Gradually decreases the learning rate at each time step 't' using an inverse scaling exponent of 'power_t'. Effective learning rate = learning_rate_init / pow(t, power_t).\n    - **'adaptive'**: Keeps the learning rate constant to 'learning_rate_init' as long as training loss keeps decreasing. Each time two consecutive epochs fail to decrease training loss by at least tol, or fail to increase validation score by at least tol if 'early_stopping' is on, the current learning rate is divided by 5.\n    - **Note**: Only used when solver='sgd'.\n\n#### learning_rate_init\n- **Type**: float\n- **Default**: 0.001\n- **Description**: The initial learning rate used. It controls the step-size in updating the weights. Only used when solver='sgd' or 'adam'.\n\n#### max_iter\n- **Type**: int\n- **Default**: 200\n- **Description**: Maximum number of iterations. The solver iterates until convergence (determined by 'tol') or this number of iterations. For stochastic solvers ('sgd', 'adam'), this determines the number of epochs (how many times each data point will be used), not the number of gradient steps.\n\n#### random_state\n- **Type**: int, RandomState instance\n- **Default**: None\n- **Description**: Determines random number generation for weights and bias initialization, train-test split if early stopping is used, and batch sampling when solver='sgd' or 'adam'. Pass an int for reproducible results across multiple function calls. See [Glossary](https://scikit-learn.org/stable/glossary.html#term-random-state).\n  \n#### n_iter_no_change\n- **Type**: int\n- **Default**: 10\n- **Description**: Maximum number of epochs to not meet tol improvement. Only effective when solver='sgd' or 'adam'.  \n\n*This markdown presents the model parameters for the KNN algorithm in a format similar to that of the sklearn documentation.*","metadata":{}},{"cell_type":"code","source":"!pip install --upgrade scikit-learn","metadata":{"execution":{"iopub.status.busy":"2024-06-28T15:55:33.515320Z","iopub.execute_input":"2024-06-28T15:55:33.515730Z","iopub.status.idle":"2024-06-28T15:55:53.416444Z","shell.execute_reply.started":"2024-06-28T15:55:33.515689Z","shell.execute_reply":"2024-06-28T15:55:53.415218Z"},"trusted":true},"execution_count":3,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/pty.py:89: RuntimeWarning: os.fork() was called. os.fork() is incompatible with multithreaded code, and JAX is multithreaded, so this will likely lead to a deadlock.\n  pid, fd = os.forkpty()\n","output_type":"stream"},{"name":"stdout","text":"Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.10/site-packages (1.2.2)\nCollecting scikit-learn\n  Downloading scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)\nRequirement already satisfied: numpy>=1.19.5 in /opt/conda/lib/python3.10/site-packages (from scikit-learn) (1.26.4)\nRequirement already satisfied: scipy>=1.6.0 in /opt/conda/lib/python3.10/site-packages (from scikit-learn) (1.11.4)\nRequirement already satisfied: joblib>=1.2.0 in /opt/conda/lib/python3.10/site-packages (from scikit-learn) (1.4.2)\nRequirement already satisfied: threadpoolctl>=3.1.0 in /opt/conda/lib/python3.10/site-packages (from scikit-learn) (3.2.0)\nDownloading scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.3 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.3/13.3 MB\u001b[0m \u001b[31m71.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m:01\u001b[0m\n\u001b[?25hInstalling collected packages: scikit-learn\n  Attempting uninstall: scikit-learn\n    Found existing installation: scikit-learn 1.2.2\n    Uninstalling scikit-learn-1.2.2:\n      Successfully uninstalled scikit-learn-1.2.2\n\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\nspopt 0.6.0 requires shapely>=2.0.1, but you have shapely 1.8.5.post1 which is incompatible.\u001b[0m\u001b[31m\n\u001b[0mSuccessfully installed scikit-learn-1.5.0\n","output_type":"stream"}]},{"cell_type":"code","source":"from sklearn.neural_network import MLPRegressor\nfrom sklearn.metrics import r2_score, root_mean_squared_error\n\nmodel = MLPRegressor(hidden_layer_sizes=(50,), activation='relu', solver='adam', alpha=0.0001, batch_size=20,\n                learning_rate='constant', learning_rate_init=0.001, max_iter=1000,random_state=111, n_iter_no_change=10)\n\nmodel.fit(X_train, y_train_log)\n\ny_pred_train = model.predict(X_train)\ny_pred_test = model.predict(X_test)\n\n\n# R-squared (R2) score for training set\nr2_train = r2_score(y_train_log, y_pred_train)\n\n# Root Mean Squared Error (RMSE) for training set\nrmse_train = root_mean_squared_error(y_train_log, y_pred_train)\n\n# Mean Absolute Percentage Error (MAPE) for training set\n# Avoiding division by zero\ny_train_values = y_train_log.to_numpy()\ny_train_values = y_train_values.reshape(y_train_values.shape[0])\nmape_train = np.mean(np.abs((y_train_values - y_pred_train) / np.where(y_train_values == 0, 1, y_train_values))) * 100\n\n# Correlation between predicted and real values for training set\ncorr_train = np.corrcoef(y_train_values, y_pred_train.ravel())[0, 1]\n\nprint(\"R-squared (R2) score for Training Set:\", r2_train)\nprint(\"Root Mean Squared Error (RMSE) for Training Set:\", rmse_train)\nprint(\"Mean Absolute Percentage Error (MAPE) for Training Set:\", mape_train)\nprint(\"Correlation between predicted and real values for Training Set:\", corr_train)\n\nprint(\"#\"*100)\n#------------------------------------------------------------------------\n\n# R-squared (R2) score\nr2 = r2_score(y_test_log, y_pred_test)\n\n# Root Mean Squared Error (RMSE)\nrmse = root_mean_squared_error(y_test_log, y_pred_test)\n\n# Mean Absolute Percentage Error (MAPE)\n# Avoiding division by zero\ny_test_values = y_test_log.to_numpy()\ny_test_values = y_test_values.reshape(y_test_values.shape[0])\nmape = np.mean(np.abs((y_test_values - y_pred_test) / np.where(y_test_values == 0, 1, y_test_values))) * 100\n\n# Correlation between predicted and real values\ncorr = np.corrcoef(y_test_values, y_pred_test.ravel())[0, 1]\n\nprint(\"R-squared (R2) score for Test Set:\", r2)\nprint(\"Root Mean Squared Error (RMSE) for Test Set:\", rmse)\nprint(\"Mean Absolute Percentage Error (MAPE) for Test Set:\", mape)\nprint(\"Correlation between predicted and real values for Test Set:\", corr)","metadata":{"execution":{"iopub.status.busy":"2024-06-28T15:23:21.471613Z","iopub.execute_input":"2024-06-28T15:23:21.472079Z","iopub.status.idle":"2024-06-28T15:23:25.374161Z","shell.execute_reply.started":"2024-06-28T15:23:21.472013Z","shell.execute_reply":"2024-06-28T15:23:25.372616Z"},"trusted":true},"execution_count":6,"outputs":[{"name":"stdout","text":"R-squared (R2) score for Training Set: 0.9361209696265046\nRoot Mean Squared Error (RMSE) for Training Set: 0.09895314115651123\nMean Absolute Percentage Error (MAPE) for Training Set: 0.6574216791256627\nCorrelation between predicted and real values for Training Set: 0.9788939208157923\n####################################################################################################\nR-squared (R2) score for Test Set: -22.524489123381134\nRoot Mean Squared Error (RMSE) for Test Set: 1.9058408996264293\nMean Absolute Percentage Error (MAPE) for Test Set: 12.638446846617946\nCorrelation between predicted and real values for Test Set: 0.7298684134016536\n","output_type":"stream"}]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.figure(figsize=(6, 4))\nplt.scatter(y_test_log, y_pred_test, color='blue', alpha=0.5)\nplt.plot([y_test_log.min(), y_test_log.max()], [y_test_log.min(), y_test_log.max()], 'k--', lw=2)  # Plot the diagonal line\nplt.xlabel('True Values')\nplt.ylabel('Predicted Values')\nplt.title('Predicted Values vs True Values')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T12:25:55.746323Z","iopub.execute_input":"2024-06-27T12:25:55.746850Z","iopub.status.idle":"2024-06-27T12:25:56.058850Z","shell.execute_reply.started":"2024-06-27T12:25:55.746818Z","shell.execute_reply":"2024-06-27T12:25:56.057832Z"},"trusted":true},"execution_count":3,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 600x400 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAhQAAAGJCAYAAADSaqrlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC6/ElEQVR4nOydeXhU9dn+75ksk32yL5CFPQkhgIIIgQpWEBV3La3ViluLb61Lba3avlatu3ZRW+vS/tzauuOur1tFEALIjkAIa8i+J5NkkkwymfP74/abMzOZJDPZE57PdeUKM3PmnO85E+a5z7MaNE3TIAiCIAiC0A+Mw70AQRAEQRBGPyIoBEEQBEHoNyIoBEEQBEHoNyIoBEEQBEHoNyIoBEEQBEHoNyIoBEEQBEHoNyIoBEEQBEHoNyIoBEEQBEHoNyIoBEEQBEHoNyIohBOeCRMm4Kqrrup8/NVXX8FgMOCrr74atjW5477GoWLJkiVYsmTJkB9XGB6uuuoqTJgwYbiXIYxSRFAIw8qLL74Ig8HQ+RMUFIRp06bhF7/4BSoqKoZ7eT7x8ccf45577hmWY7/99tswGAz45z//2e02n3/+OQwGA5588skhXNnoo6CgwOVvsqefgoKCYVnjjh07YDAY8L//+7/dbnPo0CEYDAbceuutQ7gy4UTGf7gXIAgA8Ic//AETJ05Ea2srNmzYgKeffhoff/wx9u7di5CQkCFdy2mnnYaWlhYEBgb69L6PP/4YTz311LCIihUrVsBsNuOVV17Bdddd53GbV155BX5+fvjRj340xKsbXcTFxeFf//qXy3N/+tOfUFxcjL/85S9dth0OTj75ZGRkZODVV1/F/fff73GbV155BQBwxRVXDOXShBMYERTCiODss8/G3LlzAQDXXXcdYmJi8Oc//xnvvfceLrvsMo/vsVqtCA0NHfC1GI1GBAUFDfh+BxOTyYRLL70UL7zwAkpLSzFu3DiX11tbW/HOO+9g2bJliI+PH6ZVjg5CQ0O7GOHXXnsNdXV1PRpnTdPQ2tqK4ODgwV4iAODyyy/HXXfdhc2bN2P+/PldXn/11VeRkZGBk08+eUjWIwgS8hBGJN///vcBAMeOHQPA2G5YWBiOHDmCc845B+Hh4bj88ssBAA6HA48//jiysrIQFBSEhIQErF69GnV1dS771DQN999/P5KTkxESEoLTTz8d+/bt63Ls7nIotmzZgnPOOQdRUVEIDQ3FzJkz8cQTT3Su76mnngIAF5e4YqDX6IkrrrgCDocDr732WpfXPvroI1gsls5r9sILL+D73/8+4uPjYTKZMH36dDz99NO9HkOFqNxd/T1ds7POOgtmsxkhISFYvHgxNm7c6LJNY2MjbrnlFkyYMAEmkwnx8fFYtmwZduzY0e063nrrLRgMBqxbt67La88++ywMBgP27t0LACgvL8fVV1+N5ORkmEwmJCUl4YILLuh3uGLChAk499xz8emnn2Lu3LkIDg7Gs88+2xkyefHFF7u8x2AwdPFglZSU4JprrkFCQgJMJhOysrLw/PPP93p89VkqT4Qz27dvR35+fuc27733HlasWIFx48bBZDJh8uTJuO+++9DR0dHjMbr7XLs7xwMHDuDSSy9FdHQ0goKCMHfuXLz//vsu27S3t+Pee+/F1KlTERQUhJiYGCxatAiff/55r+csjGzEQyGMSI4cOQIAiImJ6XzObrdj+fLlWLRoEf74xz92hkJWr16NF198EVdffTVuuukmHDt2DH/729+wc+dObNy4EQEBAQCA3//+97j//vtxzjnn4JxzzsGOHTtw5plnoq2trdf1fP755zj33HORlJSEm2++GYmJicjLy8OHH36Im2++GatXr0ZpaSk+//zzLu7yoVrjaaedhuTkZLzyyitd4uavvPIKQkJCcOGFFwIAnn76aWRlZeH888+Hv78/PvjgA/z85z+Hw+HADTfc0OuxvOHLL7/E2WefjTlz5uDuu++G0WjsFDJff/015s2bBwC4/vrr8dZbb+EXv/gFpk+fjpqaGmzYsAF5eXnd3l2vWLECYWFheOONN7B48WKX115//XVkZWVhxowZAIBLLrkE+/btw4033ogJEyagsrISn3/+OQoLC/udgJifn4/LLrsMq1evxk9/+lOkp6f79P6KigrMnz8fBoMBv/jFLxAXF4f/+7//w7XXXouGhgbccsst3b534sSJyMnJwRtvvIG//OUv8PPz63xNiYwf//jHACgEw8LCcOuttyIsLAxffvklfv/736OhoQGPPfaY7yfugX379mHhwoUYP3487rjjDoSGhuKNN97AhRdeiDVr1uCiiy4CANxzzz146KGHcN1112HevHloaGjAtm3bsGPHDixbtmxA1iIME5ogDCMvvPCCBkD7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DRu0ZcuWaeHh4VpoaKg2c+ZM7a9//Wvn63a7Xbvxxhu1uLg4zWAwdCkhHcg19kZtba1mMpk0ANr+/fu7vP7+++9rM2fO1IKCgrQJEyZojzzyiPb88893KQl1LxvVNE07cuSItnTpUs1kMmkJCQnab3/7W+3zzz/3eM127typXXzxxVpMTIxmMpm0tLQ0beXKldp///tfTdM0zWazabfddps2a9aszus6a9Ys7e9//7vX56qObTAYtKKiIpfXqqurtRtuuEHLyMjQQkNDNbPZrJ166qnaG2+84fX+Na37stHuyh+bm5u1a6+9VjObzVp4eLi2cuVKrbKyskvZqKZpWkVFhXbDDTdoKSkpWkBAgJaYmKidccYZ2nPPPef1+ux2u5aUlKQB0D7++OMur2/cuFGbP3++FhwcrI0bN077zW9+o3366addPjP3slFN07Sqqirtkksu0UJCQrSoqCht9erV2t69ez2Wxh45ckS78sortcTERC0gIEAbP368du6552pvvfVW5zb333+/Nm/ePC0yMlILDg7WMjIytAceeEBra2vz+nyFkYlB07yQqYIgCIIgCD0gORSCIAiCIPQbERSCIAiCIPQbERSCIAiCIPQbERSCIAiCIPQbERSCIAiCIPQbERSCIAiCIPSbMd/YyuFwoLS0FOHh4V5NhhQEQRAEgWiahsbGRowbN67LLCV3xrygKC0tRUpKynAvQxAEQRBGLUVFRV2mPbsz5gVFeHg4AF6MiIiIYV6NIAiCIIweGhoakJKS0mlLe2LMCwoV5oiIiBBBIQiCIAh9wJuUAUnKFARBEASh34igEARBEASh34igEARBEASh34igEARBEASh34igEARBEASh34igEARBEASh34z5slFBEARBx+EACguBxkYgPBxITQV6aYAoCF4hgkIQBOEEIS8PeOcd4MABoLUVCAoCMjKAiy4CMjN935+IE8EZERSCIAgnAHl5wJNPAtXVQEoKEBoKWK3Azp1AURFw002+iYqBFifC6Ee0pCAIwhjH4aDxr64Gpk8HIiIAPz/+nj6dz7/7LrfzBiVOdu4EYmOB9HT+3rmTz+flDerpCCMUERSCIAhjnMJCehJSUgD3DsoGA5CcTBFQWNj7vgZanAhjBxEUgiAIbjgcQEEB8O23/D3ajWNjI8MSoaGeXw8N5euNjb3vqy/iZKxdT8Ez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"},"metadata":{}}]},{"cell_type":"markdown","source":"### Identify the Optimal Model through Hyperparameter Tuning","metadata":{}},{"cell_type":"code","source":"from sklearn.neural_network import MLPRegressor\nfrom sklearn.metrics import r2_score, root_mean_squared_error\nfrom sklearn.model_selection import GridSearchCV\n\n# Initialize the KNeighborsRegressor\nann = MLPRegressor(solver='adam', alpha=0.0001, batch_size=20, learning_rate='constant', max_iter=10000, random_state=111)\n\n# Set up the parameter grid\nparam_grid = {\n    'hidden_layer_sizes': [(30,), (50,), (100,), (75, 30), (100, 50)],  \n    'activation': ['relu', 'tanh', 'logistic'],\n    'learning_rate_init': [0.001, 0.01, 0.1],\n    'n_iter_no_change': [10, 20, 30]\n}\n\n# Create GridSearchCV object\ngrid_search = GridSearchCV(ann, param_grid, scoring='neg_root_mean_squared_error', cv=5)\n\n# Fit the grid search to the data\ngrid_search.fit(X_train, y_train_log)\n\n# Get the best estimator\nbest_ann = grid_search.best_estimator_\n\n# Get the best parameters\nbest_params = grid_search.best_params_\nprint(\"Best Parameters:\", best_params)\n","metadata":{"execution":{"iopub.status.busy":"2024-06-28T15:23:34.813099Z","iopub.execute_input":"2024-06-28T15:23:34.814404Z","iopub.status.idle":"2024-06-28T15:49:45.702251Z","shell.execute_reply.started":"2024-06-28T15:23:34.814355Z","shell.execute_reply":"2024-06-28T15:49:45.701089Z"},"trusted":true},"execution_count":7,"outputs":[{"name":"stdout","text":"Best Parameters: {'activation': 'logistic', 'hidden_layer_sizes': (100,), 'learning_rate_init': 0.001, 'n_iter_no_change': 30}\n","output_type":"stream"}]},{"cell_type":"code","source":"# Train the regressor with the full training data\nbest_ann.fit(X_train, y_train_log)\n\n# Predict the target for the train set\ny_pred_train = best_ann.predict(X_train)\n\n# Predict the target for the test set\ny_pred = best_ann.predict(X_test)\n\n# R-squared (R2) score for training set\nr2_train = r2_score(y_train_log, y_pred_train)\n\n# Root Mean Squared Error (RMSE) for training set\nrmse_train = root_mean_squared_error(y_train_log, y_pred_train)\n\n# Mean Absolute Percentage Error (MAPE) for training set\n# Avoiding division by zero\ny_train_values = y_train_log.to_numpy()\ny_train_values = y_train_values.reshape(y_train_values.shape[0])\nmape_train = np.mean(np.abs((y_train_values - y_pred_train) / np.where(y_train_values == 0, 1, y_train_values))) * 100\n\n# Correlation between predicted and real values for training set\ncorr_train = np.corrcoef(y_train_values, y_pred_train.ravel())[0, 1]\n\nprint(\"R-squared (R2) score for Training Set:\", r2_train)\nprint(\"Root Mean Squared Error (RMSE) for Training Set:\", rmse_train)\nprint(\"Mean Absolute Percentage Error (MAPE) for Training Set:\", mape_train)\nprint(\"Correlation between predicted and real values for Training Set:\", corr_train)\n\nprint(\"#\"*100)\n#------------------------------------------------------------------------\n\n# R-squared (R2) score\nr2 = r2_score(y_test_log, y_pred)\n\n# Root Mean Squared Error (RMSE)\nrmse = root_mean_squared_error(y_test_log, y_pred)\n\n# Mean Absolute Percentage Error (MAPE)\n# Avoiding division by zero\ny_test_values = y_test_log.to_numpy()\ny_test_values = y_test_values.reshape(y_test_values.shape[0])\nmape = np.mean(np.abs((y_test_values - y_pred) / np.where(y_test_values == 0, 1, y_test_values))) * 100\n\n# Correlation between predicted and real values\ncorr = np.corrcoef(y_test_values, y_pred.ravel())[0, 1]\n\nprint(\"R-squared (R2) score for Test Set:\", r2)\nprint(\"Root Mean Squared Error (RMSE) for Test Set:\", rmse)\nprint(\"Mean Absolute Percentage Error (MAPE) for Test Set:\", mape)\nprint(\"Correlation between predicted and real values for Test Set:\", corr)","metadata":{"execution":{"iopub.status.busy":"2024-06-28T15:51:26.627734Z","iopub.execute_input":"2024-06-28T15:51:26.628162Z","iopub.status.idle":"2024-06-28T15:51:27.720590Z","shell.execute_reply.started":"2024-06-28T15:51:26.628131Z","shell.execute_reply":"2024-06-28T15:51:27.719481Z"},"trusted":true},"execution_count":8,"outputs":[{"name":"stdout","text":"R-squared (R2) score for Training Set: 0.9076800820363551\nRoot Mean Squared Error (RMSE) for Training Set: 0.11895922666449547\nMean Absolute Percentage Error (MAPE) for Training Set: 0.7423674289808585\nCorrelation between predicted and real values for Training Set: 0.9553297905704946\n####################################################################################################\nR-squared (R2) score for Test Set: 0.8748529904860469\nRoot Mean Squared Error (RMSE) for Test Set: 0.1390070351633535\nMean Absolute Percentage Error (MAPE) for Test Set: 0.8939816249739876\nCorrelation between predicted and real values for Test Set: 0.9438977172220445\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Neural Networks with Keras\n\n## 1. Deep Neural Networks\n\nTraditional neural networks, such as shallow Multi-Layer Perceptrons (MLPs), consist of an input layer, one or two hidden layers, and an output layer. Deep neural networks (DNNs), in contrast, have multiple hidden layers. This depth allows them to model more complex patterns in data, making them suitable for a wide range of tasks, including image and speech recognition, natural language processing, and more. Key advantages include:\n\n- **Automatic Feature Learning**: Deep networks can automatically learn features from raw data, reducing the need for manual feature engineering.\n- **Improved Performance**: Capable of achieving higher accuracy and better generalization on complex tasks.\n- **Scalability**: Better suited for large-scale datasets and high-dimensional data.\n\n## 2. Deep Learning\n\nDeep learning is a subset of machine learning focused on neural networks with many layers, enabling machines to learn from vast amounts of data and achieve high accuracy across various domains.\n\n## 3. Role of GPU and New Frameworks Such as Keras\n\nGPUs accelerate deep learning by handling thousands of parallel operations, significantly speeding up model training. Keras provides a user-friendly, high-level API for building and training deep learning models, leveraging the power of frameworks like TensorFlow.\n\n## 4. Important Structure for Running Models with Keras\n\nKeras is a high-level neural networks API, written in Python, and capable of running on top of TensorFlow, CNTK, or Theano. It simplifies the process of building and training deep learning models, making it accessible for both beginners and experts. Here are the key components and steps for implementing neural networks with Keras:\n\n### Key Components of Keras\n  \n#### Model Building\n\n- **Sequential API**: A simple and intuitive way to build models layer by layer.\n- **Functional API**: More flexible, allowing the creation of complex models such as multi-input/multi-output models. \n\n#### Layers\n\n- **Dense Layer**: Fully connected layer where each neuron connects to every neuron in the next layer.\n- **Convolutional Layer**: Essential for processing image data, capturing spatial hierarchies.\n- **Recurrent Layer**: Suitable for sequence data, such as text and time series, enabling the network to maintain information over time.\n\n#### Compilation\n\n- **Loss Functions**: Measure how well the model is performing. Common loss functions include `categorical_crossentropy` for classification and `mean_squared_error` for regression.\n- **Optimizers**: Algorithms to update the model's weights based on the loss function. Popular optimizers include `Adam`, `SGD`, and `RMSprop`.\n- **Metrics**: Used to evaluate the model’s performance during training and testing, such as `accuracy`.\n\n#### Training\n\n- **Fit Method**: Trains the model on the training data. Key parameters include:\n  - **Batch Size**: Number of samples processed before the model is updated.\n  - **Epochs**: Number of complete passes through the training dataset.\n","metadata":{}},{"cell_type":"code","source":"!nvidia-smi","metadata":{"execution":{"iopub.status.busy":"2024-06-28T15:52:39.487662Z","iopub.execute_input":"2024-06-28T15:52:39.488157Z","iopub.status.idle":"2024-06-28T15:52:40.559998Z","shell.execute_reply.started":"2024-06-28T15:52:39.488117Z","shell.execute_reply":"2024-06-28T15:52:40.558792Z"},"trusted":true},"execution_count":1,"outputs":[{"name":"stdout","text":"Fri Jun 28 15:52:40 2024       \n+---------------------------------------------------------------------------------------+\n| NVIDIA-SMI 535.129.03             Driver Version: 535.129.03   CUDA Version: 12.2     |\n|-----------------------------------------+----------------------+----------------------+\n| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |\n| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |\n|                                         |                      |               MIG M. |\n|=========================================+======================+======================|\n|   0  Tesla P100-PCIE-16GB           Off | 00000000:00:04.0 Off |                    0 |\n| N/A   33C    P0              26W / 250W |      0MiB / 16384MiB |      0%      Default |\n|                                         |                      |                  N/A |\n+-----------------------------------------+----------------------+----------------------+\n                                                                                         \n+---------------------------------------------------------------------------------------+\n| Processes:                                                                            |\n|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |\n|        ID   ID                                                             Usage      |\n|=======================================================================================|\n|  No running processes found                                                           |\n+---------------------------------------------------------------------------------------+\n","output_type":"stream"}]},{"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Dense\nfrom keras.optimizers import Adam\nfrom sklearn.metrics import r2_score, root_mean_squared_error\nimport random\n\n\nseed_value = 117\nrandom.seed(seed_value)\n\n\n# Build the model\nmodel = Sequential()\n\nmodel.add(Dense(units=64, activation='relu', input_shape=(42,)))\n\nmodel.add(Dense(units=64, activation='relu'))\n\nmodel.add(Dense(1))\n\n# Compile the model\nmodel.compile(optimizer=Adam(learning_rate=0.01), loss='mse', metrics=['mse'])\n\n# Train the model\nhistory = model.fit(X_train, y_train_log, epochs=100, batch_size=32, validation_split=0, verbose=1)\n\n# Evaluate the model\nloss, mse = model.evaluate(X_test, y_test_log, verbose=1)\nprint(f\"Mean Squared Error on test set: {mse}\")\n\nmodel.summary()\n\n# Generate predictions\ny_pred = model.predict(X_test)","metadata":{"execution":{"iopub.status.busy":"2024-06-28T15:57:05.376611Z","iopub.execute_input":"2024-06-28T15:57:05.377049Z","iopub.status.idle":"2024-06-28T15:57:22.704974Z","shell.execute_reply.started":"2024-06-28T15:57:05.377001Z","shell.execute_reply":"2024-06-28T15:57:22.703931Z"},"trusted":true},"execution_count":2,"outputs":[{"name":"stderr","text":"2024-06-28 15:57:05.797897: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n2024-06-28 15:57:05.797958: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n2024-06-28 15:57:05.799462: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n/opt/conda/lib/python3.10/site-packages/keras/src/layers/core/dense.py:87: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n  super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n","output_type":"stream"},{"name":"stdout","text":"Epoch 1/100\n\u001b[1m30/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━━\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 62.2674 - mse: 62.2674   ","output_type":"stream"},{"name":"stderr","text":"WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\nI0000 00:00:1719590232.795793     149 device_compiler.h:186] Compiled cluster using XLA!  This line is logged at most once for the lifetime of the process.\n","output_type":"stream"},{"name":"stdout","text":"\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 20ms/step - loss: 58.9813 - mse: 58.9813\nEpoch 2/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 2.7388 - mse: 2.7388\nEpoch 3/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 1.0690 - mse: 1.0690 \nEpoch 4/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.5736 - mse: 0.5736 \nEpoch 5/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.4183 - mse: 0.4183 \nEpoch 6/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.3246 - mse: 0.3246 \nEpoch 7/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.2625 - mse: 0.2625\nEpoch 8/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.2390 - mse: 0.2390 \nEpoch 9/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.2091 - mse: 0.2091 \nEpoch 10/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1588 - mse: 0.1588 \nEpoch 11/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1145 - mse: 0.1145 \nEpoch 12/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1272 - mse: 0.1272\nEpoch 13/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1318 - mse: 0.1318 \nEpoch 14/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1065 - mse: 0.1065 \nEpoch 15/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1061 - mse: 0.1061\nEpoch 16/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1178 - mse: 0.1178 \nEpoch 17/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0920 - mse: 0.0920 \nEpoch 18/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1059 - mse: 0.1059 \nEpoch 19/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1793 - mse: 0.1793 \nEpoch 20/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1497 - mse: 0.1497 \nEpoch 21/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1026 - mse: 0.1026 \nEpoch 22/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0893 - mse: 0.0893 \nEpoch 23/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0813 - mse: 0.0813 \nEpoch 24/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0892 - mse: 0.0892 \nEpoch 25/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0659 - mse: 0.0659 \nEpoch 26/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0598 - mse: 0.0598\nEpoch 27/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0687 - mse: 0.0687 \nEpoch 28/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0809 - mse: 0.0809 \nEpoch 29/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0703 - mse: 0.0703\nEpoch 30/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0728 - mse: 0.0728\nEpoch 31/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0654 - mse: 0.0654 \nEpoch 32/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0595 - mse: 0.0595 \nEpoch 33/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0629 - mse: 0.0629 \nEpoch 34/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0564 - mse: 0.0564 \nEpoch 35/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0557 - mse: 0.0557 \nEpoch 36/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0853 - mse: 0.0853 \nEpoch 37/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0977 - mse: 0.0977\nEpoch 38/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0871 - mse: 0.0871 \nEpoch 39/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1038 - mse: 0.1038\nEpoch 40/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0707 - mse: 0.0707\nEpoch 41/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0854 - mse: 0.0854 \nEpoch 42/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step - loss: 0.0623 - mse: 0.0623 \nEpoch 43/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0668 - mse: 0.0668 \nEpoch 44/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0624 - mse: 0.0624 \nEpoch 45/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1361 - mse: 0.1361\nEpoch 46/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.2737 - mse: 0.2737 \nEpoch 47/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1817 - mse: 0.1817 \nEpoch 48/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0913 - mse: 0.0913 \nEpoch 49/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0821 - mse: 0.0821 \nEpoch 50/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0966 - mse: 0.0966\nEpoch 51/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1239 - mse: 0.1239\nEpoch 52/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1567 - mse: 0.1567\nEpoch 53/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1780 - mse: 0.1780\nEpoch 54/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1458 - mse: 0.1458\nEpoch 55/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1631 - mse: 0.1631\nEpoch 56/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1459 - mse: 0.1459 \nEpoch 57/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0904 - mse: 0.0904\nEpoch 58/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0773 - mse: 0.0773\nEpoch 59/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1379 - mse: 0.1379\nEpoch 60/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1112 - mse: 0.1112\nEpoch 61/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1398 - mse: 0.1398\nEpoch 62/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1237 - mse: 0.1237\nEpoch 63/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step - loss: 0.1200 - mse: 0.1200\nEpoch 64/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1101 - mse: 0.1101\nEpoch 65/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0692 - mse: 0.0692 \nEpoch 66/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0526 - mse: 0.0526 \nEpoch 67/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0507 - mse: 0.0507 \nEpoch 68/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0456 - mse: 0.0456 \nEpoch 69/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0524 - mse: 0.0524 \nEpoch 70/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0454 - mse: 0.0454 \nEpoch 71/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0338 - mse: 0.0338 \nEpoch 72/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0718 - mse: 0.0718 \nEpoch 73/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1886 - mse: 0.1886 \nEpoch 74/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1134 - mse: 0.1134\nEpoch 75/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1428 - mse: 0.1428\nEpoch 76/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.2347 - mse: 0.2347\nEpoch 77/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1926 - mse: 0.1926\nEpoch 78/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1076 - mse: 0.1076 \nEpoch 79/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0834 - mse: 0.0834 \nEpoch 80/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0747 - mse: 0.0747 \nEpoch 81/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0932 - mse: 0.0932 \nEpoch 82/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0619 - mse: 0.0619 \nEpoch 83/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0380 - mse: 0.0380\nEpoch 84/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0289 - mse: 0.0289 \nEpoch 85/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0345 - mse: 0.0345 \nEpoch 86/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0335 - mse: 0.0335 \nEpoch 87/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0533 - mse: 0.0533 \nEpoch 88/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0320 - mse: 0.0320\nEpoch 89/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0287 - mse: 0.0287\nEpoch 90/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0355 - mse: 0.0355 \nEpoch 91/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0349 - mse: 0.0349 \nEpoch 92/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0283 - mse: 0.0283\nEpoch 93/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0252 - mse: 0.0252\nEpoch 94/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0282 - mse: 0.0282\nEpoch 95/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0342 - mse: 0.0342 \nEpoch 96/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0515 - mse: 0.0515 \nEpoch 97/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0329 - mse: 0.0329 \nEpoch 98/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0297 - mse: 0.0297 \nEpoch 99/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0291 - mse: 0.0291\nEpoch 100/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step - loss: 0.0537 - mse: 0.0537\n\u001b[1m14/14\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 18ms/step - loss: 5.2741 - mse: 5.2741\nMean Squared Error on test set: 5.324702739715576\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"\u001b[1mModel: \"sequential\"\u001b[0m\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape          \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      Param #\u001b[0m\u001b[1m \u001b[0m┃\n┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n│ dense (\u001b[38;5;33mDense\u001b[0m)                   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m)             │         \u001b[38;5;34m2,752\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_1 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m)             │         \u001b[38;5;34m4,160\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_2 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m)              │            \u001b[38;5;34m65\u001b[0m │\n└─────────────────────────────────┴────────────────────────┴───────────────┘\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n┃<span style=\"font-weight: bold\"> Layer (type)                    </span>┃<span style=\"font-weight: bold\"> Output Shape           </span>┃<span style=\"font-weight: bold\">       Param # </span>┃\n┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)             │         <span style=\"color: #00af00; text-decoration-color: #00af00\">2,752</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)             │         <span style=\"color: #00af00; text-decoration-color: #00af00\">4,160</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>)              │            <span style=\"color: #00af00; text-decoration-color: #00af00\">65</span> │\n└─────────────────────────────────┴────────────────────────┴───────────────┘\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m20,933\u001b[0m (81.77 KB)\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">20,933</span> (81.77 KB)\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m6,977\u001b[0m (27.25 KB)\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">6,977</span> (27.25 KB)\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m13,956\u001b[0m (54.52 KB)\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Optimizer params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">13,956</span> (54.52 KB)\n</pre>\n"},"metadata":{}},{"name":"stdout","text":"\u001b[1m14/14\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n","output_type":"stream"}]},{"cell_type":"code","source":"# Predict the target for the train set\ny_pred_train = model.predict(X_train)\n\n# Predict the target for the test set\ny_pred = model.predict(X_test)\n\n# R-squared (R2) score for training set\nr2_train = r2_score(y_train_log, y_pred_train)\n\n# Root Mean Squared Error (RMSE) for training set\nrmse_train = root_mean_squared_error(y_train_log, y_pred_train)\n\n# Mean Absolute Percentage Error (MAPE) for training set\n# Avoiding division by zero\ny_train_values = y_train_log.to_numpy()\ny_train_values = y_train_values.reshape(y_train_values.shape[0])\nmape_train = np.mean(np.abs((y_train_values - y_pred_train) / np.where(y_train_values == 0, 1, y_train_values))) * 100\n\n# Correlation between predicted and real values for training set\ncorr_train = np.corrcoef(y_train_values, y_pred_train.ravel())[0, 1]\n\nprint(\"R-squared (R2) score for Training Set:\", r2_train)\nprint(\"Root Mean Squared Error (RMSE) for Training Set:\", rmse_train)\nprint(\"Mean Absolute Percentage Error (MAPE) for Training Set:\", mape_train)\nprint(\"Correlation between predicted and real values for Training Set:\", corr_train)\n\nprint(\"#\"*100)\n#------------------------------------------------------------------------\n\n# R-squared (R2) score\nr2 = r2_score(y_test_log, y_pred)\n\n# Root Mean Squared Error (RMSE)\nrmse = root_mean_squared_error(y_test_log, y_pred)\n\n# Mean Absolute Percentage Error (MAPE)\n# Avoiding division by zero\ny_test_values = y_test_log.to_numpy()\ny_test_values = y_test_values.reshape(y_test_values.shape[0])\nmape = np.mean(np.abs((y_test_values - y_pred) / np.where(y_test_values == 0, 1, y_test_values))) * 100\n\n# Correlation between predicted and real values\ncorr = np.corrcoef(y_test_values, y_pred.ravel())[0, 1]\n\nprint(\"R-squared (R2) score for Test Set:\", r2)\nprint(\"Root Mean Squared Error (RMSE) for Test Set:\", rmse)\nprint(\"Mean Absolute Percentage Error (MAPE) for Test Set:\", mape)\nprint(\"Correlation between predicted and real values for Test Set:\", corr)","metadata":{"execution":{"iopub.status.busy":"2024-06-28T15:57:39.267240Z","iopub.execute_input":"2024-06-28T15:57:39.268448Z","iopub.status.idle":"2024-06-28T15:57:39.677181Z","shell.execute_reply.started":"2024-06-28T15:57:39.268395Z","shell.execute_reply":"2024-06-28T15:57:39.676117Z"},"trusted":true},"execution_count":3,"outputs":[{"name":"stdout","text":"\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 6ms/step\n\u001b[1m14/14\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \nR-squared (R2) score for Training Set: 0.5875157543322304\nRoot Mean Squared Error (RMSE) for Training Set: 0.2514514302509221\nMean Absolute Percentage Error (MAPE) for Training Set: 4.260604716341415\nCorrelation between predicted and real values for Training Set: 0.905199303918817\n####################################################################################################\nR-squared (R2) score for Test Set: -33.485961339613105\nRoot Mean Squared Error (RMSE) for Test Set: 2.3075318857782294\nMean Absolute Percentage Error (MAPE) for Test Set: 16.598381871932922\nCorrelation between predicted and real values for Test Set: 0.6550364095011941\n","output_type":"stream"}]},{"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Dense\nfrom keras.optimizers import Adam\nimport keras_tuner as kt\n\n# Define a model-building function\ndef build_model(hp):\n    model = Sequential()\n    \n    # Tune the number of units in the first Dense layer\n    hp_units = hp.Int('units', min_value=32, max_value=128, step=16)\n    # Tune the activation function for the first Dense layer\n    hp_activation = hp.Choice('activation', values=['relu', 'tanh', 'sigmoid'])\n    model.add(Dense(units=hp_units, activation=hp_activation, input_shape=(42,)))\n    \n    # Tune the number of units in the second Dense layer\n    hp_units_2 = hp.Int('units_2', min_value=0, max_value=128, step=16)\n    model.add(Dense(units=hp_units_2, activation=hp_activation))\n    \n    model.add(Dense(1))\n    \n    # Tune the learning rate for the optimizer\n    hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])\n    \n    model.compile(optimizer=Adam(learning_rate=hp_learning_rate), loss='mse', metrics=['mse'])\n    \n    return model\n\n# Instantiate the tuner using GridSearch\ntuner = kt.RandomSearch(\n    build_model,\n    objective='val_mse',\n    max_trials=100,  # Number of different hyperparameter combinations to try\n    executions_per_trial=1,  # Number of models to build and fit for each trial\n    seed=117,\n    directory='my_dir',\n    project_name='random_search_kt',\n    overwrite=True\n)\n\n# Perform the hyperparameter search\ntuner.search(X_train, y_train_log, epochs=50, validation_split=0.2, verbose=1)\n\n# Get the best model\nbest_model = tuner.get_best_models(num_models=1)[0]\n\n\n# Evaluate the best model\nloss, mse = best_model.evaluate(X_test, y_test_log, verbose=1)\nprint(f\"Mean Squared Error on test set: {mse}\")\n\nbest_model.summary()\nbest_model.save(\"best_nn_reg.keras\")","metadata":{"execution":{"iopub.status.busy":"2024-06-28T15:57:46.533877Z","iopub.execute_input":"2024-06-28T15:57:46.534362Z","iopub.status.idle":"2024-06-28T16:12:47.596158Z","shell.execute_reply.started":"2024-06-28T15:57:46.534328Z","shell.execute_reply":"2024-06-28T16:12:47.595247Z"},"trusted":true},"execution_count":4,"outputs":[{"name":"stdout","text":"Trial 100 Complete [00h 00m 09s]\nval_mse: 3.189948797225952\n\nBest val_mse So Far: 0.011512360535562038\nTotal elapsed time: 00h 14m 58s\n","output_type":"stream"},{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/keras/src/layers/core/dense.py:87: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n  super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n/opt/conda/lib/python3.10/site-packages/keras/src/saving/saving_lib.py:415: UserWarning: Skipping variable loading for optimizer 'adam', because it has 2 variables whereas the saved optimizer has 14 variables. \n  saveable.load_own_variables(weights_store.get(inner_path))\n","output_type":"stream"},{"name":"stdout","text":"\u001b[1m14/14\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 19ms/step - loss: 0.0237 - mse: 0.0237\nMean Squared Error on test set: 0.022392868995666504\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"\u001b[1mModel: \"sequential\"\u001b[0m\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape          \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      Param #\u001b[0m\u001b[1m \u001b[0m┃\n┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n│ dense (\u001b[38;5;33mDense\u001b[0m)                   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m96\u001b[0m)             │         \u001b[38;5;34m4,128\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_1 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m)            │        \u001b[38;5;34m12,416\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_2 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m)              │           \u001b[38;5;34m129\u001b[0m │\n└─────────────────────────────────┴────────────────────────┴───────────────┘\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n┃<span style=\"font-weight: bold\"> Layer (type)                    </span>┃<span style=\"font-weight: bold\"> Output Shape           </span>┃<span style=\"font-weight: bold\">       Param # </span>┃\n┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">96</span>)             │         <span style=\"color: #00af00; text-decoration-color: #00af00\">4,128</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)            │        <span style=\"color: #00af00; text-decoration-color: #00af00\">12,416</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>)              │           <span style=\"color: #00af00; text-decoration-color: #00af00\">129</span> │\n└─────────────────────────────────┴────────────────────────┴───────────────┘\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m16,673\u001b[0m (65.13 KB)\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">16,673</span> (65.13 KB)\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m16,673\u001b[0m (65.13 KB)\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">16,673</span> (65.13 KB)\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n</pre>\n"},"metadata":{}}]},{"cell_type":"code","source":"best_hps = tuner.get_best_hyperparameters(num_trials=1)[0]\n\nprint(\"The best hyperparameters are:\")\nprint(f\"Units (first layer): {best_hps.get('units')}\")\nprint(f\"Activation (first layer): {best_hps.get('activation')}\")\nprint(f\"Units (second layer): {best_hps.get('units_2')}\")\nprint(f\"Activation (second layer): {best_hps.get('activation')}\")\nprint(f\"Learning rate: {best_hps.get('learning_rate')}\")\n","metadata":{"execution":{"iopub.status.busy":"2024-06-28T16:22:15.521504Z","iopub.execute_input":"2024-06-28T16:22:15.522961Z","iopub.status.idle":"2024-06-28T16:22:15.530429Z","shell.execute_reply.started":"2024-06-28T16:22:15.522919Z","shell.execute_reply":"2024-06-28T16:22:15.529228Z"},"trusted":true},"execution_count":5,"outputs":[{"name":"stdout","text":"The best hyperparameters are:\nUnits (first layer): 96\nActivation (first layer): sigmoid\nUnits (second layer): 128\nActivation (second layer): sigmoid\nLearning rate: 0.01\n","output_type":"stream"}]},{"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Dense\nfrom keras.optimizers import Adam\nfrom sklearn.metrics import r2_score, root_mean_squared_error\nimport random\n\n\nseed_value = 117\nrandom.seed(seed_value)\n\n\n# Build the model\nmodel = Sequential()\n\nmodel.add(Dense(units=48, activation='sigmoid', input_shape=(42,)))\n\nmodel.add(Dense(units=96, activation='sigmoid'))\n\nmodel.add(Dense(1))\n\n# Compile the model\nmodel.compile(optimizer=Adam(learning_rate=0.01), loss='mse', metrics=['mse'])\n\n# Train the model\nhistory = model.fit(X_train, y_train_log, epochs=100, batch_size=32, validation_split=0, verbose=1)\n\n# Predict the target for the train set\ny_pred_train = model.predict(X_train)\n\n# Predict the target for the test set\ny_pred = model.predict(X_test)\n\n# R-squared (R2) score for training set\nr2_train = r2_score(y_train_log, y_pred_train)\n\n# Root Mean Squared Error (RMSE) for training set\nrmse_train = root_mean_squared_error(y_train_log, y_pred_train)\n\n# Mean Absolute Percentage Error (MAPE) for training set\n# Avoiding division by zero\ny_train_values = y_train_log.to_numpy()\ny_train_values = y_train_values.reshape(y_train_values.shape[0])\nmape_train = np.mean(np.abs((y_train_values - y_pred_train) / np.where(y_train_values == 0, 1, y_train_values))) * 100\n\n# Correlation between predicted and real values for training set\ncorr_train = np.corrcoef(y_train_values, y_pred_train.ravel())[0, 1]\n\nprint(\"R-squared (R2) score for Training Set:\", r2_train)\nprint(\"Root Mean Squared Error (RMSE) for Training Set:\", rmse_train)\nprint(\"Mean Absolute Percentage Error (MAPE) for Training Set:\", mape_train)\nprint(\"Correlation between predicted and real values for Training Set:\", corr_train)\n\nprint(\"#\"*100)\n#------------------------------------------------------------------------\n\n# R-squared (R2) score\nr2 = r2_score(y_test_log, y_pred)\n\n# Root Mean Squared Error (RMSE)\nrmse = root_mean_squared_error(y_test_log, y_pred)\n\n# Mean Absolute Percentage Error (MAPE)\n# Avoiding division by zero\ny_test_values = y_test_log.to_numpy()\ny_test_values = y_test_values.reshape(y_test_values.shape[0])\nmape = np.mean(np.abs((y_test_values - y_pred) / np.where(y_test_values == 0, 1, y_test_values))) * 100\n\n# Correlation between predicted and real values\ncorr = np.corrcoef(y_test_values, y_pred.ravel())[0, 1]\n\nprint(\"R-squared (R2) score for Test Set:\", r2)\nprint(\"Root Mean Squared Error (RMSE) for Test Set:\", rmse)\nprint(\"Mean Absolute Percentage Error (MAPE) for Test Set:\", mape)\nprint(\"Correlation between predicted and real values for Test Set:\", corr)\n","metadata":{"execution":{"iopub.status.busy":"2024-06-28T16:28:49.861614Z","iopub.execute_input":"2024-06-28T16:28:49.862420Z","iopub.status.idle":"2024-06-28T16:29:01.697631Z","shell.execute_reply.started":"2024-06-28T16:28:49.862383Z","shell.execute_reply":"2024-06-28T16:29:01.696468Z"},"trusted":true},"execution_count":6,"outputs":[{"name":"stdout","text":"Epoch 1/100\n","output_type":"stream"},{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/keras/src/layers/core/dense.py:87: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n  super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n","output_type":"stream"},{"name":"stdout","text":"\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 20ms/step - loss: 76.5592 - mse: 76.5592\nEpoch 2/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 1.1546 - mse: 1.1546\nEpoch 3/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.1300 - mse: 0.1300\nEpoch 4/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0710 - mse: 0.0710\nEpoch 5/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0660 - mse: 0.0660\nEpoch 6/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0711 - mse: 0.0711\nEpoch 7/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0590 - mse: 0.0590\nEpoch 8/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0540 - mse: 0.0540\nEpoch 9/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0566 - mse: 0.0566\nEpoch 10/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0497 - mse: 0.0497\nEpoch 11/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0480 - mse: 0.0480\nEpoch 12/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0461 - mse: 0.0461\nEpoch 13/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0423 - mse: 0.0423\nEpoch 14/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0466 - mse: 0.0466\nEpoch 15/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0503 - mse: 0.0503\nEpoch 16/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0398 - mse: 0.0398\nEpoch 17/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0386 - mse: 0.0386\nEpoch 18/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0380 - mse: 0.0380\nEpoch 19/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0367 - mse: 0.0367\nEpoch 20/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0355 - mse: 0.0355\nEpoch 21/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0323 - mse: 0.0323\nEpoch 22/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0294 - mse: 0.0294\nEpoch 23/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0312 - mse: 0.0312\nEpoch 24/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0295 - mse: 0.0295\nEpoch 25/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0288 - mse: 0.0288 \nEpoch 26/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0259 - mse: 0.0259\nEpoch 27/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0222 - mse: 0.0222\nEpoch 28/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0185 - mse: 0.0185\nEpoch 29/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0194 - mse: 0.0194\nEpoch 30/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0194 - mse: 0.0194\nEpoch 31/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0189 - mse: 0.0189\nEpoch 32/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0163 - mse: 0.0163\nEpoch 33/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0148 - mse: 0.0148\nEpoch 34/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0187 - mse: 0.0187\nEpoch 35/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0157 - mse: 0.0157\nEpoch 36/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0170 - mse: 0.0170\nEpoch 37/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0138 - mse: 0.0138\nEpoch 38/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0132 - mse: 0.0132\nEpoch 39/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0136 - mse: 0.0136\nEpoch 40/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0142 - mse: 0.0142\nEpoch 41/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0133 - mse: 0.0133\nEpoch 42/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0129 - mse: 0.0129\nEpoch 43/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0141 - mse: 0.0141\nEpoch 44/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0115 - mse: 0.0115\nEpoch 45/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0103 - mse: 0.0103\nEpoch 46/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0120 - mse: 0.0120\nEpoch 47/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0099 - mse: 0.0099\nEpoch 48/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0105 - mse: 0.0105\nEpoch 49/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0107 - mse: 0.0107\nEpoch 50/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0122 - mse: 0.0122\nEpoch 51/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0090 - mse: 0.0090\nEpoch 52/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0092 - mse: 0.0092\nEpoch 53/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0095 - mse: 0.0095\nEpoch 54/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0105 - mse: 0.0105\nEpoch 55/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0094 - mse: 0.0094\nEpoch 56/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0088 - mse: 0.0088\nEpoch 57/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0093 - mse: 0.0093\nEpoch 58/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0087 - mse: 0.0087\nEpoch 59/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0094 - mse: 0.0094\nEpoch 60/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0077 - mse: 0.0077\nEpoch 61/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0088 - mse: 0.0088\nEpoch 62/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0089 - mse: 0.0089\nEpoch 63/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0088 - mse: 0.0088\nEpoch 64/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0078 - mse: 0.0078\nEpoch 65/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0077 - mse: 0.0077\nEpoch 66/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0088 - mse: 0.0088\nEpoch 67/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0077 - mse: 0.0077\nEpoch 68/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0076 - mse: 0.0076\nEpoch 69/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0078 - mse: 0.0078\nEpoch 70/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0081 - mse: 0.0081\nEpoch 71/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0080 - mse: 0.0080\nEpoch 72/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0074 - mse: 0.0074\nEpoch 73/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0070 - mse: 0.0070\nEpoch 74/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0074 - mse: 0.0074\nEpoch 75/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0074 - mse: 0.0074\nEpoch 76/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0061 - mse: 0.0061\nEpoch 77/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0067 - mse: 0.0067\nEpoch 78/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0071 - mse: 0.0071\nEpoch 79/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0069 - mse: 0.0069\nEpoch 80/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0067 - mse: 0.0067\nEpoch 81/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0058 - mse: 0.0058\nEpoch 82/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0074 - mse: 0.0074\nEpoch 83/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0059 - mse: 0.0059\nEpoch 84/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0062 - mse: 0.0062\nEpoch 85/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0056 - mse: 0.0056\nEpoch 86/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0071 - mse: 0.0071\nEpoch 87/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0059 - mse: 0.0059\nEpoch 88/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0066 - mse: 0.0066\nEpoch 89/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0063 - mse: 0.0063\nEpoch 90/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0054 - mse: 0.0054\nEpoch 91/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0059 - mse: 0.0059\nEpoch 92/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0057 - mse: 0.0057\nEpoch 93/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0049 - mse: 0.0049\nEpoch 94/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0048 - mse: 0.0048\nEpoch 95/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0041 - mse: 0.0041\nEpoch 96/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0053 - mse: 0.0053\nEpoch 97/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0063 - mse: 0.0063\nEpoch 98/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0054 - mse: 0.0054\nEpoch 99/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0050 - mse: 0.0050\nEpoch 100/100\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 0.0041 - mse: 0.0041\n\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 8ms/step\n\u001b[1m14/14\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\nR-squared (R2) score for Training Set: 0.9697087562790514\nRoot Mean Squared Error (RMSE) for Training Set: 0.06814107487210848\nMean Absolute Percentage Error (MAPE) for Training Set: 3.7035889052475737\nCorrelation between predicted and real values for Training Set: 0.9863052900129715\n####################################################################################################\nR-squared (R2) score for Test Set: 0.819429752486731\nRoot Mean Squared Error (RMSE) for Test Set: 0.16697430291674317\nMean Absolute Percentage Error (MAPE) for Test Set: 3.7593076630477293\nCorrelation between predicted and real values for Test Set: 0.9275252411314392\n","output_type":"stream"}]}]}