互いに素な分類器のアンサンブルで構成される分類器のROC曲線を計算する効率的なアルゴリズム


13

同じ入力で2つがtrueを返さないという意味で互いに素な分類子C_1 ... C_nがあるとします(たとえば、決定木のノード)。これらのサブセットの和集合である新しい分類器を構築したい(例えば、決定木のどの葉で肯定的な分類を行うかを決定したい)。もちろん、そうすることで、感度と正の予測値の間にはトレードオフがあります。だから私はROC曲線を見たいです。原則として、分類子のすべてのサブセットを列挙し、結果の感度とPPVを計算することでこれを行うことができます。ただし、nが30以上の場合、これは非常に高価です。一方、パレート最適ではない組み合わせはほぼ確実に存在するため、分岐限定戦略などが存在する可能性があります。

このアプローチが実りある可能性が高いかどうか、作業があるかどうか、または上記の状況でROC曲線を効率的に計算するためのアイデアがあるかどうかについてアドバイスをお願いします。


各入力ケースをtrueまたはfalseに分類していますか?
image_doctor

@image_doctor:はい
ジョシュブラウンクレイマー

「同じ入力に対して2つがtrueを返さないという意味でばらばらです...」とあなたはバイナリ出力に分類していますが、2つ以上の分類器をどのように持つことができますかアンサンブル、私はおそらく何かが欠けている?
image_doctor

@image_doctor:2つの分類子が同じ入力で同じ出力を返すことはないと言っていると思われるかもしれません。誰も真を返さないと言っています。どちらもfalseを返すことができます。
ジョシュブラウンクレイマー

1
ROCの分類器を結合する理論的に最適な方法に関するこの論文(またはそれを引用する論文)は、M。バレノ、A。カルデナス、JDタイガー、分類器の組み合わせの最適なROC曲線、ニューラル情報処理システムの進歩、2008年
Valentas

回答:


1

N10

これはナップザックの問題に非常によく似ています!クラスターのサイズは「重み」であり、クラスター内の正のサンプルの数は「値」であり、固定容量のナップサックをできるだけ多くの値で満たしたいと考えています。

ナップザック問題には、正確な解を見つけるためのいくつかのアルゴリズムがあります(動的プログラミングなど)。しかし、便利な貪欲な解決策は、クラスターを降順でソートすることですvalueweightkk0N

1k1p[0,1]k

Pythonの例を次に示します。

import numpy as np
from itertools import combinations, chain
import matplotlib.pyplot as plt
np.random.seed(1)
n_obs = 1000
n = 10

# generate clusters as indices of tree leaves
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_predict
X, target = make_classification(n_samples=n_obs)
raw_clusters = DecisionTreeClassifier(max_leaf_nodes=n).fit(X, target).apply(X)
recoding = {x:i for i, x in enumerate(np.unique(raw_clusters))}
clusters = np.array([recoding[x] for x in raw_clusters])

def powerset(xs):
    """ Get set of all subsets """
    return chain.from_iterable(combinations(xs,n) for n in range(len(xs)+1))

def subset_to_metrics(subset, clusters, target):
    """ Calculate TPR and FPR for a subset of clusters """
    prediction = np.zeros(n_obs)
    prediction[np.isin(clusters, subset)] = 1
    tpr = sum(target*prediction) / sum(target) if sum(target) > 0 else 1
    fpr = sum((1-target)*prediction) / sum(1-target) if sum(1-target) > 0 else 1
    return fpr, tpr

# evaluate all subsets
all_tpr = []
all_fpr = []
for subset in powerset(range(n)):
    tpr, fpr = subset_to_metrics(subset, clusters, target)
    all_tpr.append(tpr)
    all_fpr.append(fpr)

# evaluate only the upper bound, using knapsack greedy solution
ratios = [target[clusters==i].mean() for i in range(n)]
order = np.argsort(ratios)[::-1]
new_tpr = []
new_fpr = []
for i in range(n):
    subset = order[0:(i+1)]
    tpr, fpr = subset_to_metrics(subset, clusters, target)
    new_tpr.append(tpr)
    new_fpr.append(fpr)

plt.figure(figsize=(5,5))
plt.scatter(all_tpr, all_fpr, s=3)
plt.plot(new_tpr, new_fpr, c='red', lw=1)
plt.xlabel('TPR')
plt.ylabel('FPR')
plt.title('All and Pareto-optimal subsets')
plt.show();

このコードはあなたのために素晴らしい絵を描きます:

TPR、FPR、および最適曲線

210

そして今、ちょっとした塩:サブセットについて全く気にする必要はありませんでした!私がやったのは、それぞれの陽性サンプルの割合で木の葉をソートすることです。しかし、得られたのは、ツリーの確率的予測のROC曲線です。これは、トレーニングセットのターゲット周波数に基づいて葉を手摘みしてツリーを上回ることはできないことを意味します。

リラックスして、通常の確率的予測を使用し続けることができます:)


いい案。理論的には、指数関数的に多くの「ポジティブコール」が発生する可能性がありますが、実際にはおそらく問題ではありません。
バレンタス

なぜ指数関数的な呼び出し回数ですか?各クラスターの値/重みを計算し(線形時間を要します)、それらを並べ替え(N * log(N))、最初のKクラスターごとにTPRとFPRを評価します(線形にすることもできます)。
デビッドデール

正の予測の可能な値ごとにナップザックを解くと、指数関数的な数のサブセットがあります。しかし、凸包の内側の点を明確に求める場合、これは理論的な技術です。これは面白くありません-これは受け入れられた答えです。
バレンタス

@Valentas、わかりました、あなたの意見がわかります。それでも、いくつかのリーフでランダムな予測を行うと、凸包の任意のポイントに到達できます。したがって、この場合、船体はROCそのものです。
デビッドデール

@DavidDale、要約すると:1)(感度、PPV)に関してパレート最適なすべての戦略は、その数の正の予測を持つ戦略の中で真の陽性の数を最大化します。2)これはナップザックの問題です。3)肯定的な例の数/例の数の順にノードを選択することは、ナップザック問題の適切な近似ソリューションであることが知られています。4)しかし、それは確率の閾値を選ぶのと同じです。
ジョシュブラウンクレイマー

0

貪欲な方法を使用することをお勧めします。開始する分類器を指定すると、アンサンブルに最高のパフォーマンス向上をもたらす分類器が含まれます。分類子を追加しても改善が見られない場合は、停止します。すべての分類子から始めます。複雑さはせいぜいN * Nになります。

もう1つ質問があります。「あなたの文脈では特に、「パレート最適」とはどういう意味ですか?wikiからこの説明、https://en.wikipedia.org/wiki/Pareto_efficiencyを見つけました

再割り当てにより、他の参加者の幸福度を低下させることなく、少なくとも1人の参加者の幸福度を改善できます。

パレート効率の改善は、各分類子に対応する可能性のある各参加者に対してです。1つの分類子に対する改善をどのように定義しますか?


1
つまり、アンサンブル1と2があり、それぞれ(感度、正の予測値)=(.90、.80)および(.97、.93)の場合、1はパレート最適ではありません。別のアンサンブル、つまり2で、あらゆる面でそれを打ち負かしています。提案されたアルゴリズムに関して:感度とPPVの間にはトレードオフがあります。そのため、「アンサンブルが最高のパフォーマンス改善を得る」は明確に定義されていません。
ジョシュブラウンクレイマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.