Last active
March 23, 2022 11:48
-
-
Save jamm1985/14e722192382a2919119d4cdb61e4aed to your computer and use it in GitHub Desktop.
Lab_12_intro_to_ML_regression_part_I
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "Lab_12_intro_to_machine_learning", | |
"provenance": [], | |
"authorship_tag": "ABX9TyNRcdxwAzXP9o7UZX2LavzS", | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
}, | |
"accelerator": "GPU" | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/jamm1985/14e722192382a2919119d4cdb61e4aed/lab_12_intro_to_machine_learning.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"Видео лабораторной: https://youtu.be/r-z1cjvpwBE\n", | |
"\n", | |
"TG: https://t.me/data_science_news\n", | |
"\n", | |
"\n", | |
"\n", | |
"---" | |
], | |
"metadata": { | |
"id": "-xv-tPMotFuR" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"id": "Z5BcJ-9oZr5D", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"outputId": "47a371c5-6905-4fb1-fef8-89024915e987" | |
}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"2.8.0\n" | |
] | |
} | |
], | |
"source": [ | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"import matplotlib.pylab as plt\n", | |
"\n", | |
"from sklearn.linear_model import LinearRegression\n", | |
"from sklearn.linear_model import Ridge\n", | |
"from sklearn.linear_model import Lasso\n", | |
"from sklearn.model_selection import cross_val_score\n", | |
"from sklearn.preprocessing import MaxAbsScaler\n", | |
"from sklearn.model_selection import train_test_split\n", | |
"from sklearn.metrics import mean_squared_error\n", | |
"\n", | |
"import tensorflow as tf\n", | |
"from tensorflow import keras\n", | |
"from tensorflow.keras import layers\n", | |
"\n", | |
"print(tf.__version__)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Разведочный анализ данных\n", | |
"\n", | |
"[Набор данных Copyright 2020 Google LLC](https://colab.research.google.com/github/google/eng-edu/blob/main/ml/cc/exercises/linear_regression_with_a_real_dataset.ipynb)\n", | |
"\n", | |
"[Документация по набору данных](https://developers.google.com/machine-learning/crash-course/california-housing-data-description)" | |
], | |
"metadata": { | |
"id": "fHFFL3xCe7k1" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"!wget https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv\n", | |
"!head california_housing_train.csv" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "T5vVWNXre1QT", | |
"outputId": "a6700678-2ddd-42e2-c997-08b0d46b60cd" | |
}, | |
"execution_count": 2, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"--2022-03-16 05:30:23-- https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv\n", | |
"Resolving download.mlcc.google.com (download.mlcc.google.com)... 74.125.133.94, 2a00:1450:400c:c07::5e\n", | |
"Connecting to download.mlcc.google.com (download.mlcc.google.com)|74.125.133.94|:443... connected.\n", | |
"HTTP request sent, awaiting response... 302 Found\n", | |
"Location: https://dl.google.com/mlcc/mledu-datasets/california_housing_train.csv [following]\n", | |
"--2022-03-16 05:30:23-- https://dl.google.com/mlcc/mledu-datasets/california_housing_train.csv\n", | |
"Resolving dl.google.com (dl.google.com)... 64.233.167.91, 64.233.167.136, 64.233.167.93, ...\n", | |
"Connecting to dl.google.com (dl.google.com)|64.233.167.91|:443... connected.\n", | |
"HTTP request sent, awaiting response... 200 OK\n", | |
"Length: 1706430 (1.6M) [text/csv]\n", | |
"Saving to: ‘california_housing_train.csv’\n", | |
"\n", | |
"\r californi 0%[ ] 0 --.-KB/s \rcalifornia_housing_ 100%[===================>] 1.63M --.-KB/s in 0.01s \n", | |
"\n", | |
"2022-03-16 05:30:23 (128 MB/s) - ‘california_housing_train.csv’ saved [1706430/1706430]\n", | |
"\n", | |
"\"longitude\",\"latitude\",\"housing_median_age\",\"total_rooms\",\"total_bedrooms\",\"population\",\"households\",\"median_income\",\"median_house_value\"\n", | |
"-114.310000,34.190000,15.000000,5612.000000,1283.000000,1015.000000,472.000000,1.493600,66900.000000\n", | |
"-114.470000,34.400000,19.000000,7650.000000,1901.000000,1129.000000,463.000000,1.820000,80100.000000\n", | |
"-114.560000,33.690000,17.000000,720.000000,174.000000,333.000000,117.000000,1.650900,85700.000000\n", | |
"-114.570000,33.640000,14.000000,1501.000000,337.000000,515.000000,226.000000,3.191700,73400.000000\n", | |
"-114.570000,33.570000,20.000000,1454.000000,326.000000,624.000000,262.000000,1.925000,65500.000000\n", | |
"-114.580000,33.630000,29.000000,1387.000000,236.000000,671.000000,239.000000,3.343800,74000.000000\n", | |
"-114.580000,33.610000,25.000000,2907.000000,680.000000,1841.000000,633.000000,2.676800,82400.000000\n", | |
"-114.590000,34.830000,41.000000,812.000000,168.000000,375.000000,158.000000,1.708300,48500.000000\n", | |
"-114.590000,33.610000,34.000000,4789.000000,1175.000000,3134.000000,1056.000000,2.178200,58400.000000\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"dataset_1 = pd.read_csv(\"california_housing_train.csv\")\n", | |
"dataset_1.describe()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 300 | |
}, | |
"id": "YAmQv4zxfhnL", | |
"outputId": "8f8a8611-37fb-4839-ad10-e9d8c7862416" | |
}, | |
"execution_count": 3, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" longitude latitude housing_median_age total_rooms \\\n", | |
"count 17000.000000 17000.000000 17000.000000 17000.000000 \n", | |
"mean -119.562108 35.625225 28.589353 2643.664412 \n", | |
"std 2.005166 2.137340 12.586937 2179.947071 \n", | |
"min -124.350000 32.540000 1.000000 2.000000 \n", | |
"25% -121.790000 33.930000 18.000000 1462.000000 \n", | |
"50% -118.490000 34.250000 29.000000 2127.000000 \n", | |
"75% -118.000000 37.720000 37.000000 3151.250000 \n", | |
"max -114.310000 41.950000 52.000000 37937.000000 \n", | |
"\n", | |
" total_bedrooms population households median_income \\\n", | |
"count 17000.000000 17000.000000 17000.000000 17000.000000 \n", | |
"mean 539.410824 1429.573941 501.221941 3.883578 \n", | |
"std 421.499452 1147.852959 384.520841 1.908157 \n", | |
"min 1.000000 3.000000 1.000000 0.499900 \n", | |
"25% 297.000000 790.000000 282.000000 2.566375 \n", | |
"50% 434.000000 1167.000000 409.000000 3.544600 \n", | |
"75% 648.250000 1721.000000 605.250000 4.767000 \n", | |
"max 6445.000000 35682.000000 6082.000000 15.000100 \n", | |
"\n", | |
" median_house_value \n", | |
"count 17000.000000 \n", | |
"mean 207300.912353 \n", | |
"std 115983.764387 \n", | |
"min 14999.000000 \n", | |
"25% 119400.000000 \n", | |
"50% 180400.000000 \n", | |
"75% 265000.000000 \n", | |
"max 500001.000000 " | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-726fb9fb-e88d-4f15-bb58-35e88103ed20\">\n", | |
" <div class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>longitude</th>\n", | |
" <th>latitude</th>\n", | |
" <th>housing_median_age</th>\n", | |
" <th>total_rooms</th>\n", | |
" <th>total_bedrooms</th>\n", | |
" <th>population</th>\n", | |
" <th>households</th>\n", | |
" <th>median_income</th>\n", | |
" <th>median_house_value</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>count</th>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>mean</th>\n", | |
" <td>-119.562108</td>\n", | |
" <td>35.625225</td>\n", | |
" <td>28.589353</td>\n", | |
" <td>2643.664412</td>\n", | |
" <td>539.410824</td>\n", | |
" <td>1429.573941</td>\n", | |
" <td>501.221941</td>\n", | |
" <td>3.883578</td>\n", | |
" <td>207300.912353</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>std</th>\n", | |
" <td>2.005166</td>\n", | |
" <td>2.137340</td>\n", | |
" <td>12.586937</td>\n", | |
" <td>2179.947071</td>\n", | |
" <td>421.499452</td>\n", | |
" <td>1147.852959</td>\n", | |
" <td>384.520841</td>\n", | |
" <td>1.908157</td>\n", | |
" <td>115983.764387</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>min</th>\n", | |
" <td>-124.350000</td>\n", | |
" <td>32.540000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>2.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>3.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>0.499900</td>\n", | |
" <td>14999.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25%</th>\n", | |
" <td>-121.790000</td>\n", | |
" <td>33.930000</td>\n", | |
" <td>18.000000</td>\n", | |
" <td>1462.000000</td>\n", | |
" <td>297.000000</td>\n", | |
" <td>790.000000</td>\n", | |
" <td>282.000000</td>\n", | |
" <td>2.566375</td>\n", | |
" <td>119400.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>50%</th>\n", | |
" <td>-118.490000</td>\n", | |
" <td>34.250000</td>\n", | |
" <td>29.000000</td>\n", | |
" <td>2127.000000</td>\n", | |
" <td>434.000000</td>\n", | |
" <td>1167.000000</td>\n", | |
" <td>409.000000</td>\n", | |
" <td>3.544600</td>\n", | |
" <td>180400.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>75%</th>\n", | |
" <td>-118.000000</td>\n", | |
" <td>37.720000</td>\n", | |
" <td>37.000000</td>\n", | |
" <td>3151.250000</td>\n", | |
" <td>648.250000</td>\n", | |
" <td>1721.000000</td>\n", | |
" <td>605.250000</td>\n", | |
" <td>4.767000</td>\n", | |
" <td>265000.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>max</th>\n", | |
" <td>-114.310000</td>\n", | |
" <td>41.950000</td>\n", | |
" <td>52.000000</td>\n", | |
" <td>37937.000000</td>\n", | |
" <td>6445.000000</td>\n", | |
" <td>35682.000000</td>\n", | |
" <td>6082.000000</td>\n", | |
" <td>15.000100</td>\n", | |
" <td>500001.000000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-726fb9fb-e88d-4f15-bb58-35e88103ed20')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
" \n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n", | |
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
" \n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" flex-wrap:wrap;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-726fb9fb-e88d-4f15-bb58-35e88103ed20 button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-726fb9fb-e88d-4f15-bb58-35e88103ed20');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
" </div>\n", | |
" " | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 3 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"dataset_1['median_house_value'] = dataset_1['median_house_value']/1000\n", | |
"dataset_1.describe()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 300 | |
}, | |
"id": "mLYfDfOkjKcn", | |
"outputId": "c732e083-877c-4788-f041-d6842aae6f69" | |
}, | |
"execution_count": 4, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" longitude latitude housing_median_age total_rooms \\\n", | |
"count 17000.000000 17000.000000 17000.000000 17000.000000 \n", | |
"mean -119.562108 35.625225 28.589353 2643.664412 \n", | |
"std 2.005166 2.137340 12.586937 2179.947071 \n", | |
"min -124.350000 32.540000 1.000000 2.000000 \n", | |
"25% -121.790000 33.930000 18.000000 1462.000000 \n", | |
"50% -118.490000 34.250000 29.000000 2127.000000 \n", | |
"75% -118.000000 37.720000 37.000000 3151.250000 \n", | |
"max -114.310000 41.950000 52.000000 37937.000000 \n", | |
"\n", | |
" total_bedrooms population households median_income \\\n", | |
"count 17000.000000 17000.000000 17000.000000 17000.000000 \n", | |
"mean 539.410824 1429.573941 501.221941 3.883578 \n", | |
"std 421.499452 1147.852959 384.520841 1.908157 \n", | |
"min 1.000000 3.000000 1.000000 0.499900 \n", | |
"25% 297.000000 790.000000 282.000000 2.566375 \n", | |
"50% 434.000000 1167.000000 409.000000 3.544600 \n", | |
"75% 648.250000 1721.000000 605.250000 4.767000 \n", | |
"max 6445.000000 35682.000000 6082.000000 15.000100 \n", | |
"\n", | |
" median_house_value \n", | |
"count 17000.000000 \n", | |
"mean 207.300912 \n", | |
"std 115.983764 \n", | |
"min 14.999000 \n", | |
"25% 119.400000 \n", | |
"50% 180.400000 \n", | |
"75% 265.000000 \n", | |
"max 500.001000 " | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-46692847-1b09-4381-8b12-8c1f463665fb\">\n", | |
" <div class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>longitude</th>\n", | |
" <th>latitude</th>\n", | |
" <th>housing_median_age</th>\n", | |
" <th>total_rooms</th>\n", | |
" <th>total_bedrooms</th>\n", | |
" <th>population</th>\n", | |
" <th>households</th>\n", | |
" <th>median_income</th>\n", | |
" <th>median_house_value</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>count</th>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>mean</th>\n", | |
" <td>-119.562108</td>\n", | |
" <td>35.625225</td>\n", | |
" <td>28.589353</td>\n", | |
" <td>2643.664412</td>\n", | |
" <td>539.410824</td>\n", | |
" <td>1429.573941</td>\n", | |
" <td>501.221941</td>\n", | |
" <td>3.883578</td>\n", | |
" <td>207.300912</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>std</th>\n", | |
" <td>2.005166</td>\n", | |
" <td>2.137340</td>\n", | |
" <td>12.586937</td>\n", | |
" <td>2179.947071</td>\n", | |
" <td>421.499452</td>\n", | |
" <td>1147.852959</td>\n", | |
" <td>384.520841</td>\n", | |
" <td>1.908157</td>\n", | |
" <td>115.983764</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>min</th>\n", | |
" <td>-124.350000</td>\n", | |
" <td>32.540000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>2.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>3.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>0.499900</td>\n", | |
" <td>14.999000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25%</th>\n", | |
" <td>-121.790000</td>\n", | |
" <td>33.930000</td>\n", | |
" <td>18.000000</td>\n", | |
" <td>1462.000000</td>\n", | |
" <td>297.000000</td>\n", | |
" <td>790.000000</td>\n", | |
" <td>282.000000</td>\n", | |
" <td>2.566375</td>\n", | |
" <td>119.400000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>50%</th>\n", | |
" <td>-118.490000</td>\n", | |
" <td>34.250000</td>\n", | |
" <td>29.000000</td>\n", | |
" <td>2127.000000</td>\n", | |
" <td>434.000000</td>\n", | |
" <td>1167.000000</td>\n", | |
" <td>409.000000</td>\n", | |
" <td>3.544600</td>\n", | |
" <td>180.400000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>75%</th>\n", | |
" <td>-118.000000</td>\n", | |
" <td>37.720000</td>\n", | |
" <td>37.000000</td>\n", | |
" <td>3151.250000</td>\n", | |
" <td>648.250000</td>\n", | |
" <td>1721.000000</td>\n", | |
" <td>605.250000</td>\n", | |
" <td>4.767000</td>\n", | |
" <td>265.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>max</th>\n", | |
" <td>-114.310000</td>\n", | |
" <td>41.950000</td>\n", | |
" <td>52.000000</td>\n", | |
" <td>37937.000000</td>\n", | |
" <td>6445.000000</td>\n", | |
" <td>35682.000000</td>\n", | |
" <td>6082.000000</td>\n", | |
" <td>15.000100</td>\n", | |
" <td>500.001000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-46692847-1b09-4381-8b12-8c1f463665fb')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
" \n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n", | |
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
" \n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" flex-wrap:wrap;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-46692847-1b09-4381-8b12-8c1f463665fb button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-46692847-1b09-4381-8b12-8c1f463665fb');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
" </div>\n", | |
" " | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 4 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"dataset_1.corr()['median_house_value']" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "WRci842_fzQy", | |
"outputId": "39ce79cc-6b47-46f6-897f-3786df05a3cd" | |
}, | |
"execution_count": 5, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"longitude -0.044982\n", | |
"latitude -0.144917\n", | |
"housing_median_age 0.106758\n", | |
"total_rooms 0.130991\n", | |
"total_bedrooms 0.045783\n", | |
"population -0.027850\n", | |
"households 0.061031\n", | |
"median_income 0.691871\n", | |
"median_house_value 1.000000\n", | |
"Name: median_house_value, dtype: float64" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 5 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Задача регрессии (линейная модель)\n", | |
"\n", | |
"[Лабораторная №7 - линейная регрессия](https://www.youtube.com/watch?v=txDLkiesqpY)\n" | |
], | |
"metadata": { | |
"id": "fG3lpBVZe3jm" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## Подготовка данных" | |
], | |
"metadata": { | |
"id": "72ujRJiXL5Le" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X = dataset_1.loc[:, dataset_1.columns != 'median_house_value'].to_numpy()\n", | |
"y = dataset_1['median_house_value'].to_numpy()" | |
], | |
"metadata": { | |
"id": "AGwVELBnoPbC" | |
}, | |
"execution_count": 6, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "F3NsKaY3on3Y", | |
"outputId": "7d74e34d-a2b7-4f34-9c91-d148eea39f73" | |
}, | |
"execution_count": 7, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"array([[-114.31 , 34.19 , 15. , ..., 1015. , 472. ,\n", | |
" 1.4936],\n", | |
" [-114.47 , 34.4 , 19. , ..., 1129. , 463. ,\n", | |
" 1.82 ],\n", | |
" [-114.56 , 33.69 , 17. , ..., 333. , 117. ,\n", | |
" 1.6509],\n", | |
" ...,\n", | |
" [-124.3 , 41.84 , 17. , ..., 1244. , 456. ,\n", | |
" 3.0313],\n", | |
" [-124.3 , 41.8 , 19. , ..., 1298. , 478. ,\n", | |
" 1.9797],\n", | |
" [-124.35 , 40.54 , 52. , ..., 806. , 270. ,\n", | |
" 3.0147]])" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 7 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"y" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "EbchplGSprI9", | |
"outputId": "b75e5034-8143-4ba4-e884-a5cd017680fc" | |
}, | |
"execution_count": 8, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"array([ 66.9, 80.1, 85.7, ..., 103.6, 85.8, 94.6])" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 8 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## resampling (cross validation)\n", | |
"\n", | |
"\n", | |
"\n", | |
"https://scikit-learn.org/stable/modules/cross_validation.html" | |
], | |
"metadata": { | |
"id": "q1ojgDeYvFoU" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html\n", | |
"\n" | |
], | |
"metadata": { | |
"id": "H0BUsnbypsUs" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"$\\mathrm{MSE}=\\frac{1}{N}\\sum_{i=1}^n(y_i-\\hat{y}_i)^2$" | |
], | |
"metadata": { | |
"id": "_DKeB_iO80ts" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2)\n", | |
"print(\"Dims of train \", X_train.shape, y_train.shape)\n", | |
"print(\"Dims of test \", X_test.shape, y_test.shape)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "EqbEwqE6qYtO", | |
"outputId": "c0bca208-5fb7-4056-a3ff-a28c5144ed38" | |
}, | |
"execution_count": 9, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Dims of train (11900, 8) (11900,)\n", | |
"Dims of test (5100, 8) (5100,)\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html\n", | |
"# fit model step 1\n", | |
"\n", | |
"lin_reg = LinearRegression().fit(X_train, y_train)\n", | |
"\n", | |
"print(\"R^2 on train set {}\".format(lin_reg.score(X_train, y_train)))\n", | |
"print(\"R^2 on test set {}\".format(lin_reg.score(X_test, y_test)))\n", | |
"\n", | |
"print(\"MSE on train set {}\".format(\n", | |
" mean_squared_error(y_train, lin_reg.predict(X_train))\n", | |
" )\n", | |
")\n", | |
"print(\"MSE on test set {}\".format(\n", | |
" mean_squared_error(y_test, lin_reg.predict(X_test))\n", | |
" )\n", | |
")" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "bJX_Yqvjqtg3", | |
"outputId": "95a1e961-e6ab-4922-bd32-1e78a3d5d891" | |
}, | |
"execution_count": 10, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"R^2 on train set 0.6375851309751237\n", | |
"R^2 on test set 0.6492538345819212\n", | |
"MSE on train set 4803.095967423598\n", | |
"MSE on test set 4880.3979596385025\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"lin_reg.coef_, lin_reg.intercept_" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "D5gbhax50OQS", | |
"outputId": "e3253da9-6531-40ff-c30f-69748eed9e13" | |
}, | |
"execution_count": 11, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"(array([-4.29214290e+01, -4.24176134e+01, 1.16110862e+00, -8.98362849e-03,\n", | |
" 1.15185032e-01, -3.66694219e-02, 4.69730379e-02, 4.03237644e+01]),\n", | |
" -3612.7404586294624)" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 11 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# resampling k-fold cross validation\n", | |
"# https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html#sklearn.model_selection.cross_val_score\n", | |
"\n", | |
"\n", | |
"# fit model step 2\n", | |
"\n", | |
"lin_reg_2 = LinearRegression()\n", | |
"\n", | |
"scores = cross_val_score(lin_reg_2, X, y, cv=5)\n", | |
"scores" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "mfIRTg8ysVGY", | |
"outputId": "45aa6ffb-dae2-4e0e-cbc1-328ddb73aee6" | |
}, | |
"execution_count": 12, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"array([0.52201778, 0.56428342, 0.60260364, 0.39679821, 0.65576199])" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 12 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"print(\"%0.2f R^2 with a standard deviation of %0.2f\" % (scores.mean(), scores.std()))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "_fwlqMYtui16", | |
"outputId": "11895a96-3cec-44dd-8dbe-a93d525f956c" | |
}, | |
"execution_count": 13, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"0.55 R^2 with a standard deviation of 0.09\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"lin_reg_2 = LinearRegression()\n", | |
"scores = cross_val_score(lin_reg_2, X, y, cv=5, scoring='neg_mean_squared_error')\n", | |
"print(\"%0.2f MSE with a standard deviation of %0.2f\" % (scores.mean(), scores.std()))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "s_5kGTf2-KY5", | |
"outputId": "a4aa2692-5bbb-490a-e198-471b2aab5351" | |
}, | |
"execution_count": 14, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"-5352.33 MSE with a standard deviation of 1329.57\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"###Регуляризация в задаче линейной регрессии\n", | |
"\n", | |
"Пусть $X$ данные в матричной форме:\n", | |
"\n", | |
"$$\\bf{X}=\\left[ \\begin{matrix} 1 & X_{11} & X_{12} & ... & X_{1k}\\\\ 1& X_{21} & X_{22} & ... & X_{2k} \\\\ ... & ... & ... & ... & ... \\\\ 1 & X_{n1} & X_{n2} & ... & X_{nk} \\end{matrix} \\right]$$\n", | |
"\n", | |
"$Y$, $\\beta$, $\\epsilon$ зависимая переменная, коэффициенты модели и вектор ошибок соответсвенно: \n", | |
"\n", | |
"$$\\bf{Y}=\\left[ \\begin{matrix} y_1 \\\\ y_2 \\\\ ... \\\\ y_n \\end{matrix} \\right], \\bf{\\beta}=\\left[ \\begin{matrix} \\beta_0 \\\\ \\beta_1 \\\\ ... \\\\ \\beta_k \\end{matrix} \\right], \\bf{\\epsilon}=\\left[ \\begin{matrix} \\epsilon_1 \\\\ \\epsilon_2 \\\\ ... \\\\ \\epsilon_n \\end{matrix} \\right]$$\n", | |
"\n", | |
"Тогда модель линейной регрессии в общем виде: \n", | |
"\n", | |
"$$Y = \\bf{X \\beta + \\epsilon}$$\n", | |
"\n", | |
"Пусть $\\hat{y}=f(X)=X\\hat{\\beta}$ - оценка параметров $\\beta$ для линейной модели.\n", | |
"\n", | |
"Зафиксируем целевую функцию (objective function): \n", | |
"\n", | |
"$$\\mathrm{RSS}(\\beta)=\\sum_{i=1}^n(y_i - f(X_i))^2=(y-X\\beta)^T(y-X\\beta)$$\n", | |
"\n", | |
"Тогда $\\hat{\\beta}^{\\mathrm{OLS}}=\\mathrm{argmin}_\\beta\\{\\sum_{i=1}^n(y_i - f(X_i))^2\\}$ оценка параметров линейной модели методом наименьших квадратов.\n", | |
"\n", | |
"$$\\hat{\\beta}^{\\mathrm{OLS}}=(X^TX)^{-1}X^Ty$$ - решение в общем виде для оценки методом наименьших кварратов.\n", | |
"\n", | |
"### Ridge регуляризация\n", | |
"\n", | |
"Пусть $\\mathrm{RSS}(\\beta)=\\sum_{i=1}^n(y_i - f(X_i))^2+\\lambda\\sum_{i=1}^k\\beta_j^2=(y-X\\beta)^T(y-X\\beta)+\\lambda\\beta^T\\beta$ - целевая функция с параметром регуляризации $\\lambda\\beta^T\\beta$, тогда\n", | |
"\n", | |
"$\\hat{\\beta}^{\\mathrm{ridge}}=\\mathrm{argmin}_\\beta\\{\\sum_{i=1}^n(y_i - f(X_i))^2+\\lambda\\sum_{i=1}^k\\beta_j^2\\}$ оценка параметров линейной модели c $L_2$ регуляризацией.\n", | |
"\n", | |
"$$\\hat{\\beta}^{\\mathrm{ridge}}=(X^TX+\\lambda I)^{-1}X^Ty$$ - решение в общем виде для оценки c $L_2$ регуляризацией.\n", | |
"\n", | |
"### LASSO регуляризация\n", | |
"\n", | |
"Пусть $\\mathrm{RSS}(\\beta)=\\sum_{i=1}^n(y_i - f(X_i))^2+\\lambda\\sum_{i=1}^k|\\beta_j|=(y-X\\beta)^T(y-X\\beta)+\\lambda||\\beta||_1$ - целевая функция с парамтером регуляризации $\\lambda||\\beta||_1$, тогда\n", | |
"\n", | |
"$\\hat{\\beta}^{\\mathrm{lasso}}=\\mathrm{argmin}_\\beta\\{\\frac{1}{2}\\sum_{i=1}^n(y_i - f(X_i))^2+\\lambda\\sum_{i=1}^k|\\beta_j|\\}$ оценка параметров линейной модели c $L_1$ регуляризацией.\n", | |
"\n", | |
"Ддя $\\hat{\\beta}^{\\mathrm{lasso}}$ не существут решения в общем виде, однако, оптимальная оценка может быть найдена методами оптимизации квадратичных функций." | |
], | |
"metadata": { | |
"id": "mjdeEgVEgj9X" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"#https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html\n", | |
"\n", | |
"# fit model Ridge\n", | |
"\n", | |
"ridge_reg_1 = Ridge(alpha=1.0, solver='cholesky')\n", | |
"scores = cross_val_score(ridge_reg_1, X, y, cv=5, scoring='r2')\n", | |
"print(\"%0.2f R^2 with a standard deviation of %0.2f\" % (scores.mean(), scores.std()))\n", | |
"\n", | |
"ridge_reg_2 = Ridge(alpha=1.0, solver='cholesky')\n", | |
"scores = cross_val_score(ridge_reg_2, X, y, cv=5, scoring='neg_mean_squared_error')\n", | |
"print(\"%0.2f MSE with a standard deviation of %0.2f\" % (scores.mean(), scores.std()))\n", | |
"print(\"\\n\")\n", | |
"\n", | |
"print(\"--------------- RIDGE coeffs alpha=1.0\")\n", | |
"ridge_reg_3 = Ridge(alpha=1.0, solver='cholesky').fit(X_train,y_train)\n", | |
"print(ridge_reg_3.coef_, ridge_reg_3.intercept_, \"\\n\")\n", | |
"\n", | |
"\n", | |
"print(\"--------------- RIDGE coeffs alpha=10.0\")\n", | |
"ridge_reg_4 = Ridge(alpha=10.0, solver='cholesky').fit(X_train,y_train)\n", | |
"print(ridge_reg_4.coef_, ridge_reg_4.intercept_, \"\\n\")\n", | |
"\n", | |
"print(\"--------------- RIDGE coeffs alpha=100.0\")\n", | |
"ridge_reg_5 = Ridge(alpha=100.0, solver='cholesky').fit(X_train,y_train)\n", | |
"print(ridge_reg_5.coef_, ridge_reg_5.intercept_, \"\\n\")\n", | |
"\n", | |
"print(\"--------------- OLS coeffs\")\n", | |
"print(lin_reg.coef_, lin_reg.intercept_)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "fNwBKze-7lqL", | |
"outputId": "65c5efa7-1e14-4a99-8c89-76c51d386563" | |
}, | |
"execution_count": 15, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"0.55 R^2 with a standard deviation of 0.09\n", | |
"-5352.03 MSE with a standard deviation of 1329.88\n", | |
"\n", | |
"\n", | |
"--------------- RIDGE coeffs alpha=1.0\n", | |
"[-4.29074407e+01 -4.24045336e+01 1.16133727e+00 -8.98484030e-03\n", | |
" 1.15166492e-01 -3.66696731e-02 4.70033197e-02 4.03245856e+01] -3611.5452675178294 \n", | |
"\n", | |
"--------------- RIDGE coeffs alpha=10.0\n", | |
"[-4.27819790e+01 -4.22872240e+01 1.16338783e+00 -8.99564254e-03\n", | |
" 1.14999813e-01 -3.66719551e-02 4.72750721e-02 4.03319039e+01] -3600.825268345685 \n", | |
"\n", | |
"--------------- RIDGE coeffs alpha=100.0\n", | |
"[-4.15688113e+01 -4.11531876e+01 1.18319623e+00 -9.09373770e-03\n", | |
" 1.13350796e-01 -3.66968047e-02 4.99175259e-02 4.03981251e+01] -3497.137932761225 \n", | |
"\n", | |
"--------------- OLS coeffs\n", | |
"[-4.29214290e+01 -4.24176134e+01 1.16110862e+00 -8.98362849e-03\n", | |
" 1.15185032e-01 -3.66694219e-02 4.69730379e-02 4.03237644e+01] -3612.7404586294624\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"#https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html\n", | |
"\n", | |
"# fit model Lasso\n", | |
"\n", | |
"lasso_reg_1 = Lasso(alpha=1.0)\n", | |
"scores = cross_val_score(lasso_reg_1, X, y, cv=5, scoring='r2')\n", | |
"print(\"%0.2f R^2 with a standard deviation of %0.2f\" % (scores.mean(), scores.std()))\n", | |
"\n", | |
"lasso_reg_2 = Lasso(alpha=1.0)\n", | |
"scores = cross_val_score(lasso_reg_2, X, y, cv=5, scoring='neg_mean_squared_error')\n", | |
"print(\"%0.2f MSE with a standard deviation of %0.2f\" % (scores.mean(), scores.std()))\n", | |
"print(\"\\n\")\n", | |
"\n", | |
"print(\"--------------- LASSO coeffs alpha=1.0\")\n", | |
"lasso_reg_3 = Lasso(alpha=1.0).fit(X_train,y_train)\n", | |
"print(lasso_reg_3.coef_, lasso_reg_3.intercept_, \"\\n\")\n", | |
"\n", | |
"print(\"--------------- LASSO coeffs alpha=10.0\")\n", | |
"lasso_reg_4 = Lasso(alpha=10.0).fit(X_train,y_train)\n", | |
"print(lasso_reg_4.coef_, lasso_reg_4.intercept_, \"\\n\")\n", | |
"\n", | |
"print(\"--------------- LASSO coeffs alpha=100.0\")\n", | |
"lasso_reg_5 = Lasso(alpha=100.0).fit(X_train,y_train)\n", | |
"print(lasso_reg_5.coef_, lasso_reg_5.intercept_, \"\\n\")\n", | |
"\n", | |
"print(\"--------------- OLS coeffs\")\n", | |
"print(lin_reg.coef_, lin_reg.intercept_)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "Rn6JohJ7GqM9", | |
"outputId": "f4c099b8-819b-4c42-8931-bc6c33ba81af" | |
}, | |
"execution_count": 16, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"0.56 R^2 with a standard deviation of 0.07\n", | |
"-5318.24 MSE with a standard deviation of 1427.98\n", | |
"\n", | |
"\n", | |
"--------------- LASSO coeffs alpha=1.0\n", | |
"[-3.90786668e+01 -3.88232746e+01 1.21680467e+00 -9.28340186e-03\n", | |
" 1.09766158e-01 -3.67483260e-02 5.54222354e-02 4.05165803e+01] -3284.0806183661234 \n", | |
"\n", | |
"--------------- LASSO coeffs alpha=10.0\n", | |
"[-4.49374412e+00 -6.47412275e+00 1.71806994e+00 -1.19820710e-02\n", | |
" 6.10033331e-02 -3.74577344e-02 1.31459141e-01 4.22521234e+01] -326.13902350915623 \n", | |
"\n", | |
"--------------- LASSO coeffs alpha=100.0\n", | |
"[-0. -0. 1.00948049 0.03475236 -0.21063508 -0.05565397\n", | |
" 0.22692586 6.0528728 ] 142.71153243167387 \n", | |
"\n", | |
"--------------- OLS coeffs\n", | |
"[-4.29214290e+01 -4.24176134e+01 1.16110862e+00 -8.98362849e-03\n", | |
" 1.15185032e-01 -3.66694219e-02 4.69730379e-02 4.03237644e+01] -3612.7404586294624\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## Конструирование признаков (Feature engineering)" | |
], | |
"metadata": { | |
"id": "EqxNm2YENBIB" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"### Rescale" | |
], | |
"metadata": { | |
"id": "Vt4pawzSPYIF" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"#https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MaxAbsScaler.html\n", | |
"abs_norm = MaxAbsScaler().fit(X)\n", | |
"X_normalized = abs_norm.transform(X)\n", | |
"X_normalized" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "JQRsDv-NJIRs", | |
"outputId": "70645f80-bca8-48ee-dcdd-40fe1aab19b6" | |
}, | |
"execution_count": 17, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"array([[-0.91926015, 0.81501788, 0.28846154, ..., 0.02844571,\n", | |
" 0.07760605, 0.09957267],\n", | |
" [-0.92054684, 0.82002384, 0.36538462, ..., 0.0316406 ,\n", | |
" 0.07612627, 0.12133252],\n", | |
" [-0.92127061, 0.80309893, 0.32692308, ..., 0.00933244,\n", | |
" 0.01923709, 0.11005927],\n", | |
" ...,\n", | |
" [-0.99959791, 0.99737783, 0.32692308, ..., 0.03486352,\n", | |
" 0.07497534, 0.20208532],\n", | |
" [-0.99959791, 0.99642431, 0.36538462, ..., 0.03637688,\n", | |
" 0.07859257, 0.13197912],\n", | |
" [-1. , 0.96638856, 1. , ..., 0.02258842,\n", | |
" 0.04439329, 0.20097866]])" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 17 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"lin_reg_3 = LinearRegression()\n", | |
"\n", | |
"scores = cross_val_score(lin_reg_3, X_normalized, y, cv=5, scoring='r2')\n", | |
"print(\"%0.2f R^2 with a standard deviation of %0.2f\" % (scores.mean(), scores.std()))\n", | |
"\n", | |
"scores = cross_val_score(lin_reg_3, X_normalized, y, cv=5, scoring='neg_mean_squared_error')\n", | |
"print(\"%0.2f MSE with a standard deviation of %0.2f\" % (scores.mean(), scores.std()))\n", | |
"\n" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "LEXldutWNYit", | |
"outputId": "a10a0bf3-4004-44ca-8949-a6dbd02fcdf9" | |
}, | |
"execution_count": 18, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"0.55 R^2 with a standard deviation of 0.09\n", | |
"-5352.33 MSE with a standard deviation of 1329.57\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"### Nonlinearity" | |
], | |
"metadata": { | |
"id": "BgbHHmq_Pd84" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"dataset_1.describe()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 300 | |
}, | |
"id": "Gw3ZfTppPUER", | |
"outputId": "f89e7245-916e-48b8-9a45-e850ba016d8c" | |
}, | |
"execution_count": 19, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" longitude latitude housing_median_age total_rooms \\\n", | |
"count 17000.000000 17000.000000 17000.000000 17000.000000 \n", | |
"mean -119.562108 35.625225 28.589353 2643.664412 \n", | |
"std 2.005166 2.137340 12.586937 2179.947071 \n", | |
"min -124.350000 32.540000 1.000000 2.000000 \n", | |
"25% -121.790000 33.930000 18.000000 1462.000000 \n", | |
"50% -118.490000 34.250000 29.000000 2127.000000 \n", | |
"75% -118.000000 37.720000 37.000000 3151.250000 \n", | |
"max -114.310000 41.950000 52.000000 37937.000000 \n", | |
"\n", | |
" total_bedrooms population households median_income \\\n", | |
"count 17000.000000 17000.000000 17000.000000 17000.000000 \n", | |
"mean 539.410824 1429.573941 501.221941 3.883578 \n", | |
"std 421.499452 1147.852959 384.520841 1.908157 \n", | |
"min 1.000000 3.000000 1.000000 0.499900 \n", | |
"25% 297.000000 790.000000 282.000000 2.566375 \n", | |
"50% 434.000000 1167.000000 409.000000 3.544600 \n", | |
"75% 648.250000 1721.000000 605.250000 4.767000 \n", | |
"max 6445.000000 35682.000000 6082.000000 15.000100 \n", | |
"\n", | |
" median_house_value \n", | |
"count 17000.000000 \n", | |
"mean 207.300912 \n", | |
"std 115.983764 \n", | |
"min 14.999000 \n", | |
"25% 119.400000 \n", | |
"50% 180.400000 \n", | |
"75% 265.000000 \n", | |
"max 500.001000 " | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-f8bc8975-24c0-4138-91f5-42f08bbd54cb\">\n", | |
" <div class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>longitude</th>\n", | |
" <th>latitude</th>\n", | |
" <th>housing_median_age</th>\n", | |
" <th>total_rooms</th>\n", | |
" <th>total_bedrooms</th>\n", | |
" <th>population</th>\n", | |
" <th>households</th>\n", | |
" <th>median_income</th>\n", | |
" <th>median_house_value</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>count</th>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>mean</th>\n", | |
" <td>-119.562108</td>\n", | |
" <td>35.625225</td>\n", | |
" <td>28.589353</td>\n", | |
" <td>2643.664412</td>\n", | |
" <td>539.410824</td>\n", | |
" <td>1429.573941</td>\n", | |
" <td>501.221941</td>\n", | |
" <td>3.883578</td>\n", | |
" <td>207.300912</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>std</th>\n", | |
" <td>2.005166</td>\n", | |
" <td>2.137340</td>\n", | |
" <td>12.586937</td>\n", | |
" <td>2179.947071</td>\n", | |
" <td>421.499452</td>\n", | |
" <td>1147.852959</td>\n", | |
" <td>384.520841</td>\n", | |
" <td>1.908157</td>\n", | |
" <td>115.983764</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>min</th>\n", | |
" <td>-124.350000</td>\n", | |
" <td>32.540000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>2.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>3.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>0.499900</td>\n", | |
" <td>14.999000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25%</th>\n", | |
" <td>-121.790000</td>\n", | |
" <td>33.930000</td>\n", | |
" <td>18.000000</td>\n", | |
" <td>1462.000000</td>\n", | |
" <td>297.000000</td>\n", | |
" <td>790.000000</td>\n", | |
" <td>282.000000</td>\n", | |
" <td>2.566375</td>\n", | |
" <td>119.400000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>50%</th>\n", | |
" <td>-118.490000</td>\n", | |
" <td>34.250000</td>\n", | |
" <td>29.000000</td>\n", | |
" <td>2127.000000</td>\n", | |
" <td>434.000000</td>\n", | |
" <td>1167.000000</td>\n", | |
" <td>409.000000</td>\n", | |
" <td>3.544600</td>\n", | |
" <td>180.400000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>75%</th>\n", | |
" <td>-118.000000</td>\n", | |
" <td>37.720000</td>\n", | |
" <td>37.000000</td>\n", | |
" <td>3151.250000</td>\n", | |
" <td>648.250000</td>\n", | |
" <td>1721.000000</td>\n", | |
" <td>605.250000</td>\n", | |
" <td>4.767000</td>\n", | |
" <td>265.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>max</th>\n", | |
" <td>-114.310000</td>\n", | |
" <td>41.950000</td>\n", | |
" <td>52.000000</td>\n", | |
" <td>37937.000000</td>\n", | |
" <td>6445.000000</td>\n", | |
" <td>35682.000000</td>\n", | |
" <td>6082.000000</td>\n", | |
" <td>15.000100</td>\n", | |
" <td>500.001000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-f8bc8975-24c0-4138-91f5-42f08bbd54cb')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
" \n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n", | |
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
" \n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" flex-wrap:wrap;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-f8bc8975-24c0-4138-91f5-42f08bbd54cb button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-f8bc8975-24c0-4138-91f5-42f08bbd54cb');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
" </div>\n", | |
" " | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 19 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"dataset_1['total_rooms'] = np.log(dataset_1['total_rooms'])\n", | |
"dataset_1['total_bedrooms'] = np.log(dataset_1['total_bedrooms'])\n", | |
"dataset_1['population'] = np.log(dataset_1['population'])\n", | |
"dataset_1['households'] = np.log(dataset_1['households'])\n", | |
"dataset_1.describe()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 300 | |
}, | |
"id": "iEVcRnCAPrSB", | |
"outputId": "24ac541a-ab30-47b4-c5d6-5851764d8187" | |
}, | |
"execution_count": 20, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" longitude latitude housing_median_age total_rooms \\\n", | |
"count 17000.000000 17000.000000 17000.000000 17000.000000 \n", | |
"mean -119.562108 35.625225 28.589353 7.634250 \n", | |
"std 2.005166 2.137340 12.586937 0.742704 \n", | |
"min -124.350000 32.540000 1.000000 0.693147 \n", | |
"25% -121.790000 33.930000 18.000000 7.287561 \n", | |
"50% -118.490000 34.250000 29.000000 7.662468 \n", | |
"75% -118.000000 37.720000 37.000000 8.055554 \n", | |
"max -114.310000 41.950000 52.000000 10.543682 \n", | |
"\n", | |
" total_bedrooms population households median_income \\\n", | |
"count 17000.000000 17000.000000 17000.000000 17000.000000 \n", | |
"mean 6.055277 7.027439 5.984960 3.883578 \n", | |
"std 0.726624 0.732922 0.727605 1.908157 \n", | |
"min 0.000000 1.098612 0.000000 0.499900 \n", | |
"25% 5.693732 6.672033 5.641907 2.566375 \n", | |
"50% 6.073045 7.062192 6.013715 3.544600 \n", | |
"75% 6.474276 7.450661 6.405641 4.767000 \n", | |
"max 8.771060 10.482402 8.713089 15.000100 \n", | |
"\n", | |
" median_house_value \n", | |
"count 17000.000000 \n", | |
"mean 207.300912 \n", | |
"std 115.983764 \n", | |
"min 14.999000 \n", | |
"25% 119.400000 \n", | |
"50% 180.400000 \n", | |
"75% 265.000000 \n", | |
"max 500.001000 " | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-203b3666-8591-4c23-baab-3556e84920aa\">\n", | |
" <div class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>longitude</th>\n", | |
" <th>latitude</th>\n", | |
" <th>housing_median_age</th>\n", | |
" <th>total_rooms</th>\n", | |
" <th>total_bedrooms</th>\n", | |
" <th>population</th>\n", | |
" <th>households</th>\n", | |
" <th>median_income</th>\n", | |
" <th>median_house_value</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>count</th>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>mean</th>\n", | |
" <td>-119.562108</td>\n", | |
" <td>35.625225</td>\n", | |
" <td>28.589353</td>\n", | |
" <td>7.634250</td>\n", | |
" <td>6.055277</td>\n", | |
" <td>7.027439</td>\n", | |
" <td>5.984960</td>\n", | |
" <td>3.883578</td>\n", | |
" <td>207.300912</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>std</th>\n", | |
" <td>2.005166</td>\n", | |
" <td>2.137340</td>\n", | |
" <td>12.586937</td>\n", | |
" <td>0.742704</td>\n", | |
" <td>0.726624</td>\n", | |
" <td>0.732922</td>\n", | |
" <td>0.727605</td>\n", | |
" <td>1.908157</td>\n", | |
" <td>115.983764</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>min</th>\n", | |
" <td>-124.350000</td>\n", | |
" <td>32.540000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>0.693147</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>1.098612</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>0.499900</td>\n", | |
" <td>14.999000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25%</th>\n", | |
" <td>-121.790000</td>\n", | |
" <td>33.930000</td>\n", | |
" <td>18.000000</td>\n", | |
" <td>7.287561</td>\n", | |
" <td>5.693732</td>\n", | |
" <td>6.672033</td>\n", | |
" <td>5.641907</td>\n", | |
" <td>2.566375</td>\n", | |
" <td>119.400000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>50%</th>\n", | |
" <td>-118.490000</td>\n", | |
" <td>34.250000</td>\n", | |
" <td>29.000000</td>\n", | |
" <td>7.662468</td>\n", | |
" <td>6.073045</td>\n", | |
" <td>7.062192</td>\n", | |
" <td>6.013715</td>\n", | |
" <td>3.544600</td>\n", | |
" <td>180.400000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>75%</th>\n", | |
" <td>-118.000000</td>\n", | |
" <td>37.720000</td>\n", | |
" <td>37.000000</td>\n", | |
" <td>8.055554</td>\n", | |
" <td>6.474276</td>\n", | |
" <td>7.450661</td>\n", | |
" <td>6.405641</td>\n", | |
" <td>4.767000</td>\n", | |
" <td>265.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>max</th>\n", | |
" <td>-114.310000</td>\n", | |
" <td>41.950000</td>\n", | |
" <td>52.000000</td>\n", | |
" <td>10.543682</td>\n", | |
" <td>8.771060</td>\n", | |
" <td>10.482402</td>\n", | |
" <td>8.713089</td>\n", | |
" <td>15.000100</td>\n", | |
" <td>500.001000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-203b3666-8591-4c23-baab-3556e84920aa')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
" \n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n", | |
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
" \n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" flex-wrap:wrap;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-203b3666-8591-4c23-baab-3556e84920aa button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-203b3666-8591-4c23-baab-3556e84920aa');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
" </div>\n", | |
" " | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 20 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X_log = dataset_1.loc[:, dataset_1.columns != 'median_house_value'].to_numpy()\n", | |
"X_log" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "w_oNZW7yOegy", | |
"outputId": "58f52926-788e-4fc6-b2d5-d592ff65f380" | |
}, | |
"execution_count": 21, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"array([[-114.31 , 34.19 , 15. , ..., 6.92264389,\n", | |
" 6.15697899, 1.4936 ],\n", | |
" [-114.47 , 34.4 , 19. , ..., 7.02908756,\n", | |
" 6.13772705, 1.82 ],\n", | |
" [-114.56 , 33.69 , 17. , ..., 5.80814249,\n", | |
" 4.76217393, 1.6509 ],\n", | |
" ...,\n", | |
" [-124.3 , 41.84 , 17. , ..., 7.12608727,\n", | |
" 6.12249281, 3.0313 ],\n", | |
" [-124.3 , 41.8 , 19. , ..., 7.1685799 ,\n", | |
" 6.16961073, 1.9797 ],\n", | |
" [-124.35 , 40.54 , 52. , ..., 6.69208374,\n", | |
" 5.59842196, 3.0147 ]])" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 21 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"lin_reg_3 = LinearRegression()\n", | |
"\n", | |
"scores = cross_val_score(lin_reg_3, X_log, y, cv=5, scoring='r2')\n", | |
"print(\"%0.2f R^2 with a standard deviation of %0.2f\" % (scores.mean(), scores.std()))\n", | |
"\n", | |
"scores = cross_val_score(lin_reg_3, X_log, y, cv=5, scoring='neg_mean_squared_error')\n", | |
"print(\"%0.2f MSE with a standard deviation of %0.2f\" % (scores.mean(), scores.std()))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "GcjUzXfFO0K2", | |
"outputId": "ebe9df39-e4f2-4c3e-c610-d49036b2f3a9" | |
}, | |
"execution_count": 22, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"0.59 R^2 with a standard deviation of 0.08\n", | |
"-4880.92 MSE with a standard deviation of 1192.24\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Задача регрессии (простая нейронная сеть)" | |
], | |
"metadata": { | |
"id": "kkG2-rbFQmuq" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"dataset_1 = pd.read_csv(\"california_housing_train.csv\")\n", | |
"X = dataset_1.loc[:, dataset_1.columns != 'median_house_value'].to_numpy()\n", | |
"y = dataset_1['median_house_value'].to_numpy()\n", | |
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2)\n", | |
"print(\"Dims of train \", X_train.shape, y_train.shape)\n", | |
"print(\"Dims of test \", X_test.shape, y_test.shape)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "5qavR5MfXsy1", | |
"outputId": "aa3f86e0-c715-4acb-eb57-b605af844440" | |
}, | |
"execution_count": 23, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Dims of train (11900, 8) (11900,)\n", | |
"Dims of test (5100, 8) (5100,)\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dense\n", | |
"# https://keras.io/guides/functional_api/\n", | |
"\n", | |
"\n", | |
"input = keras.Input(shape=(8,))\n", | |
"x = layers.Dense(64, activation='relu')(input)\n", | |
"x = layers.Dense(64, activation='relu')(x)\n", | |
"output = layers.Dense(1)(x)\n", | |
"\n", | |
"nn_1 = keras.Model(input, output)\n", | |
"nn_1.summary()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "8VnC8Z7iPGFj", | |
"outputId": "3787a96e-9fa6-4506-df4a-c6d9c934f340" | |
}, | |
"execution_count": 24, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Model: \"model\"\n", | |
"_________________________________________________________________\n", | |
" Layer (type) Output Shape Param # \n", | |
"=================================================================\n", | |
" input_1 (InputLayer) [(None, 8)] 0 \n", | |
" \n", | |
" dense (Dense) (None, 64) 576 \n", | |
" \n", | |
" dense_1 (Dense) (None, 64) 4160 \n", | |
" \n", | |
" dense_2 (Dense) (None, 1) 65 \n", | |
" \n", | |
"=================================================================\n", | |
"Total params: 4,801\n", | |
"Trainable params: 4,801\n", | |
"Non-trainable params: 0\n", | |
"_________________________________________________________________\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"LR = 0.001\n", | |
"nn_1.compile(\n", | |
" optimizer=keras.optimizers.Adam(learning_rate=LR),\n", | |
" loss=[tf.keras.losses.MeanAbsoluteError()],\n", | |
" metrics=[tf.keras.metrics.MeanSquaredError()]\n", | |
")\n", | |
"\n", | |
"print(\"Fit model on training data\")\n", | |
"history = nn_1.fit(\n", | |
" X_train,\n", | |
" y_train,\n", | |
" epochs=30,\n", | |
" validation_data=(X_test, y_test))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "YcDZg6DFXvZw", | |
"outputId": "f2975ecd-6b18-45c2-e4be-bab6d993dd0e" | |
}, | |
"execution_count": 25, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Fit model on training data\n", | |
"Epoch 1/30\n", | |
"372/372 [==============================] - 5s 5ms/step - loss: 139482.4844 - mean_squared_error: 33668884480.0000 - val_loss: 116905.9531 - val_mean_squared_error: 27397017600.0000\n", | |
"Epoch 2/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 111370.8438 - mean_squared_error: 24605741056.0000 - val_loss: 108485.2969 - val_mean_squared_error: 24429299712.0000\n", | |
"Epoch 3/30\n", | |
"372/372 [==============================] - 3s 7ms/step - loss: 99567.7891 - mean_squared_error: 19507484672.0000 - val_loss: 94041.8203 - val_mean_squared_error: 17196939264.0000\n", | |
"Epoch 4/30\n", | |
"372/372 [==============================] - 3s 8ms/step - loss: 86368.7422 - mean_squared_error: 13820747776.0000 - val_loss: 84807.7422 - val_mean_squared_error: 12693773312.0000\n", | |
"Epoch 5/30\n", | |
"372/372 [==============================] - 3s 8ms/step - loss: 81420.1562 - mean_squared_error: 11497886720.0000 - val_loss: 82982.4219 - val_mean_squared_error: 11738802176.0000\n", | |
"Epoch 6/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 80465.3203 - mean_squared_error: 11095239680.0000 - val_loss: 82303.9922 - val_mean_squared_error: 11350008832.0000\n", | |
"Epoch 7/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 79616.7266 - mean_squared_error: 10756466688.0000 - val_loss: 81435.4219 - val_mean_squared_error: 11249816576.0000\n", | |
"Epoch 8/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 79001.1172 - mean_squared_error: 10591767552.0000 - val_loss: 80723.8125 - val_mean_squared_error: 11035149312.0000\n", | |
"Epoch 9/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 78283.8750 - mean_squared_error: 10401550336.0000 - val_loss: 80951.7109 - val_mean_squared_error: 10745340928.0000\n", | |
"Epoch 10/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 77595.8047 - mean_squared_error: 10213095424.0000 - val_loss: 79334.5234 - val_mean_squared_error: 10440878080.0000\n", | |
"Epoch 11/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 76887.1719 - mean_squared_error: 9992031232.0000 - val_loss: 78739.1875 - val_mean_squared_error: 10250883072.0000\n", | |
"Epoch 12/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 76198.5625 - mean_squared_error: 9840065536.0000 - val_loss: 77644.0000 - val_mean_squared_error: 10119945216.0000\n", | |
"Epoch 13/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 75468.0938 - mean_squared_error: 9653007360.0000 - val_loss: 77002.9844 - val_mean_squared_error: 9891603456.0000\n", | |
"Epoch 14/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 74665.4922 - mean_squared_error: 9469588480.0000 - val_loss: 76956.6953 - val_mean_squared_error: 9763158016.0000\n", | |
"Epoch 15/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 73971.3203 - mean_squared_error: 9307841536.0000 - val_loss: 75374.4844 - val_mean_squared_error: 9504031744.0000\n", | |
"Epoch 16/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 73166.8906 - mean_squared_error: 9104160768.0000 - val_loss: 75193.6016 - val_mean_squared_error: 9687987200.0000\n", | |
"Epoch 17/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 72396.7656 - mean_squared_error: 8948977664.0000 - val_loss: 73819.3516 - val_mean_squared_error: 9310675968.0000\n", | |
"Epoch 18/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 71540.7031 - mean_squared_error: 8752439296.0000 - val_loss: 73288.3984 - val_mean_squared_error: 8950458368.0000\n", | |
"Epoch 19/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 70802.9062 - mean_squared_error: 8597010432.0000 - val_loss: 72580.0391 - val_mean_squared_error: 8838232064.0000\n", | |
"Epoch 20/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 69980.5547 - mean_squared_error: 8406166528.0000 - val_loss: 71637.8906 - val_mean_squared_error: 8852182016.0000\n", | |
"Epoch 21/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 69242.8984 - mean_squared_error: 8236980736.0000 - val_loss: 70392.6641 - val_mean_squared_error: 8521859584.0000\n", | |
"Epoch 22/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 68497.3047 - mean_squared_error: 8084510208.0000 - val_loss: 71137.5312 - val_mean_squared_error: 8470008832.0000\n", | |
"Epoch 23/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 67920.0859 - mean_squared_error: 7970188288.0000 - val_loss: 68958.7109 - val_mean_squared_error: 8200147456.0000\n", | |
"Epoch 24/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 67173.3984 - mean_squared_error: 7818501120.0000 - val_loss: 68429.4219 - val_mean_squared_error: 8104857600.0000\n", | |
"Epoch 25/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 66582.7344 - mean_squared_error: 7707080192.0000 - val_loss: 67965.9844 - val_mean_squared_error: 7992566272.0000\n", | |
"Epoch 26/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 66125.7734 - mean_squared_error: 7616282112.0000 - val_loss: 67667.4922 - val_mean_squared_error: 7905951232.0000\n", | |
"Epoch 27/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 65612.4609 - mean_squared_error: 7541339648.0000 - val_loss: 66948.7656 - val_mean_squared_error: 7765702656.0000\n", | |
"Epoch 28/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 65159.6484 - mean_squared_error: 7475697664.0000 - val_loss: 66089.9922 - val_mean_squared_error: 7663987712.0000\n", | |
"Epoch 29/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 64645.4375 - mean_squared_error: 7347859968.0000 - val_loss: 66723.0781 - val_mean_squared_error: 7919130624.0000\n", | |
"Epoch 30/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 64289.3945 - mean_squared_error: 7301460480.0000 - val_loss: 65446.8633 - val_mean_squared_error: 7637944320.0000\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# list all data in history\n", | |
"print(history.history.keys())\n", | |
"# summarize history for accuracy\n", | |
"plt.plot(history.history['mean_squared_error'])\n", | |
"plt.plot(history.history['val_mean_squared_error'])\n", | |
"plt.title('model accuracy')\n", | |
"plt.ylabel('accuracy')\n", | |
"plt.xlabel('epoch')\n", | |
"plt.legend(['train', 'test'], loc='upper left')\n", | |
"plt.show()\n", | |
"# summarize history for loss\n", | |
"plt.plot(history.history['loss'])\n", | |
"plt.plot(history.history['val_loss'])\n", | |
"plt.title('model loss')\n", | |
"plt.ylabel('loss')\n", | |
"plt.xlabel('epoch')\n", | |
"plt.legend(['train', 'test'], loc='upper left')\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 591 | |
}, | |
"id": "IoIffhtsc9o1", | |
"outputId": "b4e7fb25-91ed-4bd8-f791-dd6e61e56981" | |
}, | |
"execution_count": 26, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"dict_keys(['loss', 'mean_squared_error', 'val_loss', 'val_mean_squared_error'])\n" | |
] | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
], | |
"image/png": "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N1NXV0dtbW28wxGRJJIU1US9vb2UlpYmdSIAMDNKS0tTogQkItMrKZIBkPSJYESqXKeITK+kSQYn0jswRH1bD0PDk73drIhI6kiZZNA/OExjRx99A1OfDFpbW/n2t090L51jXXPNNbS2tk55PCIiJytlkkFmenCpfYPTlwwGBweP+7wHHniAoqKiKY9HRORkJUVvosmIpkcwjL7BoSl/7c997nNs376dFStWEI1GycrKori4mC1btvDqq6/ytre9jb1799Lb28uNN97IDTfcAByZWqOzs5Orr76aiy++mCeeeIKqqip+85vfkJ2dPeWxioiMJ+mSwVf/z0u8vL993GM9/UNEIpCZnnZSr3lmZQFfefNZEx7/+te/zqZNm9i4cSOPPPII1157LZs2bTrc/fP222+npKSEnp4ezj//fN7xjndQWlp61Gts3bqVO++8k+9973tcd9113H333Vx//fUnFaeIyKlKumRwPGYwHe3Hq1atOmocwDe/+U3uueceAPbu3cvWrVuPSQa1tbWsWLECgPPOO49du3bFPlARkVDSJYPj/YKvb+uhqbOfsysLYtpFMzc39/D2I488wsMPP8yTTz5JTk4Ol1122bjjBDIzMw9vp6Wl0dPTE7P4RETGSpkGZAiqh9yd/iluRM7Pz6ejY/y7B7a1tVFcXExOTg5btmzhqaeemtL3FhGZCklXMjie0T2KMqMn125wPKWlpVx00UWcffbZZGdnM3v27MPHrrrqKr7zne9wxhlncPrpp3PBBRdM2fuKiEyVhLsH8sqVK33szW02b97MGWecccLnDg4N83J9OxWF2ZTnZ57w/JlqstcrIjLCzJ5195UTHU+paqL0tAjpkUhMupeKiCSylEoGEFQVxWIUsohIIku9ZBCNxGQUsohIIku9ZJCexuDwMINDSggiIiNSMBnEbo4iEZFEpWQgIiKplwwy0iOYTe2Edac6hTXAN77xDbq7u6csFhGRU5FyycDMyEyb2h5FSgYikuhSagTyiMxohN4pTAajp7B+wxvewKxZs/jFL35BX18fb3/72/nqV79KV1cX1113HXV1dQwNDfGlL32JgwcPsn//fi6//HLKyspYs2bNlMUkInIyki8Z/PZzcODF455SMTRE/6DjmWkYk5iwbs5SuPrrEx4ePYX1gw8+yF133cXTTz+Nu/OWt7yFtWvX0tjY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\n" | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
], | |
"image/png": "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\n" | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X_train_norm, X_test_norm, y_train_norm, y_test_norm = train_test_split(X_normalized, y, test_size=0.3, random_state=2)\n", | |
"\n", | |
"input = keras.Input(shape=(8,))\n", | |
"x = layers.Dense(64, activation='relu')(input)\n", | |
"x = layers.Dense(64, activation='relu')(x)\n", | |
"output = layers.Dense(1)(x)\n", | |
"\n", | |
"nn_1 = keras.Model(input, output)\n", | |
"#nn_1.summary()\n", | |
"\n", | |
"LR = 0.001\n", | |
"nn_1.compile(\n", | |
" optimizer=keras.optimizers.Adam(learning_rate=LR),\n", | |
" loss=[tf.keras.losses.MeanAbsoluteError()],\n", | |
" metrics=[tf.keras.metrics.MeanSquaredError()]\n", | |
"\n", | |
")\n", | |
"\n", | |
"print(\"Fit model on training data\")\n", | |
"history = nn_1.fit(\n", | |
" X_train_norm,\n", | |
" y_train_norm,\n", | |
" epochs=30,\n", | |
" validation_data=(X_test_norm, y_test_norm))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "Xgrc_ugHZlJq", | |
"outputId": "971dc864-4300-4a2d-db70-c676a6bdfb23" | |
}, | |
"execution_count": 27, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Fit model on training data\n", | |
"Epoch 1/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 206795.4688 - mean_squared_error: 56014397440.0000 - val_loss: 205778.3906 - val_mean_squared_error: 56247169024.0000\n", | |
"Epoch 2/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 200349.9219 - mean_squared_error: 53364846592.0000 - val_loss: 192691.4375 - val_mean_squared_error: 50942058496.0000\n", | |
"Epoch 3/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 177556.3281 - mean_squared_error: 44675104768.0000 - val_loss: 159030.9219 - val_mean_squared_error: 38844985344.0000\n", | |
"Epoch 4/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 135406.7656 - mean_squared_error: 30624692224.0000 - val_loss: 114283.0156 - val_mean_squared_error: 24465571840.0000\n", | |
"Epoch 5/30\n", | |
"372/372 [==============================] - 2s 7ms/step - loss: 99154.9609 - mean_squared_error: 18977902592.0000 - val_loss: 91153.8203 - val_mean_squared_error: 16145519616.0000\n", | |
"Epoch 6/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 85705.9609 - mean_squared_error: 13909401600.0000 - val_loss: 86766.2344 - val_mean_squared_error: 13758028800.0000\n", | |
"Epoch 7/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 83946.8828 - mean_squared_error: 12788144128.0000 - val_loss: 86312.3516 - val_mean_squared_error: 13260951552.0000\n", | |
"Epoch 8/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 83658.9844 - mean_squared_error: 12504192000.0000 - val_loss: 86073.3828 - val_mean_squared_error: 13159665664.0000\n", | |
"Epoch 9/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 83417.0938 - mean_squared_error: 12436531200.0000 - val_loss: 85819.3906 - val_mean_squared_error: 13067907072.0000\n", | |
"Epoch 10/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 83161.7734 - mean_squared_error: 12325829632.0000 - val_loss: 85551.3047 - val_mean_squared_error: 12969872384.0000\n", | |
"Epoch 11/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 82888.3438 - mean_squared_error: 12262994944.0000 - val_loss: 85267.9609 - val_mean_squared_error: 12870999040.0000\n", | |
"Epoch 12/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 82610.1328 - mean_squared_error: 12163811328.0000 - val_loss: 84970.5938 - val_mean_squared_error: 12798576640.0000\n", | |
"Epoch 13/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 82309.5859 - mean_squared_error: 12090469376.0000 - val_loss: 84662.9531 - val_mean_squared_error: 12719804416.0000\n", | |
"Epoch 14/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 82001.8516 - mean_squared_error: 11967596544.0000 - val_loss: 84345.6406 - val_mean_squared_error: 12668781568.0000\n", | |
"Epoch 15/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 81691.1875 - mean_squared_error: 11925498880.0000 - val_loss: 84017.8125 - val_mean_squared_error: 12454376448.0000\n", | |
"Epoch 16/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 81364.3203 - mean_squared_error: 11785666560.0000 - val_loss: 83680.6406 - val_mean_squared_error: 12476708864.0000\n", | |
"Epoch 17/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 81035.7109 - mean_squared_error: 11714954240.0000 - val_loss: 83329.4141 - val_mean_squared_error: 12273813504.0000\n", | |
"Epoch 18/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 80690.4766 - mean_squared_error: 11618946048.0000 - val_loss: 82975.2422 - val_mean_squared_error: 12153061376.0000\n", | |
"Epoch 19/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 80342.5625 - mean_squared_error: 11458452480.0000 - val_loss: 82605.3125 - val_mean_squared_error: 12068451328.0000\n", | |
"Epoch 20/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 79982.4844 - mean_squared_error: 11394854912.0000 - val_loss: 82227.0781 - val_mean_squared_error: 11984166912.0000\n", | |
"Epoch 21/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 79606.8125 - mean_squared_error: 11279780864.0000 - val_loss: 81832.9531 - val_mean_squared_error: 11838595072.0000\n", | |
"Epoch 22/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 79217.4922 - mean_squared_error: 11152124928.0000 - val_loss: 81424.6328 - val_mean_squared_error: 11750178816.0000\n", | |
"Epoch 23/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 78818.5156 - mean_squared_error: 11080593408.0000 - val_loss: 81001.7969 - val_mean_squared_error: 11587097600.0000\n", | |
"Epoch 24/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 78403.0312 - mean_squared_error: 10902419456.0000 - val_loss: 80566.4219 - val_mean_squared_error: 11503527936.0000\n", | |
"Epoch 25/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 77971.4219 - mean_squared_error: 10838893568.0000 - val_loss: 80113.0391 - val_mean_squared_error: 11304907776.0000\n", | |
"Epoch 26/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 77523.2891 - mean_squared_error: 10658941952.0000 - val_loss: 79633.1875 - val_mean_squared_error: 11194773504.0000\n", | |
"Epoch 27/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 77053.9062 - mean_squared_error: 10558457856.0000 - val_loss: 79135.6172 - val_mean_squared_error: 11027051520.0000\n", | |
"Epoch 28/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 76557.9375 - mean_squared_error: 10388887552.0000 - val_loss: 78609.7656 - val_mean_squared_error: 10929961984.0000\n", | |
"Epoch 29/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 76051.3672 - mean_squared_error: 10264171520.0000 - val_loss: 78064.2422 - val_mean_squared_error: 10782563328.0000\n", | |
"Epoch 30/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 75515.6250 - mean_squared_error: 10129316864.0000 - val_loss: 77490.2656 - val_mean_squared_error: 10604675072.0000\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# list all data in history\n", | |
"print(history.history.keys())\n", | |
"# summarize history for accuracy\n", | |
"plt.plot(history.history['mean_squared_error'])\n", | |
"plt.plot(history.history['val_mean_squared_error'])\n", | |
"plt.title('model accuracy')\n", | |
"plt.ylabel('accuracy')\n", | |
"plt.xlabel('epoch')\n", | |
"plt.legend(['train', 'test'], loc='upper left')\n", | |
"plt.show()\n", | |
"# summarize history for loss\n", | |
"plt.plot(history.history['loss'])\n", | |
"plt.plot(history.history['val_loss'])\n", | |
"plt.title('model loss')\n", | |
"plt.ylabel('loss')\n", | |
"plt.xlabel('epoch')\n", | |
"plt.legend(['train', 'test'], loc='upper left')\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 591 | |
}, | |
"id": "3YrJ2xZgeiUe", | |
"outputId": "0e003de6-f261-47db-c89a-3cc9ae564119" | |
}, | |
"execution_count": 28, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"dict_keys(['loss', 'mean_squared_error', 'val_loss', 'val_mean_squared_error'])\n" | |
] | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
], | |
"image/png": "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\n" | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
], | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZkAAAEWCAYAAAC0Q+rDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de3xdZZ3v8c9vX3K/NmlLkwItkCIUFUpFGHVUrgVnBEcHwUGqh2OdEY86OhxhRsfRGc9hRo86zCiK0pcwoyCCDpwRBwqi6JECpaJAuTTcbHpv2qS5Jzv5nT/Wk52dNEnTNDt77/T7fr32a6/9W2vt/ayk5Mtaz7Oebe6OiIhINsRy3QAREZm7FDIiIpI1ChkREckahYyIiGSNQkZERLJGISMiIlmjkBHJMTP7rpn9wxS3fcXMzj3c9xGZLQoZERHJGoWMiIhkjUJGZArCZaprzOx3ZtZlZjeb2UIz+6mZdZjZA2ZWm7H9O83sGTNrM7Ofm9lJGetOM7ONYb8fACVjPuuPzOzJsO+vzex102zzh8ys2cz2mtk9ZtYQ6mZmXzWzXWa238yeMrNTwrqLzGxTaNtWM/uraf3ARAKFjMjUvRs4D1gG/DHwU+CvgflE/y19DMDMlgG3AZ8I6+4F/q+ZFZlZEfAfwL8B84Afhvcl7HsasBb4MFAHfAu4x8yKD6WhZnY28L+BS4FFwKvA7WH1+cAfhuOoDtu0hnU3Ax9290rgFOBnh/K5ImMpZESm7l/cfae7bwV+CTzq7r9x917gx8BpYbv3Aj9x93XuPgB8GSgF/gA4E0gCX3P3AXe/E3g84zPWAN9y90fdfdDdbwH6wn6H4s+Ate6+0d37gOuAs8xsCTAAVAKvAczdn3X37WG/AeBkM6ty933uvvEQP1dkFIWMyNTtzFjuGed1RVhuIDpzAMDdh4AtQGNYt9VHz0z7asbyscCnwqWyNjNrA44O+x2KsW3oJDpbaXT3nwH/Cnwd2GVmN5lZVdj03cBFwKtm9gszO+sQP1dkFIWMyMzbRhQWQNQHQhQUW4HtQGOoDTsmY3kL8EV3r8l4lLn7bYfZhnKiy29bAdz9Bnc/HTiZ6LLZNaH+uLtfDCwguqx3xyF+rsgoChmRmXcH8A4zO8fMksCniC55/Rp4BEgBHzOzpJn9CXBGxr7fBv7czN4YOujLzewdZlZ5iG24DfigmZ0a+nP+F9HlvVfM7A3h/ZNAF9ALDIU+oz8zs+pwmW8/MHQYPwcRhYzITHP354ErgH8B9hANEvhjd+93937gT4APAHuJ+m9+lLHvBuBDRJez9gHNYdtDbcMDwGeBu4jOno4HLgurq4jCbB/RJbVW4Eth3fuBV8xsP/DnRH07ItNm+tIyERHJFp3JiIhI1ihkREQkaxQyIiKSNQoZERHJmkSuG5Av6uvrfcmSJbluhohIQXniiSf2uPv8idYrZIIlS5awYcOGXDdDRKSgmNmrk63X5TIREckahYyIiGSNQkZERLJGfTKTGBgYoKWlhd7e3lw3JatKSkpYvHgxyWQy100RkTlGITOJlpYWKisrWbJkCaMnzZ073J3W1lZaWlpYunRprpsjInOMLpdNore3l7q6ujkbMABmRl1d3Zw/WxOR3FDIHMRcDphhR8IxikhuKGQOU1dfit0dvWg2axGRAylkDlNb9wC72rvZ0T7zQdPW1sY3vvGNQ97voosuoq2tbUbbIiIyHQqZw9Rge1gW386ezj5a9vXMaNBMFDKpVGrS/e69915qampmrB0iItOl0WWHyUqqSHbv4djSHl7phsEh55h5ZcRih9/Pce211/Liiy9y6qmnkkwmKSkpoba2lueee44XXniBSy65hC1bttDb28vHP/5x1qxZA4xMkdPZ2cmFF17Im9/8Zn7961/T2NjI3XffTWlp6WG3TURkKhQyU/T5//sMm7btH3/lQA94K6l4KX2pIeIxoyQZP+h7ntxQxef+ePmE66+//nqefvppnnzySX7+85/zjne8g6effjo91Hjt2rXMmzePnp4e3vCGN/Dud7+burq6Ue+xefNmbrvtNr797W9z6aWXctddd3HFFVdM/cBFRA6DLpfNhEQR4CRIUZyMMzjk9AwMMtNDAc4444xR97LccMMNvP71r+fMM89ky5YtbN68+YB9li5dyqmnngrA6aefziuvvDLDrRIRmZjOZKZosjMOAFpfhP4uWHgy+/uc3+/tJhmPsbS+nKLEzGR5eXl5evnnP/85DzzwAI888ghlZWW87W1vG/del+Li4vRyPB6np6dnRtoiIjIVOpOZKVUN4IPQuZOq0iRL68tJDQ7x4u5OegcGp/WWlZWVdHR0jLuuvb2d2tpaysrKeO6551i/fv3htF5EJCuy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\n" | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# https://www.tensorflow.org/api_docs/python/tf/keras/layers/Normalization\n", | |
"\n", | |
"input = keras.Input(shape=(8,))\n", | |
"x = layers.Normalization()(input)\n", | |
"x = layers.Dense(64, activation='relu')(x)\n", | |
"x = layers.Dense(64, activation='relu')(x)\n", | |
"output = layers.Dense(1)(x)\n", | |
"\n", | |
"nn_2 = keras.Model(input, output)\n", | |
"nn_2.summary()\n" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "sIxJUcbsZLxQ", | |
"outputId": "28ccc6cf-67a5-4d47-a295-816ab9fffaff" | |
}, | |
"execution_count": 29, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Model: \"model_2\"\n", | |
"_________________________________________________________________\n", | |
" Layer (type) Output Shape Param # \n", | |
"=================================================================\n", | |
" input_3 (InputLayer) [(None, 8)] 0 \n", | |
" \n", | |
" normalization (Normalizatio (None, 8) 17 \n", | |
" n) \n", | |
" \n", | |
" dense_6 (Dense) (None, 64) 576 \n", | |
" \n", | |
" dense_7 (Dense) (None, 64) 4160 \n", | |
" \n", | |
" dense_8 (Dense) (None, 1) 65 \n", | |
" \n", | |
"=================================================================\n", | |
"Total params: 4,818\n", | |
"Trainable params: 4,801\n", | |
"Non-trainable params: 17\n", | |
"_________________________________________________________________\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"\n", | |
"LR = 0.001\n", | |
"nn_2.compile(\n", | |
" optimizer=keras.optimizers.Adam(learning_rate=LR),\n", | |
" loss=[tf.keras.losses.MeanAbsoluteError()],\n", | |
" metrics=[tf.keras.metrics.MeanSquaredError()]\n", | |
"\n", | |
")\n", | |
"\n", | |
"print(\"Fit model on training data\")\n", | |
"history = nn_2.fit(\n", | |
" X_train,\n", | |
" y_train,\n", | |
" epochs=30,\n", | |
" validation_data=(X_test, y_test))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "0THrBDVnf6T3", | |
"outputId": "ddd4df87-28c1-4f1b-aefd-e89a123c277f" | |
}, | |
"execution_count": 30, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Fit model on training data\n", | |
"Epoch 1/30\n", | |
"372/372 [==============================] - 3s 5ms/step - loss: 144987.7812 - mean_squared_error: 35822739456.0000 - val_loss: 116765.2109 - val_mean_squared_error: 27681896448.0000\n", | |
"Epoch 2/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 112227.6172 - mean_squared_error: 24842373120.0000 - val_loss: 110188.4219 - val_mean_squared_error: 24272132096.0000\n", | |
"Epoch 3/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 102708.3047 - mean_squared_error: 20724606976.0000 - val_loss: 97876.5781 - val_mean_squared_error: 19019096064.0000\n", | |
"Epoch 4/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 88996.7344 - mean_squared_error: 14882031616.0000 - val_loss: 86128.2422 - val_mean_squared_error: 13466316800.0000\n", | |
"Epoch 5/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 81907.7969 - mean_squared_error: 11681053696.0000 - val_loss: 83248.2266 - val_mean_squared_error: 11745435648.0000\n", | |
"Epoch 6/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 80561.3438 - mean_squared_error: 11091396608.0000 - val_loss: 82357.6172 - val_mean_squared_error: 11481886720.0000\n", | |
"Epoch 7/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 79836.7969 - mean_squared_error: 10822083584.0000 - val_loss: 81863.3359 - val_mean_squared_error: 11213162496.0000\n", | |
"Epoch 8/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 79075.3516 - mean_squared_error: 10595145728.0000 - val_loss: 80830.5781 - val_mean_squared_error: 10984462336.0000\n", | |
"Epoch 9/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 78431.5938 - mean_squared_error: 10399730688.0000 - val_loss: 80304.7188 - val_mean_squared_error: 10730515456.0000\n", | |
"Epoch 10/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 77628.9766 - mean_squared_error: 10205846528.0000 - val_loss: 79689.5312 - val_mean_squared_error: 10670451712.0000\n", | |
"Epoch 11/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 76945.5391 - mean_squared_error: 10016186368.0000 - val_loss: 78680.8672 - val_mean_squared_error: 10284953600.0000\n", | |
"Epoch 12/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 76145.0469 - mean_squared_error: 9805711360.0000 - val_loss: 77772.7109 - val_mean_squared_error: 10197805056.0000\n", | |
"Epoch 13/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 75720.4062 - mean_squared_error: 9702811648.0000 - val_loss: 77072.8438 - val_mean_squared_error: 10036048896.0000\n", | |
"Epoch 14/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 74835.0000 - mean_squared_error: 9465024512.0000 - val_loss: 76226.7344 - val_mean_squared_error: 9817841664.0000\n", | |
"Epoch 15/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 74007.2266 - mean_squared_error: 9262068736.0000 - val_loss: 75532.3984 - val_mean_squared_error: 9636645888.0000\n", | |
"Epoch 16/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 73280.5625 - mean_squared_error: 9077710848.0000 - val_loss: 75950.6094 - val_mean_squared_error: 9874145280.0000\n", | |
"Epoch 17/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 72531.5156 - mean_squared_error: 8928563200.0000 - val_loss: 74895.6172 - val_mean_squared_error: 9232152576.0000\n", | |
"Epoch 18/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 71859.8203 - mean_squared_error: 8754529280.0000 - val_loss: 73252.5703 - val_mean_squared_error: 9070807040.0000\n", | |
"Epoch 19/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 71020.6172 - mean_squared_error: 8572276736.0000 - val_loss: 73646.8516 - val_mean_squared_error: 8964041728.0000\n", | |
"Epoch 20/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 70221.9531 - mean_squared_error: 8412365312.0000 - val_loss: 71759.7578 - val_mean_squared_error: 8829378560.0000\n", | |
"Epoch 21/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 69619.6797 - mean_squared_error: 8267113984.0000 - val_loss: 71125.3750 - val_mean_squared_error: 8510948352.0000\n", | |
"Epoch 22/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 68809.0703 - mean_squared_error: 8099959296.0000 - val_loss: 70721.3750 - val_mean_squared_error: 8593863680.0000\n", | |
"Epoch 23/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 68094.2812 - mean_squared_error: 7958014976.0000 - val_loss: 70390.0703 - val_mean_squared_error: 8355642368.0000\n", | |
"Epoch 24/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 67535.4062 - mean_squared_error: 7867279872.0000 - val_loss: 68796.2031 - val_mean_squared_error: 8227276288.0000\n", | |
"Epoch 25/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 66880.1406 - mean_squared_error: 7741731328.0000 - val_loss: 68784.9375 - val_mean_squared_error: 8112913920.0000\n", | |
"Epoch 26/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 66363.6172 - mean_squared_error: 7637346816.0000 - val_loss: 67678.5938 - val_mean_squared_error: 7986403840.0000\n", | |
"Epoch 27/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 65961.8672 - mean_squared_error: 7552273408.0000 - val_loss: 67385.1562 - val_mean_squared_error: 7926674432.0000\n", | |
"Epoch 28/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 65690.1406 - mean_squared_error: 7523852288.0000 - val_loss: 68142.6797 - val_mean_squared_error: 8206020096.0000\n", | |
"Epoch 29/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 65099.7734 - mean_squared_error: 7418447872.0000 - val_loss: 66803.6172 - val_mean_squared_error: 7650893824.0000\n", | |
"Epoch 30/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 64623.6250 - mean_squared_error: 7302447616.0000 - val_loss: 66301.5781 - val_mean_squared_error: 7767943168.0000\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# list all data in history\n", | |
"print(history.history.keys())\n", | |
"# summarize history for accuracy\n", | |
"plt.plot(history.history['mean_squared_error'])\n", | |
"plt.plot(history.history['val_mean_squared_error'])\n", | |
"plt.title('model accuracy')\n", | |
"plt.ylabel('accuracy')\n", | |
"plt.xlabel('epoch')\n", | |
"plt.legend(['train', 'test'], loc='upper left')\n", | |
"plt.show()\n", | |
"# summarize history for loss\n", | |
"plt.plot(history.history['loss'])\n", | |
"plt.plot(history.history['val_loss'])\n", | |
"plt.title('model loss')\n", | |
"plt.ylabel('loss')\n", | |
"plt.xlabel('epoch')\n", | |
"plt.legend(['train', 'test'], loc='upper left')\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 591 | |
}, | |
"id": "IAnqOOy8gDw_", | |
"outputId": "d0ee1725-ad19-423e-c126-c5c581b6ccef" | |
}, | |
"execution_count": 31, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"dict_keys(['loss', 'mean_squared_error', 'val_loss', 'val_mean_squared_error'])\n" | |
] | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
], | |
"image/png": "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\n" | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
], | |
"image/png": "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\n" | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"dataset_1 = pd.read_csv(\"california_housing_train.csv\")\n", | |
"dataset_1['median_house_value'] = dataset_1['median_house_value']/1000\n", | |
"dataset_1.describe()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 300 | |
}, | |
"id": "wQCaX_4KidvU", | |
"outputId": "06769e3f-66e7-4b2f-9038-357f59abd0a5" | |
}, | |
"execution_count": 32, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" longitude latitude housing_median_age total_rooms \\\n", | |
"count 17000.000000 17000.000000 17000.000000 17000.000000 \n", | |
"mean -119.562108 35.625225 28.589353 2643.664412 \n", | |
"std 2.005166 2.137340 12.586937 2179.947071 \n", | |
"min -124.350000 32.540000 1.000000 2.000000 \n", | |
"25% -121.790000 33.930000 18.000000 1462.000000 \n", | |
"50% -118.490000 34.250000 29.000000 2127.000000 \n", | |
"75% -118.000000 37.720000 37.000000 3151.250000 \n", | |
"max -114.310000 41.950000 52.000000 37937.000000 \n", | |
"\n", | |
" total_bedrooms population households median_income \\\n", | |
"count 17000.000000 17000.000000 17000.000000 17000.000000 \n", | |
"mean 539.410824 1429.573941 501.221941 3.883578 \n", | |
"std 421.499452 1147.852959 384.520841 1.908157 \n", | |
"min 1.000000 3.000000 1.000000 0.499900 \n", | |
"25% 297.000000 790.000000 282.000000 2.566375 \n", | |
"50% 434.000000 1167.000000 409.000000 3.544600 \n", | |
"75% 648.250000 1721.000000 605.250000 4.767000 \n", | |
"max 6445.000000 35682.000000 6082.000000 15.000100 \n", | |
"\n", | |
" median_house_value \n", | |
"count 17000.000000 \n", | |
"mean 207.300912 \n", | |
"std 115.983764 \n", | |
"min 14.999000 \n", | |
"25% 119.400000 \n", | |
"50% 180.400000 \n", | |
"75% 265.000000 \n", | |
"max 500.001000 " | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-f5087c31-e76f-4ab9-ad0a-713d66fe9688\">\n", | |
" <div class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>longitude</th>\n", | |
" <th>latitude</th>\n", | |
" <th>housing_median_age</th>\n", | |
" <th>total_rooms</th>\n", | |
" <th>total_bedrooms</th>\n", | |
" <th>population</th>\n", | |
" <th>households</th>\n", | |
" <th>median_income</th>\n", | |
" <th>median_house_value</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>count</th>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" <td>17000.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>mean</th>\n", | |
" <td>-119.562108</td>\n", | |
" <td>35.625225</td>\n", | |
" <td>28.589353</td>\n", | |
" <td>2643.664412</td>\n", | |
" <td>539.410824</td>\n", | |
" <td>1429.573941</td>\n", | |
" <td>501.221941</td>\n", | |
" <td>3.883578</td>\n", | |
" <td>207.300912</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>std</th>\n", | |
" <td>2.005166</td>\n", | |
" <td>2.137340</td>\n", | |
" <td>12.586937</td>\n", | |
" <td>2179.947071</td>\n", | |
" <td>421.499452</td>\n", | |
" <td>1147.852959</td>\n", | |
" <td>384.520841</td>\n", | |
" <td>1.908157</td>\n", | |
" <td>115.983764</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>min</th>\n", | |
" <td>-124.350000</td>\n", | |
" <td>32.540000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>2.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>3.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>0.499900</td>\n", | |
" <td>14.999000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25%</th>\n", | |
" <td>-121.790000</td>\n", | |
" <td>33.930000</td>\n", | |
" <td>18.000000</td>\n", | |
" <td>1462.000000</td>\n", | |
" <td>297.000000</td>\n", | |
" <td>790.000000</td>\n", | |
" <td>282.000000</td>\n", | |
" <td>2.566375</td>\n", | |
" <td>119.400000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>50%</th>\n", | |
" <td>-118.490000</td>\n", | |
" <td>34.250000</td>\n", | |
" <td>29.000000</td>\n", | |
" <td>2127.000000</td>\n", | |
" <td>434.000000</td>\n", | |
" <td>1167.000000</td>\n", | |
" <td>409.000000</td>\n", | |
" <td>3.544600</td>\n", | |
" <td>180.400000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>75%</th>\n", | |
" <td>-118.000000</td>\n", | |
" <td>37.720000</td>\n", | |
" <td>37.000000</td>\n", | |
" <td>3151.250000</td>\n", | |
" <td>648.250000</td>\n", | |
" <td>1721.000000</td>\n", | |
" <td>605.250000</td>\n", | |
" <td>4.767000</td>\n", | |
" <td>265.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>max</th>\n", | |
" <td>-114.310000</td>\n", | |
" <td>41.950000</td>\n", | |
" <td>52.000000</td>\n", | |
" <td>37937.000000</td>\n", | |
" <td>6445.000000</td>\n", | |
" <td>35682.000000</td>\n", | |
" <td>6082.000000</td>\n", | |
" <td>15.000100</td>\n", | |
" <td>500.001000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-f5087c31-e76f-4ab9-ad0a-713d66fe9688')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
" \n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n", | |
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
" \n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" flex-wrap:wrap;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-f5087c31-e76f-4ab9-ad0a-713d66fe9688 button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-f5087c31-e76f-4ab9-ad0a-713d66fe9688');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
" </div>\n", | |
" " | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 32 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"dataset_1[\"rooms_per_person\"] = dataset_1[\"total_rooms\"] / dataset_1[\"population\"]\n", | |
"dataset_1[\"rooms_on_income\"] = dataset_1[\"median_income\"]*dataset_1[\"total_rooms\"]\n", | |
"dataset_1.corr()['median_house_value']" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "UsNhFAwajhZ7", | |
"outputId": "eb015fd8-d237-4861-b313-287272a30879" | |
}, | |
"execution_count": 33, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"longitude -0.044982\n", | |
"latitude -0.144917\n", | |
"housing_median_age 0.106758\n", | |
"total_rooms 0.130991\n", | |
"total_bedrooms 0.045783\n", | |
"population -0.027850\n", | |
"households 0.061031\n", | |
"median_income 0.691871\n", | |
"median_house_value 1.000000\n", | |
"rooms_per_person 0.206969\n", | |
"rooms_on_income 0.375019\n", | |
"Name: median_house_value, dtype: float64" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 33 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"#dataset_2 = dataset_1.drop(columns=[\"longitude\", \"total_bedrooms\", \"population\", \"households\"])\n", | |
"X = dataset_1.loc[:, dataset_1.columns != 'median_house_value'].to_numpy()\n", | |
"y = dataset_1['median_house_value'].to_numpy()\n", | |
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2)\n", | |
"print(\"Dims of train \", X_train.shape, y_train.shape)\n", | |
"print(\"Dims of test \", X_test.shape, y_test.shape)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "EHl0evTDktL7", | |
"outputId": "445bccf0-f26a-4f98-f1f4-f85a6f0b092a" | |
}, | |
"execution_count": 34, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Dims of train (11900, 10) (11900,)\n", | |
"Dims of test (5100, 10) (5100,)\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"input = keras.Input(shape=(10,))\n", | |
"x = layers.Normalization()(input)\n", | |
"x = layers.Dense(64, activation='relu')(x)\n", | |
"x = layers.Dense(64, activation='relu')(x)\n", | |
"output = layers.Dense(1)(x)\n", | |
"\n", | |
"nn_2 = keras.Model(input, output)\n", | |
"\n", | |
"LR = 0.001\n", | |
"nn_2.compile(\n", | |
" optimizer=keras.optimizers.Adam(learning_rate=LR),\n", | |
" loss=[tf.keras.losses.MeanAbsoluteError()],\n", | |
" metrics=[tf.keras.metrics.MeanSquaredError()]\n", | |
"\n", | |
")\n", | |
"\n", | |
"print(\"Fit model on training data\")\n", | |
"history = nn_2.fit(\n", | |
" X_train,\n", | |
" y_train,\n", | |
" epochs=30,\n", | |
" validation_data=(X_test, y_test))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "wpsxHYMWlUmM", | |
"outputId": "2502eb9a-5b9c-48cd-cbc3-ddb268b4eee3" | |
}, | |
"execution_count": 35, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Fit model on training data\n", | |
"Epoch 1/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 123.5778 - mean_squared_error: 84509.2656 - val_loss: 94.7028 - val_mean_squared_error: 28951.8555\n", | |
"Epoch 2/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 74.1135 - mean_squared_error: 13103.9932 - val_loss: 84.0273 - val_mean_squared_error: 13924.6475\n", | |
"Epoch 3/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 69.8124 - mean_squared_error: 11254.4961 - val_loss: 62.4042 - val_mean_squared_error: 8254.2021\n", | |
"Epoch 4/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 63.7925 - mean_squared_error: 8883.7812 - val_loss: 65.3682 - val_mean_squared_error: 11510.4131\n", | |
"Epoch 5/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 64.2597 - mean_squared_error: 9500.2275 - val_loss: 57.6894 - val_mean_squared_error: 7735.1694\n", | |
"Epoch 6/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 60.9381 - mean_squared_error: 7677.7090 - val_loss: 58.1475 - val_mean_squared_error: 6879.2720\n", | |
"Epoch 7/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 62.2062 - mean_squared_error: 8341.0576 - val_loss: 60.1291 - val_mean_squared_error: 7726.6885\n", | |
"Epoch 8/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 60.3868 - mean_squared_error: 7539.1187 - val_loss: 63.7201 - val_mean_squared_error: 10191.7227\n", | |
"Epoch 9/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 60.5445 - mean_squared_error: 7589.5142 - val_loss: 62.1348 - val_mean_squared_error: 8403.5000\n", | |
"Epoch 10/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 59.5142 - mean_squared_error: 7382.1558 - val_loss: 57.4914 - val_mean_squared_error: 7134.7656\n", | |
"Epoch 11/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 59.4686 - mean_squared_error: 7449.5151 - val_loss: 52.8626 - val_mean_squared_error: 5637.7847\n", | |
"Epoch 12/30\n", | |
"372/372 [==============================] - 1s 4ms/step - loss: 55.0070 - mean_squared_error: 6172.5854 - val_loss: 65.5911 - val_mean_squared_error: 8472.5693\n", | |
"Epoch 13/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 58.2922 - mean_squared_error: 7076.7959 - val_loss: 63.0623 - val_mean_squared_error: 7742.8179\n", | |
"Epoch 14/30\n", | |
"372/372 [==============================] - 1s 4ms/step - loss: 56.5393 - mean_squared_error: 6516.9219 - val_loss: 58.3570 - val_mean_squared_error: 7519.5229\n", | |
"Epoch 15/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 54.7303 - mean_squared_error: 6120.8174 - val_loss: 57.7792 - val_mean_squared_error: 6764.9136\n", | |
"Epoch 16/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 55.3258 - mean_squared_error: 6324.9487 - val_loss: 52.5866 - val_mean_squared_error: 5486.2563\n", | |
"Epoch 17/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 56.8465 - mean_squared_error: 6713.0439 - val_loss: 52.5608 - val_mean_squared_error: 5543.4482\n", | |
"Epoch 18/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 55.0057 - mean_squared_error: 6202.8843 - val_loss: 63.2907 - val_mean_squared_error: 9807.6797\n", | |
"Epoch 19/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 54.4341 - mean_squared_error: 6005.2930 - val_loss: 52.2481 - val_mean_squared_error: 5230.1445\n", | |
"Epoch 20/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 52.3851 - mean_squared_error: 5476.8960 - val_loss: 50.6791 - val_mean_squared_error: 5269.7285\n", | |
"Epoch 21/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 54.1140 - mean_squared_error: 6032.5000 - val_loss: 52.0576 - val_mean_squared_error: 5089.3145\n", | |
"Epoch 22/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 51.5882 - mean_squared_error: 5353.1353 - val_loss: 54.0523 - val_mean_squared_error: 5410.7358\n", | |
"Epoch 23/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 54.3766 - mean_squared_error: 6009.6519 - val_loss: 51.8409 - val_mean_squared_error: 5514.4302\n", | |
"Epoch 24/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 51.8519 - mean_squared_error: 5430.7134 - val_loss: 50.4292 - val_mean_squared_error: 5203.2998\n", | |
"Epoch 25/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 51.6805 - mean_squared_error: 5387.0952 - val_loss: 54.4006 - val_mean_squared_error: 5912.8208\n", | |
"Epoch 26/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 50.6099 - mean_squared_error: 5249.1851 - val_loss: 52.4657 - val_mean_squared_error: 5114.3223\n", | |
"Epoch 27/30\n", | |
"372/372 [==============================] - 2s 4ms/step - loss: 51.1354 - mean_squared_error: 5322.7368 - val_loss: 50.4774 - val_mean_squared_error: 4757.1084\n", | |
"Epoch 28/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 50.6150 - mean_squared_error: 5105.1929 - val_loss: 55.7018 - val_mean_squared_error: 6655.2378\n", | |
"Epoch 29/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 50.2288 - mean_squared_error: 5055.5469 - val_loss: 49.8351 - val_mean_squared_error: 4791.1860\n", | |
"Epoch 30/30\n", | |
"372/372 [==============================] - 2s 5ms/step - loss: 50.5648 - mean_squared_error: 5132.6577 - val_loss: 49.7307 - val_mean_squared_error: 5083.0269\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"" | |
], | |
"metadata": { | |
"id": "AcvusFN2lyP0" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment