{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "intro",
   "metadata": {},
   "source": [
    "# 04　予測と答え合わせ\n",
    "\n",
    "FUJIMOTO LAB 深層学習コース。Web教材の図と説明を読んでから実行してください。Pythonの計算はColabの実行環境で行います。\n",
    "\n",
    "**この回の目標**：学習用とテスト用を時間順に分ける理由を言える\n",
    "\n",
    "このノートブックは小さな合成データを使用し、元の教材の固定Driveパスや動画を必要としません。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "predict",
   "metadata": {},
   "source": [
    "## 1　まず予想する\n",
    "\n",
    "コードを実行する前に、表示される値や形を予想してください。"
   ]
  },
  {
   "cell_type": "code",
   "id": "demo-one",
   "metadata": {},
   "source": [
    "import numpy as np\n",
    "from sklearn.linear_model import LinearRegression\n",
    "day = np.arange(1,13).reshape(-1,1)\n",
    "temp = np.array([17,18,18,20,21,21,23,24,24,26,27,28])\n",
    "model = LinearRegression().fit(day[:8], temp[:8])\n",
    "print(np.round(model.predict(day[8:]),1))"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "explain-one",
   "metadata": {},
   "source": [
    "**確かめ方**：fitに渡したのは最初の8日分だけです。後半は学習に使っていません。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "part-two",
   "metadata": {},
   "source": [
    "## 2　予測のずれを見る\n",
    "\n",
    "予測値と実際の値の差を見れば、モデルの得意・不得意が分かります。"
   ]
  },
  {
   "cell_type": "code",
   "id": "demo-two",
   "metadata": {},
   "source": [
    "pred = model.predict(day[8:])\n",
    "print(round(np.abs(pred-temp[8:]).mean(),2))"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "explain-two",
   "metadata": {},
   "source": [
    "**結果を読む**：差の絶対値を平均すると、ずれの大きさを同じ単位で読めます。未来の保証ではありません。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "experiment",
   "metadata": {},
   "source": [
    "## 3　値を変えて比べる\n",
    "\n",
    "次のセルでは、表示される値や条件を変えて、何が結果を決めるかを確かめます。長くかかる実験は、少数の合成データで行います。"
   ]
  },
  {
   "cell_type": "code",
   "id": "lab",
   "metadata": {},
   "source": [
    "# 予測と正解を同じ表で確かめる\n",
    "for d,actual,estimate in zip(day[8:,0],temp[8:],pred):\n",
    "    print(f'{d}日目 正解={actual:.1f} 予測={estimate:.1f}')\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "extra-guide-1",
   "metadata": {},
   "source": [
    "## 追加実習 1　単純な予測とも比べる\n",
    "\n",
    "機械学習の結果だけを見ると良し悪しを判断しづらいので、最後に観測した気温をそのまま予測する方法と比較します。\n",
    "\n",
    "**実行前に予想**：何が変わり、何が変わらないでしょうか。"
   ]
  },
  {
   "cell_type": "code",
   "id": "extra-code-1",
   "metadata": {},
   "source": [
    "baseline = np.full_like(temp[8:], temp[7])\n",
    "model_error = np.abs(pred - temp[8:]).mean()\n",
    "baseline_error = np.abs(baseline - temp[8:]).mean()\n",
    "print('回帰の平均絶対誤差:', round(model_error, 2))\n",
    "print('単純な予測の平均絶対誤差:', round(baseline_error, 2))\n",
    "print('テストの実測値:', temp[8:])\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "extra-reflect-1",
   "metadata": {},
   "source": [
    "**確認**：予想と違った点を一つ書き、値を一つ変えて再実行してください。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "reflection",
   "metadata": {},
   "source": [
    "## 自分の言葉で答えよう\n",
    "\n",
    "翌日の気温を予測するとき、テスト用は？\n",
    "\n",
    "- まず予想を書く\n",
    "- コードのどの行が答えを決めるか指す\n",
    "- 条件や値を1つ変えて、予想と実行結果を比べる\n",
    "\n",
    "**ヒント**：未来を知っていたことにしないため、後ろの日付を残します。"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "name": "04-prediction.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
