机器学习:Python实现NAIVE BAYES

机器学习:Python实现NAIVE BAYES

在机器学习中,朴素贝叶斯分类器是一组简单的“概率分类器”,基于贝叶斯定理,特征之间有很强的(naive)独立性假设。

朴素贝叶斯分类器是高度可扩展的,在一个学习问题中,要求在变量(特性/预测器)的数量中有许多线性的参数。最大似然训练可以通过评估一个封闭的表达式来完成,它需要线性时间,而不是像许多其他类型的分类器那样使用昂贵的迭代逼近。

在统计学和计算机科学文献中,朴素贝叶斯模型以各种名称而闻名,包括简单贝叶斯和独立贝叶斯。所有这些名称都引用了贝叶斯定理在分类器决策规则中的使用,但朴素贝叶斯并不是贝叶斯方法。

举一个实际的例子,我们考虑一个生产扳手的工厂。假设我们正在为工厂做一些分析,每天通过2台机器生产一定数量的扳手,并且在一天结束时我们有很多扳手,我们必须检测有缺陷的扳手。

机器学习:Python实现NAIVE BAYES

机器2生产故障扳手的概率是多少?要回答这个问题,我们将在这里使用的规则称为贝叶斯定理:

机器学习:Python实现NAIVE BAYES

我们知道m1每小时可生产30个扳手,每小时可生产20个扳手。此外,在所有生产的部件中,1%是有缺陷的,并且在所有缺陷部件中,50%来自m1,50%来自m2。

从m2生产的零件有缺陷的概率是多少?

如果工厂每小时生产50个扳手,则扳手来自m1的概率为30/50,而m2的概率为20/50。找到缺陷件的概率是1%,并且在所有缺陷部件中,50%来自m1,而来自m2的50%。如果我们只采用有缺陷的部件,那么来自m1的可能性是50%,而m2也是如此。

缺陷部件来自第2机械装置的概率是多少?

如果我们应用贝叶斯定理并使用这些数字,我们将得到:

机器学习:Python实现NAIVE BAYES

现在让我们看另一个例子,假设我们生产1000个扳手,因此我们知道400来自m2,1%是有缺陷的。在1000把扳手中,我们有10件有缺陷的零件,其中50%来自m2。

机器2有缺陷的零件百分比是多少?好吧它的5/400 = 0.0125!

机器学习:Python实现NAIVE BAYES

这给了我们与第一个例子相同的结果。但为什么我们不能马上做这个操作呢?答案可能是多重的,但潜在的假设是计算所有扳手的操作可能太耗时。

现在我们如何将这个特定应用于机器学习?

这里我们把数据点分为两类:红色和绿色。我们可以假设红色的点是人们走路去上班,绿色的点是开车去上班。

发生了什么事情我们添加了一个新的obervation,我们如何对它进行分类?

机器学习:Python实现NAIVE BAYES

在这种情况下,我们将使用贝叶斯定理,并将其应用于两个类别并计算相应的概率并比较2个值。显然,我们会将点数分配给概率最高的类别。

机器学习:Python实现NAIVE BAYES

我们可以通过考虑步行的人是x的可能性来计算这些值并计算后验概率。然后我们迭代开车的过程:

机器学习:Python实现NAIVE BAYES

然后我们比较2个值:

机器学习:Python实现NAIVE BAYES

第一步是计算P(Walks),由公式给出:

机器学习:Python实现NAIVE BAYES

在第2步中,我们计算P(X),它是一个固定值,取决于我们考虑的样本范围:

机器学习:Python实现NAIVE BAYES

在第3步中,我们计算P(X | Walks),它只考虑那些步行上班P(X)的人:

机器学习:Python实现NAIVE BAYES

最后我们得到P(Walks | X):

机器学习:Python实现NAIVE BAYES

然后我们可以为开车上班类别迭代相同的过程:

机器学习:Python实现NAIVE BAYES

为什么我们把这个算法叫做朴素算法???因为贝叶斯模型需要一些独立的假设,而这些假设通常是不正确的!!P(X)总是一样的我们可以把它从公式中删除如果我们想比较两个值

机器学习:Python实现NAIVE BAYES

最后,如果我们的模型中有两个以上的类别,会发生什么?我们必须至少进行n-1次计算。

要在Python上实现Naive Bayes分类器,我们必须通过sklearn.naive_bayes库和GaussianNB类的帮助创建我们的分类器,并使其适合我们的训练集。然后像往常一样,我们创建我们的混淆矩阵并可视化我们的训练集和测试集结果:

# Data Preprocessing

# Importing the Library

import numpy as np

import matplotlib.pyplot as plt

import pandas as pd

# Importing the dataset

dataset= pd.read_csv('Data.csv')

X = dataset.iloc[: , [2, 3]].values

Y = dataset.iloc[: , 4].values

# Feature Scaling

from sklearn.preprocessing import StandardScaler

sc_X = StandardScaler()

X_train = sc_X.fit_transform(X_train)

X_test = sc_X.transform(X_test)

# Fitting Classifier to the Training set

from sklearn.naive_bayes import GaussianNB

classifier = GaussianNB()

classifier.fit(X_train, y_train)

# Predicting the Test set results

y_pred = classifier.predict(X_test)

# Visualising the Training set results

from matplotlib.colors import ListedColormap

X_set, Y_set = X_train, y_train

X1, X2 = np.meshgrid(np.arrange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),

np.arrange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)

plt.contourf(X1, X2, classifier.predict(np.array([X1.rave(), X2.ravel()]).T).reshape(X1.shape),

alpha = 0.75, cmap = ListedColormap(('red', 'Green')))

plt.xlim(X1.min(), X1.max())

plt.ylim(X1.min(), X1.max())

for i, j in emunerate(np.unique(y_set)):

plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1]

c = ListedColormap(('red', 'green'))(i), label = j)

plt.title('Naive Bayes (Training set)')

plt.xlabel('Age')

plt.ylabel('Estimated Salary')

plt.legend()

plt.show()

# Visualising the Test set results

from matplotlib.colors import ListedColormap

X_set, Y_set = X_train, y_train

X1, X2 = np.meshgrid(np.arrange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),

np.arrange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)

plt.contourf(X1, X2, classifier.predict(np.array([X1.rave(), X2.ravel()]).T).reshape(X1.shape),

alpha = 0.75, cmap = ListedColormap(('red', 'Green')))

plt.xlim(X1.min(), X1.max())

plt.ylim(X1.min(), X1.max())

for i, j in emunerate(np.unique(y_set)):

plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1]

c = ListedColormap(('red', 'green'))(i), label = j)

plt.title('Naive Bayes (Test set)')

plt.xlabel('Age')

plt.ylabel('Estimated Salary')

plt.legend()

plt.show()

相关推荐