模型思想
该分类器的实现思想⾮常简单,即通过已知类别的训练数据集,计算样本的先验概率,然后利⽤⻉叶斯概率公式测算未知类别样本属于某个类别的后验概率,最终以最⼤后验概率所对应的类别作为样本的预测值。
先验概率
先验概率:指根据以往经验和分析得到的概率,如全概率公式,它往往作为"由因求果"问题中的"因"出现的概率。
后验概率
后验概率:是信息理论的基本概念之一。在一个通信系统中,在收到某个消息之后,接收端所了解到的该消息发送的概率称为后验概率。
后验概率的计算要以先验概率为基础。后验概率可以根据通过贝叶斯公式,用先验概率和似然函数计算出来。
高斯贝叶斯分类器
高斯贝叶斯分类器:适用于数据集的自变量X都是连续的数值型,通常会优先使用高斯贝叶斯分类器
多项式贝叶斯分类器
多项式贝叶斯分布器:适用于数据集的自变量X都是离散的数值型,通常会优先使用多项式贝叶斯分类器
伯努利贝叶斯分类器
伯努利贝叶斯分类器:适用于数据集中的自变量X都是0-1的二元值,通常会优先使用伯努利贝叶斯分类器
高斯贝叶斯分类器
# 读⼊数据
skin = pd.read_excel(r'C:\Users\Administrator\Desktop\Skin_Segment.xlsx')
# 样本拆分
X_train,X_test,y_train,y_test = model_selection.train_test_split(skin.iloc[:,:3], skin.y,
test_size = 0.25,
random_state=1234)
# 调⽤⾼斯朴素⻉叶斯分类器的“类”
gnb = naive_bayes.GaussianNB()
# 模型拟合
gnb.fit(X_train, y_train)
# 模型在测试数据集上的预测
gnb_pred = gnb.predict(X_test)
# 构建混淆矩阵
cm = pd.crosstab(gnb_pred,y_test)
# 绘制热力图
sns.heatmap(cm, annot = True, cmap = 'GnBu', fmt = 'd')
# 去除x轴和y轴标签
plt.xlabel('Real')
plt.ylabel('Predict')
# 显示图形
plt.show()
print('模型的准确率为:\n',metrics.accuracy_score(y_test,gnb_pred))
多项式贝叶斯分类器
# 读取数据
mushrooms = pd.read_csv(r'C:\Users\Administrator\Desktop\mushrooms.csv')
# 将字符型数据做因⼦化处理,将其转换为整数型数据
columns = mushrooms.columns[1:]
for column in columns:
mushrooms[column] = pd.factorize(mushrooms[column])[0]
# 将数据集拆分为训练集合测试集
Predictors = mushrooms.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(mushrooms[Predictors],
mushrooms['type'],
test_size = 0.25,
random_state = 10)
# 构建多项式⻉叶斯分类器的“类”
mnb = naive_bayes.MultinomialNB()
# 基于训练数据集的拟合
mnb.fit(X_train, y_train)
# 基于测试数据集的预测
mnb_pred = mnb.predict(X_test)
# 构建混淆矩阵
cm = pd.crosstab(mnb_pred,y_test)
# 绘制热力图
sns.heatmap(cm, annot = True, cmap = 'GnBu', fmt = 'd')
# 去除x轴和y轴标签
plt.xlabel('')
plt.ylabel('')
# 显示图形
plt.show()
# 模型的预测准确率
print('模型的准确率为:\n',metrics.accuracy_score(y_test, mnb_pred))
伯努利贝叶斯分类器
jieba模块
Python中针对中文进行字段的分解(需要自定义词库,停止词词库)
# 读⼊评论数据
evaluation = pd.read_excel(r'Contents.xlsx',sheetname=0)
# 运⽤正则表达式,将评论中的数字和英⽂去除
evaluation.Content = evaluation.Content.str.replace('[0-9a-zA-Z]','')
# 加载⾃定义词库
jieba.load_userdict(r'all_words.txt')
# 读⼊停⽌词
with open(r'mystopwords.txt', encoding='UTF-8') as words:
stop_words = [i.strip() for i in words.readlines()]
# 构造切词的⾃定义函数,并在切词过程中删除停⽌词
def cut_word(sentence):
words = [i for i in jieba.lcut(sentence) if i not in stop_words]
# 切完的词⽤空格隔开
result = ' '.join(words)
return(result)
# 调⽤⾃定义函数,并对评论内容进⾏批量切词
words = evaluation.Content.apply(cut_word)
# 计算每个词在各评论内容中的次数,并将稀疏度为99%以上的词删除
counts = CountVectorizer(min_df = 0.01)
# ⽂档词条矩阵
dtm_counts = counts.fit_transform(words).toarray()
# 矩阵的列名称
columns = counts.get_feature_names()
# 将矩阵转换为数据框,即X变量
X = pd.DataFrame(dtm_counts, columns=columns)
# 情感标签变量
y = evaluation.Type
# 将数据集拆分为训练集和测试集
X_train,X_test,y_train,y_test = model_selection.train_test_split(X,y,test_size = 0.25,random_state=1)
# 构建伯努利⻉叶斯分类器
bnb = naive_bayes.BernoulliNB()
# 模型在训练数据集上的拟合
bnb.fit(X_train,y_train)
# 模型在测试数据集上的预测
bnb_pred = bnb.predict(X_test)
# 构建混淆矩阵
cm = pd.crosstab(bnb_pred,y_test)
# 绘制混淆矩阵图
sns.heatmap(cm, annot = True, cmap = 'GnBu', fmt = 'd')
# 去除x轴和y轴标签
plt.xlabel('Real')
plt.ylabel('Predict')
# 显示图形
plt.show()