線形回帰や多項式回帰を学んだ後、次に取り組むべきはロジスティック回帰(Logistic Regression)です。これは主に二値分類問題を解くための手法で、「ある事象が起こるか否か」を確率的に予測します。たとえば、商品が売れるかどうか、患者が特定の病気に罹患しているか、といった「Yes/No」の判断に広く使われます。
ロジスティック回帰の特徴
ロジスティック回帰は名前に「回帰」とありますが、実際には分類アルゴリズムです。その核心はSigmoid関数(シグモイド関数)にあります。この関数は任意の実数を 0 から 1 の間に写像し、結果を「確率」として解釈できます:
\[ \sigma(z) = \frac{1}{1 + e^{-z}}, \quad \text{ここで } z = \beta_0 + \beta_1 x_1 + \cdots + \beta_n x_n \]
出力が 0.5 以上ならクラス 1、未満ならクラス 0 と判定するのが一般的です。
多クラス・順序付き分類への拡張
基本形は二値分類ですが、One-vs-Rest(OvR)などの戦略により多クラス分類にも適用可能です。さらに、カテゴリに順序(ordinal)がある場合(例:サイズ「S < M < L」)、順序ロジスティック回帰(Ordinal Logistic Regression)が利用されます。これは複数の閾値 \(T_1, T_2, \dots, T_{k-1}\) を設け、潜在的な連続変数 \(Y^*\) を k 個の順序カテゴリに分割するモデルです。
変数の関係性について
ロジスティック回帰の基盤は依然として線形結合です。つまり、特徴量とロジット(log-odds)の間には線形関係が仮定されています。ただし、特徴量同士が強く相関していても(多重共線性があっても)、モデルは動作します。線形回帰ほど敏感ではありませんが、解釈性や安定性の観点からは注意が必要です。
実践:カボチャデータセットでの分類
以下では、カボチャの色(オレンジ or その他)を予測するタスクを通じてロジスティック回帰を実装します。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# データ読み込みと前処理
df = pd.read_csv('../data/US-pumpkins.csv')
cols_to_use = ['Color', 'Origin', 'Item Size', 'Variety', 'City Name', 'Package']
clean_df = df[cols_to_use].dropna()
# カテゴリ変数を数値に変換
encoder = LabelEncoder()
encoded_df = clean_df.apply(lambda col: encoder.fit_transform(col.astype(str)))
可視化による探索的データ分析
変数間の関係を把握するために、Seaborn の PairGrid を使用します:
import seaborn as sns
g = sns.PairGrid(encoded_df)
g.map(sns.scatterplot)
特に注目すべきは Color 変数です。これは二値カテゴリ(オレンジ/非オレンジ)であり、他の変数との関係を小提琴図(violin plot)で確認できます:
sns.catplot(x="Color", y="Item Size", kind="violin", data=encoded_df)
小提琴図は分布の密度と範囲を同時に示すため、カテゴリごとの違いを直感的に把握できます。
モデル構築と評価
Scikit-learn を使ってモデルを訓練し、性能を評価します:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, roc_curve
X = encoded_df.drop('Color', axis=1)
y = encoded_df['Color']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
clf = LogisticRegression(max_iter=1000)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
y_proba = clf.predict_proba(X_test)[:, 1]
評価指標の解釈
分類レポートは各クラスごとの Precision(適合率)、Recall(再現率)、F1-score を提供します:
precision recall f1-score support
0 0.83 0.98 0.90 166
1 0.00 0.00 0.00 33
accuracy 0.81 199
クラス 1 の性能が極端に低いのは、不均衡データ(imbalance)によるものです。このような場合、Accuracy だけではモデルの真の性能を評価できません。
混同行列も重要な診断ツールです:
[[162 4]
[ 33 0]]
クラス 1 の全サンプルが誤ってクラス 0 と予測されている(False Negative = 33)ことがわかります。
ROC曲線とAUC
ROC曲線は、さまざまな閾値における真陽性率(TPR)と偽陽性率(FPR)のトレードオフを可視化します:
fpr, tpr, _ = roc_curve(y_test, y_proba)
auc = roc_auc_score(y_test, y_proba) # → 約 0.70
AUCが 0.7 近くあることから、完全なランダムよりは優れているものの、改善の余地があります。
まとめ
ロジスティック回帰はシンプルながら強力な分類手法であり、確率的解釈が可能な点が大きな利点です。ただし、線形決定境界しか表現できないため、非線形なパターンには限界があります。今後のステップとして、特徴量エンジニアリングやアンダーサンプリング/オーバーサンプリングによる不均衡対策、さらには非線形モデル(決定木、SVM、ニューラルネットなど)への移行が考えられます。