|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728 |
- {
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2.2.0\n",
- "sys.version_info(major=3, minor=6, micro=9, releaselevel='final', serial=0)\n",
- "matplotlib 3.3.4\n",
- "numpy 1.19.5\n",
- "pandas 1.1.5\n",
- "sklearn 0.24.2\n",
- "tensorflow 2.2.0\n",
- "tensorflow.keras 2.3.0-tf\n"
- ]
- }
- ],
- "source": [
- "import matplotlib as mpl\n",
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline\n",
- "import numpy as np\n",
- "import sklearn\n",
- "import pandas as pd\n",
- "import os\n",
- "import sys\n",
- "import time\n",
- "import tensorflow as tf\n",
- "\n",
- "from tensorflow import keras\n",
- "\n",
- "print(tf.__version__)\n",
- "print(sys.version_info)\n",
- "for module in mpl, np, pd, sklearn, tf, keras:\n",
- " print(module.__name__, module.__version__)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- ".. _california_housing_dataset:\n",
- "\n",
- "California Housing dataset\n",
- "--------------------------\n",
- "\n",
- "**Data Set Characteristics:**\n",
- "\n",
- " :Number of Instances: 20640\n",
- "\n",
- " :Number of Attributes: 8 numeric, predictive attributes and the target\n",
- "\n",
- " :Attribute Information:\n",
- " - MedInc median income in block\n",
- " - HouseAge median house age in block\n",
- " - AveRooms average number of rooms\n",
- " - AveBedrms average number of bedrooms\n",
- " - Population block population\n",
- " - AveOccup average house occupancy\n",
- " - Latitude house block latitude\n",
- " - Longitude house block longitude\n",
- "\n",
- " :Missing Attribute Values: None\n",
- "\n",
- "This dataset was obtained from the StatLib repository.\n",
- "http://lib.stat.cmu.edu/datasets/\n",
- "\n",
- "The target variable is the median house value for California districts.\n",
- "\n",
- "This dataset was derived from the 1990 U.S. census, using one row per census\n",
- "block group. A block group is the smallest geographical unit for which the U.S.\n",
- "Census Bureau publishes sample data (a block group typically has a population\n",
- "of 600 to 3,000 people).\n",
- "\n",
- "It can be downloaded/loaded using the\n",
- ":func:`sklearn.datasets.fetch_california_housing` function.\n",
- "\n",
- ".. topic:: References\n",
- "\n",
- " - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
- " Statistics and Probability Letters, 33 (1997) 291-297\n",
- "\n",
- "(20640, 8)\n",
- "(20640,)\n"
- ]
- }
- ],
- "source": [
- "from sklearn.datasets import fetch_california_housing\n",
- "\n",
- "housing = fetch_california_housing()\n",
- "print(housing.DESCR)\n",
- "print(housing.data.shape)\n",
- "print(housing.target.shape)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "array([[ 8.32520000e+00, 4.10000000e+01, 6.98412698e+00,\n",
- " 1.02380952e+00, 3.22000000e+02, 2.55555556e+00,\n",
- " 3.78800000e+01, -1.22230000e+02],\n",
- " [ 8.30140000e+00, 2.10000000e+01, 6.23813708e+00,\n",
- " 9.71880492e-01, 2.40100000e+03, 2.10984183e+00,\n",
- " 3.78600000e+01, -1.22220000e+02],\n",
- " [ 7.25740000e+00, 5.20000000e+01, 8.28813559e+00,\n",
- " 1.07344633e+00, 4.96000000e+02, 2.80225989e+00,\n",
- " 3.78500000e+01, -1.22240000e+02],\n",
- " [ 5.64310000e+00, 5.20000000e+01, 5.81735160e+00,\n",
- " 1.07305936e+00, 5.58000000e+02, 2.54794521e+00,\n",
- " 3.78500000e+01, -1.22250000e+02],\n",
- " [ 3.84620000e+00, 5.20000000e+01, 6.28185328e+00,\n",
- " 1.08108108e+00, 5.65000000e+02, 2.18146718e+00,\n",
- " 3.78500000e+01, -1.22250000e+02]])\n",
- "--------------------------------------------------\n",
- "array([4.526, 3.585, 3.521, 3.413, 3.422])\n"
- ]
- }
- ],
- "source": [
- "# print(housing.data[0:5])\n",
- "import pprint #打印的格式比较 好看\n",
- "\n",
- "pprint.pprint(housing.data[0:5])\n",
- "print('-'*50)\n",
- "pprint.pprint(housing.target[0:5])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "(11610, 8) (11610,)\n",
- "(3870, 8) (3870,)\n",
- "(5160, 8) (5160,)\n"
- ]
- }
- ],
- "source": [
- "from sklearn.model_selection import train_test_split\n",
- "\n",
- "#拆分训练集和测试集,random_state是随机种子,同样的随机数种子,是为了得到同样的随机值\n",
- "x_train_all, x_test, y_train_all, y_test = train_test_split(\n",
- " housing.data, housing.target, random_state = 7)\n",
- "x_train, x_valid, y_train, y_valid = train_test_split(\n",
- " x_train_all, y_train_all, random_state = 11)\n",
- "# 训练集\n",
- "print(x_train.shape, y_train.shape)\n",
- "# 验证集\n",
- "print(x_valid.shape, y_valid.shape)\n",
- "# 测试集\n",
- "print(x_test.shape, y_test.shape)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {},
- "outputs": [],
- "source": [
- "from sklearn.preprocessing import StandardScaler\n",
- "\n",
- "scaler = StandardScaler()\n",
- "x_train_scaled = scaler.fit_transform(x_train)\n",
- "x_valid_scaled = scaler.transform(x_valid)\n",
- "x_test_scaled = scaler.transform(x_test)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(8,)"
- ]
- },
- "execution_count": 27,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#看特征数目\n",
- "x_train_scaled.shape[1:]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([-0.29807281, 0.35226166, -0.10920508, -0.25055521, -0.03406402,\n",
- " -0.006034 , 1.08055484, -1.06113817])"
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "x_train_scaled[1] #标准化后的值看一下"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Model: \"sequential_1\"\n",
- "_________________________________________________________________\n",
- "Layer (type) Output Shape Param # \n",
- "=================================================================\n",
- "dense_2 (Dense) (None, 30) 270 \n",
- "_________________________________________________________________\n",
- "dense_3 (Dense) (None, 1) 31 \n",
- "=================================================================\n",
- "Total params: 301\n",
- "Trainable params: 301\n",
- "Non-trainable params: 0\n",
- "_________________________________________________________________\n"
- ]
- }
- ],
- "source": [
- "#回归模型我们只需要1个数\n",
- "model = keras.models.Sequential([\n",
- " keras.layers.Dense(30, activation='relu',\n",
- " input_shape=x_train.shape[1:]),\n",
- " keras.layers.Dense(1),#结果层只有1个节点\n",
- "])\n",
- "model.summary()\n",
- "#mean_squared_error是均方差\n",
- "model.compile(loss=\"mean_squared_error\", optimizer= \"sgd\")\n",
- "callbacks = [keras.callbacks.EarlyStopping(\n",
- " patience=5, min_delta=1e-3)]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[<tensorflow.python.keras.layers.core.Dense at 0x7fd59002a898>,\n",
- " <tensorflow.python.keras.layers.core.Dense at 0x7fd59002ab00>]"
- ]
- },
- "execution_count": 30,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.layers"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Epoch 1/100\n",
- "363/363 [==============================] - 0s 875us/step - loss: 0.8912 - val_loss: 0.6639\n",
- "Epoch 2/100\n",
- "363/363 [==============================] - 0s 811us/step - loss: 0.7128 - val_loss: 0.4861\n",
- "Epoch 3/100\n",
- "363/363 [==============================] - 0s 820us/step - loss: 0.4428 - val_loss: 0.4569\n",
- "Epoch 4/100\n",
- "363/363 [==============================] - 0s 812us/step - loss: 0.4231 - val_loss: 0.4379\n",
- "Epoch 5/100\n",
- "363/363 [==============================] - 0s 814us/step - loss: 0.4111 - val_loss: 0.4254\n",
- "Epoch 6/100\n",
- "363/363 [==============================] - 0s 812us/step - loss: 0.4003 - val_loss: 0.4203\n",
- "Epoch 7/100\n",
- "363/363 [==============================] - 0s 824us/step - loss: 0.3940 - val_loss: 0.4087\n",
- "Epoch 8/100\n",
- "363/363 [==============================] - 0s 813us/step - loss: 0.3890 - val_loss: 0.4104\n",
- "Epoch 9/100\n",
- "363/363 [==============================] - 0s 819us/step - loss: 0.3826 - val_loss: 0.4032\n",
- "Epoch 10/100\n",
- "363/363 [==============================] - 0s 819us/step - loss: 0.3787 - val_loss: 0.3991\n",
- "Epoch 11/100\n",
- "363/363 [==============================] - 0s 817us/step - loss: 0.3742 - val_loss: 0.3897\n",
- "Epoch 12/100\n",
- "363/363 [==============================] - 0s 804us/step - loss: 0.3733 - val_loss: 0.3891\n",
- "Epoch 13/100\n",
- "363/363 [==============================] - 0s 806us/step - loss: 0.3686 - val_loss: 0.3868\n",
- "Epoch 14/100\n",
- "363/363 [==============================] - 0s 821us/step - loss: 0.3655 - val_loss: 0.3836\n",
- "Epoch 15/100\n",
- "363/363 [==============================] - 0s 814us/step - loss: 0.3632 - val_loss: 0.3758\n",
- "Epoch 16/100\n",
- "363/363 [==============================] - 0s 814us/step - loss: 0.3616 - val_loss: 0.3914\n",
- "Epoch 17/100\n",
- "363/363 [==============================] - 0s 826us/step - loss: 0.3585 - val_loss: 0.3732\n",
- "Epoch 18/100\n",
- "363/363 [==============================] - 0s 811us/step - loss: 0.3682 - val_loss: 0.3766\n",
- "Epoch 19/100\n",
- "363/363 [==============================] - 0s 808us/step - loss: 0.3540 - val_loss: 0.3707\n",
- "Epoch 20/100\n",
- "363/363 [==============================] - 0s 829us/step - loss: 0.3562 - val_loss: 0.3750\n",
- "Epoch 21/100\n",
- "363/363 [==============================] - 0s 830us/step - loss: 0.3507 - val_loss: 0.3659\n",
- "Epoch 22/100\n",
- "363/363 [==============================] - 0s 813us/step - loss: 0.3581 - val_loss: 0.3752\n",
- "Epoch 23/100\n",
- "363/363 [==============================] - 0s 819us/step - loss: 0.3482 - val_loss: 0.3663\n",
- "Epoch 24/100\n",
- "363/363 [==============================] - 0s 816us/step - loss: 0.3469 - val_loss: 0.3658\n",
- "Epoch 25/100\n",
- "363/363 [==============================] - 0s 807us/step - loss: 0.3441 - val_loss: 0.3635\n",
- "Epoch 26/100\n",
- "363/363 [==============================] - 0s 814us/step - loss: 0.3434 - val_loss: 0.3640\n",
- "Epoch 27/100\n",
- "363/363 [==============================] - 0s 805us/step - loss: 0.3428 - val_loss: 0.3643\n",
- "Epoch 28/100\n",
- "363/363 [==============================] - 0s 804us/step - loss: 0.3422 - val_loss: 0.3575\n",
- "Epoch 29/100\n",
- "363/363 [==============================] - 0s 826us/step - loss: 0.3395 - val_loss: 0.3584\n",
- "Epoch 30/100\n",
- "363/363 [==============================] - 0s 822us/step - loss: 0.3397 - val_loss: 0.3564\n",
- "Epoch 31/100\n",
- "363/363 [==============================] - 0s 813us/step - loss: 0.3380 - val_loss: 0.3563\n",
- "Epoch 32/100\n",
- "363/363 [==============================] - 0s 810us/step - loss: 0.3362 - val_loss: 0.3541\n",
- "Epoch 33/100\n",
- "363/363 [==============================] - 0s 826us/step - loss: 0.3366 - val_loss: 0.3518\n",
- "Epoch 34/100\n",
- "363/363 [==============================] - 0s 824us/step - loss: 0.3525 - val_loss: 0.3794\n",
- "Epoch 35/100\n",
- "363/363 [==============================] - 0s 813us/step - loss: 0.3368 - val_loss: 0.3485\n",
- "Epoch 36/100\n",
- "363/363 [==============================] - 0s 826us/step - loss: 0.3393 - val_loss: 0.3552\n",
- "Epoch 37/100\n",
- "363/363 [==============================] - 0s 824us/step - loss: 0.3458 - val_loss: 0.3571\n",
- "Epoch 38/100\n",
- "363/363 [==============================] - 0s 818us/step - loss: 0.3453 - val_loss: 0.3681\n",
- "Epoch 39/100\n",
- "363/363 [==============================] - 0s 815us/step - loss: 0.3352 - val_loss: 0.3475\n",
- "Epoch 40/100\n",
- "363/363 [==============================] - 0s 821us/step - loss: 0.3623 - val_loss: 0.4131\n"
- ]
- }
- ],
- "source": [
- "history = model.fit(x_train_scaled, y_train,\n",
- " validation_data = (x_valid_scaled, y_valid),\n",
- " epochs = 100,\n",
- " callbacks = callbacks)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "<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>0</th>\n",
- " </tr>\n",
- " </thead>\n",
- " <tbody>\n",
- " <tr>\n",
- " <th>0</th>\n",
- " <td>NaN</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>1</th>\n",
- " <td>-0.177860</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>2</th>\n",
- " <td>-0.029153</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>3</th>\n",
- " <td>-0.019061</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>4</th>\n",
- " <td>-0.012509</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>5</th>\n",
- " <td>-0.005047</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>6</th>\n",
- " <td>-0.011595</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>7</th>\n",
- " <td>0.001715</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>8</th>\n",
- " <td>-0.007277</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>9</th>\n",
- " <td>-0.004029</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>10</th>\n",
- " <td>-0.009408</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>11</th>\n",
- " <td>-0.000596</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>12</th>\n",
- " <td>-0.002325</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>13</th>\n",
- " <td>-0.003157</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>14</th>\n",
- " <td>-0.007837</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>15</th>\n",
- " <td>0.015586</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>16</th>\n",
- " <td>-0.018196</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>17</th>\n",
- " <td>0.003385</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>18</th>\n",
- " <td>-0.005923</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>19</th>\n",
- " <td>0.004336</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>20</th>\n",
- " <td>-0.009119</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>21</th>\n",
- " <td>0.009357</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>22</th>\n",
- " <td>-0.008908</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>23</th>\n",
- " <td>-0.000567</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>24</th>\n",
- " <td>-0.002293</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>25</th>\n",
- " <td>0.000529</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>26</th>\n",
- " <td>0.000278</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>27</th>\n",
- " <td>-0.006812</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>28</th>\n",
- " <td>0.000943</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>29</th>\n",
- " <td>-0.002013</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>30</th>\n",
- " <td>-0.000127</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>31</th>\n",
- " <td>-0.002156</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>32</th>\n",
- " <td>-0.002337</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>33</th>\n",
- " <td>0.027607</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>34</th>\n",
- " <td>-0.030894</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>35</th>\n",
- " <td>0.006756</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>36</th>\n",
- " <td>0.001852</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>37</th>\n",
- " <td>0.011062</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>38</th>\n",
- " <td>-0.020612</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>39</th>\n",
- " <td>0.065578</td>\n",
- " </tr>\n",
- " </tbody>\n",
- "</table>\n",
- "</div>"
- ],
- "text/plain": [
- " 0\n",
- "0 NaN\n",
- "1 -0.177860\n",
- "2 -0.029153\n",
- "3 -0.019061\n",
- "4 -0.012509\n",
- "5 -0.005047\n",
- "6 -0.011595\n",
- "7 0.001715\n",
- "8 -0.007277\n",
- "9 -0.004029\n",
- "10 -0.009408\n",
- "11 -0.000596\n",
- "12 -0.002325\n",
- "13 -0.003157\n",
- "14 -0.007837\n",
- "15 0.015586\n",
- "16 -0.018196\n",
- "17 0.003385\n",
- "18 -0.005923\n",
- "19 0.004336\n",
- "20 -0.009119\n",
- "21 0.009357\n",
- "22 -0.008908\n",
- "23 -0.000567\n",
- "24 -0.002293\n",
- "25 0.000529\n",
- "26 0.000278\n",
- "27 -0.006812\n",
- "28 0.000943\n",
- "29 -0.002013\n",
- "30 -0.000127\n",
- "31 -0.002156\n",
- "32 -0.002337\n",
- "33 0.027607\n",
- "34 -0.030894\n",
- "35 0.006756\n",
- "36 0.001852\n",
- "37 0.011062\n",
- "38 -0.020612\n",
- "39 0.065578"
- ]
- },
- "execution_count": 32,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "pd.DataFrame(history.history['val_loss']).diff(1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 33,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeMAAAEzCAYAAAACSWsXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAzxUlEQVR4nO3deZxcVZ3//9enqqur9yXd6U7S2clG6A7Z2IatExACKO4CCgOOio7iNvNlRMevOo6zKDPDzPy+yPJVB1E0MgwKX4kiQkJAASEhgewbSehsnc7W+1JV5/fHre5UOp10JV3kVlW/n4/Hfdylbt0+p2/S77rnnnvKnHOIiIiIfwJ+F0BERGS4UxiLiIj4TGEsIiLiM4WxiIiIzxTGIiIiPlMYi4iI+GzQMDazH5lZo5mtGWS/88wsYmYfSl3xREREsl8yV8YPAYtOtoOZBYHvAr9LQZlERESGlUHD2Dm3HDg4yG6fB/4HaExFoURERIaTId8zNrMa4P3AfUMvjoiIyPCTk4Jj/DvwFedczMxOuqOZ3Q7cDpCfnz9v3LhxKfjxnlgsRiCQXf3Rsq1Oqk96U33Sm+qT3pKtz6ZNm5qccyOPe8E5N+gETATWnOC1t4Dt8akVr6n6fYMdc968eS6Vli5dmtLjpYNsq5Pqk95Un/Sm+qS3ZOsDvOYGyMQhXxk75yb1LpvZQ8CvnXO/GupxRUREhotBw9jMfg7UA5Vm1gB8EwgBOOfuf0dLJyIiMgwMGsbOuZuSPZhz7rYhlUZERGQYSkUHLhERGQZ6enpoaGigs7NzyMcqLS1l/fr1KShVeuhfn7y8PMaOHUsoFErq/QpjERFJSkNDA8XFxUycOJHBnp4ZTEtLC8XFxSkqmf8S6+Oc48CBAzQ0NDBp0qRB3unJnn7lIiLyjurs7KSiomLIQZztzIyKiopTakFQGIuISNIUxMk51d+TwlhERDJGUVGR30V4RyiMRUREfKYwFhGRjOOc484776S2tpa6ujp+8YtfALBnzx4uu+wyZs+eTW1tLS+88ALRaJTbbrutb9977rnH59IfT72pRUQk4zz++OOsWrWK1atX09TUxHnnncdll13Gz372M66++mr+9m//lmg0Snt7O6tWrWLXrl2sWbMGgMOHD/tb+AEojEVE5JT93f9by7rdzaf9/mg0SjAYPGbbzDElfPM95yT1/hdffJGbbrqJYDBIdXU1l19+Oa+++irnnXcef/EXf0FPTw/ve9/7mD17NpMnT2bbtm18/vOf57rrruOqq6467XK/U9RMLSIiWeOyyy5j+fLl1NTUcNttt/Hwww9TXl7O6tWrqa+v5/777+eTn/yk38U8jq6MRUTklCV7BXsiQx3049JLL+WBBx7g1ltv5eDBgyxfvpy7776bHTt2MHbsWD71qU/R1dXFypUrufbaa8nNzeWDH/wg06dP5+abbx5S2d8JCmMREck473//+3nppZc499xzMTO+973vMWrUKH784x9z9913EwqFKCoq4uGHH2bXrl18/OMfJxaLAfBP//RPPpf+eApjERHJGK2trYA3qMbdd9/N3Xfffczrt956K7feeutx71u5cuUZKd/p0j1jERERnymMRUREfKYwFhER8ZnCWERExGcKYxEREZ8pjEVERHymMBYREfGZwlhERLLWyb7/ePv27dTW1p7B0pyYwlhERMRnCmMREckYd911F/fee2/f+re+9S2+853vcMUVVzB37lzq6up44oknTvm4nZ2dfPzjH6euro45c+awdOlSANauXcv555/P7NmzmTVrFps3b6atrY3rrruOc889l9ra2r7vUh4KDYcpIiKn7jd3wd43T/vt+dEIBPtF0Kg6uOafT/q+G264gS996Ut87nOfA+DRRx/l6aef5gtf+AIlJSU0NTVx4YUXcv3112NmSZfn3nvvxcx488032bBhA1dddRWbNm3i/vvv54tf/CIf+9jH6O7uJhqNsmTJEsaMGcNTTz0FwJEjR06t8gPQlbGIiGSMOXPm0NjYyO7du1m9ejXl5eWMGjWKr33ta8yaNYsrr7ySXbt2sW/fvlM67osvvtj3bU4zZsxgwoQJbNq0iYsuuoh//Md/5Lvf/S47duwgPz+furo6nnnmGb7yla/wwgsvUFpaOuR66cpYRERO3SBXsIPpGMJXKH74wx/mscceY+/evdxwww088sgj7N+/nxUrVhAKhZg4cSKdnZ1DKl+vj370o1xwwQU89dRTXHvttTzwwAMsXLiQlStXsmTJEr7+9a9zxRVX8OUvf3lIP0dhLCIiGeWGG27gU5/6FE1NTTz//PM8+uijVFVVEQqFWLp0KTt27DjlY1566aU88sgjLFy4kE2bNrFz506mT5/Otm3bmDx5Ml/4whfYuXMnb7zx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\n",
- "text/plain": [
- "<Figure size 576x360 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "def plot_learning_curves(history):\n",
- " pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
- " plt.grid(True)\n",
- " plt.gca().set_ylim(0, 1.4)\n",
- " plt.show()\n",
- "plot_learning_curves(history)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.37843212485313416"
- ]
- },
- "execution_count": 34,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.evaluate(x_test_scaled, y_test, verbose=0)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 35,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "-1.0"
- ]
- },
- "execution_count": 35,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "np.tanh(-1000)"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.6.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
- }
|