【Python】ロジスティック回帰を使ってクラスの確率を予測するモデルの構築Part1
はじめに
この記事は株式会社インプレスの「Python機械学習プログラミング Pytorch&scilit-learn編」を読んで、私が学習したことをまとめています。
今回は3章3節の「ロジスティック回帰を使ってクラスの確立を予測するモデルの構築」を読んで学んだことをまとめていきます。
※まとめている中で、思った以上にボリュームがあったので、細かく記事を分けています。今回は「3.3.1 ロジスティック回帰と条件付き確率」を読んで学んだことをまとめています。
また、用語などの定義については【Python】ADALINE(フルバッチ勾配降下法)と学習の収束にまとめていますので、こちらをご確認ください。
【リンク紹介】
・【一覧】Python機械学習プログラミング Pytorch&scilit-learn編
・これまで書いたシリーズ記事一覧
ロジット関数
ロジット関数の定義
ロジスティック回帰(logostic regression)とは、ADALINEの活性化関数を恒等関数ではなくシグモイド関数(sigmoid function)
に置き換えたものです。よって、ここではシグモイド関数についてお話します。
まず、事象(event)とは結果として起こる事柄のことを言い、正事象(positive event)とは予測したい事象であるとします。そして正事象の確立を
と書くことができます。(※この記事で用いられている
ここで、比
このオッズ比の対数をとって確率
と表すこととします。
ロジット関数のグラフ
すると、ロジット関数は次のようなグラフになります。
import
!pip install japanize_matplotlib > /dev/null # matplotlibで日本語表示を行う
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib
# 0から1まで50個の配列を作る
x = np.linspace(0, 1, 50)
# ロジット関数を定義
y = np.log (x / (1 - x))
# 結果を描画
plt.plot(x, y, color = '#3F9877')
# 縦軸を追加
ymin, ymax = -4, 4
plt.vlines(0.5, ymin, ymax, color = 'black')
# 横線を追加
xmin, xmax = 0, 1
plt.hlines(0, xmin, xmax, color = 'black')
plt.xlabel('p')
plt.ylabel('logit(p)')
# グラフを保存
plt.savefig('logit_function.png')
plt.grid()
plt.show()
ロジット関数を定義
# 0から1まで50個の配列を作る
x = np.linspace(0, 1, 50)
# ロジット関数を定義
y = np.log (x / (1 - x))
ロジット関数を描画
# 結果を描画
plt.plot(x, y, color = '#3F9877')
# 縦軸を追加
ymin, ymax = -4, 4
plt.vlines(0.5, ymin, ymax, color = 'black')
# 横線を追加
xmin, xmax = 0, 1
plt.hlines(0, xmin, xmax, color = 'black')
plt.xlabel('p')
plt.ylabel('logit(p)')
# グラフを保存
plt.savefig('logit_function.png')
plt.grid()
plt.show()
[参考資料]
シグモイド関数
シグモイド関数の定義
さて、このロジット関数ですが、ロジスティックモデルにおいては総入力
この関数の逆関数が、冒頭で出てきたシグモイド関数となります。導出は以下の通りです。
シグモイド関数のグラフ
では実際にシグモイド関数を描画してみます。
シグモイド関数を定義と実装
# シグモイド関数を定義
def sigmoid(z):
return 1.0 / (1.0 + np.exp(-z))
# 0.1間隔で-7以上7未満のデータを作成
z = np.arange(-7, 7, 0.1)
# シグモイド関数を実行
sigma_z = sigmoid(z)
シグモイド関数を描画
# 結果を描画
plt.plot(z, sigma_z, color = '#3F9877')
# 垂直線を追加(z = 0)
plt.axvline(0.0, color = 'k')
# y軸の上限/下限を設定
plt.ylim(-0.1, 1.1)
# 軸のラベルを設定
plt.xlabel('z')
plt.ylabel('$\sigma_3 (z)$')
# y軸のメモリを追加
plt.yticks([0.0, 0.5, 1.0])
# Axesクラスのオブジェクトの取得
ax = plt.gca()
# y軸のメモリに合わせて水平グリッド線を追加
ax.yaxis.grid(True)
# グラフを保存
plt.savefig('3-2.png')
plt.show()
グラフより、
閾値関数を再定義する
したがって、シグモイド関数は入力値を受け取り、
よって、閾値関数を切片が0.5であることに注目して以下のように定義すればよいです。
再定義とは書きましたが、結論だけ見ればこれまでの閾値関数と変わりません。
参考文献
- Sebastian Raschka, Yuxi(Hayden)Liu, Vahid Mirjalili.Python機械学習プログラミング PyTorch&scilit-learn編.株式会社インプレス,2022
- Christopher M. Bishop.パターン認識と機械学習 上.丸善出版,2014
- Soledad Galli.データサイエンティストのための特徴量エンジニアリング.株式会社マイナビ,2023
- 寺田学, 辻真吾, 鈴木たかのり, 福島真太郎.Pythonによる新しいデータ分析の教科書 第2版.翔泳社,2023
- 三宅敏恒.線形代数学-初歩からジョルダン標準形へ-.培風館,2009
- 稲垣宣生,山根芳知,吉田光雄.統計学入門.裳華房, 2009
- 宮腰忠.高校数学+α 基礎と論理の物語.共立出版, 2013
ご協力のほどよろしくお願いします。
Discussion