K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

順序回帰

中級

02.2.8

順序回帰

最終更新 2026-03-03 読了時間 3 分
まとめ
順序回帰(Ordinal Regression)は、「悪い < 普通 < 良い」や星 1〜5 のように順序のあるカテゴリを予測する手法です。通常の多クラス分類(ソフトマックス)は星 3 を星 4 と間違えるのも星 5 と間違えるのも同じ 1 回の誤りとして扱いますが、順序回帰は 1 本の回帰スコア \(X\beta\) を並んだ閾値 \(\theta_1 < \theta_2 < \cdots\) で区切るので、「2 つ離れた誤りより 1 つ離れた誤りのほうがまし」という構造が自然に入ります。評価も正解率ではなく MAE(平均絶対誤差)で「何段階ずれたか」を測ります。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」の順序つきカテゴリと見なします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, mean_absolute_error
import mord

np.random.seed(42)
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5,
                           n_classes=5, n_clusters_per_class=1, random_state=42)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

順序回帰 vs ソフトマックス #

同じ学習データで mord.OrdinalRidge(順序回帰)と LogisticRegression(順序を無視した多クラス分類)を学習し、評価データ 300 件の MAE を比べます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from sklearn.linear_model import LogisticRegression

# 順序回帰
ord_model = mord.OrdinalRidge(alpha=1.0)
ord_model.fit(X_train, y_train)
y_pred_ord = ord_model.predict(X_train).astype(int)

# 通常の多クラス分類
lr_model = LogisticRegression(max_iter=1000, random_state=42)
lr_model.fit(X_train, y_train)
y_pred_lr = lr_model.predict(X_test)

y_pred_ord_test = ord_model.predict(X_test).astype(int)
print(f"順序回帰 MAE: {mean_absolute_error(y_test, y_pred_ord_test):.3f}")
print(f"ソフトマックス MAE: {mean_absolute_error(y_test, y_pred_lr):.3f}")

応用場面 #

タスク順序カテゴリ例
商品レビュー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 件で比べる実験です。星評価・重症度・信用格付けのように順序が明確なカテゴリで使い、順序のないカテゴリには適用しないでください。