ค้นหา P (X | Y) ที่ดีที่สุดเมื่อได้รับฉันมีโมเดลที่มีประสิทธิภาพที่ดีเมื่อฝึกฝนบน P (Y | X)


11

ป้อนข้อมูล:

X -> คุณสมบัติของเสื้อยืด (สีโลโก้ ฯลฯ )

Y -> อัตรากำไร

ฉันได้ฝึกอบรมฟอเรสต์แบบสุ่มบนและด้านบนและได้รับความถูกต้องสมเหตุสมผลในข้อมูลการทดสอบ ดังนั้นฉันมีYXY

P(Y|X)X)

ตอนนี้ฉันต้องการค้นหาเช่นการกระจายความน่าจะเป็นของฟีเจอร์เนื่องจากฉันคาดว่าจะได้รับกำไรมากXP(X|Y)X

ฉันจะทำเช่นนั้นด้วยฟอเรสต์แบบสุ่ม (หรือโมเดลการเลือกปฏิบัติอื่น ๆ ) ได้อย่างไร

หนึ่งข้อเสนอแนะสำหรับฉันอาจเริ่มต้นด้วยตัวแบบกำเนิดมากกว่าแบบตัวเลือก แต่ความเข้าใจของฉันเป็นแบบจำลองทั่วไปโดยทั่วไปต้องใช้ข้อมูลจำนวนมากในการฝึกอบรมเว้นแต่ว่าจะมีข้อ จำกัด บางอย่างเช่นความเป็นอิสระตามเงื่อนไขของในกรณีของ Naive Bayes?X

ข้อเสนอแนะอื่น ๆ อาจเป็นเพียงแค่สลับและและฝึกอบรมรูปแบบการเลือกปฏิบัติ ตอนนี้จะเป็นอัตรากำไรและจะเป็นคุณสมบัติของเสื้อ จะให้การกระจายความน่าจะเป็นของคุณสมบัติเสื้อยืดโดยตรงกับฉันเนื่องจากอัตรากำไรเป้าหมาย แต่วิธีการนี้ดูเหมือนจะไม่ถูกต้องสำหรับฉันเนื่องจากฉันคิดว่าเป็นตัวแปรชั่วคราวและจะมีผลเสมอY X Y P ( Y | X ) X YXYXYP(Y|X)XY

นอกจากนี้จากสิ่งที่ฉันได้ยินคำถามที่คล้ายกันได้ถูกวางสำหรับการค้นพบยาเสพติดและอัลกอริทึมได้รับการออกแบบซึ่งเกิดขึ้นกับยาเสพติดใหม่ผู้สมัครที่มีระดับสูงของความสำเร็จ ใครช่วยชี้แนะให้ฉันค้นคว้าวรรณกรรมในโดเมนนี้ได้ไหม

ปรับปรุง:

ฉันเจอสิ่งนี้และสิ่งนี้พูดถึง GAN ที่ใช้ในการค้นพบสิ่งเสพติด เครือข่ายฝ่ายตรงข้ามทั่วไปดูเหมือนจะเหมาะสำหรับคำแถลงปัญหาของฉันดังนั้นฉันจึงได้อ่านเกี่ยวกับพวกเขา แต่สิ่งหนึ่งที่ฉันเข้าใจคือ GAN สร้างตัวอย่างในลักษณะที่ไม่มีผู้ดูแล พวกเขาพยายามสร้างตัวอย่างที่เหมือนกับการจับภาพการแจกแจงต้นแบบของ X แล้วสุ่มตัวอย่างจากการแจกแจงนั้น แต่ฉันสนใจ X | Y X และ Y ถูกกำหนดไว้ด้านบน ฉันควรสำรวจสิ่งอื่นนอกเหนือจาก GANs หรือไม่ พอยน์เตอร์ใดโปรด

ติดตามคำถาม:

ลองนึกภาพฉันมี GAN ผ่านการฝึกอบรมที่ได้เรียนรู้วิธีการทำเสื้อยืด (ตัวอย่าง Xs ผลลัพธ์) ฉันจะได้เสื้อ 5 อันดับแรกของ Y ที่ให้มาได้อย่างไร


สิ่งนี้มีความเกี่ยวข้องอย่างใกล้ชิดกับปัญหาเครื่องหลังหรือสายพันธุ์สุ่มของสิ่งนี้ เป็นไปได้ไหมที่จะปรับปรุงซ้ำเช่นนี้ภายใต้สมมติฐานที่สมเหตุสมผลเกี่ยวกับโดเมนอินพุตของคุณ
mjul

