Temukan P optimal (X | Y) mengingat saya memiliki model yang memiliki kinerja baik ketika dilatih tentang P (Y | X)


11

Memasukan data:

-> fitur kaos (warna, logo, dll)X

-> margin keuntunganY

Saya telah melatih hutan acak pada dan Y di atas dan telah mencapai akurasi yang masuk akal pada data uji. Jadi saya punyaXY

.P(Y|X)

Sekarang, saya ingin mencari yaitu distribusi probabilitas dari fitur X mengingat saya mengharapkan margin keuntungan sebanyak ini.P(X|Y)X

Bagaimana saya melakukannya dengan hutan acak (atau model diskriminatif lainnya)?

Salah satu saran bagi saya adalah memulai dengan model generatif daripada model diskriminatif. Tapi, pemahaman saya adalah model generatif umumnya membutuhkan banyak data untuk dilatih kecuali jika membuat beberapa asumsi yang sangat ketat seperti independensi bersyarat dalam kasus Naif Bayes?X

Saran lainnya bisa saja beralih dan Y dan melatih model diskriminatif. Sekarang X akan menjadi margin keuntungan dan Y akan menjadi fitur at shirt. P ( Y | X ) akan langsung memberi saya distribusi probabilitas fitur t-shirt, mengingat target margin keuntungan. Tetapi pendekatan ini tampaknya tidak benar bagi saya, karena saya selalu menganggap X sebagai variabel biasa dan Y sebagai efek.XYXYP(Y|X)XY

Juga, dari apa yang saya dengar, pertanyaan serupa telah diajukan untuk penemuan obat dan algoritma telah dirancang yang muncul dengan kandidat obat baru yang memiliki tingkat keberhasilan yang tinggi. Adakah yang bisa mengarahkan saya ke literatur penelitian di domain ini?

Memperbarui:

Saya telah menemukan ini dan ini yang berbicara tentang GAN yang digunakan untuk penemuan obat. Jaringan permusuhan generatif sepertinya cocok untuk pernyataan masalah saya, jadi saya telah membaca tentang mereka. Tapi satu hal yang saya pahami adalah GAN menghasilkan sampel dengan cara yang tidak diawasi. Mereka mencoba menghasilkan sampel yang seperti pertama-tama menangkap distribusi X yang mendasari dan kemudian mengambil sampel dari distribusi tersebut. Tapi saya tertarik pada X | Y. X dan Y didefinisikan di atas. Haruskah saya menjelajahi sesuatu selain GAN? Adakah petunjuk?

Pertanyaan lanjutan:

Bayangkan saya memiliki GAN terlatih yang telah belajar cara membuat kaos (sampel sampel Xs). Bagaimana saya bisa mendapatkan 5 kemeja teratas untuk diberikan Y?


Ini terkait erat dengan Masalah Knapsack atau varian stokastik ini. Apakah mungkin untuk menyatakannya kembali dengan asumsi yang masuk akal tentang domain input Anda?
mjul

@mjul. Sry tidak menangkapmu. Tolong jelaskan. Proposal untuk pendekatan berbeda untuk menyelesaikan masalah selalu diterima!
claudius

1
Masalah Knapsack adalah masalah optimisasi kombinatorial, di mana tujuannya adalah untuk mengidentifikasi set fitur yang paling menguntungkan (untuk kaos Anda) dengan asumsi Anda tahu nilai dan biaya fitur individual. Ini mengasumsikan nilai tepat, bukan stokastik. Namun, di bawah asumsi independensi yang masuk akal, Anda mungkin dapat menyatakan kembali masalah Anda sebagai Masalah Knapsack atau sebagai salah satu varian stokastik yang juga telah dipelajari selama bertahun-tahun. Namun, tanpa informasi lebih lanjut tidak segera jelas bahwa ini mungkin terjadi dalam kasus Anda.
mjul

Jawaban:


10

Respons ini telah dimodifikasi secara signifikan dari bentuk aslinya. Kelemahan dari tanggapan awal saya akan dibahas di bawah, tetapi jika Anda ingin melihat kira-kira seperti apa tanggapan ini sebelum saya membuat perubahan besar, lihat buku catatan berikut: https://nbviewer.jupyter.org/github /dmarx/data_generation_demo/blob/54be78fb5b68218971d2568f1680b4f783c0a79a/demo.ipynb

