逻辑回帰による二値分類入門

線形回帰や多項式回帰を学んだ後、次に取り組むべきはロジスティック回帰(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、ニューラルネットなど)への移行が考えられます。

タグ: ロジスティック回帰 機械学習 Scikit-learn 分類問題 Python

7月24日 21:21 投稿