贝叶斯方法是一种统计推断的 方法,它利用贝叶斯定理来更新我们对事件概率的信念。这种方法在机器学习和数据 分析中得到广泛应用,特别是在分类和概率估计问题上。
一、数据集介绍
使用的数据集是早期糖尿病预测数据集Early Stage Diabetes Risk Prediction - UCI Machine Learning Repository,包括16个特征和一个目标。
数据集地址:
变量名称 | 角色 | 类型 | 中文 | 描述 | 单位 | 缺失值 |
---|---|---|---|---|---|---|
Age | Feature | Integer | 年龄 | no | ||
Gender | Feature | Categorical | 性别 | no | ||
Polyuria | Feature | Binary | 多尿 | no | ||
Polydipsia | Feature | Binary | 多饮 | no | ||
weight loss | Feature | Binary | 体重骤降 | no | ||
weakness | Feature | Binary | 乏力 | no | ||
Polyphagia | Target | Binary | 多食 | no | ||
Genital thrush | Feature | Binary | 生殖器念珠菌感染 | no | ||
visual_blurring | Feature | Binary | 视力模糊 | no | ||
itching | Feature | Binary | 瘙痒 | no | ||
irritability | Feature | Binary | 易怒 | no | ||
delayed healing | Feature | Binary | 伤口愈合延迟 | no | ||
partial paresis | Feature | Binary | 部分瘫痪 | no | ||
muscle | Feature | Binary | 肌肉僵硬 | no | ||
stiffness | Feature | Binary | 脱发 | no | ||
Obesity | Feature | Binary | 肥胖 | no | ||
class | Target | Binary | 类别 | no |
二、设计思路
2.1、读取数据集
import pandas as pd
df=pd.read_csv('diabetes_data_upload.csv')
df.head()
2.2、划分特征
X=df.drop(columns='class')
y=df['class']
2.3、独热编码
在数据集中好多都为为分类变量,使用one-hot编码处理
categorical_features = X.keys()
X = pd.get_dummies(X, columns=categorical_features)
2.4、划分数据集和训练集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=0.5,random_state=42)
2.5、标准化
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
X_train_scaler=scaler.fit_transform(X_train)
X_test_scaler=scaler.transform(X_test)
2.6、模型的构建,训练,预测
from sklearn.naive_bayes import GaussianNB
gb=GaussianNB()
gb.fit(X_train,y_train)
y_pred=gb.predict(X_test)
2.7、模型评估
对模型的性能进行评估。我们使用测试集进行预测,并计算准 确率、混淆矩阵和分类报告等指标来了解模型的表现。
准确度 (Accuracy):准确度是正确预测的样本数与总样本数之比。
混淆矩阵(Classification Report): 混淆矩阵显示了模型的分类情况。对角线上的元素表示正确分类的样本数,而非对角 线上的元素表示错误分类的样本数。例如,29个类别一被正确分类,而5个类别二被 错误分类成类别三。
分类报告 (Classification Report):
分类报告提供了更详细的性能指标,包括精度(precision)、召回率(recall)、F1分数 (f1-score)等。
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report
# 准确率:计算分类模型的准确率,也可以计算准确个数
accuracy = accuracy_score(y_test, y_pred)
# 混淆矩阵:可以直观的展示分类模型在各个类别上的预测情况。
# 返回一个二维数组(也就是混淆矩阵),矩阵的行表示真实类别,矩阵的列表示预测类别
conf_matrix = confusion_matrix(y_test, y_pred)
# 真反例:实际类别是反例,模型预测也是反例。
# 精准率:指该类别被正确预测的样本数(真正例)与所有被预测为该类别的样本数(假正例)。 真正例/(真正例+假正例)
# 召回率:指该类别被正确预测的样本数(真正例)与所有实际属于该类别的样本数(假反例)。 真正例(真正例+假反例)
# f1值:精准率与召回率的调和平均数 : 2 * pre * recall / (pre + recall)
# 支持度:指每个类别在真实标签中出现的样本数量
# 宏平均:对各个类别指标(pre、recall、f1)的简单平均
# 加权平均:根据每个类别的支持度对每个类别指标进行加权平均
class_report = classification_report(y_test, y_pred)
print(f'Accuracy: {accuracy}')
print(f'Confusion Matrix: \n{conf_matrix}')
print(f'Classfication Report: \n{class_report}')
2.8、可视化
使用t-SNE对SVM模型的决策函数结果进行降维,创建散点图进行可视 化,以便更直观地理解模型在二维空间中的预测结果。
from matplotlib import pyplot as plt
from sklearn.manifold import TSNE
from sklearn.preprocessing import LabelEncoder
# 数据可视化,降维 使用t-sne算法进行降维操作,将特征讲到2维,方便可视化
tsne = TSNE(n_components=2)
x_tsne = tsne.fit_transform(X_test_scaler)
# 将字符串标签转换为数值标签,方便画图
label_encoder = LabelEncoder()
y_test_numeric = label_encoder.fit_transform(y_pred)
# 绘制图像
plt.figure(figsize=(8, 6))
scatter = plt.scatter(x_tsne[:, 0], x_tsne[:, 1], c=y_test_numeric, cmap='viridis')
plt.title('t-SNE Visualization of naive_bayes Predictions')
plt.legend(*scatter.legend_elements(), title='Classes')
plt.show()
三、完整代码
import pandas as pd
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.manifold import TSNE
from sklearn.preprocessing import LabelEncoder
# 从CSV文件中加载糖尿病数据集
df = pd.read_csv('diabetes_data_upload.csv')
print(df.head()) # 显示数据集的前几行以便检查
# 划分特征(X)和标签(y)
X = df.drop(columns='class') # 特征:除了'class'以外的所有列
y = df['class'] # 标签:'class'列
# 获取特征的名称(类别特征)
categorical_features = X.keys()
# 将类别特征转换为独热编码(one-hot encoding)
X = pd.get_dummies(X, columns=categorical_features)
# 将数据集分为训练集和测试集,训练集占50%
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.5, random_state=42)
# 对特征进行标准化,去除均值并缩放到单位方差
scaler = StandardScaler()
X_train_scaler = scaler.fit_transform(X_train) # 拟合并转换训练数据
X_test_scaler = scaler.transform(X_test) # 转换测试数据
# 初始化并训练高斯朴素贝叶斯分类器
gb = GaussianNB()
gb.fit(X_train, y_train) # 用训练数据拟合模型
y_pred = gb.predict(X_test) # 对测试集进行预测
# 准确率:计算分类模型的准确率,也可以计算准确个数
accuracy = accuracy_score(y_test, y_pred) # 计算模型准确率
# 混淆矩阵:可以直观展示分类模型在各个类别的预测情况。
# 返回一个二维数组(也就是混淆矩阵),矩阵的行表示真实类别,矩阵的列表示预测类别
conf_matrix = confusion_matrix(y_test, y_pred) # 计算混淆矩阵
# 真反例:实际类别是反例,模型预测也是反例。
# 精准率:指该类别被正确预测的样本数(真正例)与所有被预测为该类别的样本数(假正例)。 真正例/(真正例+假正例)
# 召回率:指该类别被正确预测的样本数(真正例)与所有实际属于该类别的样本数(假反例)。 真正例(真正例+假反例)
# f1值:精准率与召回率的调和平均数 : 2 * pre * recall / (pre + recall)
# 支持度:每个类别在真实标签中出现的样本数量
# 宏平均:对各个类别指标(pre、recall、f1)的简单平均
# 加权平均:根据每个类别的支持度对每个类别指标进行加权平均
class_report = classification_report(y_test, y_pred) # 生成分类报告
# 打印模型的准确率
print(f'Accuracy: {accuracy}')
# 打印混淆矩阵
print(f'Confusion Matrix: \n{conf_matrix}')
# 打印分类报告
print(f'Classification Report: \n{class_report}')
# 数据可视化,降维,使用t-SNE算法进行降维处理,将特征转为二维,方便可视化
tsne = TSNE(n_components=2) # 初始化t-SNE,用于2D可视化
x_tsne = tsne.fit_transform(X_test_scaler) # 拟合并转换测试集
# 将字符串标签转换为数值标签,方便绘图
label_encoder = LabelEncoder()
y_test_numeric = label_encoder.fit_transform(y_pred) # 将预测标签转换为数值型以便绘图
# 绘制图像
plt.figure(figsize=(8, 6)) # 创建绘图的画布
scatter = plt.scatter(x_tsne[:, 0], x_tsne[:, 1], c=y_test_numeric, cmap='viridis') # 绘制t-SNE结果的散点图
plt.title('t-SNE可视化朴素贝叶斯预测结果') # 设置图表标题
plt.legend(*scatter.legend_elements(), title='类别') # 添加类别图例
plt.show() # 显示图表