<!-- ↑ 概要設定部分 -->
<!-------------------------------------------------->
<br>
<br>
<br>
# 予習・復習
### `AI基礎研修` `第3回`
##### `author: TIS Keisuke Nishimura`
##### `Copyright(C) 2020 System Shared co., ltd, ALL Rights Reserved`
----
## TOC
- はじめに
- TOC
- 本日のスケジュール
- 復習
- 最適化
- 最小二乗法(正規方程式)
- 勾配降下法
- 未学習・過学習
- 学習度合
- 正則化
- 予習
- ロジスティック回帰
- 分類の精度
----
## 本日のスケジュール
<br>
<br>
<br>
```mermaid
gantt
dateFormat HH:mm
axisFormat %H:%M
予習・復習 :c1, 10:00, 2h
昼休 :done, c2, after c1, 1h
分類演習 :crit, c3, after c2, 4h
```
:::warning
#### 補足
- 1時間ごとに10分の休憩を取ります
- 演習中は、それぞれの作業を進める形なので自由に休憩を取ってください
:::
---
<br>
<br>
<br>
# 復習
---
<br>
<br>
<br>
# 1. 最適化
----
## 最小二乗法(正規方程式)
<br>
<img src="https://i.imgur.com/F9yOetb.png" height="90%" width="100%">
### ► 方程式を解くことで係数を一気に(演繹的に)求めている
----
## 勾配降下法
<img src="https://i.imgur.com/PtFm073.png" width="60%">
### ► 逐次的(帰納的に)に最適(コストを小さくする)な係数を求める
----
### ▮ イメージ(係数が1つの場合)
<img src="https://i.imgur.com/oxu2uhb.gif" width="50%">
### ► レールにボールを転がすイメージ
----
### ▮ イメージ(係数が2つの場合)
<img src="https://i.imgur.com/3JDJYff.gif" width="70%">
### ► お椀にボールを転がすイメージ
----
### ▮ もしも勾配降下法で線形回帰を計算したら
<img src="https://miro.medium.com/max/1280/1*eeIvlwkMNG1wSmj3FR6M2g.gif" width="70%">
### ► 係数と切片を徐々に調整している具合になる
----
## まとめ:最適化
<br>
|#|最小二乗法|勾配降下法|
|:--:|:--:|:--:|
|**やりたいこと**|==誤差を最小にする係数を求めたい==|==誤差を最小にする係数を求めたい==|
|**計算方法**|【演繹的】<br>●微分方程式を解く|【帰納的】<br>●都度、傾きを求めて調整する|
|**メリット**|計算量が少ない|複雑なコスト関数でも解ける|
|**デメリット**|複雑なコスト関数は解けない|計算量が多い|
<br>
### ► 勾配降下法は3か月目に学ぶニューラルネットワーク、ひいてはディープラーニングで用いられている最適化手法
---
<br>
<br>
<br>
# 2. 未学習・過学習
----
## 学習度合

----
### ▮ 学習度合のイメージ
<br>

<br>
### ► 学習度合 = データ量ではないことに注意
----
### ▮ 学習度合まとめ
<br>
|#|未学習|最適な学習|過学習|
|:--:|:--:|:--:|:--:|
|学習データに対する精度|低い|高い|高い|
|未知(テスト)データに対する精度|==低い==|高い|==低い==|
<br>
### ► 共通して未知データへの精度が悪いことが問題
----
### ▮ 過学習・未学習への対処
<div id="l">
#### 未学習
- データを増やす
- ~~行を増やす(それができれば苦労は...)~~
- 列を増やす
- べき
- カテゴリのエンコーディング
- 複雑なモデルへ変更
- ex. 線形モデルから
:arrow_forward: K近傍法へ
:arrow_forward: アンサンブル学習へ
:arrow_forward: ニューラルネットワークへ
</div>
<div id="r">
#### 過学習
- データを増やす
- ~~行を増やす~~
- データを減らす
- 列を減らす
- 多重線形性を回避する
- 質的変数の水準数を減らす
- 意味・性質に似た値はまとめる
- onehotは苦肉の策(精度向上は期待できない)
- アルゴリズムの変更(チューニング込み)
- ==正則化==
- ex. DNNから
:arrow_forward: 線形モデルへ
</div>
----
## 正則化

### ► 正則化を、<br>==強==めるとモデルは==単純==になる<br>==弱==めるとモデルは==複雑==になる
----
### ▮ 正則化は具体的になにをしているのか?

