【ラビットチャレンジ】要点のまとめ - 機械学習 その１

# 1. はじめに
本記事はJDLA E資格の認定プログラム「ラビットチャレンジ」における機械学習のレポート記事である。
本記事では機械学習における「線形回帰モデル」について要点をまとめている。

【ラビットチャレンジ】要点のまとめ - 機械学習 その１
[【ラビットチャレンジ】要点のまとめ - 機械学習 その２](https://qiita.com/PoppeDwarf/items/80724b0b92d01c9a9421)
[【ラビットチャレンジ】要点のまとめ - 機械学習 その３](https://qiita.com/PoppeDwarf/items/30944bca17d2c7f8c5ee)
[【ラビットチャレンジ】要点のまとめ - 機械学習 その４](https://qiita.com/PoppeDwarf/items/01cc119c707fe3e26f1d)
[【ラビットチャレンジ】要点のまとめ - 機械学習 その５](https://qiita.com/PoppeDwarf/items/6cb3929a4668ecf1c2ab)
[【ラビットチャレンジ】要点のまとめ - 機械学習 その６](https://qiita.com/PoppeDwarf/items/83f7e350e6720e801038)


# 2. 機械学習とは
## 2.1. 機械学習モデリングプロセス
- 問題設定
まず考えるべきは「それは本当に機械学習を使うべき問題なのか？」

深層学習を含む機械学習は全般的に複雑な理論の上に成り立っている。つまり、開発側だけでなく運用側もある程度深く理解しておかなければ、何か問題が発生したときによい方策がとりづらくなってしまう。

またテストのしにくさも問題に挙がる。ルールベースと違い入力に対する結果が固定的ではなく、学習モデルを更新したときに結果が変化してしまう場合が起こりうる。

これらの点を踏まえたうえで機械学習の使うかの見極めが必要になってくる。場合によっては機械学習ではなく従来のルールベースのプログラム構築を選択するほうがよいことも覚えておきたい。

このうえで「どのような課題を機械学習に解決させるか」を検討する。

- データ選定
問題解決に必要なデータの選定および検討→収集。予測させたいものに合わせて設定し収集する必要がある。

- データの前処理
収集したデータの整理と修正。欠損の補填や異常値→ダミー変数化など。

- 機械学習モデルの選定
分類・予測・クラスタリングなど、さまざまなアルゴリズムから問題に合わせて最良と判断したものを選定する。

- モデルの学習（パラメータ推定）
選定した機械学習モデルによるパラメータの推定。

- モデルの評価
ハイパーパラメータの選定、モデル精度・性能の測定。

## 2.2. 機械学習の定義
> コンピュータプログラムは、タスクT（アプリケーションにさせたいこと）を性能指標Pで測定し、その性能が経験E（データ）により改善される場合、タスクTおよび性能指標Pに関して経験Eから学習すると言われている（トム・ミッチェル 1997）

1. タスクTを性能指標Pで測定→結果を「Result」とする
2. タスクTに経験Eを与える
3. タスクTを再び性能指標Pで測定→結果を「Result'」とする

このとき、「Result'」が「Result」に比べて改善されていた場合、「コンピュータプログラムはタスクTおよび性能指標Pに関して経験Eから学習する」と言える。


# 3. 線形回帰モデル
## 3.1. 回帰問題
ある入力（離散値、連続値）から出力（連続値）を予測する問題。

## 3.2. 回帰で扱うデータ
説明変数：$ \boldsymbol{x} = (x_{1}, x_{2}, ... , x_{m})^{T} \in \mathbb{R}^{m} $
$ \qquad \boldsymbol{x} $：説明変数。$m$次元のベクトル
$ \qquad x_{1}, x_{2}, ... , x_{m} $：説明変数$ \boldsymbol{x} $のエレメント

目的変数：$ \boldsymbol{y} \in \mathbb{R}^{1} $
$ \qquad \boldsymbol{y} $：目的変数。1次元のスカラ

## 3.3. 線形回帰モデル
回帰問題を解くための機械学習モデルの一。教師あり学習。
$m$次元の入力およびパラメータの線形結合を出力する。

教師データ：$ \smash{\bigl\\{ ( \boldsymbol{x_{i}}, \boldsymbol{y_{i}} ); i = 1, ... , n\bigr\\}} $
$ \qquad $説明変数と目的変数をひとつのペアとしたデータ
$ \qquad \boldsymbol{x} $：説明変数。$m$次元のベクトル
$ \qquad \boldsymbol{y} $：目的変数。1次元のスカラ
$ \qquad n $：教師データ数
$ \qquad i $：教師データの参照インデックス。$1～n$の間をとる

パラメータ：$ \boldsymbol{w} = (w_{1}, w_{2}, ... , w_{m})^{T} \in \mathbb{R}^{m}  $
$ \qquad \boldsymbol{w} $：パラメータ。$m$次元のベクトル

## 3.4. 線形結合
線形結合：$ \hat{y} = \boldsymbol{w}^{T}\boldsymbol{x} + w_{0} = \sum_{j=1}^{m}w_{j}x_{j} + w_{0} $
$ \qquad \hat{y} $：予測値。正解データと区別するためハット「$\hat{}$」をつける。
$ \qquad \boldsymbol{x} $：説明変数
$ \qquad \boldsymbol{w}^{T} $：モデルのパラメータ
$ \qquad w_{0} $：切片
$ \qquad m $：パラメータおよび説明変数の次元数
$ \qquad j $：次元のインデックス。$1～m$の間をとる

## 3.5. 回帰モデル
### 3.5.1. 単回帰モデル（説明変数が１次元「m=1」の場合）
モデル数式：$ y = w_{0} + w_{1}x_{1} + \varepsilon $
$ \qquad y$：目的変数
$ \qquad w_{0}$：切片
$ \qquad w_{1}$：回帰係数
$ \qquad x_{1}$：説明変数
$ \qquad \varepsilon$：誤差。データは回帰直線に誤差が加わって観測されていると仮定したときの誤差の値

学習によって既知の変数「目的変数」「説明変数」から未知の変数「回帰係数」「切片」を決めていく。

### 3.5.2. 重回帰モデル（説明変数が多次元「m>1」の場合）
モデル数式：$ y = w_{0} + w_{1}x_{1} + \cdots + w_{m}x_{m} + \varepsilon $
$ \qquad y$：目的変数
$ \qquad w_{0}$：切片
$ \qquad w_{1}～w_{m}$：回帰係数
$ \qquad x_{1}～x_{m}$：説明変数
$ \qquad \varepsilon$：誤差。データは回帰直線に誤差が加わって観測されていると仮定したときの誤差の値


## 3.6. 教師データの分割
データは「学習用データ」「検証用データ」に分割して使用する。
　・学習用データ：機械学習モデルの学習に利用するデータ
　・検証用データ：学習済みモデルの精度測定に利用するデータ

データの分割は、汎化性能のよいモデルを構築するために必要となってくる。
　・汎化性能
　　　未知のデータに対してどの程度正確に判断できるかという性能
　・検証に学習用データを使用すべきでない理由
　　　汎化性能を上げるのが目的であり、既知の学習データに対しての適応度を上げたいのではない。
　　　なお学習データへの適応度を上げすぎると、逆に汎化性能は下がることがわかっている。（過学習）

## 3.7. パラメータ推定
- 平均二乗誤差（残差平方和、Mean Squared Error）  
データとモデル出力の二乗誤差の和。  
平均二乗誤差が小さいほどモデル数式の直線とデータの距離が近い（全体としての誤差が小さい。）

$ \qquad MSE_{train} = \dfrac{1}{n_{train}}\displaystyle\sum\nolimits_{i=1}^{n_{train}}(\hat{y}\_{i}^{(train)} - y_{i}^{(train)})^{2} $

- 最小二乗法
学習データに関して平均二乗誤差が最小となるパラメータを探索する手法。  
勾配が0になる点（微分したときに0になる点）を探し出す。

最小二乗法$ \hat{\boldsymbol{w}} = arg \; {min}_{\boldsymbol{w} \in \mathbb{R}^{m + 1}}{MSE}\_{train} $

次の式を解くことで解となる回帰係数$\boldsymbol{w}$を求める：$ \smash{ \dfrac{\partial}{\partial \boldsymbol{w}}MSE_{train} = 0 }$

回帰係数：$ \hat{\boldsymbol{w}} = (\boldsymbol{X}^{(train)T}\boldsymbol{X}^{(train)})^{-1}\boldsymbol{X}^{(train)T}\boldsymbol{y}^{(train)} $

予測値は回帰係数と説明変数の線形結合のため、

予測値：$\hat{\boldsymbol{y}} = \boldsymbol{X}\_{n_{new} \times m+1}\hat{\boldsymbol{w}} = \boldsymbol{X}\_{n_{new} \times m+1}(\boldsymbol{X}^{(train)T}\boldsymbol{X}^{(train)})^{-1}\boldsymbol{X}^{(train)T}\boldsymbol{y}^{(train)}$


# 4. ハンズオン
## 4.1. 課題：線形回帰モデル-Boston Hausing Data-
ボストン住宅データセットの線形回帰モデルでの分析、「部屋数：4」「犯罪率：0.3」の物件の価格の予測。

## 4.2. 演習結果
### 4.2.1. 必要モジュールとデータのインポート
最初に以下の３つをインポートする。
　・scikit-learnからボストン住宅データセットを取得してくる「load_boston」
　・pandasから２次元のテーブルデータを表す型「DataFrame」
　・学術計算ライブラリ「numpy」（以降のコードでnpで参照できるようにしている）
![01_skl_regression_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/caa10572-f0cd-7c9a-f3f0-ec4a1672ec57.jpeg)
![01_skl_regression_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/b458af09-b499-468e-f4cc-de43e8cdebff.jpeg)
取得したボストン住宅データセットの説明文を確認。
「DESCR」は「Description」つまり「説明・解説」というような意味をさす。
インスタンス数（データ数）は506個、属性は13。
課題に必要な情報のうち部屋数は「RM」、犯罪率は「CRIM」で参照できることがわかる。
![01_skl_regression_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/2711f84d-0fa5-7b59-58c9-991f029dbd63.jpeg)
「feature_name」は直訳すれば「特徴名」。
今回は上記説明文にもあった「属性名」が一覧として取得されている。
![01_skl_regression_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/e8335fab-4a68-93c1-dd2c-74f91f0c47d4.jpeg)
![01_skl_regression_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/2090f116-c0e4-d471-ca79-c68734c5d8f3.jpeg)

### 4.2.2. データフレームの作成
「feature_name」をカラムに設定して、説明変数をDataFrameに変換。
その後目的変数をカラムに新しく価格「PRICE」として追加する。
最初の5行を表示させて、説明変数の各カラムと目的変数のカラムが正しいことを確認。
![01_skl_regression_06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/8888dff2-2da4-3722-8936-fa8e6b6a224c.jpeg)

### 4.2.3. 線形単回帰分析
説明変数が1次元（部屋数のみ）の場合の予測。
作成したデータフレームから部屋数「RM」を説明変数に、価格「PRICE」を目的変数に、それぞれ取り出す。
![01_skl_regression_07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/08e55af4-cea9-188a-4535-edd4e0ce8c5a.jpeg)

scikit-learnのlinear_model（線形モデル）より「LinearRegression」をインポートし、オブジェクトを生成。
先ほど取り出した説明変数および目的変数からパラメータ推定（fit）を実行する。

学習させたモデルで部屋数「1」の場合の価格を予測させると「-25.5685118」とマイナスの値が出てしまっている。
![01_skl_regression_08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/80d5872e-73df-bda2-4763-995ac2305f7e.jpeg)

### 4.2.4. 線形重回帰分析（2変数）
次に、説明変数が2次元（犯罪率と部屋数）の場合の予測。
![01_skl_regression_09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/3321b121-a3c9-3a86-d706-9afac0362411.jpeg)

課題の「「部屋数：4」「犯罪率：0.3」の物件の価格の予測」をすると、価格が「4.24007956」となっている。
![01_skl_regression_10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/28c6efdb-9813-6af2-5a5b-babff9835fb0.jpeg)

### 4.2.4. 回帰係数と切片の値の確認
上記で実装した単回帰・重回帰両方の回帰係数および切片の値を確認する。
![01_skl_regression_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/9e6fd22f-7676-df36-46b9-d0094ed2627f.jpeg)

### 4.2.5. モデルの検証
決定係数$R^{2}$：モデルの予測値が実際の値に比べてどれくらいずれが小さいかを客観的に示す指標
　（参考）[決定係数R2って何？は今日でお終い！3分でわかるR二乗とは](https://aizine.ai/r2-score0411/)

上記線形単回帰のほうで利用した説明変数（部屋数）、目的変数（価格）をそれぞれ学習用と検証用に分割。
学習用データからパラメータ推定。
作成されたモデルを使って学習用データに対する予測と検証用データに対する予測をそれぞれ行う。
![01_skl_regression_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/2d44cc83-ab8c-1290-1e94-397e9d280315.jpeg)
予測値と実際の値の残差をプロットする。
![01_skl_regression_13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/26e2d136-9980-6a8d-3a8b-fcb855a729ed.jpeg)
平均二乗誤差と決定係数を算出する。
![01_skl_regression_14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110108/ac9eb283-c4f0-b6e8-1691-9f665a1bfd12.jpeg)