इष्टतम P (X | Y) का पता लगाएं, मेरे पास एक मॉडल है जो P (Y | X) पर प्रशिक्षित होने पर अच्छा प्रदर्शन करता है।


11

इनपुट डेटा:

-> टी शर्ट की विशेषताएं (रंग, लोगो, आदि)X

-> लाभ मार्जिनY

मैंने उपरोक्त और वाई पर एक यादृच्छिक जंगल को प्रशिक्षित किया है और एक परीक्षण डेटा पर उचित सटीकता हासिल की है। तो मेरे पास हैXY

P(Y|X)

अब, मैं को ढूंढना चाहूंगा, अर्थात X सुविधाओं की प्रायिकता वितरण को देखते हुए मैं इस लाभ मार्जिन की अपेक्षा कर रहा हूं।P(X|Y)X

मैं एक यादृच्छिक जंगल (या किसी अन्य भेदभावपूर्ण मॉडल) के साथ ऐसा कैसे करूं?

मेरे लिए एक सुझाव भेदभावपूर्ण मॉडल के बजाय एक जनरेटिव मॉडल के साथ शुरू करना हो सकता है। लेकिन, मेरी समझ यह है कि जेनरिक मॉडल को आम तौर पर प्रशिक्षित करने के लिए बहुत सारे डेटा की आवश्यकता होती है जब तक कि कुछ बहुत ही प्रतिबंधात्मक धारणाएं नहीं होती हैं जैसे कि नैवे बेस के मामले में की सशर्त स्वतंत्रता ?X

अन्य सुझाव सिर्फ और वाई को स्विच करने और एक भेदभावपूर्ण मॉडल को प्रशिक्षित करने के लिए हो सकते हैं । अब X प्रॉफिट मार्जिन होगा और Y शर्ट में फीचर्स होगा। P ( Y | X ) सीधे लक्षित लाभ मार्जिन को देखते हुए, मुझे टी शर्ट सुविधाओं का प्रायिकता वितरण प्रदान करेगा। लेकिन यह दृष्टिकोण मुझे सही नहीं लगता है, क्योंकि मेरे पास हमेशा एक्स के रूप में आकस्मिक चर और वाई के रूप में प्रभावी होना है।XYXYP(Y|X)XY

इसके अलावा, मैंने जो सुना है, दवा की खोज के लिए इसी तरह का सवाल किया गया है और एल्गोरिदम डिजाइन किए गए हैं जो उम्मीदवार नई दवाओं के साथ आते हैं जिनमें सफलता की उच्च डिग्री होती है। क्या कोई मुझे इस क्षेत्र में शोध साहित्य की ओर इशारा कर सकता है?

अपडेट करें:

मैं इस पर आया हूं और यह दवा की खोज के लिए जीएएन के उपयोग की बात करता है। जेनेरिक एडवरटाइजिंग नेटवर्क मेरे समस्या बयान के लिए एक अच्छा फिट लगता है इसलिए मैं उनके बारे में पढ़ रहा हूं। लेकिन एक बात मुझे समझ में आ गई कि GAN एक अनछुए तरीके से नमूने उत्पन्न करता है। वे नमूने का उत्पादन करने की कोशिश करते हैं जो पहले एक्स के अंतर्निहित वितरण पर कब्जा करने और फिर उस वितरण से नमूना लेने जैसा है। लेकिन मुझे X | Y में दिलचस्पी है। X और Y को ऊपर परिभाषित किया गया है। क्या मुझे GAN के अलावा कुछ और तलाशना चाहिए? कोई संकेत कृपया?

अनुवर्ती सवाल:

कल्पना कीजिए कि मेरे पास एक GAN प्रशिक्षित है जिसने टी शर्ट (आउटपुट नमूना Xs) बनाना सीखा है। मैं दिए गए Y के लिए शीर्ष 5 शर्ट कैसे प्राप्त कर सकता हूं?


यह नैकपैक समस्या या इस के स्टोचस्टिक वेरिएंट के साथ निकटता से संबंधित है। क्या आपके इनपुट डोमेन के बारे में कुछ उचित मान्यताओं के तहत इसे पुनर्स्थापित करना संभव होगा?
मुजुल

@mjul। Sry तुम नहीं मिला। कृपया विस्तार से बताएं। समस्या को हल करने के लिए एक अलग दृष्टिकोण का प्रस्ताव हमेशा स्वागत है, हालांकि!
क्लॉडियस

1
द नैप्सैक प्रॉब्लम एक कॉम्बीनेटरियल ऑप्टिमाइज़ेशन प्रॉब्लम है, जहाँ लक्ष्य सबसे लाभदायक फीचर सेट (आपकी टी-शर्ट के लिए) को पहचानना है, यह मानते हुए कि आप अलग-अलग फीचर्स की कीमत और कीमत जानते हैं। यह मानता है कि मूल्य सटीक हैं, स्टोचस्टिक नहीं। हालाँकि, उचित स्वतंत्रता मान्यताओं के तहत, आप अपनी समस्या को नैकपैक समस्या के रूप में या वर्षों से अध्ययन किए गए स्टोचस्टिक वेरिएंट में से एक के रूप में फिर से बता सकते हैं। हालांकि, बिना जानकारी के तुरंत स्पष्ट नहीं है कि यह आपके मामले में संभव है।
mjul