P(X)P(X|Y)P(Y|X)P(X)P(Y|X)X

Estimasi Kemungkinan Maksimum

... dan mengapa itu tidak berhasil di sini

Dalam respons awal saya, teknik yang saya sarankan adalah menggunakan MCMC untuk melakukan estimasi kemungkinan maksimum. Secara umum, MLE adalah pendekatan yang baik untuk menemukan solusi "optimal" untuk probabilitas bersyarat, tetapi kami memiliki masalah di sini: karena kami menggunakan model diskriminatif (hutan acak dalam kasus ini) probabilitas kami dihitung relatif terhadap batas keputusan . Sebenarnya tidak masuk akal untuk berbicara tentang solusi "optimal" untuk model seperti ini karena begitu kita mendapatkan cukup jauh dari batas kelas, model hanya akan memprediksi yang untuk semuanya. Jika kita memiliki cukup kelas beberapa dari mereka mungkin benar-benar "dikelilingi" dalam hal ini ini tidak akan menjadi masalah, tetapi kelas pada batas data kita akan "dimaksimalkan" oleh nilai-nilai yang tidak selalu layak.

Untuk menunjukkan, saya akan memanfaatkan beberapa kode kenyamanan yang dapat Anda temukan di sini , yang menyediakan GenerativeSamplerkelas yang membungkus kode dari respons awal saya, beberapa kode tambahan untuk solusi yang lebih baik ini, dan beberapa fitur tambahan yang saya mainkan (beberapa yang berfungsi , beberapa yang tidak) yang saya mungkin tidak akan masuk ke sini.

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()

masukkan deskripsi gambar di sini

Dalam visualisasi ini, x adalah data nyata, dan kelas yang kami minati berwarna hijau. Titik-titik yang terhubung garis adalah sampel yang kami gambar, dan warnanya sesuai dengan urutan sampelnya, dengan posisi urutan "menipis" yang diberikan oleh label bilah warna di sebelah kanan.

Seperti yang Anda lihat, sampler menyimpang dari data cukup cepat dan kemudian pada dasarnya bergaul cukup jauh dari nilai-nilai ruang fitur yang sesuai dengan pengamatan nyata. Jelas ini masalah.

Salah satu cara kita dapat menipu adalah dengan mengubah fungsi proposal kami untuk hanya memungkinkan fitur mengambil nilai yang sebenarnya kami amati dalam data. Mari kita coba dan lihat bagaimana hal itu mengubah perilaku hasil kita.

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()

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

X

P(X)P(Y|X)P(X)P(Y|X)P(X)

Masukkan Aturan Bayes

Setelah Anda membujuk saya untuk tidak terlalu bersemangat dengan matematika di sini, saya bermain-main dengan jumlah yang lumayan (karenanya saya membangunnya GenerativeSampler), dan saya menemui masalah yang saya sebutkan di atas. Saya merasa benar-benar bodoh ketika saya membuat realisasi ini, tetapi jelas apa yang Anda minta panggilan untuk penerapan aturan Bayes dan saya minta maaf karena menolak sebelumnya.

Jika Anda tidak terbiasa dengan aturan bayes, sepertinya ini:

P(B|A)=P(A|B)P(B)P(A)

Dalam banyak aplikasi penyebutnya adalah konstanta yang bertindak sebagai istilah penskalaan untuk memastikan bahwa pembilangnya berintegrasi ke 1, sehingga aturannya sering dinyatakan kembali sebagai berikut:

P(B|A)P(A|B)P(B)

Atau dalam bahasa Inggris yang sederhana: "posterior sebanding dengan waktu sebelumnya, kemungkinan".

Terlihat familier? Bagaimana kalau sekarang:

P(X|Y)P(Y|X)P(X)

Ya, inilah tepatnya yang kami lakukan sebelumnya dengan menyusun perkiraan untuk MLE yang didasarkan pada distribusi data yang diamati. Saya tidak pernah memikirkan Bayes memerintah dengan cara ini, tetapi masuk akal jadi terima kasih telah memberi saya kesempatan untuk menemukan perspektif baru ini.

P(Y)

