机器学习 回归与分类模型 数据挖掘
基于数据集data.xlsx包含某地区某一年每一日的AQI、质量等级、PM2.5、PM10、SO2、CO、NO2、O3_8h等指标数据:
回归模型 根据PM2.5、PM10、SO2、CO、NO2、O3_8h等指标数据作为特征集,AQI空气质量指数作为目标向量构建线性回归模型并进行预测。
分类模型:根据AQI空气质量指数对大气质量等级进行分类并进行预测
数据提取与预处理
1、导入部分所需要的模块
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
2、读取数据集,此处为xlsx文件
'''获取数据集,此处为excel文件'''
def _get_data():
df = pd.read_excel('./data.xlsx')
return df
3、数据异常值处理以及数据编码转换
'''数据异常值处理以及数据编码'''
def _wash_data():
data = _get_data()
from sklearn.impute import SimpleImputer # 数据预处理工具
# 对数值型特征进行均值填充:
num_features = ['AQI', 'PM2.5', 'PM10', 'SO2', 'CO', 'NO2', 'O3_8h']#定义了数值型特征的列表。
imputer = SimpleImputer(strategy='mean')#创建了一个用于填充空值的SimpleImputer对象,策略为使用特征的均值进行填充。
data[num_features] = imputer.fit_transform(data[num_features])#对data中的数值型特征进行均值填充操作。
# 对分类型特征进行众数填充(如果有的话):
cat_features = ['质量等级']#定义了分类型特征的列表。
cat_imputer = SimpleImputer(strategy='most_frequent')#创建了一个用于填充空值的SimpleImputer对象,策略为使用特征的众数进行填充。
data[cat_features] = cat_imputer.fit_transform(data[cat_features])#对data中的分类型特征进行众数填充操作。
'''将数据集中质量等级进行分类。转换为0-n-1的数(n为编码标签的个数)'''
from sklearn.preprocessing import LabelEncoder # 数据编码工具
encoder = LabelEncoder()
# 将质量等级编码[0、1、2、3、4]分别对应['中度污染' '优' '良' '轻度污染' '重度污染']
data['质量等级'] = encoder.fit_transform(data['质量等级'])
return data
模型构建
线性回归模型
1、划分特征集和目标向量
class LinearRegression(object):
df = _wash_data()
# 选取特征集data_list赋值给变量x_data
data_list = ['PM2.5', 'PM10', 'SO2', 'CO', 'NO2', 'O3_8h']
x_data = df[data_list]
# 目标向量赋值给y_data
y_data = df['AQI']
from sklearn.model_selection import train_test_split # 对数据集进行划分
'''划分训练集和测试集'''
'''将数据集以8;2的比例分为训练集和测试集,将各空气质量指标赋值到变量x中,将转换后的质量等级赋值到变量y中'''
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, # 前两个参数表示样本的特征集以及分类
test_size=0.2, # 表示测试集占比20%
random_state=1) # 用于控制每次运行的数据划分结果
2、可视化部分一:查看特征集与目标之间的相关性。
# 数据可视化1:各自查看特征集中的对象与目标向量的关系
sns.pairplot(df
, x_vars=data_list
, y_vars='AQI'
, height=7
, aspect=0.8
, kind='reg')
plt.show()
3、构建模型,进行回归预测
# 构建线性回归模型
from sklearn.linear_model import LinearRegression
linreg = LinearRegression()
model = linreg.fit(x_train, y_train)
# 进行模型的预测
y_pred = linreg.predict(x_test)
# 数据可视化2:预测值和真实值的比较
import matplotlib.pyplot as plt
plt.figure()
plt.plot(range(len(y_pred)), y_pred, 'b', label="predict")
plt.plot(range(len(y_pred)), y_test, 'r', label="test")
plt.legend(loc="upper right")
plt.xlabel("the number of sales")
plt.ylabel('value of sales')
plt.show()
分类模型
1、划分训练集和测试集
class GaussianNB(object):
'''划分训练集和测试集'''
df = _wash_data()
'''将数据集以8;2的比例分为训练集和测试集,将各空气质量指标赋值到变量x中,将转换后的质量等级赋值到变量y中'''
# data_list = ['PM2.5', 'PM10', 'SO2', 'CO', 'NO2', 'O3_8h']
x_data = df['AQI'] # 选取空气质量指数赋值到x_data中
x_data = pd.DataFrame(x_data)
y_data = df['质量等级'] # 将转换后的质量等级赋值到变量y_data中
from sklearn.model_selection import train_test_split # 对数据集进行划分
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, # 前两个参数表示样本的特征集以及分类
test_size=0.2, # 表示测试集占比20%
random_state=40, # 用于控制每次运行的数据划分结果
stratify=y_data) # 保证数据集划分后样本分布的一致性
2、模型构建与预测,输出模型准确率和混淆矩阵。
from sklearn.naive_bayes import GaussianNB # 调用朴素贝叶斯模型
gnb_clf = GaussianNB()
gnb_clf.fit(x_train, y_train)
# 使用训练好的模型进行预测
y_pred = gnb_clf.predict(x_test)
from sklearn.metrics import accuracy_score # accuracy_score()对模型准确率进行评价
# 输出模型的准确率
print("准确率:%f"%(accuracy_score(y_test,y_pred)))
#准确率:1.000000
# 生成混淆矩阵
from sklearn.metrics import confusion_matrix # 生成混淆矩阵对模型进行评估
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()
3、模型调参,输出最优参数和准确率
# 模型调参
param_grid = {
'var_smoothing': [1e-7, 1e-8, 1e-9, 1e-10, 1e-11, 1e-12]
}
from sklearn.model_selection import GridSearchCV # 对模型进行调参
# 使用GridSearchCV进行5折交叉验证和网格搜索,来找到最佳的平滑参数取值。最后输出最佳的平滑参数,verbose取2时显示训练过程,
gnb_grid_clf = GridSearchCV(gnb_clf,param_grid,cv=5,verbose=0)
gnb_grid_clf.fit(x_train,y_train)
# 输出最优参数:
print(f'最优参数值:{gnb_grid_clf.best_params_}')
# 使用调参后的模型进行预测
true_y_pred = gnb_grid_clf.best_estimator_.predict(x_test)
# 输出模型的准确率
print("准确率:%f"%(accuracy_score(y_test,true_y_pred)))
##最优参数值:{'var_smoothing': 1e-07}
##准确率:1.000000
数据集的获取可私信。