机器学习:量化缺失数据的不确定性

Machine Learning: quantifying uncertainty around missing data

我的问题是围绕我遇到的一个特定的class化问题。

我的训练数据完整,没有缺失数据。我可以围绕它构建任何 class 化模型(SVM、随机森林等)以获得良好的结果。到目前为止,猪还没有在对流层飞行。

问题是我想将这些模型应用于缺少特征的数据。我对任何形式的归责都不感兴趣。我想要一个 "uncertainty" 度量,它会随着缺少的功能的增加而增加,而且我仍然希望模型吐出一个结果(即使不确定性很高)。例如对于一条记录,如果 10 个特征中有 5 个是空数据,模型将给出 class 但不确定性为 50%(理想情况下我可以指定每个变量的 "important")。

我还没有 运行 在网上找到类似的东西,我已经找了一段时间了。 感谢您的帮助!

为什么是数据特定问题?

让我们从非常简单的模型开始——线性模型 (f(x) = sign(<w,x> + b))。我们还假设现在给定了一个缺失值 x_i=N/A 的向量,并且相应的权重不为零 (w_i != 0);不失一般性让 w_i>0,然后我们可以看到,我总是可以 "imput" x_i 如此之小(非常非常负的值,如 -10e10000)模型将回答 -1 并且对称地,如此大的值将输出 +1。为了进行预测(并进一步量化确定性),我们确实需要假设 x_i 的可能值。我希望这个简单的例子表明,没有任何假设我们就迷路了——我们什么也做不了,没有预测,没有确定性——什么都没有。这是机器学习中一个众所周知的事实——我们无法在没有模型诱发偏差的情况下进行预测。在这种情况下 - 我们对缺失值进行建模。

我们能做什么?

我们需要就价值观达成一致。有很多选择:

  • 我们可以假设均匀分布,例如,如果它是一个具有 M 值的分类变量,我们将 1/M 概率放在每个可能的实例上。如果它介于 0 和 1 之间,我们可以在这样的范围内使用均匀分布。在这种情况下,我们需要有界值。如果值是无限的 - 没有均匀分布。
  • 我们假设某种无限支持分布,例如简单的高斯分布,它可以是任意的(0 均值,1 标准差)或从数据中学习的(经验均值 + 经验标准差)。
  • 我们推断出一些复杂的分布,可能使用非参数估计器 (KDE),甚至可能从其他维度推断出条件分布。

好的,它与数据插补有何不同?数据插补假定填充缺失值,它给你一个 point。我在这里谈论的是将我们的缺失值作为 概率分布 的观点来考虑 - 所以更多的贝叶斯方法。现在它不再是数据点,而是无限的点云,具有各种密度。

如何将经典的 ML 技术应用于分发?

不幸的是,这里事情变得复杂了,因为它是完全模型特定的问题。因此,根据您使用的 classifier/regressor 类型,您需要不同的方法。最简单的情况是随机森林,所以我将重点关注这个,稍后会给出一个效率较低但对任何模型都更通用的解决方案。

随机森林案例

在决策树中,每个节点都是对某些特征的决策。因此,为了对我们的 "distribution" 进行预测,我们只需将点放入决策过程 - 如果节点询问现有特征 - 我们将正常处理它。当我们被问及缺少功能时该怎么办?我们拆分执行,并计算 两条 路径,但权重是根据输出分布和节点中的阈值计算的。例如,假设我们在 [0,1] 上选择了均匀分布,并且阈值现在为 0.75(这意味着该节点询问缺失值是 <0.75 还是 >=0.75)。我们在两部分中拆分计算并检查预测,决策 <0.75 的权重为 0.75(因为它是一个积分 INT_{0}^{0.75} pdf(x) dx,其中 pdf(x) 是我们的均匀分布),第二条路径的权重为 0.25。最后我们得到期望值。我们的信心是什么?您像往常一样计算,或者执行更复杂的置信区间分析。

一般方法

最通用的方法(可以作为黑盒用于任何模型)是Monte Carlo方法。我们有我们的分布 pdf(x),所以我们从这个分布中重复采样,分类并记录输出。最后 - 我们收集选票并获得分类和信心。伪代码如下

function CLASSIFY_WIT_NA(x, probability_model, model, k=1000):
  pdf <- probability_model(x.missing_values)
  predictions <- empty set
  for i=1 to k
    x' ~ pdf
    prediction <- model(x')
    predictions.add(prediction)

  class <- most_common_element_of(predictions)
  confidence <- count(class, predictions) / k