Tìm P (X | Y) tối ưu khi tôi có một mô hình có hiệu suất tốt khi được đào tạo về P (Y | X)


11

Dữ liệu đầu vào:

-> tính năng của áo t (màu sắc, logo, v.v.)X

-> tỷ suất lợi nhuậnY

Tôi đã đào tạo một khu rừng ngẫu nhiên trên Y ở trên và đã đạt được độ chính xác hợp lý trên dữ liệu thử nghiệm. Vì vậy, tôi cóXY

.P(Y|X)

Bây giờ, tôi muốn tìm tức là phân phối xác suất của các tính năng X được cung cấp Tôi đang mong đợi mức lợi nhuận cao này.P(X|Y)X

Làm thế nào để tôi làm điều đó với một khu rừng ngẫu nhiên (hoặc bất kỳ mô hình phân biệt đối xử nào khác)?

Một gợi ý cho tôi có thể là bắt đầu với một mô hình thế hệ hơn là một mô hình phân biệt đối xử. Nhưng, sự hiểu biết của tôi là mô hình thế hệ thường đòi hỏi rất nhiều dữ liệu để đào tạo trừ khi điều đó đưa ra một số giả định rất hạn chế như sự độc lập có điều kiện của trong trường hợp của Naive Bayes?X

Đề nghị khác có thể là chỉ cần chuyển đổi Y và đào tạo một mô hình phân biệt đối xử. Bây giờ X sẽ là tỷ suất lợi nhuận và Y sẽ là các tính năng của áo sơ mi. P ( Y | X ) sẽ trực tiếp cung cấp cho tôi phân phối xác suất của các tính năng áo sơ mi, với mức lợi nhuận mục tiêu. Nhưng cách tiếp cận này có vẻ không đúng với tôi, vì tôi luôn luôn nghĩ về XXYXYP(Y|X)X coi là biến thông thường và có hiệu lực.Y

Ngoài ra, từ những gì tôi đã nghe, câu hỏi tương tự đã được đặt ra cho việc khám phá thuốc và các thuật toán đã được thiết kế để đưa ra các ứng cử viên thuốc mới có mức độ thành công cao. Ai đó có thể chỉ cho tôi nghiên cứu văn học trong lĩnh vực này?

Cập nhật:

Tôi đã đi qua điều nàyđiều này nói về GAN được sử dụng để khám phá ma túy. Các mạng đối nghịch tạo ra có vẻ phù hợp với tuyên bố vấn đề của tôi vì vậy tôi đã đọc về chúng. Nhưng một điều tôi hiểu là GAN ​​tạo mẫu theo cách không giám sát. Họ cố gắng tạo ra mẫu giống như lần đầu tiên nắm bắt phân phối cơ bản của X và sau đó lấy mẫu từ phân phối đó. Nhưng tôi quan tâm đến X | Y. X và Y được định nghĩa ở trên. Tôi có nên khám phá một cái gì đó ngoài GAN không? Bất kỳ con trỏ xin vui lòng?

Theo dõi câu hỏi:

Hãy tưởng tượng tôi có một GAN được đào tạo đã học cách làm áo phông (đầu ra mẫu X). Làm thế nào tôi có thể nhận được 5 áo sơ mi hàng đầu cho Y?


Điều này liên quan chặt chẽ với Vấn đề Knapsack hoặc các biến thể ngẫu nhiên của vấn đề này. Có thể giới thiệu lại như vậy theo một số giả định hợp lý về tên miền đầu vào của bạn không?
mjul

@mjul. Sry đã không nhận được bạn. Xin hãy giải thích. Đề xuất cho một cách tiếp cận khác nhau để giải quyết vấn đề luôn luôn được hoan nghênh!
claudius

1
Vấn đề Knapsack là một vấn đề tối ưu hóa kết hợp, trong đó mục tiêu là xác định bộ tính năng có lợi nhất (cho áo phông của bạn) giả sử bạn biết giá trị và chi phí của các tính năng riêng lẻ. Nó giả định các giá trị là chính xác, không ngẫu nhiên. Tuy nhiên, theo các giả định độc lập hợp lý, bạn có thể nêu lại vấn đề của mình dưới dạng Vấn đề Knapsack hoặc là một trong những biến thể ngẫu nhiên cũng đã được nghiên cứu trong nhiều năm qua. Tuy nhiên, không có thêm thông tin thì không rõ ràng ngay lập tức trong trường hợp của bạn.
mjul

Câu trả lời:


10

Phản ứng này đã được sửa đổi đáng kể từ hình thức ban đầu của nó. Các sai sót trong phản hồi ban đầu của tôi sẽ được thảo luận bên dưới, nhưng nếu bạn muốn xem đại khái phản hồi này trông như thế nào trước khi tôi thực hiện chỉnh sửa lớn, hãy xem sổ tay sau: https://nbviewer.jupyter.org/github /dmarx/data_generation_demo/blob/54be78fb5b68218971d2568f1680b4f783c0a79a/demo.ipynb