जवाबों:


10

इस प्रतिक्रिया को इसके मूल रूप से काफी संशोधित किया गया है। मेरी मूल प्रतिक्रिया के दोषों के बारे में नीचे चर्चा की जाएगी, लेकिन यदि आप मोटे तौर पर देखना चाहते हैं तो इससे पहले कि यह प्रतिक्रिया कैसी दिखती है, इससे पहले कि मैं बड़ा संपादन करता, निम्नलिखित नोटबुक पर एक नज़र डालें: 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

अधिकतम संभावना अनुमान

... और यह यहाँ क्यों काम नहीं करता है

मेरी मूल प्रतिक्रिया में, मैंने जिस तकनीक का सुझाव दिया था वह अधिकतम संभावना अनुमान लगाने के लिए एमसीएमसी का उपयोग करना था। आमतौर पर, 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 वास्तविक डेटा हैं, और जिस वर्ग में हम रुचि रखते हैं वह हरा है। लाइन-कनेक्टेड डॉट्स वे नमूने हैं जिन्हें हमने आकर्षित किया था, और उनका रंग उस क्रम से मेल खाता है जिसमें उन्हें नमूना दिया गया था, दाईं ओर रंगीन बार लेबल द्वारा दिए गए उनके "पतले" अनुक्रम की स्थिति के साथ।

जैसा कि आप देख सकते हैं, सैंपलर को डेटा से काफी जल्दी से हटा दिया गया है और फिर मूल रूप से फीचर स्पेस के मूल्यों से बहुत दूर लटका दिया गया है जो किसी भी वास्तविक टिप्पणियों के अनुरूप है। स्पष्ट रूप से यह एक समस्या है।

जिस तरह से हम धोखा दे सकते हैं वह है कि हमारे प्रस्ताव फ़ंक्शन को बदलने के लिए केवल सुविधाओं को उन मूल्यों को लेने की अनुमति दें जो हमने वास्तव में डेटा में देखे थे। आइए कोशिश करते हैं और देखें कि यह हमारे परिणाम के व्यवहार को कैसे बदलता है।

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

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

X

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

बे नियम दर्ज करें

जब आपने मुझे यहां गणित के साथ हाथ-लहरदार होने के लिए उकसाया, तो मैंने इस उचित राशि के साथ खेला (इसलिए मैं इस GenerativeSamplerचीज़ का निर्माण कर रहा हूं), और मैंने उन समस्याओं का सामना किया जो मैंने ऊपर रखी थीं। जब मुझे यह अहसास हुआ तो मुझे वास्तव में बहुत बुरा लगा, लेकिन जाहिर है कि आप बेयस रूल के आवेदन के लिए कॉल कर रहे हैं और मैं पहले ही खारिज होने के लिए माफी चाहता हूं।

यदि आप खाड़ी नियम से परिचित नहीं हैं, तो यह इस तरह दिखता है:

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

कई अनुप्रयोगों में भाजक एक स्थिर होता है जो स्केलिंग शब्द के रूप में कार्य करता है यह सुनिश्चित करने के लिए कि अंश 1 से एकीकृत होता है, इसलिए नियम को अक्सर इसी तरह से बहाल किया जाता है:

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

या सादे अंग्रेजी में: "पूर्ववर्ती समय संभावना के समानुपाती होता है"।

परिचित दिखता है? अभी के बारे में कैसे:

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

हाँ, यह वही है जो हमने पहले MLE के लिए एक अनुमान लगाकर काम किया था जो डेटा के देखे गए वितरण के लिए लंगर डाले हुए है। मैंने कभी भी इस तरह से शासन करने के बारे में नहीं सोचा है, लेकिन यह समझ में आता है कि मुझे इस नए परिप्रेक्ष्य की खोज करने का अवसर देने के लिए धन्यवाद।

P(Y)

इसलिए, इस अंतर्दृष्टि को बनाए रखने के लिए कि हमें डेटा के लिए एक पूर्व शामिल करना चाहिए, चलो एक मानक केडीई फिटिंग करके और देखें कि यह हमारे परिणाम को कैसे बदलता है।

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

यहाँ छवि विवरण दर्ज करें

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

यहाँ छवि विवरण दर्ज करें

और वहां आपके पास यह है: बड़ा काला 'एक्स' हमारा एमएपी अनुमान है (उन कंट्रोवर्स पोस्टवर्ड के केडीई हैं)।


