{ "cells": [ { "cell_type": "code", "execution_count": 1, "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.2.1\n", "numpy 1.18.5\n", "pandas 1.0.4\n", "sklearn 0.23.1\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": 2, "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": 3, "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", "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", "print(x_train.shape, y_train.shape)\n", "print(x_valid.shape, y_valid.shape)\n", "print(x_test.shape, y_test.shape)\n" ] }, { "cell_type": "code", "execution_count": 4, "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": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"wide_deep_model_2\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "dense_6 (Dense) multiple 270 \n", "_________________________________________________________________\n", "dense_7 (Dense) multiple 930 \n", "_________________________________________________________________\n", "dense_8 (Dense) multiple 39 \n", "=================================================================\n", "Total params: 1,239\n", "Trainable params: 1,239\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "None\n" ] } ], "source": [ "# 子类API\n", "#Model类的介绍看下面\n", "# https://tensorflow.google.cn/api_docs/python/tf/keras/Model\n", "#其实就是将原有面向过程的代码,改为面向对象\n", "class WideDeepModel(keras.models.Model):\n", " def __init__(self):\n", " super(WideDeepModel, self).__init__()\n", " \"\"\"定义模型的层次\"\"\"\n", " #初始化了3个全连接层的层对象\n", " self.hidden1_layer = keras.layers.Dense(30, activation='relu')\n", " self.hidden2_layer = keras.layers.Dense(30, activation='relu')\n", " self.output_layer = keras.layers.Dense(1)\n", " \n", " def call(self, input):\n", " \"\"\"完成模型的正向计算(搭建),call是被build方法调用的\"\"\"\n", " #这里的input是输入的特征形状\n", " hidden1 = self.hidden1_layer(input)\n", " hidden2 = self.hidden2_layer(hidden1)\n", " concat = keras.layers.concatenate([input, hidden2])\n", " output = self.output_layer(concat)\n", " return output\n", "\n", "model = WideDeepModel()\n", "#下面这种也可以,和model = WideDeepModel()是没有打印细节\n", "# model = keras.models.Sequential([\n", "# WideDeepModel(),\n", "# ])\n", "#build等价于调用call,29行和30行是等价的\n", "# model(input_shape=(None, 8))\n", "model.build(input_shape=(None, 8))\n", " \n", "print(model.summary())\n", "model.compile(loss=\"mean_squared_error\",\n", " optimizer = keras.optimizers.SGD(0.001))\n", "callbacks = [keras.callbacks.EarlyStopping(\n", " patience=5, min_delta=1e-2)]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100\n", "363/363 [==============================] - 1s 3ms/step - loss: 2.8035 - val_loss: 1.0274\n", "Epoch 2/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.7387 - val_loss: 0.6841\n", "Epoch 3/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.6182 - val_loss: 0.6414\n", "Epoch 4/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5884 - val_loss: 0.6184\n", "Epoch 5/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5689 - val_loss: 0.6016\n", "Epoch 6/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5555 - val_loss: 0.5885\n", "Epoch 7/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5444 - val_loss: 0.5785\n", "Epoch 8/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5350 - val_loss: 0.5679\n", "Epoch 9/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5276 - val_loss: 0.5606\n", "Epoch 10/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5214 - val_loss: 0.5531\n", "Epoch 11/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5158 - val_loss: 0.5499\n", "Epoch 12/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5110 - val_loss: 0.5429\n", "Epoch 13/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5059 - val_loss: 0.5385\n", "Epoch 14/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.5008 - val_loss: 0.5325\n", "Epoch 15/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4973 - val_loss: 0.5282\n", "Epoch 16/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4933 - val_loss: 0.5243\n", "Epoch 17/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4890 - val_loss: 0.5195\n", "Epoch 18/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4858 - val_loss: 0.5162\n", "Epoch 19/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4830 - val_loss: 0.5129\n", "Epoch 20/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4794 - val_loss: 0.5113\n", "Epoch 21/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4764 - val_loss: 0.5058\n", "Epoch 22/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4734 - val_loss: 0.5035\n", "Epoch 23/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4707 - val_loss: 0.4990\n", "Epoch 24/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.4676 - val_loss: 0.4974\n", "Epoch 25/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4657 - val_loss: 0.4938\n", "Epoch 26/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4632 - val_loss: 0.4917\n", "Epoch 27/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4600 - val_loss: 0.4888\n", "Epoch 28/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4579 - val_loss: 0.4864\n", "Epoch 29/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4554 - val_loss: 0.4835\n", "Epoch 30/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4529 - val_loss: 0.4804\n", "Epoch 31/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4505 - val_loss: 0.4786\n", "Epoch 32/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4483 - val_loss: 0.4758\n", "Epoch 33/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4461 - val_loss: 0.4749\n", "Epoch 34/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4431 - val_loss: 0.4708\n", "Epoch 35/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4414 - val_loss: 0.4681\n", "Epoch 36/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.4394 - val_loss: 0.4661\n", "Epoch 37/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4383 - val_loss: 0.4651\n", "Epoch 38/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4354 - val_loss: 0.4635\n", "Epoch 39/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4335 - val_loss: 0.4605\n", "Epoch 40/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4319 - val_loss: 0.4587\n", "Epoch 41/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4293 - val_loss: 0.4571\n", "Epoch 42/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4274 - val_loss: 0.4542\n", "Epoch 43/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4254 - val_loss: 0.4520\n", "Epoch 44/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4242 - val_loss: 0.4504\n", "Epoch 45/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4219 - val_loss: 0.4490\n", "Epoch 46/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4198 - val_loss: 0.4473\n", "Epoch 47/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4196 - val_loss: 0.4449\n", "Epoch 48/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4173 - val_loss: 0.4432\n", "Epoch 49/100\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.4154 - val_loss: 0.4417\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": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe0AAAEzCAYAAAAcgFukAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deZxddZ3n/9fn7rVlTyohCUlYAySQSEAYFArQgNCC/mwHEByw1fQouMyvm2m0+4cOLq3y6La7p7EhozTiKIEfjd0ooSGtFMuwmICBJCwhiUCqyL7Wfrfv/HHOrbpVqUrdqjqhcuq8n4/HeZz93O/9kuLz3c73mnMOEREROfrFRjsBIiIiUhkFbRERkZBQ0BYREQkJBW0REZGQUNAWEREJCQVtERGRkBg0aJvZbDN7wsxeNbMNZvaVfq4xM/sHM9tkZq+Y2fvKzl1vZm/6y/VBfwEREZGosMHe0zazGcAM59xLZlYHvAh8zDn3atk1lwFfAi4D3g/8vXPu/WY2CVgDLAGcf++Zzrl9R+TbiIiIjGGD1rSdc9uccy/52y3Aa8DMPpddCdzrPM8DE/xgfwmwyjm31w/Uq4BLA/0GIiIiETGkPm0zmwssBl7oc2omsLVsv8k/NtBxERERGaJEpReaWS3wL8BXnXMHg06ImS0DlgFUVVWdOXv27MCeXSwWicVi7Ol0tOUcx9Zp/N1IlPJTgqM8DZ7yNFjKz+CV5+nGjRt3O+emDnZPRUHbzJJ4AfvnzrmH+rmkGSiPsrP8Y81AQ5/jjf19hnNuObAcYMmSJW7NmjWVJK0ijY2NNDQ08O1fv8p9v3uHDbephX4kSvkpwVGeBk95GizlZ/DK89TM3q7knkpGjxvwE+A159zfDnDZw8B/8UeRnwMccM5tAx4DlprZRDObCCz1j42KdDJGV744Wh8vIiIyIpXUtM8DPg2sM7O1/rGvA8cCOOfuBFbijRzfBLQDn/HP7TWzbwGr/ftuc87tDS75Q5OKx8kXHYWiIx6z0UqGiIjIsAwatJ1zzwCHjXDOe2/sxgHO3Q3cPazUBSyd9BoWsvkiVan4KKdGRERkaCoeiDYWpBNe0O7KFxS0RUQClMvlaGpqorOzc7STclTLZDLMmjWLZDI5rPsjFbRT3UFb/doiIkFqamqirq6OuXPn4g2Fkr6cc+zZs4empibmzZs3rGdEavx+OuHVrrtyCtoiIkHq7Oxk8uTJCtiHYWZMnjx5RK0REQvafp92oTDKKRERGXsUsAc30jyKZNDuVE1bRGTMqa2tHe0kHHGRCtrq0xYRkTCLVNAu9WlnFbRFRMYs5xw333wzCxYsYOHChdx///0AbNu2jfPPP59FixaxYMECnn76aQqFAjfccEP3tT/84Q9HOfWHF6nR46X3tLvy6tMWERmrHnroIdauXcvLL7/M7t27Oeusszj//PP5xS9+wSWXXMJf/uVfUigUaG9vZ+3atTQ3N7N+/XoA9u/fP8qpP7xIBe1UXM3jIiJH2v/41QZefTfY35U69ZhxfOOjp1V07TPPPMM111xDPB6nvr6eCy64gNWrV3PWWWfxJ3/yJ+RyOT72sY+xaNEijjvuOLZs2cKXvvQlLr/8cpYuXRpouoMWqebxTFJBW0Qkqs4//3yeeuopZs6cyQ033MC9997LxIkTefnll2loaODOO+/kc5/73Ggn87AiVdNWn7aIyJFXaY34SPngBz/IXXfdxfXXX8/evXt56qmnuP3223n77beZNWsWn//85+nq6uKll17isssuI5VK8YlPfIKTTz6Z6667blTTPpiIBW31aYuIjHUf//jHee655zjjjDMwM37wgx8wffp0fvrTn3L77beTTCapra3l3nvvpbm5mc985jMUi15l7q//+q9HOfWHF6mg3f3Kl97TFhEZc1pbWwFvApPbb7+d22+/vdf566+/nuuvv/6Q+1566aX3JH1BiFSfdnfzeEFBW0REwidSQVs1bRERCbNIBe14zEjETH3aIiISSpEK2uANRtMrXyIiEkbRC9rJuF75EhGRUIpe0E7E1DwuIiKhFLmgnVLzuIiIhFTkgnY6EVPzuIhIxB3ut7ffeustFixY8B6mpnIRDNpx1bRFRCSUIhe0U+rTFhEZc2655RbuuOOO7v1vfvObfPvb3+biiy/mfe97HwsXLuTf/u3fhvzczs5OPvOZz7Bw4UIWL17ME088AcCGDRs4++yzWbRoEaeffjpvvvkmbW1tXH755ZxxxhksWLCg+3e8gxSpaUzBH4imyVVERI6cR2+B7euCfeb0hfCR7w14+qqrruKrX/0qN954IwAPPPAAjz32GF/+8pcZN24cu3fv5pxzzuGKK67AzCr+2DvuuAMzY926dbz++uss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\n", "text/plain": [ "
" ] }, "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, 2)\n", " plt.show()\n", "plot_learning_curves(history)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.43126633763313293" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.evaluate(x_test_scaled, y_test, verbose=0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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 }