新闻  |   论坛  |   博客  |   在线研讨会
混合密度网络(MDN)进行多元回归详解和代码示例(1)
数据派THU | 2022-03-13 09:01:55    阅读:393   发布文章

来源:Deephub Imba


回归


“回归预测建模是逼近从输入变量 (X) 到连续输出变量 (y) 的映射函数 (f) [...] 回归问题需要预测具体的数值。具有多个输入变量的问题通常被称为多元回归问题 例如,预测房屋价值,可能在 100,000 美元到 200,000 美元之间
这是另一个区分分类问题和回归问题的视觉解释如下:
图片
另外一个例子

图片

密度


DENSITY “密度” 是什么意思?这是一个快速的通俗示例:
假设正在为必胜客运送比萨。现在记录刚刚进行的每次交付的时间(以分钟为单位)。交付 1000 次后,将数据可视化以查看工作表现如何。这是结果:图片
这是披萨交付时间数据分布的“密度”。平均而言,每次交付需要 30 分钟(图中的峰值)。它还表示,在 95% 的情况下(2 个标准差2sd ),交付需要 20 到 40 分钟才能完成。密度种类代表时间结果的“频率”。“频率”和“密度”的区别在于:

  • 频率:如果你在这条曲线下绘制一个直方图并对所有的 bin 进行计数,它将求和为任何整数(取决于数据集中捕获的观察总数)。

  • 密度:如果你在这条曲线下绘制一个直方图并计算所有的 bin,它总和为 1。我们也可以将此曲线称为概率密度函数 (pdf)。

  • 用统计术语来说,这是一个漂亮的正态/高斯分布。这个正态分布有两个参数:


均值


  • 标准差:“标准差是一个数字,用于说明一组测量值如何从平均值(平均值)或预期值中展开。低标准偏差意味着大多数数字接近平均值。高标准差意味着数字更加分散。“


均值和标准差的变化会影响分布的形状。例如:
图片
有许多具有不同类型参数的各种不同分布类型。例如:

图片

混合密度


现在让我们看看这 3 个分布:
图片
如果我们采用这种双峰分布(也称为一般分布):

图片
混合密度网络使用这样的假设,即任何像这种双峰分布的一般分布都可以分解为正态分布的混合(该混合也可以与其他类型的分布一起定制 例如拉普拉斯):
图片

网络架构


混合密度网络也是一种人工神经网络。这是神经网络的经典示例:
图片
输入层(黄色)、隐藏层(绿色)和输出层(红色)。
如果我们将神经网络的目标定义为学习在给定一些输入特征的情况下输出连续值。在上面的例子中,给定年龄、性别、教育程度和其他特征,那么神经网络就可以进行回归的运算。
图片


密度网络


图片
密度网络也是神经网络,其目标不是简单地学习输出单个连续值,而是学习在给定一些输入特征的情况下输出分布参数(此处为均值和标准差)。在上面的例子中,给定年龄、性别、教育程度等特征,神经网络学习预测期望工资分布的均值和标准差。预测分布比预测单个值具有很多的优势,例如能够给出预测的不确定性边界。这是解决回归问题的“贝叶斯”方法。下面是预测每个预期连续值的分布的一个很好的例子:

图片
下面的图片向我们展示了每个预测实例的预期值分布:

图片


混合密度网络


最后回到正题,混合密度网络的目标是在给定特定输入特征的情况下,学习输出混合在一般分布中的所有分布的参数(此处为均值、标准差和 Pi)。新参数“Pi”是混合参数,它给出最终混合中给定分布的权重/概率。
图片
最终结果如下:

图片

示例1:单变量数据的 MDN 类


上面的定义和理论基础已经介绍完毕,下面我们开始代码的演示:

import numpy as np
import pandas as pd

from mdn_model import MDN

from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.linear_model import LinearRegression
from sklearn.kernel_ridge import KernelRidge

plt.style.use('ggplot')


生成著名的“半月”型的数据集:

X, y = make_moons(n_samples=2500, noise=0.03)
y = X[:, 1].reshape(-1,1)
X = X[:, 0].reshape(-1,1)

x_scaler = StandardScaler()
y_scaler = StandardScaler()

X = x_scaler.fit_transform(X)
y = y_scaler.fit_transform(y)

plt.scatter(X, y, alpha = 0.3)

图片


绘制目标值 (y) 的密度分布:

sns.kdeplot(y.ravel(), shade=True)

通过查看数据,我们可以看到有两个重叠的簇:


图片


这时一个很好的多模态分布(一般分布)。如果我们在这个数据集上尝试一个标准的线性回归来用 X 预测 y:

model = LinearRegression()
model.fit(X.reshape(-1,1), y.reshape(-1,1))
y_pred = model.predict(X.reshape(-1,1))

plt.scatter(X, y, alpha = 0.3)
plt.scatter(X,y_pred)
plt.title('Linear Regression')

图片

sns.kdeplot(y_pred.ravel(), shade=True, alpha = 0.15, label = 'Linear Pred dist')      
sns.kdeplot(y.ravel(), shade=True, label = 'True dist')

图片


效果必须不好!现在让尝试一个非线性模型(径向基函数核岭回归):


model = KernelRidge(kernel = 'rbf')
model.fit(X, y)
y_pred = model.predict(X)


plt.scatter(X, y, alpha = 0.3)
plt.scatter(X,y_pred)
plt.title('Non Linear Regression')

图片

sns.kdeplot(y_pred.ravel(), shade=True, alpha = 0.15, label = 'NonLinear Pred dist')      
sns.kdeplot(y.ravel(), shade=True, label = 'True dist')

图片
虽然结果也不尽如人意,但是比上面的线性回归要好很多了。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客