P(Y | X)でトレーニングしたときに優れたパフォーマンスを持つモデルがある場合、最適なP(X | Y)を見つける


11

入力データ:

バツ > Tシャツの特徴(色、ロゴなど)

Y >利益率

上記のとランダムフォレストをトレーニングし、テストデータで妥当な精度を達成しました。ので、私は持っていますYバツY

PY|バツ

ここで、つまりフィーチャの確率分布を見つけたいと思います。これだけの利益率を期待しているからです。XPバツ|Yバツ

ランダムフォレスト(またはその他の識別モデル)でそれを行うにはどうすればよいですか?

私に対する提案の1つは、差別モデルではなく生成モデルから始めることです。しかし、私の理解では、生成モデルは、ナイーブベイズの場合のの条件付き独立性などの非常に限定的な仮定を行わない限り、一般にトレーニングに多くのデータを必要とします。バツ

その他の提案としては、とを入れ替えて、判別モデルをトレーニングすることもできます。今、利益率となり、シャツでの機能となります。は、目標利益率が与えられている場合、Tシャツの特徴の確率分布を直接示します。しかし、このアプローチは私には適切ではないようです。私はいつもを偶然の変数として考え、が効果的だからです。Y X Y P Y | X X YバツYバツYPY|バツバツY

また、私が聞いたところから、同様の質問が創薬のために提起されており、アルゴリズムは高度な成功を収める新薬候補を生み出すように設計されています。誰かがこのドメインの文献を研究するように私に指摘できますか?

更新:

私はこれに遭遇これは創薬に使用されているGANについて語っています。生成的な敵対的なネットワークは、私の問題の発言に適しているように思えるので、私はそれらについて読んでいます。しかし、私が理解したことの1つは、GANが監視なしの方法でサンプルを生成することです。彼らは最初にXの基になる分布をキャプチャし、次にその分布からサンプリングするようなサンプルを生成しようとします。しかし、私はX | Yに興味があります。XとYは上記で定義されています。GAN以外のものを探索する必要がありますか?ポインタはありますか?

フォローアップ質問:

Tシャツ(出力サンプルX)の作成方法を学習したGANのトレーニングを受けたとします。特定のYの上位5枚のシャツを入手するにはどうすればよいですか?


これはナップザック問題またはこれの確率的変形と密接に関連しています。入力ドメインについてのいくつかの合理的な仮定の下で、そのようにそれを言い換えることは可能でしょうか?
mjul 2018年

@mjul。Sryはあなたを捕まえませんでした。詳しく説明してください。ただし、問題を解決するための別のアプローチの提案はいつでも歓迎します!
クラウディウス2018年

1
ナップザック問題は組み合わせ最適化の問題であり、個々の機能の価値とコストを知っていると仮定して、目標が(Tシャツの)最も収益性の高い機能セットを特定することです。値は確率的ではなく正確であることを前提としています。ただし、妥当な独立性の仮定の下では、問題をナップザック問題として、または長年にわたって研究されてきた確率論的変形の1つとして、再度述べることができる場合があります。しかし、それ以上の情報がなければ、あなたのケースでそれが可能であることはすぐにはわかりません。
mjul 2018年

回答:


10

この応答は、元の形式から大幅に変更されています。私の元の応答の欠陥については以下で説明しますが、大幅に編集する前にこの応答がどのようになっていたかをおおまかに確認したい場合は、次のノートブックをご覧くださいhttps : //nbviewer.jupyter.org/github /dmarx/data_generation_demo/blob/54be78fb5b68218971d2568f1680b4f783c0a79a/demo.ipynb

TL; DR:概算するために使用するKDE(またはお好みの手順)、その後からサンプルを引き出すためにMCMCを使っP X | Y α P Y | X P X PはY | X はモデルによって指定されます。これらのサンプルから、生成したサンプルに2番目のKDEをフィッティングし、KDEを最大化する観測値を最大事後(MAP)推定値として選択することにより、「最適な」Xを推定できます。PバツPバツ|YαPY|バツPバツPY|バツバツ

最尤推定

...そしてそれがここで機能しない理由

私の最初の応答では、MCMCを使用して最尤推定を実行する方法を提案しました。一般的に、MLEは条件付き確率の「最適な」解を見つけるための優れたアプローチですが、ここで問題があります。判別モデル(この場合はランダムフォレスト)を使用しているため、確率は決定の境界に対して計算されています。 。このようなモデルの「最適な」ソリューションについて話すことは実際には意味がありません。クラスの境界から十分に離れると、モデルはすべてのものを予測するだけだからです。十分なクラスがある場合、それらの一部は完全に「囲まれる」可能性がありますが、その場合は問題になりませんが、データの境界にあるクラスは、必ずしも実現可能ではない値によって「最大化」されます。