TL; DR: Sử dụng một KDE (hoặc các thủ tục lựa chọn của bạn) để xấp xỉ , sau đó sử dụng MCMC để vẽ mẫu từ P ( X | Y ) α P ( Y | X ) P ( X ) , nơi P ( Y | X ) được đưa ra bởi mô hình của bạn. Từ các mẫu này, bạn có thể ước tính X "tối ưu" bằng cách khớp KDE thứ hai với các mẫu bạn đã tạo và chọn quan sát tối đa hóa KDE làm ước tính tối đa của posteriori (MAP).P(X)P(X|Y)αP(Y|X)P(X)P(Y|X)X

Ước lượng khả năng tối đa

... và tại sao nó không hoạt động ở đây

Trong phản hồi ban đầu của tôi, kỹ thuật tôi đề xuất là sử dụng MCMC để thực hiện ước tính khả năng tối đa. Nói chung, MLE là một cách tiếp cận tốt để tìm giải pháp "tối ưu" cho xác suất có điều kiện, nhưng chúng tôi có một vấn đề ở đây: bởi vì chúng tôi đang sử dụng mô hình phân biệt (một khu rừng ngẫu nhiên trong trường hợp này) xác suất của chúng tôi được tính toán liên quan đến ranh giới quyết định . Thật không có ý nghĩa gì khi nói về một giải pháp "tối ưu" cho một mô hình như thế này bởi vì một khi chúng ta đã đi đủ xa khỏi ranh giới lớp, mô hình sẽ chỉ dự đoán các giải pháp cho mọi thứ. Nếu chúng ta có đủ các lớp, một số trong số chúng có thể hoàn toàn bị "bao vây" trong trường hợp đó sẽ không phải là vấn đề, nhưng các lớp trên ranh giới dữ liệu của chúng ta sẽ được "tối đa hóa" bởi các giá trị không nhất thiết phải khả thi.

Để chứng minh, tôi sẽ tận dụng một số mã tiện lợi bạn có thể tìm thấy ở đây , nó cung cấp GenerativeSamplerlớp bao bọc mã từ phản hồi ban đầu của tôi, một số mã bổ sung cho giải pháp tốt hơn này và một số tính năng bổ sung mà tôi đang chơi xung quanh (một số tính năng hoạt động , một số cái không) mà tôi có lẽ sẽ không vào được đây.

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

nhập mô tả hình ảnh ở đây

Trong hình dung này, các x là dữ liệu thực và lớp chúng ta quan tâm là màu xanh lá cây. Các chấm được nối với nhau là các mẫu chúng ta đã vẽ và màu của chúng tương ứng với thứ tự được lấy mẫu, với vị trí chuỗi "mỏng" của chúng được đưa ra bởi nhãn thanh màu bên phải.

Như bạn có thể thấy, bộ lấy mẫu chuyển hướng khỏi dữ liệu khá nhanh và sau đó về cơ bản chỉ nằm cách xa các giá trị của không gian tính năng tương ứng với bất kỳ quan sát thực tế nào. Rõ ràng đây là một vấn đề.

Một cách chúng ta có thể gian lận là thay đổi chức năng đề xuất của mình để chỉ cho phép các tính năng lấy các giá trị mà chúng ta thực sự quan sát được trong dữ liệu. Hãy thử điều đó và xem điều đó thay đổi hành vi của kết quả của chúng tôi như thế nào.

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

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

X vì vậy chúng tôi thực sự không nên tin tưởng phân phối này hoặc.

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

Nhập quy tắc Bayes

Sau khi bạn làm cho tôi bớt căng thẳng với môn toán ở đây, tôi đã chơi với số tiền khá lớn này (do đó tôi xây dựng GenerativeSamplerđiều đó), và tôi đã gặp phải những vấn đề tôi đặt ra ở trên. Tôi cảm thấy thực sự, thực sự ngu ngốc khi tôi thực hiện điều này, nhưng rõ ràng những gì bạn đang yêu cầu kêu gọi áp dụng quy tắc Bayes và tôi xin lỗi vì đã bị từ chối trước đó.

Nếu bạn không quen thuộc với quy tắc bay, nó sẽ giống như sau:

P(B|Một)= =P(Một|B)P(B)P(Một)

Trong nhiều ứng dụng, mẫu số là một hằng số đóng vai trò là một thuật ngữ tỷ lệ để đảm bảo rằng tử số tích hợp thành 1, do đó, quy tắc thường được trình bày lại như vậy:

P(B|Một)αP(Một|B)P(B)

Hoặc bằng tiếng Anh đơn giản: "hậu thế tỷ lệ thuận với thời gian trước khả năng".

Nhìn có quen không? Làm thế nào bây giờ:

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

Vâng, đây chính xác là những gì chúng tôi đã làm việc trước đó bằng cách xây dựng một ước tính cho MLE được neo vào phân phối dữ liệu quan sát được. Tôi chưa bao giờ nghĩ về Bayes cai trị theo cách này, nhưng nó rất có ý nghĩa vì vậy cảm ơn bạn đã cho tôi cơ hội khám phá quan điểm mới này.