@mjul Sry ไม่ได้รับคุณ กรุณาอธิบายอย่างละเอียด ข้อเสนอสำหรับแนวทางที่แตกต่างเพื่อแก้ปัญหายินดีต้อนรับเสมอ!
claudius

1
ปัญหาเป้เป็นปัญหาการเพิ่มประสิทธิภาพ combinatorial โดยมีเป้าหมายคือการระบุชุดคุณลักษณะที่ทำกำไรได้มากที่สุด (สำหรับเสื้อยืดของคุณ) สมมติว่าคุณรู้คุณค่าและค่าใช้จ่ายของคุณลักษณะแต่ละอย่าง มันถือว่าค่าที่แน่นอนไม่ใช่สุ่ม อย่างไรก็ตามภายใต้สมมติฐานความเป็นอิสระที่สมเหตุสมผลคุณอาจสามารถระบุปัญหาของคุณอีกครั้งเป็นปัญหาเป้หรือเป็นหนึ่งในตัวแปรสุ่มที่ได้รับการศึกษาในช่วงหลายปีที่ผ่านมา อย่างไรก็ตามหากไม่มีข้อมูลเพิ่มเติมจะไม่ชัดเจนในทันทีว่าเป็นไปได้ในกรณีของคุณ
mjul

คำตอบ:


10

การตอบสนองนี้ได้รับการแก้ไขอย่างมีนัยสำคัญจากรูปแบบเดิม ข้อผิดพลาดของคำตอบดั้งเดิมของฉันจะกล่าวถึงด้านล่าง แต่ถ้าคุณต้องการดูคร่าว ๆ ว่าคำตอบนี้ดูเหมือนว่าก่อนที่ฉันจะทำการแก้ไขครั้งใหญ่ลองดูที่สมุดบันทึกต่อไปนี้: https://nbviewer.jupyter.org/github /dmarx/data_generation_demo/blob/54be78fb5b68218971d2568f1680b4f783c0a79a/demo.ipynb

TL; DR: ใช้ KDE (หรือขั้นตอนที่คุณเลือก) เพื่อประมาณจากนั้นใช้ MCMC เพื่อดึงตัวอย่างจากโดยที่มอบให้โดยโมเดลของคุณ จากตัวอย่างเหล่านี้คุณสามารถประมาณ "ดีที่สุด" โดยปรับ KDE ที่สองให้พอดีกับตัวอย่างที่คุณสร้างขึ้นและเลือกการสังเกตที่เพิ่ม KDE ให้มากที่สุดเพื่อประเมิน posteriori (MAP) สูงสุดP ( X | Y ) P ( Y | X ) P ( X ) P ( Y | X ) XP(X)P(X|Y)P(Y|X)P(X)P(Y|X)X

การประมาณความน่าจะเป็นสูงสุด

... และทำไมมันไม่ทำงานที่นี่

ในการตอบกลับดั้งเดิมของฉันเทคนิคที่ฉันแนะนำคือใช้ 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 เป็นข้อมูลจริงและคลาสที่เราสนใจนั้นเป็นสีเขียว จุดเชื่อมต่อสายเป็นตัวอย่างที่เราวาดและสีของพวกมันสอดคล้องกับลำดับที่พวกมันถูกสุ่มตัวอย่างด้วยตำแหน่งลำดับ "ผอมบาง" ที่กำหนดโดยฉลากแถบสีทางด้านขวา

อย่างที่คุณเห็นเครื่องเก็บตัวอย่างถูกแยกออกจากข้อมูลอย่างรวดเร็วและจากนั้นจะแขวนห่างจากค่าของพื้นที่ฟีเจอร์ที่สอดคล้องกับการสังเกตของจริง เห็นได้ชัดว่านี่เป็นปัญหา

วิธีหนึ่งที่เราสามารถโกงได้คือเปลี่ยนฟังก์ชั่นข้อเสนอของเราเพื่อให้ฟีเจอร์ใช้ค่าที่เราสังเกตเห็นในข้อมูลเท่านั้น มาลองดูกันว่ามันจะเปลี่ยนพฤติกรรมของผลลัพธ์ของเราอย่างไร

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

