类别朴素贝叶斯CategoricalNB和西瓜数据集

1 CategoricalNB原理以及用法

(1)具体原理
具体原理可看:贝叶斯分类器原理
sklearn之CategoricalNB对条件概率的原理如下:
P ( x i = k ∣ y ) = N y , k + α N y + α n i P(x_i = k | y) = \frac{N_{y,k} + \alpha}{N_y + \alpha n_i} P(xi=ky)=Ny+αniNy,k+α
其中:

  • N y , k N_{y,k} Ny,k是在类别y下特征 x i x_i xi取值为k的样本数。
  • N y N_y Ny 是类别y下的总样本数。
  • α \alpha α是平滑参数,用来避免零概率,如果我们将 α \alpha α设置为1,则这个平滑叫做拉普拉斯平滑,如果 α \alpha α小于1,则我们把它叫做利德斯通平滑。
  • n i n_i ni是特征 x i x_i xi的可能取值的数量。

(2)CategoricalNB用法
之后会有详细例子,现在先看用法

class sklearn.naive_bayes.CategoricalNB(*, alpha=1.0, fit_prior=True, class_prior=None)

参数说明:

参数
说明
alpha float, default=1.0
附加的平滑参数(Laplace/Lidstone),0是不平滑
fit_prior bool, default=True
是否学习类别先验概率。若为False,将使用统一的先验(概率相等)
class_prior array-like of shape (n_classes,), default=None
类别的先验概率。一经指定先验概率不能随着数据而调整。

属性说明:

属性
说明
category_count_ list of arrays of shape (n_features,)
为每个要素保存形状的数组(n_classes,各个要素的n_categories)。每个数组为每个类别和分类的特定特征提供遇到的样本数量。
class_count_ ndarray of shape (n_classes,)
拟合期间每个类别遇到的样本数。此值由提供的样本权重加权。
class_log_prior_ ndarray of shape (n_classes,)
每个类别的对数先验概率(平滑)。
classes_ ndarray of shape (n_classes,)
分类器已知的类别标签
feature_log_prob_ list of arrays of shape (n_features,)
为每个特征保形状的数组(n_classes,各个要素的n_categories)。每个数组提供了给定各自特征和类别的分类的经验对数概率log(p(xi|y))
n_features_ int
每个样本的特征数量。

方法说明:

方法
说明
fit(X, y[, sample_weight]) 根据X,y拟合朴素贝叶斯分类器。
get_params([deep]) 获取这个估计器的参数
partial_fit(X, y[, classes, sample_weight]) 对一批样本进行增量拟合。
predict(X) 对测试向量X进行分类
predict_log_proba(X) 返回针对测试向量X的对数概率估计
predict_proba(X) 返回针对测试向量X的概率估计
score(X, y[, sample_weight]) 返回给定测试数据和标签上的平均准确率
set_params(**params) 为这个估计器设置参数

对于X矩阵和y矩阵的要求如下:

参数
说明
X {array-like, sparse matrix} of shape (n_samples, n_features)
样本的特征矩阵,其中n_samples是样本数量,n_features是特征数量。在此,假设X的每个特征都来自不同的分类分布。进一步假设每个特征的所有类别均由数字0,…,n-1表示,其中n表示给定特征的类别总数。例如,这可以在顺序编码(OrdinalEncoder)的帮助下实现。
y array-like of shape (n_samples,)
每个样本所属的标签类别

2 数据集

2.1 西瓜数据集

要对下述的数据集转换成特征矩阵X和标签类别y,则需要认识两种编码

色泽 根蒂 敲击 纹理 脐部 触感 好坏
青绿 蜷缩 浊响 清晰 凹陷 硬滑 好瓜
乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 好瓜
乌黑 蜷缩 浊响 清晰 凹陷 硬滑 好瓜
青绿 蜷缩 沉闷 清晰 凹陷 硬滑 好瓜
浅白 蜷缩 浊响 清晰 凹陷 硬滑 好瓜
青绿 稍蜷 浊响 清晰 稍凹 软粘 好瓜
乌黑 稍蜷 浊响 稍糊 稍凹 软粘 好瓜
乌黑 稍蜷 浊响 清晰 稍凹 硬滑 好瓜
乌黑 稍蜷 沉闷 稍糊 稍凹 硬滑 坏瓜
青绿 硬挺 清脆 清晰 平坦 软粘 坏瓜
浅白 硬挺 清脆 模糊 平坦 硬滑 坏瓜
浅白 蜷缩 浊响 模糊 平坦 软粘 坏瓜
青绿 稍蜷 浊响 稍糊 凹陷 硬滑 坏瓜
浅白 稍蜷 沉闷 稍糊 凹陷 硬滑 坏瓜
乌黑 稍蜷 浊响 清晰 稍凹 软粘 坏瓜
浅白 蜷缩 浊响 模糊 平坦 硬滑 坏瓜
青绿 蜷缩 沉闷 稍糊 稍凹 硬滑 坏瓜

2.2 LabelEncoder

class sklearn.preprocessing.LabelEncoder
  • 对目标标签进行编码,其值介于0和n_classes-1之间。
  • 该转换器应用于编码目标值,即y,而不是输入X。

常用方法:

方法
说明
fit(self, y) 适合标签编码器
fit_transform(self, y) 适合标签编码器并返回编码的标签
get_params(self[, deep]) 获取此估计量的参数
inverse_transform(self, y) 将标签转换回原始编码
set_params(self, **params) 设置此估算器的参数
transform(self, y) 将标签转换为标准化的编码