P(Y)

Vì vậy, khi đã hiểu rõ rằng chúng ta cần kết hợp trước cho dữ liệu, hãy thực hiện điều đó bằng cách khớp KDE tiêu chuẩn và xem điều đó thay đổi kết quả của chúng ta như thế nào.

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

nhập mô tả hình ảnh ở đâ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()

nhập mô tả hình ảnh ở đây

Và ở đó bạn có nó: 'X' màu đen lớn là ước tính MAP của chúng tôi (những đường viền đó là KDE của hậu thế).


Cảm ơn bạn đã trả lời. Tôi có một câu hỏi. alpha = np.min ([f (new) / f (cũ), 1]) ..... ở đây f (new) là P (Y = 0 | X = new) vì chúng tôi đang sử dụng model.predict_proba mang lại phân phối của Y đã cho X ...... nhưng từ en.wikipedia.org/wiki/MetropolisTHERHastings_alacticm những gì tôi có thể hiểu là alpha nên là min (P (X = new | y = 0) / P (X = cũ | y = 0), 1). Có phải tôi đã hiểu nhầm điều gì không?
claudius

Bạn cũng đã đề cập trong ghi chú TLDR "Sử dụng MCMC để tạo mẫu từ p (X | Y) bằng cách chấm điểm các giá trị X của ứng viên so với khả năng có điều kiện của lớp do mô hình của bạn cung cấp." Nhưng không phải model.predict_proba cho khả năng của lớp được cung cấp X. Làm thế nào bạn có thể nói P (X1 | Y = 0)> P (X2 | Y = 0) chỉ vì model.predict_proba (X1) [0,0]> mô hình .predict_proba (X2) [0,0]. Tôi đọc mối quan hệ từ model.predict_proba là P (Y = 0 | X1)> P (Y = 0 | X2). xin vui lòng cho tôi biết tôi sai ở đâu.
claudius

Ngoài ra một câu hỏi tiếp theo khác ... Hàm phân phối đề xuất đối xứng ở đây là gì? Cảm ơn David đã giúp tôi ra ngoài !!
claudius

Đề xuất đối xứng là một bước đi ngẫu nhiên gaussian. Tôi dự định sẽ sớm cập nhật điều này với bản demo của một func đề xuất "theo kinh nghiệm". Về toán học MCMC, đừng quá bận tâm vào nó. Bằng cách giữ Y cố định và chạy các ứng cử viên X so với p (Y | X), MCMC xấp xỉ MLE cho X trong p (Y = 0 | X), tức là hàm tôi lấy mẫu từ đây không phải là p (Y | X ) (nếu không tôi sẽ tạo một chuỗi các nhãn lớp), đó là L (X; Y). Điều này thực sự mang lại cho tôi một phân phối trên p (X | Y = 0). Hàm tính điểm trong tỷ lệ đô thị là p (Y | X), nhưng cách tôi đang sử dụng nó tạo ra các mẫu từ p (X | Y).
David Marx

Này David. Bạn có thể vui lòng viết ra toán học cho nó Tôi đang gặp khó khăn trong việc thuyết phục bản thân mình về toán học. Tôi đã kiểm tra hồ sơ của bạn để thấy rằng bạn là một người tốt nghiệp stat. Xin hãy giải thích những điểm của bạn để giúp những người bình thường như tôi: P. Đặc biệt là "Bằng cách giữ Y cố định và chạy các ứng cử viên X chống lại p (Y | X), MCMC xấp xỉ MLE cho X trong p (Y = 0 | X), tức là hàm tôi lấy mẫu từ đây không phải là p (Y | X) (nếu không tôi sẽ tạo một chuỗi các nhãn lớp), đó là L (X; Y). Điều này mang lại cho tôi sự phân phối trên p (X | Y = 0) một cách hiệu quả. "Cảm ơn trước!
claudius

0

Một cách để tiến về phía trước có thể là:

Tạo một mạng nơ-ron dẫn nguồn, cho Y (có thể bạn muốn bình thường hóa nó) dự đoán X. Vì vậy, đầu ra của mô hình (lớp cuối cùng) sẽ là một tập hợp các nơ-ron mềm cho mỗi tính năng. Vì vậy, nếu tính năng 1 (ví dụ màu sắc) có 4 tùy chọn, bạn sẽ áp dụng softmax trên bốn nơ ron và thực hiện tương tự trên mỗi tính năng.

Sau đó, hàm mất của bạn có thể là tổng (hoặc kết hợp tuyến tính nếu bạn muốn) của entropy chéo cho mỗi tính năng.


cảm ơn bạn đã trả lời Nhưng, tôi đang tìm kiếm câu trả lời gợi ý nhiều cách tiếp cận và đề cập đến ưu và nhược điểm của từng phương pháp.
claudius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.