ทางออกที่ชัดเจนที่นี่คือการรวมอย่างใดอย่างหนึ่งเพื่อยึดกระบวนการสุ่มตัวอย่างของเราไปยังพื้นที่ของพื้นที่คุณสมบัติที่ข้อมูลมีแนวโน้มที่จะใช้จริง ดังนั้นแทนที่จะลองตัวอย่างจากความน่าจะเป็นร่วมของความน่าจะเป็นที่กำหนดโดยแบบจำลองและการประมาณการเชิงตัวเลขสำหรับกำหนดโดย KDE ให้พอดีกับชุดข้อมูลทั้งหมด ตอนนี้เรากำลัง ... สุ่มตัวอย่างจาก ... ....P(X)P(Y|X)P(X)P(Y|X)P(X)

ป้อนกฎของเบย์

หลังจากที่คุณทำให้ฉันเป็นคลื่นน้อยด้วยคณิตศาสตร์ที่นี่ฉันเล่นด้วยจำนวนที่พอเหมาะ (ด้วยเหตุนี้ฉันสร้างGenerativeSamplerสิ่ง) และฉันพบปัญหาที่ฉันวางไว้ข้างต้น ฉันรู้สึกงี่เง่าจริง ๆ เมื่อฉันทำให้การรับรู้นี้ แต่เห็นได้ชัดว่าสิ่งที่คุณขอเรียกร้องให้ใช้กฎของ Bayes และฉันขอโทษสำหรับการถูกไล่ออกก่อนหน้านี้

หากคุณไม่คุ้นเคยกับกฎของเบย์ดูเหมือนว่า:

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 ที่ยึดกับการกระจายข้อมูลที่สังเกตได้ ฉันไม่เคยคิดเกี่ยวกับการปกครองของเบย์ด้วยวิธีนี้ แต่มันก็สมเหตุสมผลแล้วขอบคุณที่ให้โอกาสฉันได้ค้นพบมุมมองใหม่นี้

เพื่อย้อนรอยเล็กน้อย MCMC เป็นหนึ่งในแอปพลิเคชั่นของกฎ Bayes ที่เราสามารถมองข้ามตัวส่วน เมื่อเราคำนวณอัตราส่วน acceptanc,จะใช้ค่าเดียวกันทั้งในตัวเศษและส่วนการยกเลิกและทำให้เราสามารถดึงตัวอย่างจากการแจกแจงความน่าจะเป็นแบบไม่ปกติP(Y)

ดังนั้นเมื่อมีข้อมูลเชิงลึกนี้แล้วเราจำเป็นต้องรวมข้อมูลก่อนหน้านี้มาทำเช่นนั้นโดยปรับ 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()

ป้อนคำอธิบายรูปภาพที่นี่

ดีกว่ามาก! ตอนนี้เราสามารถประมาณค่า "ดีที่สุด"โดยใช้สิ่งที่เรียกว่าการประเมิน "สูงสุด a หลัง" ซึ่งเป็นวิธีแฟนซีในการบอกว่าเราพอดี KDE ที่สอง - แต่สำหรับตัวอย่างของเราในครั้งนี้ - และค้นหาค่าที่เพิ่มสูงสุด KDE ได้คือค่าที่สอดคล้องกับโหมดของY)P ( X | Y )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()

ป้อนคำอธิบายรูปภาพที่นี่

และคุณก็มีแล้ว: 'X' สีดำขนาดใหญ่คือค่าประมาณ MAP ของเรา (รูปทรงเหล่านั้นคือ KDE ของด้านหลัง)


ขอบคุณสำหรับการตอบกลับนะ ผมมีคำถาม. alpha = np.min ([f (ใหม่) / f (เก่า), 1]) ..... ที่นี่ f (ใหม่) คือ P (Y = 0 | X = ใหม่) ตามที่เราใช้ model.predict_proba ซึ่งให้ การกระจายตัวของ Y ที่ให้ X ...... แต่จากen.wikipedia.org/wiki/Mastropolis –Hastings_algorithm สิ่งที่ฉันเข้าใจได้คือ alpha ควรเป็น min (P (X = ใหม่ | y = 0) / P (X = เก่า | y = 0), 1) ฉันเข้าใจผิดบางอย่างเหรอ?
claudius

