Найти оптимальный P (X | Y), учитывая, что у меня есть модель, которая имеет хорошие показатели при обучении на P (Y | X)

11

Входные данные:

-> особенности футболки (цвет, логотип и т. Д.)X

-> маржа прибылиY

Я натренировал случайный лес на вышеуказанных и Y и добился разумной точности на тестовых данных. Так что яXY

.P(Y|X)

Теперь я хотел бы найти то есть распределение вероятностей X объектов, учитывая, что я ожидаю такой большой прибыли.P(X|Y)X

Как мне сделать это со случайным лесом (или любой другой дискриминационной моделью)?

Одним из предложений для меня может быть начать с генеративной модели, а не дискриминационной модели. Но, насколько я понимаю, генеративная модель обычно требует большого количества данных для обучения, разве что это делает некоторые очень ограничительные предположения, такие как условная независимость в случае наивного Байеса?X

Другое предложение может состоять в том, чтобы просто переключить и Y и обучить дискриминационную модель. Теперь X будет маржой прибыли, а Y - особенностями рубашки. P ( Y | X ) будет напрямую давать мне распределение вероятностей характеристик футболки с учетом целевой прибыли. Но такой подход мне не кажется правильным, так как я всегда думал, что X - случайные переменные, а Y - эффект.XYXYP(Y|X)XY

Кроме того, из того, что я слышал, подобный вопрос был задан для открытия лекарств, и были разработаны алгоритмы, которые придумывают новые лекарства-кандидаты, которые имеют высокую степень успеха. Может ли кто-нибудь указать мне на исследование литературы в этой области?

Обновить:

Я пришел через это , и это , которое говорит о Gans используется для обнаружения наркотиков. Генеративное adversial сеть , кажется , как хорошо подходит для моей постановки задачи , так что я читал о них. Но я понял одну вещь: GAN генерирует образцы без присмотра. Они пытаются произвести выборку, которая как сначала захватывает базовое распределение X, а затем производит выборку из этого распределения. Но меня интересует X | Y. X и Y определены выше. Должен ли я изучать что - то другое , чем Gans? Любые указатели , пожалуйста?

Контрольный вопрос:

Представьте, что у меня есть тренировка ГАН, которая научилась делать футболки (пример выходных X). Как я могу получить топ-5 рубашек для данного Y?

Клавдий
источник
Это тесно связано с котомкой Проблема или случайных вариантов этого. Возможно ли будет переформулировать его в соответствии с некоторыми разумными предположениями о вашем входном домене?
mjul
@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

Оценка максимального правдоподобия

... и почему это не работает здесь

В моем первоначальном ответе я предложил использовать метод 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

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)

Итак, сделав это понимание того, что нам нужно включить априор для данных, давайте сделаем это путем подгонки стандартного 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()

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

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 (new) / f (old), 1]) ..... здесь f (new) - это P (Y = 0 | X = new), так как мы используем model.predict_proba, который дает распределение Y с учетом X ...... но из en.wikipedia.org/wiki/Metropolis –Hastings_algorithm я могу понять, что альфа должна быть минимальной (P (X = новый | y = 0) / P (X = старый | y = 0), 1). Я что-то не так понял?
Клавдий
Вы также упомянули в заметке TLDR «Использование 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 (Х2) [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 варианта, вы примените softmax к четырем нейронам и сделаете то же самое для каждой функции.

Тогда вашей функцией потерь может быть сумма (или линейная комбинация, если вы предпочитаете) перекрестной энтропии для каждого признака.

Escachator
источник
спасибо за ваш ответ! Но, я ищу ответ , который предлагает несколько подходов и упоминает плюсы и минусы каждого подхода.
Клавдий