実例を示すために、ここで見つけることができるいくつかの便利なコードを活用します。これはGenerativeSampler、元の応答からのコードをラップするクラス、このより優れたソリューションのためのいくつかの追加コード、および私が試してみたいくつかの追加機能(いくつかの機能するもの)を提供します、そうでないものもありますが、おそらくここには入りません。

np.random.seed(123)
sampler = GenerativeSampler(model=RFC, X=X, y=y, 
                            target_class=2, 
                            prior=None, 
                            class_err_prob=0.05, # <-- the score we use for candidates that aren't predicted as the target class
                            rw_std=.05,          # <-- controls the step size of the random walk proposal
                            verbose=True, 
                            use_empirical=False)
samples, _ = sampler.run_chain(n=5000)

burn = 1000
thin = 20
X_s = pca.transform(samples[burn::thin,:])

# Plot the iris data
col=['r','b','g']
for i in range(3):
    plt.scatter(*X_r[y==i,:].T, c=col[i], marker='x')
plt.plot(*X_s.T, 'k')
plt.scatter(*X_s.T, c=np.arange(X_s.shape[0]))
plt.colorbar()
plt.show()

ここに画像の説明を入力してください

この視覚化では、xは実際のデータであり、関心のあるクラスは緑色です。線で結ばれたドットは私たちが描いたサンプルであり、その色はそれらがサンプリングされた順序に対応し、右側のカラーバーラベルによって「薄められた」シーケンス位置が示されます。

ご覧のように、サンプラーはデータからかなり速く分岐し、基本的に、実際の観測に対応する特徴空間の値からかなり離れたところにいます。これは明らかに問題です。

だますことができる1つの方法は、提案関数を変更して、フィーチャがデータで実際に観察した値のみを取ることを許可することです。それを試して、結果の動作がどのように変わるか見てみましょう。

np.random.seed(123)
sampler = GenerativeSampler(model=RFC, X=X, y=y, 
                            target_class=2, 
                            prior=None, 
                            class_err_prob=0.05, 
                            verbose=True, 
                            use_empirical=True) # <-- magic happening under the hood
samples, _ = sampler.run_chain(n=5000)

X_s = pca.transform(samples[burn::thin,:])

# Constrain attention to just the target class this time
i=2
plt.scatter(*X_r[y==i,:].T, c='k', marker='x')
plt.scatter(*X_s.T, c='g', alpha=0.3)
#plt.colorbar()
plt.show()


sns.kdeplot(X_s, cmap=sns.dark_palette('green', as_cmap=True))
plt.scatter(*X_r[y==i,:].T, c='k', marker='x')
plt.show()

ここに画像の説明を入力してください

ここに画像の説明を入力してください

バツ

PバツPY|バツPバツPY|バツPバツ

ベイズ規則を入力してください

ここで数学の手間が少なくなるように私を探した後、私はこれをかなり試しました(それで私はGenerativeSamplerものを作ったのです)、そして私は上に示した問題に遭遇しました。私がこのことに気付いたときは本当に、本当に愚かでしたが、ベイズの法則の適用を求める声をあなたが求めていることは明らかであり、私は以前に却下されたことをお詫びします。

ベイズの規則に慣れていない場合は、次のようになります。

PB|A=PA|BPBPA

多くのアプリケーションでは、分母は定数であり、分子が1に積分されることを保証するスケーリング項として機能するため、ルールはしばしばこうして言い換えられます。

PB|AαPA|BPB

または平易な英語で:「事後は以前の時間の可能性に比例します」。

見覚えがあります?今はどう:

Pバツ|YαPY|バツPバツ

ええ、これは、観測されたデータの分布に基づいてMLEの推定値を作成することで、これまでに正確に作成したものです。私はベイズがこのように支配することについて考えたことはありませんが、理にかなっているので、この新しい視点を発見する機会を与えてくれてありがとう。

PY

したがって、データの事前統合を組み込む必要があるというこの洞察を作成したら、標準のKDEをフィッティングしてそれを行い、結果がどのように変化するかを見てみましょう。

np.random.seed(123)
sampler = GenerativeSampler(model=RFC, X=X, y=y, 
                            target_class=2, 
                            prior='kde',         # <-- the new hotness
                            class_err_prob=0.05,
                            rw_std=.05,          # <-- back to the random walk proposal
                            verbose=True, 
                            use_empirical=False)
samples, _ = sampler.run_chain(n=5000)

burn = 1000
thin = 20
X_s = pca.transform(samples[burn::thin,:])

# Plot the iris data
col=['r','b','g']
for i in range(3):
    plt.scatter(*X_r[y==i,:].T, c=col[i], marker='x')