### ► Loss(コスト)に項を追加しただけ
----
### ▮ L1・L2正則化それぞれの特徴
<div id="l">
#### L1正則化
<img src="https://i1.wp.com/laid.delanover.com/wp-content/uploads/2018/01/l1_compressed.gif?zoom=1.5&resize=355%2C266" width="90%">
- 係数の多くが0になる(ことがある)
- 自動で重要な変数を選択するイメージ
</div>
<div id="r">
#### L2正則化
<img src="https://i0.wp.com/laid.delanover.com/wp-content/uploads/2018/01/l2_compressed.gif?zoom=1.5&resize=331%2C248" width="90%">
- 係数の多くが0ではない
- 全ての変数を重要とみなすイメージ
</div>
### ► 精度の良し悪しは試してみなければ分からない<br>(※L1はモデルの解釈性が高まるので使用されることが多い)
---
<br>
<br>
<br>
# 予習
---
<br>
<br>
<br>
# 1. ロジスティック回帰
----
## 分類の超基本的なアルゴリズム
<div id="l" class="box">
- 乳がん判別モデリングに使用したアルゴリズム
- 散布図に境界線(直線)を引くイメージ
- 線より上は毒キノコ
- 下は非毒キノコ
</div>
<img id="r" src="https://miro.medium.com/max/2100/1*PQ8tdohapfm-YHlrRIRuOA.gif">
----
## やっていることは線形回帰とあまり変わらない

### ► 線形回帰の出力を0~1に収まる値(≒確率)に調整しているだけ
----
## Lossは分類用のクロスエントロピー

### ► 正解1に対して高い確率を、正解0に対して低い確率を出力するほど小さくなるLoss
----
## クロスエントロピーの具体的な計算

### ► 良いモデルの方が小さくなっていることが確認できた
----
## なぜ、境界線を引くようなものと解釈できるのか?
<div class="box">
$$
予測 = \begin{cases}
1 & (確率 \geq 0.5) \\
0 & (otherwise)
\end{cases}
$$
</div>
<div class="box">
$$
確率 = \frac{1}{1+2.72^{-(a_1x_1+a_2x_2+b)}}
$$
$$
確率 = \begin{cases}
\geq 0.5 & (a_1x_1+a_2x_2+b \geq 0) \\
\lt 0.5 & (otherwise)
\end{cases}
$$
</div>
<br>
つまり、
<div class="box">
$$
予測 = \begin{cases}
1 & (a_1x_1+a_2x_2+b \geq 0) \\
0 & (otherwise)
\end{cases}
$$
</div>
### ► $a_2x_2 \geq - (a_1x_1+b)$という単純な領域を示す不等式と解釈できる
----
## ロジスティック回帰の主な設定値(ハイパーパラメータ)
#### C: 境界線の複雑さ

