|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- {
- "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": [
- "<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, 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
- }
|