在机器学习领域,朴素贝叶斯分类器因其简单性和效率而广受欢迎。它适用于处理大量数据,并且在诸如垃圾邮件过滤、文本分类、情感分析和推荐系统中表现出色。本文将介绍朴素贝叶斯算法的基本概念,并展示如何在Python中使用Sklearn库实现高斯朴素贝叶斯分类器。
朴素贝叶斯是一种基于贝叶斯定理的概率分类模型。贝叶斯定理提供了在已知另一个事件B已经发生的情况下,事件A发生的条件概率。其数学公式如下:
P(A|B) = P(B|A) * P(A) / P(B)
其中,A和B是两个事件,P(A|B)是在事件B已经发生的情况下事件A发生的概率,P(B|A)是在事件A已经发生的情况下事件B发生的概率,P(A)和P(B)分别是事件A和B的独立概率。
基于贝叶斯定理,可以构建如下分类模型:
P(y|X) = P(X|y) * P(y) / P(X)
其中,X是一系列独立的预测变量,y是类别标签,P(y|X)是在预测变量X给定的情况下标签y的概率。
朴素贝叶斯分类器的一个特点是假设预测变量对输出类别的贡献是相等且独立的,尽管这一假设在现实世界中往往不成立,但在大多数情况下仍能得到满意的结果。
朴素贝叶斯分类器主要分为以下三种:
将通过一个癌症数据集的例子,展示如何在Python中使用Sklearn库实现高斯朴素贝叶斯分类器。以下是实现步骤:
首先,需要加载一些基本库来导入和查看数据集。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
接下来,将导入用于朴素贝叶斯分类的数据集。
dataset = pd.read_csv("datasets/cancer.csv")
使用head()方法快速查看数据集的前几行。
print(dataset.head())
然后,使用info()方法分析数据集中包含的列。
dataset.info()
将通过查看恶性肿瘤和良性肿瘤的平均半径和纹理来分析它们。
plt.title("Malignant vs Benign Tumor")
plt.xlabel("Radius Mean")
plt.ylabel("Texture Mean")
plt.scatter(M.radius_mean, M.texture_mean, color = "red", label = "Malignant", alpha = 0.3)
plt.scatter(B.radius_mean, B.texture_mean, color = "lime", label = "Benign", alpha = 0.3)
plt.legend()
plt.show()
将恶性肿瘤分配值为‘1’,良性肿瘤分配值为‘0’。
dataset.diagnosis = [1 if i == "M" else 0 for i in dataset.diagnosis]
将数据集分为x和y两部分,x包含所有独立的预测因子,而y提供诊断预测。
x = dataset.drop(["diagnosis"], axis = 1)
y = dataset.diagnosis.values
为了最大化模型的效率,通常建议将数据标准化到一个共同的尺度。
x = (x - np.min(x)) / (np.max(x) - np.min(x))
使用sklearn包中的train_test_split模块将数据集分割为训练和测试部分。
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 42)
导入并实例化Sklearn GaussianNB中的高斯朴素贝叶斯模块,并将x_train和y_train传递给模型以拟合。
from sklearn.naive_bayes import GaussianNB
nb = GaussianNB()
nb.fit(x_train, y_train)
以下准确度得分反映了Sklearn高斯朴素贝叶斯模型在测试数据上预测癌症的成功程度。
print("Naive Bayes score: ", nb.score(x_test, y_test))
Q1. 如何在Python中使用sklearn库实现朴素贝叶斯分类器?
A. 在Python中使用scikit-learn(sklearn)实现朴素贝叶斯分类器,请按照以下步骤操作:
1. 导入必要的库:
from sklearn.naive_bayes import GaussianNB
2. 创建朴素贝叶斯分类器的实例:
classifier = GaussianNB()
3. 将分类器拟合到训练数据:
classifier.fit(X_train, y_train)
4. 预测测试数据的目标值:
y_pred = classifier.predict(X_test)
5. 评估分类器的性能:
accuracy = classifier.score(X_test, y_test)
Q2. 朴素贝叶斯是懒惰分类器吗? A. 不,朴素贝叶斯不被认为是懒惰分类器。“懒惰分类器”通常指的是那些将学习过程推迟到预测时的算法。这些算法存储训练实例,并在预测阶段直接使用它们。相比之下,朴素贝叶斯是一个积极或“生成性”分类器的例子。它在训练阶段基于训练数据学习一个概率模型,然后这个模型被用来在不需要原始训练数据的情况下对新的、未见过的实例进行预测。