{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EmFhw2x12Mqe"
      },
      "source": [
        "# MSE vs MAE 回帰モデル比較\n",
        "\n",
        "このノートブックでは、線形回帰モデルを以下の2種類の損失関数で学習し、外れ値の影響を比較します。\n",
        "\n",
        "1. **MSE (Mean Squared Error; 二乗誤差)**\n",
        "2. **MAE (Mean Absolute Error; 絶対値誤差)**\n",
        "\n",
        "MSE は外れ値があるとその影響をより強く受け、MAE は外れ値に比較的ロバストな挙動を示します。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "RlFo_NMN2Mqh"
      },
      "outputs": [],
      "source": [
        "# ライブラリ読み込み\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn.linear_model import SGDRegressor\n",
        "\n",
        "# 疑似データセット生成用関数の定義\n",
        "def generate_linear_data(\n",
        "    num_samples=50, # データのサンプル数\n",
        "    slope=2.0,      # 真の直線(傾き)\n",
        "    intercept=5.0,  # 真の直線(切片)\n",
        "    noise_std=1.0,  # ノイズの標準偏差\n",
        "    num_outliers=2, # 外れ値の個数\n",
        "    outlier_magnitude=40.0, # 外れ値をどの程度離れた位置に置くか（大きいほど離れる）\n",
        "    random_seed=42  # 乱数シード\n",
        "):\n",
        "    \"\"\"\n",
        "    線形回帰モデルの例として、外れ値を含む疑似データを生成する関数。\n",
        "\n",
        "    Returns\n",
        "    -------\n",
        "    X : ndarray (shape: (num_samples,))\n",
        "        入力データ（説明変数）\n",
        "    y : ndarray (shape: (num_samples,))\n",
        "        出力データ（目的変数）\n",
        "    \"\"\"\n",
        "    np.random.seed(random_seed)\n",
        "\n",
        "    # Xを0から10まで等間隔に生成\n",
        "    X = np.linspace(0, 10, num_samples)\n",
        "    # 真の線形関係 + ガウスノイズ\n",
        "    y = slope * X + intercept + np.random.randn(num_samples) * noise_std\n",
        "\n",
        "    # 外れ値をランダムに選んだサンプルに付与\n",
        "    outlier_indices = np.random.choice(num_samples, size=num_outliers, replace=False)\n",
        "    for idx in outlier_indices:\n",
        "        y[idx] += outlier_magnitude\n",
        "\n",
        "    return X, y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 606
        },
        "id": "HxsGCPhP2Mqj",
        "outputId": "d22c7e48-ae49-4fd4-8385-d92e49db6ad1"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x500 with 1 Axes>"
            ],
            "image/png": "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cSjF0KFDcefOHezfvx8ODg549913kZycrFdunz59oFAosGvXLri7u2PNmjV44YUXcOXKFXh5eZn0HImIiKhyYLgth3vpaiSqcixdDaMMGjQIU6dORUJCAgDg0KFD2LJli164tbe3x8aNGzFixAisXr0ajRo1Qrt27dC/f3/Uq1dP73hTpkzBRx99pLds165deO6550qsQ7du3fDWW28BAKZPn45Vq1ahadOm6NOnj3jMli1bIikpCUqlEosXL8YLL7yAadOmAQBq1aqFmJgYfPrppxg6dCiuXLmCXbt24dixY2jatCkAYP369QgPDxfL/Oeff3Ds2DEkJyeLYX3RokXYsWMH/u///g8jR44sz8dJRERElRzDbTn4uD5pz2b5e27LysfHB927d8fGjRshCAK6d++OKlWqGGzXu3dvdO/eHX///TeOHj2KXbt2YeHChfjyyy/1bjx7//339d4DwDPPPFNqHQoHZD8/PwBARESEwbLk5GQolUpcvHgRL730kt4xWrdujSVLliA/Px8XL16Evb09GjduLK4PCwuDh4eH+P7MmTPIyMiAt7e33nGys7MRGxtban2JiIjIejHclkNZhwYUpdVqoVKp4ObmBqm04oc9Dx8+HGPGjAEArFixosTt5HI5OnbsiI4dO2LatGl48803MWPGDL0wW6VKFdSoUaNM5Ts4OIh/l0gkJS7TarVlOm5pMjIy4O/vr9dDrVM4BBMREZFtYbh9CnTp0gW5ubmQSCTo3Lmz0fvVrl0bO3bsqLiKlSA8PFxvCjKgYDhFrVq1YGdnh7CwMOTl5eHff/8VhyVcvnwZqamp4vaNGjVCYmIi7O3tERwcbMbaExERkSUx3D4F7OzscPHiRfHvRT148AB9+vTB8OHDUa9ePbi6uuLEiRNYuHChwfCA9PR0JCYm6i1zcnKCm5ubyer73nvvoWnTpvj444/Rr18/HDlyBMuXL8fKlSsBAM8++yy6dOmCt956C6tWrYK9vT3Gjx8vTncGAJGRkWjZsiV69eqFhQsXolatWrhz5w5+//13vPzyy2jSpInJ6ktERESVB6cCe0q4ubmVGEBdXFzQvHlzfP7552jbti3q1q2LadOmYcSIEVi+fLnettOnT4e/v7/ea/LkySata6NGjfDDDz9gy5YtqFu3LqZPn47Zs2frDY/YsGEDAgIC0K5dO7zyyisY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iYiIiMhmMNwSERERkc1guCUiIiIim8FwS0RkA/Lz89GqVSu88soresvT0tIQGBiI//3vfxaqGRGRefHxu0RENuLKlSto0KAB1q1bh4EDBwIABg8ejDNnzuD48eNwdHS0cA2JiCoewy0RkQ1ZunQpZs6ciQsXLuDYsWPo06cPjh8/jvr161u6akREZsFwS0RkQwRBQIcOHWBnZ4dz585h7Nix+OijjyxdLSIis2G4JSKyMZcuXUJ4eDgiIiJw8uRJ2NvbW7pKRERmwxvKiIhszFdffQUnJyfExcXh1q1blq4OEZFZseeWiMiGHD58GO3atcOff/6JOXPmAAD27NkDiURi4ZoREZkHe26JiGxEVlYWhg4dirfffhvt27fH+vXrcezYMaxevdrSVSMiMhv23BIR2Yhx48Zh586dOHPmDJycnAAAa9aswaRJk3Du3DkEBwdbtoJERGbAcEtEZAP++usvvPDCCzhw4ADatGmjt65z587Iy8vj8AQieiow3BIRERGRzeCYWyIiIiKyGQy3RERERGQzGG6JiIiIyGYw3BIRERGRzWC4JSIiIiKbwXBLRERERDaD4ZaIiIiIbAbDLRERERHZDIZbIiIiIrIZDLdEREREZDMYbomIiIjIZvw/3tu0R8TFfHgAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "--- MSE (squared_error) ---\n",
            "Coefficient (slope): 3.521\n",
            "Intercept: 0.858\n",
            "\n",
            "--- MAE (absolute_error) ---\n",
            "Coefficient (slope): 2.558\n",
            "Intercept: 1.882\n"
          ]
        }
      ],
      "source": [
        "# データ生成と MSE vs MAE 回帰モデルの可視化\n",
        "\n",
        "num_samples = 20 # サンプル数\n",
        "num_outliers = 1 # 外れ値の個数\n",
        "\n",
        "\n",
        "# 1. データ生成\n",
        "X, y = generate_linear_data(\n",
        "    num_samples=num_samples,  # サンプル数\n",
        "    slope=2.0,           # 真の傾き\n",
        "    intercept=5.0,       # 真の切片\n",
        "    noise_std=1.0,       # ノイズのばらつき\n",
        "    num_outliers=num_outliers, # 外れ値の個数\n",
        "    outlier_magnitude=100,# 外れ値の大きさ\n",
        "    random_seed=0        # 乱数シード(固定生成)\n",
        ")\n",
        "\n",
        "# 2. MSE (二乗誤差) モデルの学習\n",
        "model_mse = SGDRegressor(\n",
        "    loss='squared_error',  # MSE\n",
        "    max_iter=1000,\n",
        "    tol=1e-3,\n",
        "    random_state=0\n",
        ")\n",
        "model_mse.fit(X.reshape(-1, 1), y)\n",
        "\n",
        "# 3. MAE (絶対値誤差) モデルの学習\n",
        "# ただし epsilon_insensitive で代替\n",
        "model_mae = SGDRegressor(\n",
        "    loss=\"epsilon_insensitive\", # ≒ epsilon=0.0とすることでMAE相当\n",
        "    epsilon=0.0,         # 絶対値損失に近くなるように epsilon=0\n",
        "    max_iter=1000,\n",
        "    tol=1e-3,\n",
        "    random_state=0\n",
        ")\n",
        "model_mae.fit(X.reshape(-1, 1), y)\n",
        "\n",
        "# 4. 予測および可視化\n",
        "X_plot = np.linspace(0, 10, 100)\n",
        "y_pred_mse = model_mse.predict(X_plot.reshape(-1, 1))\n",
        "y_pred_mae = model_mae.predict(X_plot.reshape(-1, 1))\n",
        "\n",
        "plt.figure(figsize=(8, 5))\n",
        "plt.scatter(X, y, color='black', alpha=0.7, label='Data (including outliers)')\n",
        "plt.plot(X_plot, y_pred_mse, label='MSE model', linewidth=2)\n",
        "plt.plot(X_plot, y_pred_mae, label='MAE model', linewidth=2)\n",
        "plt.title('Comparison of MSE vs MAE Regression')\n",
        "plt.xlabel('X')\n",
        "plt.ylabel('y')\n",
        "plt.legend()\n",
        "plt.grid(True)\n",
        "plt.show()\n",
        "\n",
        "# 5. 回帰係数の確認\n",
        "print('--- MSE (squared_error) ---')\n",
        "print(f'Coefficient (slope): {model_mse.coef_[0]:.3f}')\n",
        "print(f'Intercept: {model_mse.intercept_[0]:.3f}')\n",
        "\n",
        "print('\\n--- MAE (absolute_error) ---')\n",
        "print(f'Coefficient (slope): {model_mae.coef_[0]:.3f}')\n",
        "print(f'Intercept: {model_mae.intercept_[0]:.3f}')"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    },
    "colab": {
      "provenance": []
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}