02.2.8
順序回帰
mord ライブラリの OrdinalRidge や、二値分類器を連鎖させる Frank-Hall 法で実装できます。順序回帰は ロジスティック回帰 のシグモイドを閾値ごとに並べた形なので二値分類の式を先に、そして順序を無視する比較対象として ソフトマックス回帰 を押さえておくと、違いが「閾値を共有するかどうか」だけだと分かります。
直感 #
映画のレビュー(1〜5 つ星)を予測するタスクで、3 つ星を 5 つ星と誤分類するのと、4 つ星と誤分類するのでは深刻さが違います。通常のソフトマックスはこの 2 つの誤りを等しく扱います。クラス 1 からクラス 5 は「別々のラベル」でしかありません。順序回帰は、まず特徴量から 1 本の数直線上のスコアを計算し、そのスコアを 4 本の閾値で 5 つの区間に切ります。星 3 と星 4 の区間は隣り合っているので、スコアが少しずれても 1 段階しか外れません。
式で書くと何を切っているか #
累積確率モデル #
「スコアを閾値で切る」を確率の形にしたのが、累積確率モデル(比例オッズモデル)です。
$$ P(Y \le k | X) = \sigma(\theta_k - X\beta) $$\(\theta_k\) はクラス \(k\) の閾値で \(\theta_1 \lt \theta_2 \lt \cdots\) と並び、\(\beta\) は全クラスで共通の回帰係数、\(\sigma\) はロジスティック回帰と同じシグモイド関数です。「\(k\) 以下である確率」を閾値ごとに出し、隣どうしの差をとれば各クラスの確率になります。係数 \(\beta\) が 1 本しかないのがソフトマックスとの決定的な違いで、ソフトマックスはクラスごとに別の \(\mathbf{w}_k\) を持ちます。
Python 実装 — mord #
次のコードは、5 クラスの人工データを 1000 件作り、70 % を学習・30 % を評価に分けます。make_classification のクラス番号 0〜4 を「星 1〜5」の順序つきカテゴリと見なします。
| |
順序回帰 vs ソフトマックス #
同じ学習データで mord.OrdinalRidge(順序回帰)と LogisticRegression(順序を無視した多クラス分類)を学習し、評価データ 300 件の MAE を比べます。
| |
応用場面 #
| タスク | 順序カテゴリ | 例 |
|---|---|---|
| 商品レビュー | 1〜5つ星 | ECサイトの評価予測 |
| 患者の重症度 | 軽症 < 中等 < 重症 | 医療トリアージ |
| 信用スコア | A > B > C > D | 与信審査 |
| 満足度調査 | 非常に不満〜非常に満足 | アンケート分析 |
使いどころと落とし穴 #
順序回帰が向くのは、上の表のように「隣のカテゴリとの誤りは軽く、遠いカテゴリとの誤りは重い」とはっきり言える問題です。逆に「犬・猫・鳥」のように順序のないカテゴリに OrdinalRidge を使うと、存在しない大小関係をスコアに押し込んで精度が落ちます。間違えやすいのは評価指標です。accuracy_score だけを見ると順序回帰の利点はほとんど現れず、MAE か、順序を考慮した一致度の Cohen’s Kappa(重み付き版)で比べる必要があります。クラスの間隔が等しくない(星 4 と星 5 の差が星 1 と星 2 の差より小さい)場合は、閾値 \(\theta_k\) を学習する累積確率モデル(mord.LogisticAT)のほうが、等間隔を仮定する OrdinalRidge より適しています。
まとめ #
順序回帰は、1 本の回帰スコア \(X\beta\) を並んだ閾値 \(\theta_1 \lt \theta_2 \lt \cdots\) で区切ることで、「星 3 を星 4 と間違えるのは星 5 と間違えるよりまし」という順序の情報を予測に組み込みます。ソフトマックス回帰はクラスごとに別の係数を持ち、この順序を使いません。評価は accuracy_score ではなく mean_absolute_error で「何段階ずれたか」を測り、上のコードは mord.OrdinalRidge と LogisticRegression の MAE を同じ 300 件で比べる実験です。星評価・重症度・信用格付けのように順序が明確なカテゴリで使い、順序のないカテゴリには適用しないでください。
- ロジスティック回帰 — 二値分類の基本手法
- ソフトマックス回帰 — 順序を無視した多クラス分類
- Cohen’s Kappa — 順序を考慮した一致度指標