Знайдіть оптимальний P (X | Y) з огляду на те, що у мене є модель, яка має хороші показники при навчанні на P (Y | X)


11

Вхідні дані:

X -> особливості футболки (колір, логотип тощо)

Y -> норма прибутку

Я навчив випадковий ліс на вищезгаданих і і досяг розумної точності на даних тесту. Отже, маюYXY

P(Y|X) .

Тепер я хотів би знайти тобто розподіл ймовірності ознак, враховуючи, що я очікую такої великої норми прибутку.P(X|Y)X

Як це зробити з випадковим лісом (або будь-якою іншою дискримінаційною моделлю)?

Однією з пропозицій для мене могло б стати з генеративної моделі, а не з дискримінативної моделі. Але, як я розумію, генеративна модель, як правило, вимагає багато даних для підготовки, хіба що це робить дуже обмежувальні припущення, такі як умовна незалежність -го у випадку наївного Байєса?X

Іншою пропозицією може бути просто переключення і та підготовка дискримінативної моделі. Тепер буде прибутковою, а - рисами футболки. безпосередньо дасть мені розподіл ймовірностей особливостей футболки з урахуванням цільової норми прибутку. Але цей підхід мені не здається правильним, оскільки я завжди мав як випадкові змінні та - ефект.YXYY P ( Y | X ) X YXYP(Y|X)XY

Крім того, з того, що я чув, подібне питання було поставлено для виявлення наркотиків і були розроблені алгоритми, які придумували нові лікарські препарати, які мають високий ступінь успіху. Чи може хтось вказати мені на дослідження літератури в цій галузі?

Оновлення:

Я натрапив на це, і це говорить про те, що GAN використовуються для виявлення наркотиків. Генеральні рекламні мережі, здається, добре підходять для моєї постановки проблеми, тому я читав про них. Але я зрозумів, що GAN генерує зразки без нагляду. Вони намагаються створити зразок, який нагадує спочатку захоплення основного розподілу X, а потім вибірку з цього розподілу. Але мене цікавить X | Y. X і Y визначені вище. Чи слід досліджувати щось, крім GAN? Будь-які покажчики, будь ласка?

Подальше запитання:

Уявіть, я мав навчання GAN, який навчився робити футболки (вихідний зразок X). Як я можу отримати 5 найкращих сорочок для даного Y?


Це тісно пов'язане з проблемою «Рюкзак» або стохастичними варіантами цієї проблеми. Чи можна було б перезапустити його як таке під деякими розумними припущеннями щодо вашого вхідного домену?
mjul

@mjul. Шрі тебе не зрозумів. Будь ласка, докладно. Пропозиція щодо іншого підходу до вирішення проблеми завжди вітається!
Клавдій

1
Проблема "Рюкзак" - це проблема комбінаторної оптимізації, де мета - визначити найвигідніший набір функцій (для ваших футболок), припускаючи, що ви знаєте вартість та вартість окремих функцій. Він передбачає, що значення є точними, а не стохастичними. Однак, при обґрунтованих припущеннях про незалежність, ви, можливо, зможете повторно заявити про свою проблему як проблему «Рюкзак» або як один із стохастичних варіантів, які також вивчалися роками. Однак без додаткової інформації не відразу зрозуміло, що це можливо у вашому випадку.
mjul

Відповіді:


10

Ця відповідь була суттєво модифікована з початкової форми. Про недоліки моєї оригінальної відповіді буде обговорено нижче, але якщо ви хочете приблизно побачити, як виглядала ця відповідь до того, як я зробив велику редагування, подивіться на наступний зошит: https://nbviewer.jupyter.org/github /dmarx/data_generation_demo/blob/54be78fb5b68218971d2568f1680b4f783c0a79a/demo.ipynb

TL; DR: Використовуйте KDE (або обрану вами процедуру) для апроксимації , а потім використовуйте MCMC для отримання зразків з , де задається вашою моделлю. З цих зразків ви можете оцінити "оптимальний" , встановивши другий KDE до згенерованих вами вибірок, і вибравши спостереження, яке максимізує KDE як ваш максимальний a 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()

введіть тут опис зображення

