机器学习 构建朴素贝叶斯分类器 大气质量环境分类

机器学习建立分类模型

高斯朴素贝叶斯模型

大气环境质量等级的分类与预测

导入所需要的第三方库:

import pandas as pd
from sklearn.preprocessing import LabelEncoder#数据编码工具
from sklearn.model_selection import train_test_split#对数据集进行划分
from sklearn.naive_bayes import GaussianNB#调用高斯朴素贝叶斯模型
from sklearn.metrics import confusion_matrix#生成混淆矩阵对模型进行评估
from sklearn.model_selection import GridSearchCV#对模型进行调参
from sklearn.metrics import accuracy_score#accuracy_score()对模型准确率进行评价
from sklearn.decomposition import PCA#数据降维工具
import matplotlib.pyplot as plt
import seaborn as sns#画图工具

1、获取数据集,此处为Excel文件

该数据集包含某地区2019年每一日的AQI、质量等级、PM2.5、PM10、SO2、CO、NO2、O3_8h等指标数据。

df = pd.read_excel('./data.xlsx')

2、数据预处理

缺失值填充:

from sklearn.impute import SimpleImputer#数据预处理工具
# 对数值型特征进行均值填充:
num_features = ['AQI', 'PM2.5', 'PM10', 'SO2', 'CO', 'NO2', 'O3_8h']#定义了数值型特征的列表。
imputer = SimpleImputer(strategy='mean')#创建了一个用于填充空值的SimpleImputer对象,策略为使用特征的均值进行填充。
df[num_features] = imputer.fit_transform(df[num_features])#对data中的数值型特征进行均值填充操作。
# 对分类型特征进行众数填充(如果有的话):
cat_features = ['质量等级']#定义了分类型特征的列表。
cat_imputer = SimpleImputer(strategy='most_frequent')#创建了一个用于填充空值的SimpleImputer对象,策略为使用特征的众数进行填充。
df[cat_features] = cat_imputer.fit_transform(df[cat_features])#对data中的分类型特征进行众数填充操作。

进行数据编码,当模型特征变量中存在类别变量时,大多情况下都需要进行编码转换

'''将数据集中质量等级进行分类。转换为0-n-1的数(n为编码标签的个数)'''
encoder = LabelEncoder()
# 将质量等级编码[0、1、2、3、4]分别对应['中度污染' '优' '良' '轻度污染' '重度污染']
df['质量等级'] = encoder.fit_transform(df['质量等级'])

3、将数据集以8:2的比例分为训练集和测试集,首先将数据集的’日期’,'质量等级’两列删除后作为样本的特征集赋值给x_data,将编码后的分类赋值给y_data。

'''将数据集以8;2的比例分为训练集和测试集,将各空气质量指标赋值到变量x中,将转换后的质量等级赋值到变量y中'''
x_data = df.drop(['日期','质量等级'],axis=1)#删除['日期','质量等级']所在的整列赋值给x_data
y_data = df['质量等级']#将转换后的质量等级赋值到变量y_data中
x_train,x_test,y_train,y_test = train_test_split(x_data,y_data,#前两个参数表示样本的特征集以及分类
                                                 test_size=0.2,#表示测试集占比30%
                                                 random_state=40,#用于控制每次运行的数据划分结果
                                                 stratify=y_data)#保证数据集划分后样本分布的一致性

4、模型的训练

gnb_clf = GaussianNB()
gnb_clf.fit(x_train,y_train)

5、数据分类的可视化

PCA(Principal Component Analysis,主成分分析)是一种常用的数据降维技术,通过线性变换将原始数据投影到新的坐标系中,得到一组新的正交特征向量(主成分),其中第一个主成分包含最大方差,第二个主成分包含第二大方差,依此类推。

在下述代码中,我们使用PCA将原始数据集中的特征降维到二维空间,得到了两个主成分(Principal Component 1 和 Principal Component 2)。这两个主成分是原始特征经过PCA变换后得到的新的特征,具有以下含义:

主成分捕获了原始数据中最大的方差,并且在新的坐标系中表示数据的最大变化方向。
Principal Component 1 是沿着数据变化最明显的方向,它带有最多的信息。
Principal Component 2 是与Principal Component 1 正交的方向,它带有数据中第二大的方差。
通过将数据投影到这两个主成分上,我们可以在二维空间中展示数据的分布情况,从而更直观地理解数据的结构和特征之间的关系。在分类任务中,使用PCA降维可以帮助减少特征的维度,同时保留数据集中最重要的信息,有助于可视化数据、减少计算复杂度并提高分类器的性能

# 使用主成分分析(PCA)进行数据降维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(x_data)

# 可视化结果展示:
plt.figure(figsize=(8, 6))
for i in range(5):  # 有5个类别
    plt.scatter(X_pca[y_data == i, 0], X_pca[y_data == i, 1], label=f'Class {i}')
plt.legend()
plt.title('Naive Bayes Classification Results')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()

在这里插入图片描述

6、对模型进行预测,输出模型的准确率

# 使用训练好的模型进行预测
y_pred = gnb_clf.predict(x_test)

# 输出模型的准确率
print("准确率:%f"%(accuracy_score(y_test,y_pred)))
#准确率:0.918919

7、对模型的预测结果进行可视化

使用 scikit-learn 中的 confusion_matrix 函数生成混淆矩阵,该混淆矩阵将真实标签 y_test 与预测标签 y_pred 进行比较。

最后,使用 seaborn 库中的 heatmap 函数将混淆矩阵可视化出来,其中 annot=True 表示在每个格子上显示数字,fmt=“d” 表示数字以整数形式显示,cmap=“Blues” 表示使用蓝色调色板。

# 生成混淆矩阵
conf_matrix = confusion_matrix(y_test,y_pred)

sns.heatmap(conf_matrix,annot=True,fmt="d",cmap="Blues")
plt.xlabel('Predicted')#预测值
plt.ylabel('Actual')#数据真实值
plt.show()

在这里插入图片描述

8、模型的调参

方差估计的平滑参数(var_smoothing):高斯朴素贝叶斯模型中为了避免概率为0的情况,会对各特征的方差进行平滑处理。这个平滑参数可以影响模型的泛化能力,尝试不同的取值来找到最佳的平衡点。

# 模型调参
params = {
    'var_smoothing':[1e-7,1e-8,1e-9,1e-10,1e-11,1e-12]
}
# 使用GridSearchCV进行5折交叉验证和网格搜索,来找到最佳的平滑参数取值。最后输出最佳的平滑参数,verbose取2时显示训练过程
gnb_grid_clf = GridSearchCV(gnb_clf,param_grid=params,cv=5,verbose=2)
gnb_grid_clf.fit(x_train,y_train)
# 使用调参后的模型进行预测
true_y_pred = gnb_grid_clf.best_estimator_.predict(x_test)
# 输出模型的准确率
print("准确率:%f"%(accuracy_score(y_test,true_y_pred)))
#准确率:0.918919

显示训练过程:高斯朴素贝叶斯模型默认的’var_smoothing’为1e-09,但在该数据集下,不同的’var_smoothing’参数模型训练的总时间都为 0 秒,原因可能在于数据量较少,计算时间非常迅速。

9、对调参后模型的预测结果进行可视化

# 生成混淆矩阵
true_conf_matrix = confusion_matrix(y_test,true_y_pred)

sns.heatmap(true_conf_matrix,annot=True,fmt="d",cmap="Blues")
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

在这里插入图片描述备注:
可私信获得数据来源更有详细代码和教程。

  • 22
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值