Jadi, setelah membuat wawasan ini bahwa kita perlu memasukkan prior untuk data, mari kita lakukan itu dengan memasang KDE standar dan lihat bagaimana hal itu mengubah hasil kita.

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()

masukkan deskripsi gambar di sini

XP(X|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()

masukkan deskripsi gambar di sini

Dan begitulah: hitam besar 'X' adalah perkiraan MAP kami (kontur itu adalah KDE dari posterior).


Terima kasih atas balasan Anda. Saya punya pertanyaan. alpha = np.min ([f (baru) / f (lama), 1]) ..... di sini f (baru) adalah P (Y = 0 | X = baru) karena kami menggunakan model.predict_proba yang memberikan distribusi Y diberikan X ...... tetapi dari en.wikipedia.org/wiki/Metropolis –Hastings_algorithm yang bisa saya mengerti adalah alpha harus min (P (X = baru | y = 0) / P (X = lama | y = 0), 1). Apakah saya salah paham akan sesuatu?
claudius

Anda juga disebutkan dalam catatan TLDR "Gunakan MCMC untuk menghasilkan sampel dari p (X | Y) dengan menilai nilai kandidat X terhadap kemungkinan kondisi kelas yang disediakan oleh model Anda." Tetapi bukankah model.predict_proba memberikan kemungkinan kelas diberi X. Bagaimana Anda bisa mengatakan P (X1 | Y = 0)> P (X2 | Y = 0) hanya karena model.predict_proba (X1) [0,0]> model .predict_proba (X2) [0,0]. Saya membaca hubungan dari model.predict_proba sebagai P (Y = 0 | X1)> P (Y = 0 | X2). tolong beri tahu saya di mana saya salah.
claudius

Juga pertanyaan lanjutan lain ... Apa fungsi distribusi proposal simetris di sini? Terima kasih David telah membantu saya !!
claudius

Proposal simetris adalah jalan acak gaussian. Saya berencana untuk segera memperbarui ini dengan demo fungsi proposal "empiris" juga. Mengenai matematika MCMC, jangan terlalu terpaku padanya. Dengan memegang Y tetap dan menjalankan kandidat X terhadap p (Y | X), MCMC mendekati MLE untuk X dalam p (Y = 0 | X), yaitu fungsi yang saya sampel dari sini bukan p (Y | X ) (kalau tidak saya akan membuat urutan label kelas), itu L (X; Y). Ini secara efektif memberi saya distribusi lebih dari p (X | Y = 0). Fungsi penilaian dalam rasio metropolis adalah p (Y | X), tetapi cara saya menggunakannya menghasilkan sampel dari p (X | Y).
David Marx

Hei David. Bisakah kamu menuliskan matematika untuk itu? Saya mengalami kesulitan meyakinkan diri saya tentang matematika. Saya memeriksa profil Anda untuk mengetahui bahwa Anda adalah lulusan stat. Tolong jelaskan poin Anda untuk membantu manusia seperti saya: P. Terutama "Dengan memegang Y tetap dan menjalankan kandidat X terhadap p (Y | X), MCMC mendekati MLE untuk X dalam p (Y = 0 | X), yaitu fungsi yang saya sampel dari sini bukan p (Y | X) (kalau tidak saya akan menghasilkan urutan label kelas), itu L (X; Y). Ini secara efektif memberi saya distribusi lebih dari p (X | Y = 0). "Terima kasih sebelumnya!
claudius

0

Salah satu cara untuk maju adalah:

Buat jaringan saraf feedforward yang, mengingat Y (mungkin Anda ingin menormalkannya) memprediksi X. Jadi output dari model (lapisan terakhir) akan menjadi satu set neuron softmax untuk setiap fitur. Jadi jika fitur 1 (misalnya warna) memiliki 4 opsi, Anda akan menerapkan softmax di atas empat neuron, dan melakukan hal yang sama pada setiap fitur.

Maka fungsi kerugian Anda bisa menjadi jumlah (atau kombinasi linear jika Anda suka) dari entropi silang untuk setiap fitur.


terima kasih atas balasan Anda! Tapi, saya mencari jawaban yang menyarankan beberapa pendekatan dan menyebutkan pro dan kontra dari setiap pendekatan.
claudius
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.