У цій візуалізації х є реальними даними, а клас, який нас цікавить, - зелений. Точки, пов’язані з лінією, - це зразки, які ми намалювали, і їх колір відповідає порядку, в якому вони були відібрані, причому їх “стоншене” положення послідовності задано етикеткою кольорової смуги праворуч.

Як бачимо, пробник відхилився від даних досить швидко, а потім просто зависає досить далеко від значень простору функцій, які відповідають будь-яким реальним спостереженням. Очевидно, це проблема.

Один із способів, який ми можемо обдурити, - це змінити нашу функцію пропозиції, щоб лише функції дозволяли приймати значення, які ми насправді спостерігали в даних. Спробуємо це і подивимось, як це змінює поведінку нашого результату.

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 ( Y | X ) P ( X ) P ( Y | X ) P ( 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, прикріпленого до спостережуваного розподілу даних. Я ніколи не замислювався над тим, як Байєс править таким чином, але має сенс, тому дякую, що ви дали мені можливість відкрити цю нову перспективу.

Щоб відслідкувати крихітний шматочок, MCMC - це одне із застосувань правила байєса, де ми можемо ігнорувати знаменник. Коли ми обчислюємо коефіцієнт акцептанта, буде приймати однакове значення і в чисельнику, і в знаменнику, скасовуючи і дозволяючи нам вибирати вибірки з ненормалізованих розподілів ймовірностей.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 posteriori" оцінкою, що є фантастичним способом сказати, що ми підходимо до другого KDE - але для наших зразків цього разу - і знаходимо значення, яке максимальне KDE, тобто значення, що відповідає режиму .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 задня частина).


Дякую за відповідь ур. У мене є питання. альфа = np.min ([f (новий) / f (старий), 1]) ..... тут f (new) є P (Y = 0 | X = new), як ми використовуємо model.predict_proba, який дає розподіл Y дано X ...... але з en.wikipedia.org/wiki/Metropolis –Hastings_algorithm, що я міг зрозуміти, що альфа має бути min (P (X = new | y = 0) / P (X = старий | у = 0), 1). Я щось неправильно зрозумів?
Клавдій

Ви також згадали в примітці TLDR "Використовуйте MCMC для генерування зразків з p (X | Y) шляхом вибору кандидатних значень X проти умовно-ймовірності класу, наданої вашою моделлю." Але не модель.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). будь ласка, дайте мені знати, де я помиляюся.
Клавдій

Ще одне наступне питання ... Яка тут функція симетричного розповсюдження пропозицій? Дякую Давидові за допомогу мені !!
Клавдій

Симетрична пропозиція - це гауссова випадкова прогулянка. Я планую найближчим часом оновити це з демонстрацією функції "емпіричного" пропозиції. Щодо математики 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).
Девід Маркс

Гей, Девід. Чи можете ви, будь ласка, записати математику для цього. Мені важко переконати себе в тому, що я знаю математику. Я перевірив ваш профіль, щоб виявити, що ви статевий випускник. Будь ласка, детальніше розкажіть, щоб допомогти простим смертним, як я: P. Особливо "Тримаючи Y фіксованих та запускаючи X кандидатів проти p (Y | X), MCMC наближає MLE для X у p (Y = 0 | X), тобто функція, яку я відбираю звідси, не p (Y | X) (інакше я б генерував послідовність міток класу), це L (X; Y). Це ефективно дає мені розподіл по p (X | Y = 0). "Дякую заздалегідь!
Клавдій

0

Одним із способів просування вперед може бути:

Створіть нейронну мережу подачі, яка з урахуванням Y (ймовірно, ви хочете її нормалізувати) пророкує X. Отже, вихід моделі (останній шар) буде набором нейронів softmax для кожної функції. Отже, якщо функція 1 (наприклад, колір) має 4 варіанти, ви застосуєте софтмакс над чотирма нейронами та зробите те ж саме для кожної функції.

Тоді вашою функцією втрати може бути сума (або лінійна комбінація, якщо ви віддаєте перевагу) перехресної ентропії для кожної функції.


дякую за відповідь ур! Але я шукаю відповідь, яка пропонує декілька підходів та згадує плюси та мінуси кожного підходу.
Клавдій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.