一、贝叶斯分类
1、贝叶斯分类
贝叶斯分类属于有监督学习算法,基于贝叶斯公式。
2、适用场景
不能被线性分离,但是具有明显的概率分布。
二、贝叶斯分类要素
1、数据
贝叶斯分类的数据即一系列自变量以及对应的因变量(分类标签)。
2、模型
- 贝叶斯公式
其中, x为自变量,为第i个类别,为x发生后属于的后验概率,为属于的先验概率,为x在中的概率,为x发生的概率。
- 模型
根据最大后验估计(MAP):
,
由于 为常量,所以:
.
对于n维自变量:
,
,
根据朴素贝叶斯独立假设,假设所有自变量条件独立,则有:
,
所以朴素贝叶斯模型为:
.
当类别中存在自变量的数量为零的属性值时,则会出现零数问题,即:
,
,
因此,通常使用拉普拉斯平滑(Laplace Smoothing),给每个属性值增加一个数量:
其中, 为类别中自变量值为 k 时的数据数量,x为自变量中所有的可能值情况。
3、 朴素贝叶斯算法
- 训练阶段
- 外层循环:对于每一个类别,计算
- 内层循环:对于中每一个属性的每一个属性值,计算
- 测试阶段
三、朴素贝叶斯分类实践(sklearn)
以kaggle中数据集"Ionosphere"为例
1、数据准备
直接下载使用"Ionosphere"数据集,并读取数据
import pandas as pd
dataset = pd.read_csv('./ionosphere_data.csv') # 读取数据集ionosphere_data.csv
独热编码,相较于序数编码,可以消除数值关系,降低噪声
import category_encoders as ce
encoder = ce.OneHotEncoder(cols=['column_a', 'column_b'], use_cat_names=True).fit(
dataset) # 对column_a和column_b两列进行独热编码
encoder_dataset = encoder.transform(dataset)
离散化连续变量
# 对数据集中第2到第33列离散化,将每列的数值分成10个区间,并用0到9的标签替换
for i in range(2, 34):
col = dataset.columns[i]
encoder_dataset[col] = pd.cut(dataset[col], bins=10, labels=range(0, 10))
2、训练模型
Hold-out,划分训练集和测试集
from sklearn.model_selection import train_test_split
X = encoder_dataset.drop(['column_ai'], axis=1) # 删除column_ai,作为特征X
y = encoder_dataset['column_ai'] # 将column_ai作为目标y
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33,
random_state=11) # 将数据集按照33%的比例划分为训练集和测试集,设置随机种子为11
训练一个分类朴素贝叶斯分类器,强制使用拉普拉斯平滑
from sklearn.naive_bayes import CategoricalNB
CNB = CategoricalNB(force_alpha=True) # 创建一个CategoricalNB对象,指定强制使用拉普拉斯平滑
CNB.fit(X_train, y_train) # 使用训练集拟合分类器
3、评估模型
输出分类器分别在训练集和测试集上的准确率
print("Score of train-set : {:.4f}".format(CNB.score(X_train, y_train))) # 打印分类器在训练集上的准确率
print("Score of test-set : {:.4f}".format(CNB.score(X_test, y_test))) # 打印分类器在测试集上的准确率
结果如下:
Score of train-set : 0.9191
Score of test-set : 0.9310