🤖
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