Python----机器学习(基于贝叶斯的糖尿病分类)

        贝叶斯方法是一种统计推断的 方法,它利用贝叶斯定理来更新我们对事件概率的信念。这种方法在机器学习和数据 分析中得到广泛应用,特别是在分类和概率估计问题上。

一、数据集介绍

        使用的数据集是早期糖尿病预测数据集Early Stage Diabetes Risk Prediction - UCI Machine Learning Repository,包括16个特征和一个目标。

数据集地址:

        早期糖尿病风险预测 - UCI Machine Learning Repository

变量名称角色类型中文描述单位缺失值
AgeFeatureInteger年龄no
GenderFeatureCategorical性别no
PolyuriaFeatureBinary多尿no
PolydipsiaFeatureBinary多饮no
weight lossFeatureBinary体重骤降no
weaknessFeatureBinary乏力no
PolyphagiaTargetBinary多食no
Genital thrushFeatureBinary生殖器念珠菌感染no
visual_blurringFeatureBinary视力模糊no
itchingFeatureBinary瘙痒no
irritabilityFeatureBinary易怒no
delayed healingFeatureBinary伤口愈合延迟no
partial paresisFeatureBinary部分瘫痪no
muscleFeatureBinary肌肉僵硬no
stiffnessFeatureBinary脱发no
ObesityFeatureBinary肥胖no
classTargetBinary类别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()  # 显示图表  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值