朴素贝叶斯:除以零错误

数据挖掘 Python scikit-学习 朴素贝叶斯分类器
2021-09-27 19:16:59

好的,这是我第一次使用 ML,首先我正在实施朴素贝叶斯。我有板球(体育)数据,我必须根据 Toss Won|Lost 和 Bat First|Second 检查球队是赢还是输。下面是我的代码:

from sklearn.naive_bayes import GaussianNB
import numpy as np

"""
    Labels : Lost, Draw, Won [-1,0,1]
    Features
    ==========
        Toss(Lost,Won) = [-1,1]
        Bat(First, Second) = [-1,1]
"""
#Based on Existing Data Features are:
features = np.array([[-1, 1],[-1, 1]])
labels = np.array([0,1])
# Create a Gaussian Classifier
model = GaussianNB()

# Train the model using the training sets
model.fit(features, labels)

# Predict Output
predicted = model.predict([[1,0]])
print(predicted)

在运行这个我得到错误:

/anaconda3/anaconda/lib/python3.5/site-packages/sklearn/naive_bayes.py:393: RuntimeWarning: divide by zero encountered in log
[0]
  n_ij = - 0.5 * np.sum(np.log(2. * np.pi * self.sigma_[i, :]))
/anaconda3/anaconda/lib/python3.5/site-packages/sklearn/naive_bayes.py:395: RuntimeWarning: divide by zero encountered in true_divide
  (self.sigma_[i, :]), 1)
/anaconda3/anaconda/lib/python3.5/site-packages/sklearn/naive_bayes.py:395: RuntimeWarning: invalid value encountered in subtract
  (self.sigma_[i, :]), 1)

更新

这里给出的代码

2个回答

虽然我还没有验证它,但乍一看你使用的特征和训练集就会发现一个明显的问题。当你给它不同的标签时,你只有两个具有完全相同特征的数据样本。

尽管其他类型的模型可能不会破坏并且只是给两个样本一个相等的概率为 0 或 1,但朴素贝叶斯分类器内部计算中的某些内容可能要求在不同标记的样本中至少存在一些差异(这不是不合理的假设)。

我无法为自己确认这一点,因为我必须更深入地研究源代码才能实际检查 scikit 实现,所以也许其他更熟悉它的人可以检查。

编辑:我刚刚通过将代码中的一行更改为

features = np.array([[-1, 1],[-1, 0]])

有效。

首先,您的数据似乎是离散的,因此我建议使用多项朴素贝叶斯(scikit-learn 也提供了一个实现)。

我运行了您的代码,您的代码中断的原因不是因为实现,而是因为数据。

拟合有效,但如果您运行model.sigma_,您将看到特征的方差等于 0。

这将导致运行时错误,因为高斯朴素贝叶斯模型类概率如下: 在此处输入图像描述

由于此处的 sigma 等于零,因此您的代码将崩溃。如果您只是将代码更改为:

from sklearn.naive_bayes import GaussianNB
import numpy as np

"""
    Labels : Lost, Draw, Won [-1,0,1]
    Features
    ==========
        Toss(Lost,Won) = [-1,1]
        Bat(First, Second) = [-1,1]
"""
#Based on Existing Data Features are:
features = np.array([[-1, -1],[-1, 1]])
labels = np.array([0,1])
# Create a Gaussian Classifier
model = GaussianNB()

# Train the model using the training sets
model.fit(features, labels)

# Predict Output
predicted = model.predict([[1,0]])
print(predicted)

您所做的只是将您的功能更改为features = np.array([[-1, -1],[-1, 1]]),您的代码现在将运行。