了解朴素贝叶斯

时间:2016-05-09 14:19:02

标签: machine-learning naivebayes

我一直在四处寻找,似乎无法找到这个问题的答案:
如果我训练Naive-bayes作为某些数据的分类器。然后我重新使用这个训练数据作为测试数据。我不应该获得100%的分类成功吗?谢谢阅读!

编辑:看来我的讨论超出了我的理解水平。因此,我觉得我不应该扮演“接受”答案的角色。不过我很感激您的意见,并会阅读所有答案。

2 个答案:

答案 0 :(得分:2)

实际上,尽管被接受了答案,@ flyingmeatball的答案在这个特殊情况下(至少部分地)是错误的。它描述了相关现象,但显然不是给出的情况的关键现象。

您所描述的是一种情况,您希望您的模型具有100%的训练准确度,而事实并非如此。这与"没有足够表达现象的数据无关" - 对于高泛化错误,而不是训练,情况确实如此。

小于100%的训练误差意味着,数据本身可能太嘈杂而无法模拟(飞行球表示),但实际上,对于训练集,情况就是这样当且仅当有两个完全相同时带有不同标签的积分。如果不是这种情况(也可能不是)实际的问题"是您选择的模型有一些内部偏见。简单来说 - 将其视为假设关于数据,甚至约束,即使数据明显不遵循,模型也不会改变。特别是,朴素贝叶斯有两个这样的假设:

  1. 功能是独立的,这意味着没有相关性,标签与当时不止一个功能之间没有重要的联系。如果您的特征是风和温度,朴素贝叶斯将假设它可以根据温度本身做出正确的决定,例如假设“良好的温度在20度左右"对于风来说也是如此,例如"最多10km / h"。它将无法找到基于这两个值的关系,例如"温度风至少为30"或类似的东西

  2. 它假定每个要素的特定值分布 - 通常是MultiNomial分布或高斯分布。这些是很好的发行版系列,但很多功能都不遵循它们。例如,如果您的功能是"人们在我的杂货店购买的时间" (比如你把它视为一个连续变量,精确测量在几微秒内等),你会发现,你有两个"高峰时间"一个在早上和一个在晚上,因此朴素贝叶斯将做一个可怕的工作拟合一个高斯,将在中午有一个高峰!同样,错误的假设会导致错误的决定。

  3. 为什么我们这样做呢?嗯,由于很多原因,但其中一个是因为我们关心的是泛化而不是培训,因此它是一种防止我们的模型过度拟合到严重的方式,代价是"不合适& #34;训练集。这也有助于处理噪音,简化优化并制作许多其他奇妙的东西: - )

    希望这会有所帮助。

答案 1 :(得分:1)

没有。并非所有数据的可变性都可以在您选择的功能中进行说明。想象一下,你在分类是否是打网球的好日子。你的功能是温度,风,沉淀。那些可能是很好的描述,但你没有训练是否有镇游行!在游行日,网球场被封锁,所以尽管你的功能应该很好地解释已知数据,但是有一些不适合这些功能的异常值。

通常,数据中存在随机性,您将无法100%捕获。

根据以下评论更新

问题是对同一数据集的培训和测试是否100%准确,我认为我们都同意这些不会起作用(他们没有询问NB的假设是什么)。以下是演示上述方案的示例数据集:

import pandas as pd
import numpy as np
from sklearn.naive_bayes import GaussianNB

gnb = GaussianNB()

df = pd.DataFrame([[1,1,0],[1,0,0],[0,0,1],[1,0,1],[1,1,0]], columns = ['hot','windy','rainy'])
targets = [1,1,0,0,0]
preds = gnb.fit(df, targets).predict(df)

print preds
array([1, 1, 0, 0, 1])

请注意,第一种情况和最后一种情况相同,但分类器错过了最后一种情况的预测。这是因为手头的数据并不总能完美地描述伴随的分类。 NB还有许多其他假设,也可以描述失败的情况(你在下面极好地指出),但我的目标只是想出一个他们希望能够理解并回答这个问题的快速演示。 p>