机器学习:Python实现NAIVE BAYES
在机器学习中,朴素贝叶斯分类器是一组简单的“概率分类器”,基于贝叶斯定理,特征之间有很强的(naive)独立性假设。
朴素贝叶斯分类器是高度可扩展的,在一个学习问题中,要求在变量(特性/预测器)的数量中有许多线性的参数。最大似然训练可以通过评估一个封闭的表达式来完成,它需要线性时间,而不是像许多其他类型的分类器那样使用昂贵的迭代逼近。
在统计学和计算机科学文献中,朴素贝叶斯模型以各种名称而闻名,包括简单贝叶斯和独立贝叶斯。所有这些名称都引用了贝叶斯定理在分类器决策规则中的使用,但朴素贝叶斯并不是贝叶斯方法。
举一个实际的例子,我们考虑一个生产扳手的工厂。假设我们正在为工厂做一些分析,每天通过2台机器生产一定数量的扳手,并且在一天结束时我们有很多扳手,我们必须检测有缺陷的扳手。
机器2生产故障扳手的概率是多少?要回答这个问题,我们将在这里使用的规则称为贝叶斯定理:
我们知道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机械装置的概率是多少?
如果我们应用贝叶斯定理并使用这些数字,我们将得到:
现在让我们看另一个例子,假设我们生产1000个扳手,因此我们知道400来自m2,1%是有缺陷的。在1000把扳手中,我们有10件有缺陷的零件,其中50%来自m2。
机器2有缺陷的零件百分比是多少?好吧它的5/400 = 0.0125!
这给了我们与第一个例子相同的结果。但为什么我们不能马上做这个操作呢?答案可能是多重的,但潜在的假设是计算所有扳手的操作可能太耗时。
现在我们如何将这个特定应用于机器学习?
这里我们把数据点分为两类:红色和绿色。我们可以假设红色的点是人们走路去上班,绿色的点是开车去上班。
发生了什么事情我们添加了一个新的obervation,我们如何对它进行分类?
在这种情况下,我们将使用贝叶斯定理,并将其应用于两个类别并计算相应的概率并比较2个值。显然,我们会将点数分配给概率最高的类别。
我们可以通过考虑步行的人是x的可能性来计算这些值并计算后验概率。然后我们迭代开车的过程:
然后我们比较2个值:
第一步是计算P(Walks),由公式给出:
在第2步中,我们计算P(X),它是一个固定值,取决于我们考虑的样本范围:
在第3步中,我们计算P(X | Walks),它只考虑那些步行上班P(X)的人:
最后我们得到P(Walks | X):
然后我们可以为开车上班类别迭代相同的过程:
为什么我们把这个算法叫做朴素算法???因为贝叶斯模型需要一些独立的假设,而这些假设通常是不正确的!!P(X)总是一样的我们可以把它从公式中删除如果我们想比较两个值
最后,如果我们的模型中有两个以上的类别,会发生什么?我们必须至少进行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()