### ► Cを大きくするほど、境界線が複雑になる(イメージ)
----
#### penalty: 正則化の種類
```Python
"l1" または "l2"
```
----
## 効率的なチューニング
### ▮ グリッドサーチ
<img src="https://i.imgur.com/4G5gJ4h.gif">
### ► 指定した設定値の組み合わせにおける精度を網羅的に確認する手法
----
### 要するに...
```Python
設定値A = [1,2,3]
設定値B = [1,2,3]
設定値C = [1,2,3]
for a in 設定値A:
for b in 設定値B:
for c in 設定値C:
設定(a, b, c)
学習
精度算出
```
### ► この場合、3x3x3=27通りの設定が試されることになる
---
<br>
<br>
<br>
# 2. 分類の精度
----
## accuracy
<img src="https://i.imgur.com/VUzxT4N.png" width="60%">
$accuracy = 正解数/予測数 = 16/20 = 80_\%$
### ► 分かり易いが良し悪しの判断を誤らないようにされたい
----
## 適合率(Precision)と再現率(Recall)
<img src="https://i.imgur.com/6MIX9YS.png" id="l" width="40%">
<div id="r2" class=box>
- 適合率
- $\frac{正解数}{予測した合格者}$
- 「100撃って、何発当たったか?」
</div>
<br>
<br>
<br>
<div id="r2" class=box>
- 再現率
- $\frac{正解数}{真の合格者}$
- 「的が100ある内、何発当たったか?」
</div>
<div id="r">
### ► accuracyが高いように見えても、適合率/再現率が悪い場合もある
</div>
<!-------------------------------------------------->
<!-- デザイン設定部分 -->
<!-- 基本設定 -->
<style>
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6,
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {
font-family: 'Meiryo UI', 'Source Sans Pro', Helvetica, sans-serif, 'Helvetica Neue', 'Helvetica', 'Arial', 'Hiragino Sans', 'ヒラギノ角ゴシック', YuGothic, 'Yu Gothic';
text-align: left;
line-height: 1.6;
letter-spacing: normal;
text-shadow: none;
word-wrap: break-word;
color: #444;
}
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {font-weight: bold;}
.reveal h1, .reveal h2, .reveal h3 {color: #2980b9;}
.reveal th {background: #DDD;}
.reveal section img {background:none; border:none; box-shadow:none; max-width: 95%; max-height: 95%;}
.reveal blockquote {width: 90%; padding: 0.5vw 3.0vw;}
.reveal table {margin: 1.0vw auto;}
.reveal code {line-height: 1.2;}
.reveal p, .reveal li {padding: 0vw; margin: 0vw;}
.reveal .box {margin: -0.5vw 1.5vw 2.0vw -1.5vw; padding: 0.5vw 1.5vw 0.5vw 1.5vw; background: #EEE; border-radius: 1.5vw;}
/* table design */
.reveal table {background: #f5f5f5;}
.reveal th {background: #444; color: #fff;}
.reveal td {position: relative; transition: all 300ms;}
.reveal tbody:hover td { color: transparent; text-shadow: 0 0 3px #aaa;}
.reveal tbody:hover tr:hover td {color: #444; text-shadow: 0 1px 0 #fff;}
/* blockquote design */
.reveal blockquote {
width: 90%;
padding: 0.5vw 0 0.5vw 6.0vw;
font-style: italic;
background: #f5f5f5;
}
.reveal blockquote:before{
position: absolute;
top: 0.1vw;
left: 1vw;
content: "\f10d";
font-family: FontAwesome;
color: #2980b9;
font-size: 3.0vw;
}
/* font size */
.reveal h1 {font-size: 5.0vw;}
.reveal h2 {font-size: 4.0vw;}
.reveal h3 {font-size: 2.8vw;}
.reveal h4 {font-size: 2.6vw;}
.reveal h5 {font-size: 2.4vw;}
.reveal h6 {font-size: 2.2vw;}
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {font-size: 2.2vw;}
.reveal code {font-size: 1.6vw;}
/* new color */
.red {color: #EE6557;}
.blue {color: #16A6B6;}
/* split slide */
#c {text-align: center; width: 100%; z-index: -10;}
#l {left: 31.25%; text-align: left; float: left; width: 50%; z-index: -10;}
#r {left: -18.33%; text-align: left; float: left; width: 50%; z-index: -10;}
#l2 {left: 31.25%; text-align: left; float: left; width: 50%; height: 50%; z-index: -10;}
#r2 {left: -18.33%; text-align: left; float: left; width: 50%; height: 50%; z-index: -10;}
</style>
<!-- 背景設定 -->
<style>
.reveal {
background-image:
/* copy right */
/* 個人 */
/* url("https://i.imgur.com/mYSeGwZ.png"); */
/* 顧客 */
url("https://i.imgur.com/R5Lgxvx.png");
/* url("https://i.imgur.com/kNd1W6K.png"); header */
background-repeat:
/* no-repeat, */
no-repeat;
background-position:
center 99%;
/* ,center 2%; */
background-size:
30% auto;
/* ,90% auto; */
}
.reveal h1 {padding: 3.0vw 0vw;}
@media screen and (max-width: 1024px) {
.reveal h2 {margin: -2.0vw 0 0 0; padding: 0.0vw 0vw 3.0vw 2.0vw; }
}
@media screen and (min-width: 1025px) and (max-width: 1920px) {
.reveal h2 {margin: -1.5vw 0 0 0; padding: 0.0vw 0vw 3.0vw 2.0vw; }
}
@media screen and (min-width: 1921px) and (max-width: 100000px) {
.reveal h2 {margin: -1.0vw 0 0 0; padding: 0.0vw 0vw 3.0vw 2.0vw; }
}
</style>
<!-- 特殊な設定 -->
<style>
.reveal h1 {
margin: 0% -100%;
padding: 2% 100% 4% 100%;
color: #fff;
background: #c2e59c; /* fallback for old browsers */
background: linear-gradient(-45deg, #EE7752, #E73C7E, #23A6D5, #23D5AB);
background-size: 200% 200%;
animation: Gradient 60s ease infinite;
}
@keyframes Gradient {
0% {background-position: 0% 50%}
50% {background-position: 100% 50%}
100% {background-position: 0% 50%}
}
.reveal h2 {
text-align: center;
margin: -5% -50% 2% -50%;
padding: 4% 10% 1% 10%;
color: #fff;
background: #c2e59c; /* fallback for old browsers */
background: -webkit-linear-gradient(to right, #64b3f4, #c2e59c); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to right, #64b3f4, #c2e59c); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
}
</style>
{"metaMigratedAt":"2023-06-14T23:51:25.159Z","metaMigratedFrom":"YAML","title":"予習・復習","breaks":true,"slideOptions":"{\"theme\":\"white\",\"slideNumber\":\"c/t\",\"center\":false,\"transition\":\"slide\",\"keyboard\":true,\"width\":\"93%\",\"height\":\"100%\",\"allottedMinutes\":50}","contributors":"[{\"id\":\"d206f7f3-4802-40db-ab72-33d309b006f9\",\"add\":10979,\"del\":917}]"}