順序回帰

2.2.8

順序回帰

最終更新 2026-03-03 読了時間 1 分
まとめ
  • 順序回帰(Ordinal Regression)は「悪い < 普通 < 良い」のような順序関係を持つカテゴリを予測する。
  • 通常の多クラス分類(ソフトマックス)はカテゴリ間の順序を無視するが、順序回帰はこの情報を活用する。
  • mord ライブラリの OrdinalRidge や、Frank-Hall 法(二値分類器の連鎖)で実装できる。

直感 #

映画のレビュー(1〜5つ星)を予測するタスクで、3つ星を5つ星と誤分類するのと、4つ星と誤分類するのでは深刻さが違う。通常のソフトマックスはすべての誤分類を等しく扱うが、順序回帰は「2つ離れた誤分類より1つ離れた誤分類の方がまし」という構造を組み込む。

詳細な解説 #

累積確率モデル #

順序回帰の代表的な定式化は、累積確率モデル(比例オッズモデル):

$$ P(Y \le k | X) = \sigma(\theta_k - X\beta) $$
  • $\theta_k$: クラス $k$ の閾値($\theta_1 < \theta_2 < \cdots$)
  • $\beta$: 共通の回帰係数
  • $\sigma$: シグモイド関数

Python 実装 — mord #

 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 ソフトマックス #

 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与信審査
満足度調査非常に不満〜非常に満足アンケート分析