機械学習を1ヵ月で実践レベルにする #7 (分類問題: ロジスティック回帰 #1)

# 7日目
[Coursera でStanford が提供しているMachine Learning](https://www.coursera.org/learn/machine-learning/) のWEEK 5 にながらく苦戦していたのですが、復習に復習をかさね、講座のビデオも何度も見直し、ようやく完璧に理解しました。そのおかげで、WEEK 5 の修了テストもようやく合格し、週明けからはWEEK 6 に入れそうです。

WEEK 11 まであるのでこれで折り返し。

スケジュールが少し押してしまっているので、クリスマスの3連休を使って少しずつ挽回を図ります。

## 過去記事一覧
* [1日目 とっかかり編](http://qiita.com/junichiro/items/ee50af10df77d52cd432)
* [2日目 オンライン講座](http://qiita.com/junichiro/items/7a5b95d7122176e94fe0)
* [3日目 Octave チュートリアル](http://qiita.com/junichiro/items/33954f08411e33d33506)
* [4日目 機械学習の第一歩、線形回帰から](http://qiita.com/junichiro/items/d4dc67bdebb9fccb7ef5)
* [5日目 線形回帰をOctave で実装する](http://qiita.com/junichiro/items/1a4b87e99b471cf5bea1)
* [6日目 Octave によるVectorial implementation](http://qiita.com/junichiro/items/7972b1b6ad3d087fbde0)
* [7日目 ロジスティック回帰 (分類問題) その1](http://qiita.com/junichiro/items/8de94c84c35e9851d42a)
* [8日目 ロジスティック回帰 (分類問題) その2](http://qiita.com/junichiro/items/5d20a40a3a282af422a3)
* [9日目 オーバーフィッティング](http://qiita.com/junichiro/items/4d2c91128c9bd850f580)
* [10日目 正規化](http://qiita.com/junichiro/items/8b1867201663c5af38a4)
* [11日目 ニューラルネットワーク #1] (http://qiita.com/junichiro/items/7794cedf834a4f6ef52c)
* [12日目 ニューラルネットワーク #2] (http://qiita.com/junichiro/items/b522ea41c02f90d23aa5)
* [13日目 機械学習に必要な最急降下法の実装に必要な知識まとめ](http://qiita.com/junichiro/items/527b1f211ed814528ded)
* [14日目 機械学習で精度が出ない時にやることまとめ](http://qiita.com/junichiro/items/7e2842c7afba2407c49b)
* [最終日 機械学習をゼロから1ヵ月間勉強し続けた結果](http://qiita.com/junichiro/items/3457e33e502086a200f1)

# ロジスティック回帰
さて、実際の講座の進捗とこちらの日々のレポートは乖離したままですが、今日はロジスティック回帰(講座でいうところのだいたいWEEK 3 くらい)を説明したいと思います。

## 二値分類
腫瘍の大きさと、それが良性か悪性かどうか(二値)のトレーニングデータがあるとします。大きさをx軸に、それが悪性かどうかをy軸にプロットして、次のようなグラフが得られたとします。
![logisticRegression.png](https://qiita-image-store.s3.amazonaws.com/0/121876/de03618f-67ef-5cc5-17cf-0a2a8daba26a.png)
まずこれにいままでのように線形回帰を適用させてみましょう。そうすると、次のようなh(x) が引けるかと思います。
![logisticRegression2.png](https://qiita-image-store.s3.amazonaws.com/0/121876/0cc8371a-c5ce-54bd-bb2d-fea717d90b99.png)
これで、もし、h(x) が0.5以上なら悪性、h(x) が0.5 未満なら良性と予測してみましょう。一見これでもうまくいきそうに見えますが、トレーニングデータに大きな腫瘍のデータが追加されたとします。すると...
![logisticRegression3.png](https://qiita-image-store.s3.amazonaws.com/0/121876/949d361f-8df6-5d81-554c-4be6b1fd522a.png)
そうすると、h(x) はこのような直線になってしまい、本来悪性と予測すべきサイズでも良性と判断されかねないものとなってしまいます。そのため、こういった分類は線形回帰ではうまく表現できないということがわかるかと思います。

## シグモイド関数
また、線形回帰ではh(x) が1より大きい値もとれてしまいますし、0より小さい値もとれてしまいます。しかし、二値分類におけるh(x) は0以上1以下の値域におさめたいです。そのため、シグモイド関数というものを導入します。

線形回帰におけるh(x) は ![image](https://qiita-image-store.s3.amazonaws.com/0/121876/79da48c0-9a29-f2e9-2153-4f9fd80381aa.png) でしたが
ロジスティック回帰ではこれにシグモイド関数(g)を適用し
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/3828dc52-8025-7466-fe2f-33634750a0ba.png)
と表現されます。
ここでシグモイド関数は以下で定義された関数です。
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/e54bba73-b8e5-70af-4fe8-6f96fdb42b24.png)
グラフの形状は次のようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/ad0fcb02-d5a9-b418-ea4f-bd03ab9e1a8b.png)
(y をg(z) x をz と読み替えてください)

この定義の元で、
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/e926c362-6879-a565-3b19-ff6a78b957b6.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/3d58aff7-e710-69e9-877d-eeda0add95fd.png)
とします。

h(x) はシグモイド関数なので、上記をシグモイド関数で考えると、
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/cab177a7-e163-28b3-d0c0-2356846dea91.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/9ee3da83-2627-61c6-d2b2-d6aafbe6132e.png)
z が0以上か0未満かで境界がわかれるのがわかります。

h(x) の定義と上記より
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/e60b5834-62c3-e635-6d1a-3a992e8c9afc.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/627553a3-0dd1-6270-50bf-b2c8dbe9bc2b.png)
となります。

### 具体例
具体例をひとつあげておきます。
![logisticRegressionExample.png](https://qiita-image-store.s3.amazonaws.com/0/121876/8340f247-8020-2c49-962e-debcd7c733e8.png)
このような分布のデータがあったとすると、
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/2faeb2f4-8065-124b-d862-845dcdceee20.png)
このθ を
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/ebf9e571-c9a8-da94-0fa8-bd1d67ce8be4.png)
この定義に代入して、さきほどの境界を決定する式にあてはめて考えると
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/57c4548a-877e-3e3d-695a-48074fbca972.png)
このようになり、結局
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/4a78c43e-7cd9-3250-4f49-ea963a163600.png)
という、図の直線となります。

## θの選び方
ロジスティック回帰でも線形回帰と同じようにコストを考えてみましょう。つまり、仮説関数h(x) とトレーニングデータの値y の差がコストとなります。
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/923f9c8c-b427-e6bc-f1ab-9b4827e2d27a.png)
しかし、線形回帰ではこのコスト関数が凸関数(局所最小 = グローバル最小)ということが知られていましたが、ロジスティック回帰では凸関数になりません。これはh(x) がシグモイド関数であるためですが、理由などは解析的に難しい話になるのはここでは割愛し、ともかく、コスト関数をこのまま使うと、最急降下法のような局所最小を求める手順では、最小値を導くことができなくなってしまいます。

ここで、コスト関数のうち、実際のコストの部分(∑の中身)を下記のように定義しなおします。
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/04a8c9c1-c751-275d-1924-a870b0bd1cf1.png)
線形回帰の場合は
![image](https://qiita-image-store.s3.amazonaws.com/0/121876/cfaa7934-19cd-37bf-02d8-5856d9ee9575.png)
ということです。次回は、ロジスティック回帰用にこのCost(h(x), y) を定義しなおし、そのコスト関数を最小にするθを求めることで、機械学習による分類を完成させます。

# 講座リスケ
ちなみにオンライン講座のほうはWEEK 5 で苦戦してしまったので下記のようにリスケしています。

* 12/24(土) WEEK 6 前半 (5h46m)
* 12/25(日) WEEK 6 後半 (5h46m)
* 12/26(月) WEEK 7 (4h57m), WEEK 8 前半 (5h26m)
* 12/27(火) WEEK 8 後半 (6h9m), WEEK 9 前半 (6h9m)
* 12/28(水) WEEK 9 後半 (6h9m) WEEK 10
* 12/29(木) WEEK 11 (2h39m), WEEK 6 〜 WEEK 11 のReview とやり残し

クリスマス三連休含め、年内フル稼働でございます。