对于y矩阵的要求如下:

参数
说明
y array-like of shape (n_samples,)
每个样本所属的标签类别

2.3 OrdinalEncoder

class sklearn.preprocessing.OrdinalEncoder(*, categories='auto', dtype=<class 'numpy.float64'>)
  • 将分类特征编码为整数数组。
  • 该转换器的输入应为整数或字符串之类的数组,表示分类(离散)特征所采用的值。要素将转换为序数整数。这将导致每个要素的一列整数(0到n_categories-1)。

参数说明如下:

参数
说明
categories ‘auto’ or a list of array-like, default=’auto’
适合标签编码器每个功能的类别(唯一值):
‘auto’:根据训练数据自动确定类别。
list:category [i]保存第i列中预期的类别。传递的类别不应将字符串和数字值混合使用,并且在使用数字值时应进行排序
使用的类别可以在category_属性中找到。
dtype number type, default np.float64
所需的输出dtype

常用方法有:

方法
说明
fit(X[, y]) 使OrdinalEncoder拟合X
get_params([deep]) 获取此估计量的参数
inverse_transform(X) 将数据转换回原始表示形式
set_params(**params) 设置此估算器的参数
transform(X) 将X转换为序数代码

对X矩阵的要求如下:

参数
说明
X array-like, shape [n_samples, n_features]

3 代码实现

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, OrdinalEncoder
from sklearn.naive_bayes import CategoricalNB

# 第一步:创建数据集
data = {
    '色泽': ['青绿', '乌黑', '乌黑', '青绿', '浅白', '青绿', '乌黑', '乌黑', '乌黑', '青绿', '浅白', '浅白', '青绿', '浅白', '乌黑', '浅白', '青绿'],
    '根蒂': ['蜷缩', '蜷缩', '蜷缩', '蜷缩', '蜷缩', '稍蜷', '稍蜷', '稍蜷', '稍蜷', '硬挺', '硬挺', '蜷缩', '稍蜷', '稍蜷', '稍蜷', '蜷缩', '蜷缩'],
    '敲击': ['浊响', '沉闷', '浊响', '沉闷', '浊响', '浊响', '浊响', '浊响', '沉闷', '清脆', '清脆', '浊响', '浊响', '沉闷', '浊响', '浊响', '沉闷'],
    '纹理': ['清晰', '清晰', '清晰', '清晰', '清晰', '清晰', '稍糊', '清晰', '稍糊', '清晰', '模糊', '模糊', '稍糊', '稍糊', '清晰', '模糊', '稍糊'],
    '脐部': ['凹陷', '凹陷', '凹陷', '凹陷', '凹陷', '稍凹', '稍凹', '稍凹', '稍凹', '平坦', '平坦', '平坦', '凹陷', '凹陷', '稍凹', '平坦', '稍凹'],
    '触感': ['硬滑', '硬滑', '硬滑', '硬滑', '硬滑', '软粘', '软粘', '硬滑', '硬滑', '软粘', '硬滑', '软粘', '硬滑', '硬滑', '软粘', '硬滑', '硬滑'],
    '好坏': ['好瓜', '好瓜', '好瓜', '好瓜', '好瓜', '好瓜', '好瓜', '好瓜', '坏瓜', '坏瓜', '坏瓜', '坏瓜', '坏瓜', '坏瓜', '坏瓜', '坏瓜', '坏瓜']
}

df = pd.DataFrame(data)

# 第二步:编码

# 标签编码
label_encoder = LabelEncoder()
df['好坏'] = label_encoder.fit_transform(df['好坏'])

# 对分类特征进行Ordinal编码
ordinal_encoder = OrdinalEncoder()
categorical_features = df.columns[:-1]  # 除最后一列“好坏”之外的所有列
df[categorical_features] = ordinal_encoder.fit_transform(df[categorical_features])

# 确定特征X和标签y
X = df.drop('好坏', axis=1)
y = df['好坏']


# 第三步:划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 第四步:训练模型
model = CategoricalNB()
model.fit(X_train, y_train)

# 输出预测概率
probabilities = model.predict_proba(X_test)
print("Probabilities:\n", probabilities)
print('精确度:', model.score(X_test, y_test))

首先看一下X矩阵和y矩阵,如图所示:
X矩阵
X矩阵
y矩阵
y矩阵
代码准确率结果如下:
准确率

相关推荐

  1. AI -朴素

    2024-06-16 01:30:02       20 阅读
  2. NLP--朴素

    2024-06-16 01:30:02       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-16 01:30:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-16 01:30:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-16 01:30:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-16 01:30:02       20 阅读

热门阅读

  1. 深度学习中的卷积算子优化与GPU加速

    2024-06-16 01:30:02       5 阅读
  2. Rust 基金会的商标政策更新引发社区争议

    2024-06-16 01:30:02       8 阅读
  3. 多维数组切片

    2024-06-16 01:30:02       6 阅读
  4. Web前端开发UL:探索与解构列表的奥秘

    2024-06-16 01:30:02       7 阅读
  5. Vue Router 快速入门教程

    2024-06-16 01:30:02       7 阅读
  6. 带你学习Mybatis之ParameterHandler参数处理

    2024-06-16 01:30:02       7 阅读
  7. spring

    2024-06-16 01:30:02       6 阅读
  8. git报错:ownership 冲突

    2024-06-16 01:30:02       9 阅读