उर उत्तर के लिए धन्यवाद। मेरा एक सवाल है। अल्फा = np.min ([f (नया) / f (पुराना), 1]) ..... यहाँ f (नया) P (Y = 0; X = new) है जैसा कि हम मॉडल का उपयोग कर रहे हैं ।predict_proba जो देता है। Y दिए गए X का वितरण ...... लेकिन en.wikipedia.org/wiki/Metropolis –Hastings_algorithm से जो मैं समझ सकता था वह अल्फ़ा मिनट होना चाहिए (P (X = new | y = 0) / P (X = old) | y = 0), 1)। क्या मुझे कुछ गलत समझ में आया?
क्लॉडियस

आपने TLDR नोट में भी उल्लेख किया है "अपने मॉडल द्वारा प्रदान की गई वर्ग-सशर्त संभावना के खिलाफ उम्मीदवार X मूल्यों को स्कोर करके p (X | Y) से नमूने उत्पन्न करने के लिए MCMC का उपयोग करें।" लेकिन मॉडल नहीं है ।predict_proba दिए गए वर्ग की संभावना को देखते हुए। आप कैसे कह सकते हैं P (X1। Y = 0)> P (X2 | Y = 0) सिर्फ इसलिए क्योंकि model.predict_proba (X1) [0,0]> मॉडल .predict_proba (X2) [0,0]। मैंने P. (Y = 0 | X1)> P (Y = 0 | X2) के रूप में model.predict_proba से रिश्ते को पढ़ा। कृपया मुझे बताएं कि मैं कहां गलत हूं।
क्लॉडियस

इसके अलावा एक और फॉलोअप सवाल ... यहाँ सममित प्रस्ताव वितरण समारोह क्या है? धन्यवाद डेविड मेरी मदद करने के लिए !!
क्लॉडियस

सममित प्रस्ताव एक गाऊसी यादृच्छिक चलना है। मैं जल्द ही इसे "अनुभवजन्य" प्रस्ताव के डेमो के साथ ही अपडेट करने की योजना बना रहा हूं। MCMC गणित के बारे में, उस पर बहुत मत टालो। पी के खिलाफ Y (X | X) को Y तय करने और चलने वाले उम्मीदवारों को पकड़कर, MCMC ने M के लिए X को p (Y = 0 | X) में अनुमानित किया है, यानी जिस फ़ंक्शन का मैं यहाँ से नमूना ले रहा हूँ वह p नहीं है (Y | X) ) (अन्यथा मैं कक्षा लेबल का एक क्रम उत्पन्न कर रहा हूँ), यह L (X, Y) है। यह प्रभावी रूप से मुझे p (X | Y = 0) पर एक वितरण देता है। महानगर के अनुपात में स्कोरिंग फ़ंक्शन p (Y | X) है, लेकिन जिस तरह से मैं इसका उपयोग कर रहा हूं वह p (X। Y) से नमूने तैयार करता है।
डेविड मार्क्स

हे डेविड। क्या आप कृपया इसके लिए गणित लिख सकते हैं। मैं कठिन समय के लिए अपने आप को गणित समझ रहा हूं। मैंने यह जानने के लिए आपकी प्रोफ़ाइल की जाँच की कि आप एक स्टेट ग्रेजुएट हैं। कृपया मेरे जैसे नश्वर लोगों की मदद करने के लिए अपने बिंदुओं पर विस्तार से बताएं: पी। विशेष रूप से "पी के खिलाफ वाई (एक्स | एक्स) को तय करने वाले और एक्स उम्मीदवारों को पकड़कर, एमसीएमसी एक्स के लिए एमएलई को पी (वाई = 0 | एक्स) में लगाता है, यानी जिस फ़ंक्शन का मैं यहां से नमूना ले रहा हूं वह पी (वाई) नहीं है। | X) (अन्यथा मैं कक्षा लेबल का एक क्रम उत्पन्न कर रहा हूँ), यह L (X; Y) है। यह प्रभावी रूप से मुझे p (X | Y = 0) पर वितरण प्रदान करता है। "अग्रिम धन्यवाद!
क्लॉडियस

0

आगे बढ़ने का एक तरीका यह हो सकता है:

एक फीडफुल न्यूरल नेटवर्क बनाएं, जिसे Y (शायद आप इसे सामान्य करना चाहते हैं) एक्स को भविष्यवाणी करता है। इसलिए मॉडल का आउटपुट (अंतिम परत) प्रत्येक फीचर के लिए सॉफ्टमैक्स न्यूरॉन्स का एक सेट होगा। इसलिए यदि सुविधा 1 (जैसे रंग) में 4 विकल्प हैं, तो आप चार न्यूरॉन्स पर सॉफ्टमैक्स लागू करेंगे, और प्रत्येक सुविधा पर ऐसा ही करेंगे।

तब आपका नुकसान फ़ंक्शन प्रत्येक सुविधा के लिए क्रॉस एन्ट्रापी का योग (या यदि आप चाहें तो एक रैखिक संयोजन) हो सकता है।


उर उत्तर के लिए धन्यवाद! लेकिन, मैं ऐसे उत्तर की तलाश में हूं जो कई दृष्टिकोणों का सुझाव देता है और प्रत्येक दृष्टिकोण के पेशेवरों और विपक्षों का उल्लेख करता है।
क्लॉडियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.