{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# sklearn-fab"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## データ準備"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "まず、学習用のデータを確認します。\n",
    "\n",
    "本ノートブックでは、中古車の販売価格を示すデータを使用します。\n",
    "\n",
    "データの詳細については、以下をご覧ください。\n",
    "\n",
    "[Automobile Data Set][1]\n",
    "\n",
    "[1]:https://archive.ics.uci.edu/ml/datasets/Automobile"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "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>price</th>\n",
       "      <th>symboling</th>\n",
       "      <th>normalized-losses</th>\n",
       "      <th>num-of-doors</th>\n",
       "      <th>wheel-base</th>\n",
       "      <th>length</th>\n",
       "      <th>width</th>\n",
       "      <th>height</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>12964</td>\n",
       "      <td>3</td>\n",
       "      <td>145.0</td>\n",
       "      <td>two</td>\n",
       "      <td>95.9</td>\n",
       "      <td>173.2</td>\n",
       "      <td>66.3</td>\n",
       "      <td>50.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10198</td>\n",
       "      <td>0</td>\n",
       "      <td>89.0</td>\n",
       "      <td>four</td>\n",
       "      <td>97.0</td>\n",
       "      <td>173.5</td>\n",
       "      <td>65.4</td>\n",
       "      <td>53.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>11245</td>\n",
       "      <td>0</td>\n",
       "      <td>115.0</td>\n",
       "      <td>four</td>\n",
       "      <td>98.8</td>\n",
       "      <td>177.8</td>\n",
       "      <td>66.5</td>\n",
       "      <td>55.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14399</td>\n",
       "      <td>0</td>\n",
       "      <td>108.0</td>\n",
       "      <td>four</td>\n",
       "      <td>100.4</td>\n",
       "      <td>184.6</td>\n",
       "      <td>66.5</td>\n",
       "      <td>56.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>25552</td>\n",
       "      <td>-1</td>\n",
       "      <td>93.0</td>\n",
       "      <td>four</td>\n",
       "      <td>110.0</td>\n",
       "      <td>190.9</td>\n",
       "      <td>70.3</td>\n",
       "      <td>56.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   price  symboling  normalized-losses num-of-doors  wheel-base  length  \\\n",
       "0  12964          3              145.0          two        95.9   173.2   \n",
       "1  10198          0               89.0         four        97.0   173.5   \n",
       "2  11245          0              115.0         four        98.8   177.8   \n",
       "3  14399          0              108.0         four       100.4   184.6   \n",
       "4  25552         -1               93.0         four       110.0   190.9   \n",
       "\n",
       "   width  height  \n",
       "0   66.3    50.2  \n",
       "1   65.4    53.0  \n",
       "2   66.5    55.5  \n",
       "3   66.5    56.1  \n",
       "4   70.3    56.5  "
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "train_data = pd.read_csv('../data/train_data.csv')\n",
    "train_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上記のデータについて、以下の前処理を実施します。\n",
    "\n",
    "- num-of-doorsはカテゴリ変数のため、二値展開\n",
    "- num-of-doorsを除く変数は数値データであるため、標準化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二値展開"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "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>price</th>\n",
       "      <th>symboling</th>\n",
       "      <th>normalized-losses</th>\n",
       "      <th>wheel-base</th>\n",
       "      <th>length</th>\n",
       "      <th>width</th>\n",
       "      <th>height</th>\n",
       "      <th>num-of-doors_four</th>\n",
       "      <th>num-of-doors_two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>12964</td>\n",
       "      <td>3</td>\n",
       "      <td>145.0</td>\n",
       "      <td>95.9</td>\n",
       "      <td>173.2</td>\n",
       "      <td>66.3</td>\n",
       "      <td>50.2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10198</td>\n",
       "      <td>0</td>\n",
       "      <td>89.0</td>\n",
       "      <td>97.0</td>\n",
       "      <td>173.5</td>\n",
       "      <td>65.4</td>\n",
       "      <td>53.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>11245</td>\n",
       "      <td>0</td>\n",
       "      <td>115.0</td>\n",
       "      <td>98.8</td>\n",
       "      <td>177.8</td>\n",
       "      <td>66.5</td>\n",
       "      <td>55.5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14399</td>\n",
       "      <td>0</td>\n",
       "      <td>108.0</td>\n",
       "      <td>100.4</td>\n",
       "      <td>184.6</td>\n",
       "      <td>66.5</td>\n",
       "      <td>56.1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>25552</td>\n",
       "      <td>-1</td>\n",
       "      <td>93.0</td>\n",
       "      <td>110.0</td>\n",
       "      <td>190.9</td>\n",
       "      <td>70.3</td>\n",
       "      <td>56.5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   price  symboling  normalized-losses  wheel-base  length  width  height  \\\n",
       "0  12964          3              145.0        95.9   173.2   66.3    50.2   \n",
       "1  10198          0               89.0        97.0   173.5   65.4    53.0   \n",
       "2  11245          0              115.0        98.8   177.8   66.5    55.5   \n",
       "3  14399          0              108.0       100.4   184.6   66.5    56.1   \n",
       "4  25552         -1               93.0       110.0   190.9   70.3    56.5   \n",
       "\n",
       "   num-of-doors_four  num-of-doors_two  \n",
       "0                  0                 1  \n",
       "1                  1                 0  \n",
       "2                  1                 0  \n",
       "3                  1                 0  \n",
       "4                  1                 0  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def binary_expand(data):\n",
    "    binary_data = pd.get_dummies(data.select_dtypes(include=[object]))\n",
    "    numerical_data = data.select_dtypes(exclude=[object])\n",
    "    data = numerical_data.join(binary_data)\n",
    "\n",
    "    return data\n",
    "\n",
    "train_data = binary_expand(train_data)\n",
    "train_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 標準化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "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>price</th>\n",
       "      <th>symboling</th>\n",
       "      <th>normalized-losses</th>\n",
       "      <th>wheel-base</th>\n",
       "      <th>length</th>\n",
       "      <th>width</th>\n",
       "      <th>height</th>\n",
       "      <th>num-of-doors_four</th>\n",
       "      <th>num-of-doors_two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.284679</td>\n",
       "      <td>1.811656</td>\n",
       "      <td>0.618145</td>\n",
       "      <td>-0.436458</td>\n",
       "      <td>0.083628</td>\n",
       "      <td>0.350742</td>\n",
       "      <td>-1.512881</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.203075</td>\n",
       "      <td>-0.625845</td>\n",
       "      <td>-0.924055</td>\n",
       "      <td>-0.221660</td>\n",
       "      <td>0.110246</td>\n",
       "      <td>-0.109542</td>\n",
       "      <td>-0.336858</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.018448</td>\n",
       "      <td>-0.625845</td>\n",
       "      <td>-0.208033</td>\n",
       "      <td>0.129829</td>\n",
       "      <td>0.491759</td>\n",
       "      <td>0.453028</td>\n",
       "      <td>0.713163</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.537726</td>\n",
       "      <td>-0.625845</td>\n",
       "      <td>-0.400808</td>\n",
       "      <td>0.442264</td>\n",
       "      <td>1.095083</td>\n",
       "      <td>0.453028</td>\n",
       "      <td>0.965168</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2.504436</td>\n",
       "      <td>-1.438345</td>\n",
       "      <td>-0.813897</td>\n",
       "      <td>2.316871</td>\n",
       "      <td>1.654045</td>\n",
       "      <td>2.396452</td>\n",
       "      <td>1.133171</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      price  symboling  normalized-losses  wheel-base    length     width  \\\n",
       "0  0.284679   1.811656           0.618145   -0.436458  0.083628  0.350742   \n",
       "1 -0.203075  -0.625845          -0.924055   -0.221660  0.110246 -0.109542   \n",
       "2 -0.018448  -0.625845          -0.208033    0.129829  0.491759  0.453028   \n",
       "3  0.537726  -0.625845          -0.400808    0.442264  1.095083  0.453028   \n",
       "4  2.504436  -1.438345          -0.813897    2.316871  1.654045  2.396452   \n",
       "\n",
       "     height  num-of-doors_four  num-of-doors_two  \n",
       "0 -1.512881                  0                 1  \n",
       "1 -0.336858                  1                 0  \n",
       "2  0.713163                  1                 0  \n",
       "3  0.965168                  1                 0  \n",
       "4  1.133171                  1                 0  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "std_list = ['price', 'symboling', 'normalized-losses', 'wheel-base', 'length', 'width', 'height']\n",
    "scaler = StandardScaler()\n",
    "train_data.loc[:, std_list] = pd.DataFrame(scaler.fit_transform(train_data.loc[:, std_list]),\n",
    "                                           columns=train_data.loc[:, std_list].columns.values)\n",
    "train_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "次に、予測用データを読み込み、学習用データと同様に前処理を実施します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "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>price</th>\n",
       "      <th>symboling</th>\n",
       "      <th>normalized-losses</th>\n",
       "      <th>wheel-base</th>\n",
       "      <th>length</th>\n",
       "      <th>width</th>\n",
       "      <th>height</th>\n",
       "      <th>num-of-doors_four</th>\n",
       "      <th>num-of-doors_two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.883744</td>\n",
       "      <td>0.186655</td>\n",
       "      <td>-0.979133</td>\n",
       "      <td>-0.475513</td>\n",
       "      <td>-1.202871</td>\n",
       "      <td>-1.030111</td>\n",
       "      <td>0.293154</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.199174</td>\n",
       "      <td>1.811656</td>\n",
       "      <td>0.755842</td>\n",
       "      <td>0.188411</td>\n",
       "      <td>1.272531</td>\n",
       "      <td>0.453028</td>\n",
       "      <td>0.965168</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.114355</td>\n",
       "      <td>0.999156</td>\n",
       "      <td>0.315213</td>\n",
       "      <td>0.051721</td>\n",
       "      <td>0.349801</td>\n",
       "      <td>-0.007257</td>\n",
       "      <td>-0.336858</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.035159</td>\n",
       "      <td>0.999156</td>\n",
       "      <td>0.315213</td>\n",
       "      <td>0.051721</td>\n",
       "      <td>0.349801</td>\n",
       "      <td>-0.007257</td>\n",
       "      <td>-0.756866</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.685556</td>\n",
       "      <td>-0.625845</td>\n",
       "      <td>0.618145</td>\n",
       "      <td>2.902686</td>\n",
       "      <td>2.425944</td>\n",
       "      <td>2.038453</td>\n",
       "      <td>-0.420860</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      price  symboling  normalized-losses  wheel-base    length     width  \\\n",
       "0 -0.883744   0.186655          -0.979133   -0.475513 -1.202871 -1.030111   \n",
       "1  1.199174   1.811656           0.755842    0.188411  1.272531  0.453028   \n",
       "2  1.114355   0.999156           0.315213    0.051721  0.349801 -0.007257   \n",
       "3  0.035159   0.999156           0.315213    0.051721  0.349801 -0.007257   \n",
       "4  3.685556  -0.625845           0.618145    2.902686  2.425944  2.038453   \n",
       "\n",
       "     height  num-of-doors_four  num-of-doors_two  \n",
       "0  0.293154                  0                 1  \n",
       "1  0.965168                  0                 1  \n",
       "2 -0.336858                  0                 1  \n",
       "3 -0.756866                  0                 1  \n",
       "4 -0.420860                  1                 0  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predict_data = pd.read_csv('../data/predict_data.csv')\n",
    "predict_data = binary_expand(predict_data)\n",
    "predict_data.loc[:, std_list] = pd.DataFrame(scaler.transform(predict_data.loc[:, std_list]),\n",
    "                                             columns=predict_data.loc[:, std_list].columns.values)\n",
    "predict_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "学習用および予測用の説明変数をそれぞれX_train, X_predict、目的変数をそれぞれy_train, y_predictとして定義しておきます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = train_data.iloc[:, 1:]\n",
    "y_train = train_data.iloc[:, 0]\n",
    "X_predict = predict_data.iloc[:, 1:]\n",
    "y_predict = predict_data.iloc[:, 0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分析手順の設計"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "目的変数priceは連続値であるため、回帰用のestimatorである「SklearnFABBernGateLinearRegressor」を選択します。\n",
    "\n",
    "学習を行う際に、以下のパラメーターを指定します。\n",
    "\n",
    "random_seed\n",
    "\n",
    "- estimatorで使用される乱数シードです。\n",
    "\n",
    "tree_depth\n",
    "\n",
    "- 門木の深さを設定するパラメーターです。\n",
    "\n",
    "shrink_threshold\n",
    "\n",
    "- 門木の枝刈りの閾値を設定するパラメーターです。\n",
    "\n",
    "random_seed, tree_depth, shrink_thresholdの詳細は、「sklearn-fab Reference v1.1.0」をご覧ください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn_fab import SklearnFABBernGateLinearRegressor\n",
    "\n",
    "random_seed = 0\n",
    "tree_depth = 3\n",
    "shrink_threshold = 2.0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "estimatorインスタンスを作成します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "estimator = SklearnFABBernGateLinearRegressor(random_seed=random_seed,\n",
    "                                              tree_depth=tree_depth,\n",
    "                                              shrink_threshold=shrink_threshold)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 学習、予測"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "学習を実行します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SklearnFABBernGateLinearRegressor(base_model_dict=None,\n",
       "                                  comp_backward_step=False,\n",
       "                                  comp_bias_max_scale=0.75,\n",
       "                                  comp_bias_min_scale=0.25,\n",
       "                                  comp_foba_skip='power_of_two',\n",
       "                                  comp_foba_skip_max_interval=25,\n",
       "                                  comp_l2_regularize=0.0, comp_opt_mode='opt',\n",
       "                                  comp_two_stage_opt=False,\n",
       "                                  comp_variance_max_scale=0.25,\n",
       "                                  comp_variance_min_scale=0.1,\n",
       "                                  comp_weights_max_scale=0.5,\n",
       "                                  comp_we...\n",
       "                                  gate_opt_mode='opt',\n",
       "                                  max_comp_foba_iterations=100,\n",
       "                                  max_comp_relevant_features=100,\n",
       "                                  max_fab_iterations=100,\n",
       "                                  num_acceleration_steps=0, num_threads_comps=1,\n",
       "                                  num_threads_gate_features=1,\n",
       "                                  num_threads_gates=1, projection_estep=False,\n",
       "                                  random_seed=0, repeat_until_convergence=False,\n",
       "                                  shrink_threshold=2.0, start_from_mstep=False,\n",
       "                                  tree_depth=3,\n",
       "                                  with_comp_scaled_l0_regularize=True)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "estimator.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "予測を実行します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "predict_value = estimator.predict(X_predict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## モデルバリデーション"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 予測精度の確認"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "作成したモデルを評価するため、予測精度を確認します。\n",
    "\n",
    "評価指標として、RMSEを選定します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6509250433352727"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import mean_squared_error\n",
    "\n",
    "test_rmse = mean_squared_error(y_predict, predict_value, squared=False)\n",
    "test_rmse"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 門木の可視化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "モデルがもつ門木を可視化します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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AUE+Pngc7l1OzsAjb3NypKWkAr29mTExg79GI18xuXFx5bdvf9MmRqi4utpl48by5ubEpKTJvFhAZGhoNPr27duzZs+etWvX06Qkfm9uANwFPsXbXQDZurSkJABAV01NQ0lJkN1KqpuapmzdSu3tjYuP59+FGgAACoW6cOHCD1u2rDh8+I/btwU5JxXM4U8J5jAOAAj09mb19g5c66fQaACACYIdo8Xlcg/dvLnyjz927Nx57tw5vnbcgnk+uvP89fv35NbWXYGBA4+kFhUNUa58TZC88vV5/vn+3AOwWOzTZ892794dfORIUkHByY0bBTaBw/H797cFBOBxuEVTpnyPxeqoqgIAGtva6AzG6/fvW6lU5GpCBpGoraqKfIMfSCPkIk4Xk4l8uWT19gIAOBwO8mUO0c/hSKDRAIA3WVmOZmZITyZmT8/A8+e6uRlpa/924wa5tdXLwYFYU5NRUvLo118/inN3YODt168fxsW10ekLPTya2ttbqNQL27Z5jhv3KD7+7JMnwb6+msrKAIDzT59OtrHZNH8+AMCCQCDW1By6eTPY1/dFaipyOSY6M3O6oyOy9QGdDAYAgN3fLykhYayt3djWVtfS8unX3GF3kEL+y/2DvhArycvvWb78YkREiJ8fDoPpZDD+fv58f1CQrmjMxn379evvT560s7d/8/ChjqAWTJWUlLxz9+7mzZsX/vzzsXXrdixeLIBev3AXQPBvFwj09k4qKIhMT186bVptc3NzRwcyhF8AUouK5h84oKmrm/DiBV8LbgQKhTp+/DiBQNixY0cOiXR5507BzDsEcxgh+MM4ACDIx+fE/ft/3rt3e/9+AEB4YqKmsjLSvVsw6N3da/7734iUlLNnz24QyABlmOejNc9js7OP3rmzwN39fHg4AIALQGVDA1ZW1sXaWujlyjflucQvv/wy9DPQaLSPj4+tre2RM2duxsQ4mpp+afp93tp/+fLr9++pnZ1/v3ihoaR0ddcuPA6ngMUmFRTkV1Yunz7dSEsrnUisbW72sLf/89691KKiLibTxcaGRCb/9ewZh8vtZrEmWlpeiYy89/YtAACHwVgQCHIyMufDwyk0moKcnDmB0M1kJubnX9i+XVZauqqx8dDNm+lEIrWrSwmHszY0XDptWmVjY8z797FZWbrq6ue3bv10JXAleXn/yZMrGxqyysrSiotN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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.display import display, Image\n",
    "from sklearn_fab.utils import export_gate_tree_dot\n",
    "\n",
    "dot = export_gate_tree_dot(estimator, X=X_train)\n",
    "display(Image(dot.create_png()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 予測式の可視化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "モデルがもつ予測式情報にアクセスし、可視化します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "# 可視化のために、DataFrame形式で予測式を表現\n",
    "columns = np.append(estimator.feature_names_, ['bias', 'variance'])\n",
    "prediction_formulas = [np.append(comp.weights, [comp.bias, comp.variance])\n",
    "                       for comp in estimator.comps_]\n",
    "pf_df = pd.DataFrame(prediction_formulas, columns=columns,\n",
    "                     index=['component #' + str(i) for i in estimator.comp_ids_])\n",
    "\n",
    "# 係数が0ではない説明変数のみを抽出し、表示\n",
    "relevant_feature_indices = pf_df.sum(axis=0) != 0\n",
    "pf_df = pf_df.T[relevant_feature_indices]\n",
    "pf_df.plot(kind='barh', figsize=(8, 4), stacked=True)\n",
    "plt.show()"
   ]
  }
 ],
 "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.8.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
