【ラビットチャレンジ】機械学習:その3 ロジスティック回帰モデル
ロジスティック回帰
分類問題(ウラス分類)
- 入力
- m次元のベクトル
- 出力
- 0 or 1
シグモイド関数
- 入力ドメインは実数空間
- 出力は必ず 0 〜 1の値になる
- パラメータが変わるとシグモイド関数の形が変わる
- シグモイド関数の微分は、シグモイド関数自身で表現することが可能
- MSEの尤度関数で利用する場合など、最小値を求めるときに有利
ロジスティック回帰モデル
- 分類問題を解くため教師あり機械学習モデル (教師データから学習 )
- 入力とm次元パラメータ線形結合をシグモイド関数に入力
- 出力y=1になる確率値になる
- データYは確率が0.5以上なら1・未満なら0と予測
尤度関数
- 尤度とは、あるデータを得たときに分布のパラメータが特定の値であることがどれほどありえそうかを表現したもの
- 確率はパラメータを固定してデータが変化
- 尤度はデータを固定してパラメータが変化
- ベルヌーイ分布に従う
- モデルの出力Yが1となる確率とYが0になる確率を以下で表記
- P(Y = 1 | x) = p
- P(Y = 0 | x) = 1 - P(Y = 1 | x) = 1 - p
- 確率変数Yはベルヌーイ施行に従う
同時確率
- 学習データ・セットが同時に得られる確率を計算
- 観測されたデータ(学習データ)を発生させる尤もらしい確率分布を求める
- 尤度関数を最大にするパラメータを推定パラメータとする
対数尤度関数の最大化
- 尤度関数を最大化するよりも、対数尤度関数を最大化する方が楽
- 咳が和、指数が積の演算に変換出来る
- 対数尤度関数が最大になる点と尤度関数が最大になる点は同じ
- 平均二乗誤差は最小化、尤度関数は最大化はややこしいので、対数尤度関数にマイナスを掛けて「最小化」で統一
勾配降下法
- Gradient descent
- 反復学習によりパラメータを逐次的に更新するアプローチの一つ
ηは学習率と呼ばれるハイパーパラメータでモデルの収束しやすさを調整
パラメータが更新されなくなった場合、それ勾配が0になったということ。少なくと も反復学習で探索した範囲では最適な解がもとめられたことになる
- 勾配降下法では、パラメータを更新するにN個全てデータに対する和を求める 必要がある。
※ 確率的勾配降下法(SDG)はDeep Learningで利用することが多いので、そちらでも学習してみてね
動画による説明(SDG)
- Deep Learningでのサンプルを想定
- 尤度が高いところへ収束していっている
- サンプルでは山が2つ
- 学習率が大きくなると、動画での尤度探索の移動量が増えるイメージ
- 最初は大きくても良いが、最尤近くになったら小さくしたい
※ ガウス型基底の話は試験に出てくる? → 優先度は高くないが、現場では一般的に出てくる ただし、理解するにはかなり複雜そう
モデルの評価
混同行列
- True Positive
- False Positive
- False Negative
- True Negative
- True/False 予測の成否
- Positive/Negative 予測の結果
正解率
- (TP + TN) / (TP + FN + FP + TN)
- 正解した数と予測した全データ数の割合
- データに偏りがあった場合に問題になることがある
- 単純な正解率はあまり意味をなさない
適合率
- TP / (TP + FP)
- 誤りが覆うてもヌケモレを少なくしたい
- メールのスパム判定の例としては、スパムがすり抜けて届く方がベター
再現率
- TP / (TP + FN)
- 見逃しが多くても、正確な予想をしたい
- 病気の陽性判定の例、再度検査をすればよいため
F値
- 適合率と再現率はトレードオフの関係にあるため、2つの調和平均を取る
- バランスを取りたい場合に利用
ハンズオン(タイタニック号データ)
欠損値があるデータ
- 無視する
- 欠損値が無い情報で補完する
- 回帰を使って補完する
処理の進め方
- 2変量に絞る
- Ageが欠損しているので、AgeFillカラムを追加
- Ageカラムのnullを中央値で補完
- 元のAgeカラムは残しておく
※ Pythonの実行でエラーが出ても結果は出ているみたい(LogisticRegression().fit)
DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
ハンズオン2 (2変数から生死を判別)
※ pythonのオープンソースを使うとかなり簡単に実現出来る。難しい微分とかは出てこない バックエンドはパッと書いてしまって、フロントにこだわるのもあり。REST APIとか
※ 図示化して表示してあげると色々な人を説得しやすい
ハンズオン3(混同行列とクロスバリデーション)
※ ヒートマップも上司に喜ばれるかも
※ きれいな図を書くなら、Seabornがおすすめ matplotlibのラッパー。もう少しきれいに書ける
スクリーンショット