ロジスティック回帰分析のスクラッチ実装:NumPyによる実装
ロジスティック回帰は、二値分類問題で広く使用される手法です。この記事では、NumPyを使ってロジスティック回帰モデルをゼロから実装する方法を解説します。具体的には、ロジスティック関数、損失関数(交差エントロピー)、そして勾配降下法によるパラメータの更新を実装します。
1. ロジスティック回帰とは?
ロジスティック回帰は、線形回帰に基づいた分類アルゴリズムです。二値分類の問題において、入力特徴量に基づいて出力がクラス0かクラス1かを予測します。予測値は0から1の間の値で表され、しきい値(通常は0.5)を用いてクラスに分類されます。
2. ライブラリのインポート
import numpy as np
3. データセットの準備
まず、ロジスティック回帰モデルに学習させるためのデータセットを用意します。今回は、XOR問題を簡単なデータセットとして使用します。このデータセットは2つの入力を持ち、出力はそれらの排他的論理和(XOR)になります。
# データセットの準備
x = np.array([[0, 0],
[0, 1],
[1, 0],
[1, 1]]) # (B, F) (4, 2)
y = np.array([[0],
[1],
[1],
[0]]) # (B, 1)
4. 重みとバイアスの初期化
次に、重み w とバイアス b を初期化します。初期値は0.1と0.2に設定しますが、通常はランダムな初期化が一般的です。
# 重みとバイアスの初期化
w = np.array([[0.1],
[0.2]]) # (2, 1)
b = np.array([[0.0]])
5. 学習率の設定
学習率は、勾配降下法で使用するパラメータ更新の一歩の大きさを調整するために必要です。学習率が大きすぎると収束が不安定になる可能性があるため、適切な値を選びます。
# 学習率の設定
learning_rate = 1
6. 順伝播:シグモイド関数の適用
ロジスティック回帰モデルの出力を計算するために、シグモイド関数を適用します。シグモイド関数は、モデルの線形結合出力 z を0から1の範囲に変換し、確率として解釈できるようにします。
# 順伝播
z = np.dot(x, w) + b # (batch, 1)
y_pred = 1 / (1 + np.exp(-z)) # シグモイド関数
7. 損失関数の計算
ロジスティック回帰の損失関数として、交差エントロピー損失(ログ損失)を使用します。これは、出力確率と正解ラベルの不一致を測定するものであり、モデルが予測精度を向上させるための指標となります。
# 損失関数の計算
loss = - (y * np.log(y_pred + 1e-8) + (1 - y) * np.log(1 - y_pred + 1e-8))
# 平均損失を出力
print(f"Iteration {i+1}, Loss: {loss.mean()}")
8. 逆伝播:勾配の計算
ロジスティック回帰では、損失関数の勾配を計算して、重みとバイアスを最適化します。今回はシグモイド関数の微分を考慮して、重みとバイアスの勾配を計算しています。
# 逆伝播
dy = -(y / (y_pred + 1e-8)) + ((1 - y) / (1 - y_pred + 1e-8))
dz = dy * y_pred * (1 - y_pred) # シグモイドの微分を含む
dw = np.dot(x.T, dz) / x.shape[0] # 重みの勾配
db = np.sum(dz) / x.shape[0] # バイアスの勾配
9. パラメータの更新
学習率と勾配を用いて、重み w とバイアス b を更新します。これにより、モデルの予測が少しずつ改善されていきます。
# パラメータの更新
w -= learning_rate * dw
b -= learning_rate * db
10. 更新結果の表示
各イテレーションごとに、更新された重みとバイアスを確認し、モデルが学習していることを確認します。
# 更新された重みとバイアスの出力
print("Updated weights:", w)
print("Updated bias:", b)
まとめ
このコードでは、ロジスティック回帰モデルの基本的な構成要素であるシグモイド関数、交差エントロピー損失、および勾配降下法を利用して、シンプルなロジスティック回帰モデルをスクラッチ実装しました。これにより、ロジスティック回帰モデルの学習プロセスがどのように進むのかを理解することができます。
さらに学びたい場合は、このモデルを複数のデータセットや多次元データでテストしたり、学習率やイテレーション数を調整したりすることで、学習の挙動がどのように変わるかを観察すると良いでしょう。