给定我有一个在P(Y | X)上训练时具有良好性能的模型,找到最佳P(X | Y)


11

输入数据:

> T恤的功能(颜色,徽标等)X

>利润率Y

我已经在上面的Y上训练了一个随机森林,并在测试数据上达到了合理的准确性。所以我有XY

P(Y|X)

现在,我想找到即给定我期望这么高的利润率的X特征的概率分布。P(X|Y)X

如何使用随机森林(或任何其他判别模型)来做到这一点?

对我来说,一个建议可能是从生成模型而不是判别模型开始。但是,我的理解是,生成模型通常需要训练大量数据,除非做出一些非常严格的假设,例如在朴素贝叶斯的情况下的条件独立性?X

其他建议可能只是切换Y并训练判别模型。现在X将是利润率,Y将是at衬衫的特征。给定目标利润率,P Y | X 将直接给我t恤功能的概率分布。但是这种方法对我来说似乎并不正确,因为我一直将X作为偶然变量,而将Y视为有效。XYXYP(Y|X)XY

而且,据我所知,对于药物发现也提出了类似的问题,并设计了算法,这些算法提出了具有高度成功性的候选新药物。有人可以指点我研究这一领域的文学吗?

更新:

我也碰到过这个这个,其被用于药物发现约甘斯举行会谈。生成式对抗网络似乎很适合我的问题陈述,因此我一直在阅读有关它们的信息。但是我了解的一件事是GAN以无监督的方式生成样本。他们试图生成样本,就像首先捕获X的基础分布,然后从该分布进行采样一样。但是我对X | Y感兴趣。X和Y在上面定义。除了GAN,我是否应该探索其他东西?有指针吗?

后续问题:

想象一下,我受过GAN培训,学习了如何制作T恤(输出样本Xs)。在给定的Y下,如何获得前5件衬衫?


这与背包问题或此问题的随机变化密切相关。在有关您的输入域的一些合理假设下,是否可以这样重述?
mjul

@mjul。Sry没听懂你的话。请详细说明。始终欢迎提出其他解决问题的方法的建议!
claudius

1
背包问题是一个组合优化问题,其目标是假设您知道各个功能的价值和成本,确定最有利可图的功能集(适用于您的T恤)。它假定值是准确的,不是随机的。但是,在合理的独立性假设下,您可能可以将问题重新表述为背包问题或多年来也研究过的随机变量之一。但是,如果没有更多信息,您可能无法立即知道是否有可能。
mjul

Answers:


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给定X的Y分布...但是从en.wikipedia.org/wiki/Metropolis –Hastings_algorithm我可以理解的是alpha应该为min(P(X = new | y = 0)/ P(X = old | y = 0),1)。我误会了吗?
claudius

您还在TLDR注释中提到“使用MCMC通过根据模型提供的类条件似然对候选X值进行评分来从p(X | Y)生成样本。” 但是不是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

对称建议是高斯随机游动。我计划尽快以“经验性”提案功能演示进行更新。关于MCMC数学,不要太迷恋它。通过使Y固定并针对p(Y | X)运行X个候选项,MCMC近似于p(Y = 0 | X)中X的MLE,即我从此处采样的函数不是p(Y | X) )(否则,我将生成一个类标签序列),它是L(X; Y)。这有效地给了我p(X | Y = 0)的分布。大都市比率的计分函数是p(Y | X),但是我使用它的方式是从p(X | Y)生成样本。
大卫·马克思

嘿,大卫。你能为它写下数学吗?我很难说服自己算算。我检查了您的个人资料,发现您是应届毕业生。请详细说明您的观点,以帮助像我这样的凡人:P。特别是“通过使Y固定并针对p(Y | X)运行X个候选,MCMC在p(Y = 0 | X)中近似X的MLE,即我从此处采样的函数不是p(Y | X)(否则,我将生成一个类标签序列),它是L(X; Y)。这实际上为我分配了p(X | Y = 0)。
claudius

0

一种前进的方式可能是:

创建一个前馈神经网络,给定Y(可能要对其进行归一化)预测X。因此,模型的输出(最后一层)将是每个功能的一组softmax神经元。因此,如果特征1(例如颜色)具有4个选项,则将对四个神经元应用softmax,并对每个特征执行相同的操作。

那么您的损失函数可以是每个特征的交叉熵的和(或线性组合,如果您愿意)。


感谢您的答复!但是,我正在寻找可以建议多种方法并提及每种方法的利弊的答案。
claudius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.