🤖

Pythonでロジスティック回帰を1から実装してみた

に公開

🧠 ロジスティック回帰の手動実装【乳がんデータセット使用】

以下は、scikit-learnの乳がん診断データセットを使って、ロジスティック回帰をNumPyだけで実装した例です。


📦 必要なライブラリの読み込み

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

📊 データ準備と分割

# データの読み込み
dataset = load_breast_cancer()
X = dataset.data
y = dataset.target

# 訓練・テスト分割(クラスの比率を維持)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, stratify=y, test_size=0.2, random_state=42
)

🔄 特徴量の標準化

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

y_train = y_train.reshape(-1, 1)
y_test = y_test.reshape(-1, 1)

🔧 モデルの初期化と学習

# パラメータ初期化
w = np.random.randn(X_train.shape[1], 1)
b = np.random.randn()
learning_rate = 0.01
epochs = 10000

# 学習ループ
for epoch in range(epochs):
    z = X_train @ w + b
    prediction = 1 / (1 + np.exp(-z))  # sigmoid関数
    error = prediction - y_train

    # 勾配計算
    gradient_w = X_train.T @ error / len(X_train)
    gradient_b = error.mean()

    # パラメータ更新
    w -= learning_rate * gradient_w
    b -= learning_rate * gradient_b

    # 1000エポックごとに損失を表示
    if epoch % 1000 == 0:
        loss = -y_train*np.log(prediction + 1e-15) - (1 - y_train)*np.log(1 - prediction + 1e-15)
        print(loss.mean())

🧪 テスト精度の確認

np.set_printoptions(suppress=True, precision=15)
test_z = X_test @ w + b
test_prediction = 1 / (1 + np.exp(-test_z))
test_result = (test_prediction >= 0.5).astype(int)

accuracy = np.mean((test_result == y_test).astype(int))
print(accuracy)

✅ まとめ

この実装では、scikit-learnを使わずにロジスティック回帰の仕組みを1から構築しました。勾配降下法、クロスエントロピー損失、シグモイド関数の理解が深まるはずです。

Discussion