plt.plot(*X_s.T, 'k--')
plt.scatter(*X_s.T, c=np.arange(X_s.shape[0]), alpha=0.2)
plt.colorbar()
plt.show()

ここに画像の説明を入力してください

バツPバツ|Y

# MAP estimation

from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV
from scipy.optimize import minimize

grid = GridSearchCV(KernelDensity(), {'bandwidth': np.linspace(0.1, 1.0, 30)}, cv=10, refit=True)
kde = grid.fit(samples[burn::thin,:]).best_estimator_

def map_objective(x):
    try:
        score = kde.score_samples(x)
    except ValueError:
        score = kde.score_samples(x.reshape(1,-1))
    return -score

x_map = minimize(map_objective, samples[-1,:].reshape(1,-1)).x

print(x_map)

x_map_r = pca.transform(x_map.reshape(1,-1))[0]
col=['r','b','g']
for i in range(3):
    plt.scatter(*X_r[y==i,:].T, c=col[i], marker='x')
sns.kdeplot(*X_s.T, cmap=sns.dark_palette('green', as_cmap=True))
plt.scatter(x_map_r[0], x_map_r[1], c='k', marker='x', s=150)
plt.show()

ここに画像の説明を入力してください

そして、そこにそれがあります:大きな黒い「X」はMAP推定値です(これらの輪郭は後部のKDEです)。


返信ありがとうございます。質問があります。alpha = np.min([f(new)/ f(old)、1]).....ここでf(new)はP(Y = 0 | X = new)なので、model.predict_probaを使用すると、 Xが与えられたYの分布......しかしen.wikipedia.org/wiki/Metropolisから–Hastings_algorithm私が理解できたのはアルファはmin(P(X = new | y = 0)/ P(X = old | y = 0)、1)。私は何かを誤解しましたか?
クラウディウス2017

また、TLDRノートで「MCMCを使用して、モデルによって提供されるクラス条件付き尤度に対して候補X値をスコアリングすることにより、p(X | Y)からサンプルを生成する」と述べました。しかし、model.predict_probaは、Xが与えられたクラスの尤度を与えていません。model.predict_proba(X1)[0,0]> modelだからといって、P(X1 | Y = 0)> P(X2 | Y = 0)と言うにはどうすればよいでしょうか。 .predict_proba(X2)[0,0]。model.predict_probaから関係をP(Y = 0 | X1)> P(Y = 0 | X2)として読み取ります。どこが悪いのか教えてください。
クラウディウス2017

また別のフォローアップの質問...ここで対称提案分布関数とは何ですか?私を助けてくれたDavidに感謝します!!
クラウディウス2017

対称的な提案は、ガウスのランダムウォークです。私はこれを「経験的」提案関数のデモでもすぐに更新する予定です。MCMCの数学については、あまり夢中にならないでください。Yを固定してX候補をp(Y | X)に対して実行すると、MCMCはXのMLEをp(Y = 0 | X)で近似します。つまり、ここからサンプリングしている関数はp(Y | Xではありません) )(それ以外の場合は、クラスラベルのシーケンスを生成します)、それはL(X; Y)です。これにより、p(X | Y = 0)上の分布が効果的に得られます。大都市比のスコアリング関数はp(Y | X)ですが、これを使用する方法では、p(X | Y)からサンプルを生成します。
デビッドマルクス

ねえデビッド。数学を書いてください。私は自分に数学を説得するのに苦労している。私はあなたが統計学の卒業生であることを見つけるためにあなたのプロフィールをチェックしました。私のような単なる人間を助けるためにあなたのポイントを詳しく説明してください:P。特に "Yを固定してX候補をp(Y | X)に対して実行すると、MCMCはXのMLEをp(Y = 0 | X)で近似します。つまり、ここからサンプリングしている関数はp(Yではありません。 | X)(それ以外の場合は、クラスラベルのシーケンスを生成します)、それはL(X; Y)です。これにより、p(X | Y = 0)上の分布が効果的に得られます。
クラウディウス2018年

0

前進する1つの方法は次のとおりです。

Y(おそらく正規化したい)がXを予測するフィードフォワードニューラルネットワークを作成します。したがって、モデルの出力(最後のレイヤー)は、各機能のソフトマックスニューロンのセットになります。したがって、機能1(たとえば、色)に4つのオプションがある場合、4つのニューロンにソフトマックスを適用し、各機能に対して同じことを行います。

次に、損失関数は、各フィーチャのクロスエントロピーの合計(または、必要に応じて線形結合)にすることができます。


返信ありがとうございます!しかし、私は複数のアプローチを提案し、各アプローチの長所と短所に言及する答えを探しています。
クラウディウス2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.