คุณยังกล่าวถึงใน TLDR note "ใช้ MCMC เพื่อสร้างตัวอย่างจาก p (X | Y) โดยการให้คะแนนค่า X ของผู้สมัครเทียบกับความน่าจะเป็นตามเงื่อนไขระดับชั้นที่โมเดลของคุณจัดทำ" แต่ไม่ใช่ model.predict_proba ให้ความเป็นไปได้ของชั้นเรียนที่ระบุ X. คุณจะพูดอย่างไร P (X1 | Y = 0)> P (X2 | Y = 0) เพียงเพราะ model.predict_proba (X1) [0,0]> โมเดล .predict_proba (X2) [0,0] ฉันอ่านความสัมพันธ์จาก model.predict_proba เป็น P (Y = 0 | X1)> P (Y = 0 | X2) โปรดแจ้งให้เราทราบว่าฉันผิดตรงไหน
claudius

อีกคำถามติดตามผล ... ฟังก์ชั่นการกระจายข้อเสนอแบบสมมาตรคืออะไรที่นี่? ขอบคุณเดวิดที่ช่วยฉันออกมา !!
claudius

ข้อเสนอแบบสมมาตรคือการเดินสุ่มแบบเกาส์เซียน ฉันวางแผนที่จะอัปเดตนี้ในไม่ช้าด้วยการสาธิตข้อเสนอ "เชิงประจักษ์" func เช่นกัน เกี่ยวกับคณิตศาสตร์ MCMC อย่าไปยุ่งกับมันมากเกินไป เมื่อถือ Y ให้คงที่และเรียกใช้ตัวเลือก X เทียบกับ p (Y | X) MCMC จะประมาณค่า MLE สำหรับ X ใน p (Y = 0 | X) เช่นฟังก์ชันที่ฉันสุ่มตัวอย่างจากที่นี่ไม่ใช่ p (Y | X ) (ไม่เช่นนั้นฉันจะสร้างลำดับของคลาสป้ายกำกับ) มันคือ L (X; Y) สิ่งนี้ทำให้ฉันกระจายอย่างมีประสิทธิภาพมากกว่า p (X | Y = 0) ฟังก์ชันการให้คะแนนในอัตราส่วนมหานครคือ p (Y | X) แต่วิธีที่ฉันใช้มันทำให้เกิดตัวอย่างจาก p (X | Y)
David Marx

เฮ้เดวิด คุณช่วยเขียนคณิตศาสตร์ให้หน่อยได้ไหม ฉันมีเวลายากที่จะโน้มน้าวใจตัวเองเกี่ยวกับคณิตศาสตร์ ฉันตรวจสอบโปรไฟล์ของคุณเพื่อพบว่าคุณเป็นบัณฑิต โปรดอธิบายรายละเอียดเกี่ยวกับคะแนนของคุณเพื่อช่วยให้ปุถุชนเพียงแค่ฉัน: P โดยเฉพาะอย่างยิ่ง "โดยถือ Y คงที่และเรียกใช้ตัวเลือก X เทียบกับ p (Y | X), MCMC จะประมาณค่า MLE สำหรับ X ใน p (Y = 0 | X), นั่นคือฟังก์ชันที่ฉันสุ่มตัวอย่างจากที่นี่ไม่ใช่ p (Y | X) (ไม่เช่นนั้นฉันจะสร้างลำดับของคลาสป้ายกำกับ) มันคือ L (X; Y) สิ่งนี้ให้การกระจายอย่างมีประสิทธิภาพแก่ฉันผ่าน p (X | Y = 0) "ขอขอบคุณล่วงหน้า!
claudius

0

วิธีหนึ่งในการก้าวไปข้างหน้าอาจเป็น:

สร้างเครือข่ายนิวรัลไปข้างหน้าซึ่งกำหนดให้ Y (คุณอาจต้องการทำให้เป็นมาตรฐาน) ทำนาย X ดังนั้นเอาต์พุตของโมเดล (เลเยอร์สุดท้าย) จะเป็นชุดของเซลล์ประสาท softmax สำหรับแต่ละคุณสมบัติ ดังนั้นหากคุณสมบัติ 1 (เช่นสี) มี 4 ตัวเลือกคุณจะใช้ softmax กับเซลล์ประสาทสี่ตัวและทำเช่นเดียวกันกับแต่ละคุณสมบัติ

จากนั้นฟังก์ชั่นการสูญเสียของคุณอาจเป็นผลรวม (หรือชุดค่าผสมเชิงเส้นหากคุณต้องการ) ของเอนโทรปีของ cross สำหรับแต่ละฟีเจอร์


ขอบคุณสำหรับคำตอบของคุณ! แต่ฉันกำลังมองหาคำตอบที่แนะนำหลายวิธีและกล่าวถึงข้อดีข้อเสียของแต่ละวิธี
claudius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.