【勉強メモ03】予測モデルを構築しよう

#はじめに
今回記事作成者の機械学習の勉強＆メモのために記事を作成しています
間違いなどありましたらコメントにてご指摘いただけると幸いです。

#予測モデルの準備を使用

```Python
# Pythonでグラフを描画するためのライブラリ
import matplotlib.pyplot as plt

# Numerical Pythonを略してNumPy 数値の計算や行列を扱うためのライブラリ
import numpy as np

# テーブル型のデータを処理するためのライブラリ
import pandas as pd

```

# データセットを用意する

データの前処理などはされていることを前提にモデルを構築していく

```Python
# データセットの読み込み
# train.csv →　呼び出したいファイル名を入れてください。
dataset = pd.read_csv("train.csv")
```

# 目的変数と説明変数の設定をする

```Python
# 目的変数(予測したい値を1項目入力する）
target_col = "price"
# 説明変数(予測するのに使用する項目を入力する)
feature_cols = ["distance","temp","clouds","pressure"]
```

## 項目数が多い場合

```Python
# 目的変数の設定
target_col = "price"
# 特徴量として検討しないものを選択する
exclude_cols = ["price","id","date"]
# 特徴量として検討しないものを取り除き、説明変数として設定する
feature_cols = [col for col in dataset.columns if col not in exclude_cols]
```


#データセットを学習モデル用と検証用で分割する

```Python
# データ分割用のライブラリ
from sklearn.model_selection import train_test_split

# 特徴量をX、ターゲット変数をyに格納する
# プログラムしやすくするため格納している
y = dataset[target_col]
X = dataset[feature_cols]

#　学習データとテストデータを70/30で分ける
# random_state = 1234 →　ランダムに分ける際に何度も実行しても同じようにできる
X_train_val, X_test, y_train_val,y_test = train_test_split(X,y,test_size=0.3, random_state = 1234)

#学習データをさらに　学習データとテストデータに70/30に分ける
X_train,X_val,y_train,y_val = train_test_split(
X_train_val, y_train_val,test_size = 0.3,random_state = 1234)

# X : 全データセット
# 学習用データでよいモデルが構築できたら、最終確認で下記データセットを使う
# X_test : 最終検証用データセット

# X_train_val : 学習用データセット (train, valで分割される）

#モデルの構築は下記データセットが使用される
# X_train : 学習用データセットの学習用データセット

#モデルの構築後の精度確認用のデータセットが下記である。
# X_val : 学習用データセットの検証用データセット
```




#線形回帰モデルの構築方法

```Python
# 線形回帰モデルを使って予測をしていく
# 線形回帰モデルのライブラリ
from sklearn.linear_model import LinearRegression
# MSEのライブラリ
from sklearn.metrics import mean_squared_error

# 線形回帰モデルの構築
lm = LinearRegression()
# 線形回帰モデルに学習させるデータを入力する
lm.fit(X_train, y_train)
# 検証用データを使って予測を行う
y_pred = lm.predict(X_val)
# 検証用データを使って予測した結果の精度MSEを算出する
lm_mse = mean_squared_error(y_val,y_pred)
# RMSEの出力 (下3桁で出力)
print("LinerRegression RMSE:", round(np.sqrt(lm_mse),3))
```

#決定木モデルの構築方法

```Python
# 決定木（回帰木）を使って予測する

# 決定木のライブラリを読み込む
from sklearn.tree import DecisionTreeRegressor
# 決定木の構築
# 決定木のモデル構築
dt = DecisionTreeRegressor(random_state = 1234)
# 構築したモデルに学習データを入れる
dt.fit(X_train, y_train)
# 学習したモデルを用いて、検証用のデータを入れ、予測する
y_pred = dt.predict(X_val)
# 予測した結果と検証用結果のMSEを算出する
dt_mse = mean_squared_error(y_val, y_pred)
#RMSEを算出し、出力する
print("Decision Tree RMSE:",round(np.sqrt(dt_mse),3))

#round : 下〇桁までで出力させることができる
#np.sqrt : 平方根を取ることができる
```

#決定木のモデルを可視化する

```Python
# 決定木の可視化をする
# 決定木の結果を可視化するライブラリを読み込む
from sklearn.tree import plot_tree
# 決定木の初期化
# max_depth →　決定木の深さ
dt = DecisionTreeRegressor(max_depth=3, random_state = 1234)
# Xを入力、yを予測する値として学習させる
dt.fit(X_train,y_train)

# 決定木の図を出力する
# 図のサイズを設定する
fig = plt.figure(figsize = (15,10))

ax = fig.add_subplot()
ax = plot_tree(dt,feature_names = feature_cols,
              filled = True,
              rounded = True)

#図のタイトルの設定
p lt.suptitle("Decision tree")

# 図の出力をする
plt.show()
```

#ランダムフォレストの構築方法

```Python
# ランダムフォレストのモデルを実装する
# ランダムフォレストのライブラリの呼び出す
from sklearn.ensemble import RandomForestRegressor
# ランダムフォレストのモデルを作成
rf=RandomForestRegressor(random_state = 1234)
# ランダムフォレストのモデルに学習データを入力し学習させる
rf.fit(X_train, y_train)
# 検証用データを用いて、予測を行う
y_pred = rf.predict(X_val)
# 予測した結果と検証用結果のMSEを算出する
rf_mse = mean_squared_error(y_val, y_pred)
# RMSEを算出し、出力する
print("Randam Forest RMSE:",round(np.sqrt(rf_mse),3))
```

#ランダムフォレストの重要度の可視化方法

```Python
# ランダムフォレストのFeature importanceの可視化
feature_importance = pd.DataFrame(rf.feature_importances_,
                                 columns = ["importance"],
                                 index = feature_cols)
feature_importance.sort_values("importance",ascending = False).plot(kind = "bar")
```

#参考資料

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15576681%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  >Pythonによるあたらしいデータ分析の教科書 [ 寺田 学 ]</a>

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15576681%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/2132e914.2fe6209c.2132e915.6ace3022/?me_id=1213310&item_id=19251192&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F8341%2F9784798158341.jpg%3F_ex%3D240x240&s=240x240&t=pict" border="0" style="margin:2px" alt="" title=""></a>

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15697205%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  >見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑 [ 秋庭 伸也 ]</a>

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15697205%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/2132e914.2fe6209c.2132e915.6ace3022/?me_id=1213310&item_id=19382494&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F5654%2F9784798155654.jpg%3F_ex%3D240x240&s=240x240&t=pict" border="0" style="margin:2px" alt="" title=""></a>