【问题标题】:Multinomial naive bayes - sklearn多项朴素贝叶斯 - sklearn
【发布时间】:2018-12-24 08:49:00
【问题描述】:
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[0.25, 0.73], [0.12, 0.42], [0.53, 0.92], [0.11, 0.32]])
y = np.array([0, 0, 0, 1])
mnb = MultinomialNB()
mnb.fit(X, y)
mnb.predict([[0.11, 0.32]])

--> 它预测0

它不应该预测 1 吗?

【问题讨论】:

标签: python scikit-learn naivebayes


【解决方案1】:

不一定。您不能仅仅因为模型已经看到观察结果就假设它会正确预测相应的标签。在高偏差算法like Naive Bayes 中尤其如此。高偏差模型倾向于过度简化您的Xy 之间的关系,而您在这里看到的就是这种关系的产物。最重要的是,您只适合 4 个样本,这对于模型学习稳健关系来说太少了。

如果您想知道模型究竟是如何创建这些预测的,Multinomial Naive Bayes 会学习每个类的联合对数似然性。您实际上可以使用拟合模型计算这些可能性:

>>> jll = mnb._joint_log_likelihood(X)
>>> jll
array([[-0.87974542, -2.02766662],
       [-0.60540174, -1.73662711],
       [-1.24051492, -2.36300468],
       [-0.54761186, -1.66776584]])

从那里,predict 阶段获取类的argmax,这是类标签预测的来源:

>>> mnb.classes_[np.argmax(jll, axis=1)]
array([0, 0, 0, 0])

您可以看到,就目前而言,该模型将为您提供的所有样本预测0

【讨论】:

  • 我该如何克服这个问题?
  • 您正在寻求解决机器学习中一个巨大问题的灵丹妙药(bias variance tradeoff)。如果您想要一个简单的开始,请获取更多数据,并且不要期望适合 4 个样本的模型会是完美的。
【解决方案2】:

视情况而定。在这里,您在拟合/训练期间仅使用 一个 属于第 1 类 的样本。另外,每个样本只有 4 个特征只有 4 个样本,所以训练会很差

import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[0.25, 0.73], [0.12, 0.42], [0.53, 0.92], [0.11, 0.32]])
y = np.array([0, 0, 0, 1])
mnb = MultinomialNB()
mnb.fit(X, y)

mnb.predict([[0.11, 0.32]])
array([0])
mnb.predict([[0.25, 0.73]])
array([0])

模型学习了规则并且可以成功预测第 0 类,但不能预测第 1 类。这也称为特异性和敏感性之间的权衡。我们也指模型不能概括规则。

【讨论】:

  • 说“理论上是的”是很危险的。在 ML 分类算法的大多数场景中,并不能保证说训练集中的样本会在预测中预测出相同的标签。尤其是在高偏差的 MNB 中。
  • 是的,这是真的。我说理论上的意思是,由于没有使用 CV,因此对训练集的预测应该是好的(过拟合),因此,对于上述情况,返回 1。欢呼
  • 是的,但如果我只有一个样本属于 1 类,不能让它预测 1 类吗?
  • 这几乎是不可能的。如果您只有一个属于特定类别的样本,那么几乎不可能拟合模型然后学习决策函数。你确定你只有一个属于第 1 类的样本吗?
猜你喜欢
  • 2015-06-05
  • 2018-12-15
  • 2012-06-09
  • 2020-02-28
  • 2015-01-03
  • 2019-02-21
  • 2012-02-11
  • 2019-05-10
  • 2021-10-18
相关资源
最近更新 更多