欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【机器学习案例一】PM2.5的预测(回归)

程序员文章站 2022-05-02 16:35:20
...

案例背景

数据集 pm2.5 中给出了与预测 pm2.5 有关的气象数据。请利用 2010年至 2013 年的数据作为训练集对 2014 年的 pm2.5 数据进行预测。考虑使用的预测变量包括:hour(日内小时)、dewp(露点)、temp(气温)、pres(气压)cbwd(风向)、lws(风速)、ls(累积降雪)、lr(累积降雨),其中 hour 与 cbwd 应当作类别变量处理。

数据预处理

  • 导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
import warnings
# filter warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
from sklearn import linear_model
  • 读取数据
df=pd.read_csv('pm25.csv')
  • 处理缺失值
  1. 查看缺失值情况
df.isna().sum()

只有pm25这一列数据有空值,一共2043行。而总的数据集的数据一共43800行,包含空值的数据所占总数据集的比例较少,可以直接删除。
【机器学习案例一】PM2.5的预测(回归)
2. 删除缺失值

df.dropna(inplace=True)
  • 更改数据类型
df['cbwd']=df['cbwd'].astype(str)
df['hour']=df['hour'].astype(str)
  • 数据了解
df.columns

[‘year’, ‘month’, ‘day’, ‘hour’, ‘pm25’, ‘DEWP’, ‘TEMP’, ‘PRES’, ‘cbwd’, ‘Iws’, ‘Is’, ‘Ir’]

df.dtypes

【机器学习案例一】PM2.5的预测(回归)

  • 划分训练集测试集
x=df.loc[:,['hour','DEWP','TEMP','PRES','cbwd','Iws', 'Is', 'Ir']]
y=df.loc[:,['pm25']]
x=pd.get_dummies(x)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.3,random_state = 1)

普通线性回归

要求

请建立普通的线性回归模型,并分别对训练集和测试集的预测精度进行评价。

模型参数

linear_model.LinearRegression().get_params()

{‘copy_X’: True, ‘fit_intercept’: True, ‘n_jobs’: None, ‘normalize’: False}

fit_intercept:是否有截据,如果没有则直线过原点;
normalize:是否将数据归一化(标准化);
copy_X:默认为True,当为True时,X会被copied,否则X将会被覆写;
n_jobs:默认值为1。计算时使用的核数

训练模型

linear=linear_model.LinearRegression()
linear.fit(x_train,y_train)
linear.score(x_train,y_train)
linear.score(x_test,y_test)

回归系数

linear.coef_
linear.intercept_

训练集精度:0.295160
测试集精度:0.292433

- 数据标准化
linear=linear_model.LinearRegression(normalize=True)
linear.fit(x_train,y_train)
linear.score(x_train,y_train)
linear.score(x_test,y_test)

训练集精度:0.295146
测试集精度:0.292365

将数据进行标准化处理以后,测试精度和训练精度几乎没有改进

训练效果

  1. 均方误差
y_hat=linear.predict(x_train)
y_pre=linear.predict(x_test)
fmse=(y_pre-y_test).T.dot(y_pre-y_test)/len(y_test)
mse=(y_hat-y_train).T.dot(y_hat-y_train)/len(y_train)

训练集:mse=6054
测试集:fmse=5801

  1. 画图
plt.rcParams['savefig.dpi']=300 #像素
plt.rcParams['figure.dpi'] = 100 #分辨率
plt.rcParams['figure.figsize']=(8.0,6.0)
plt.figure()
plt.scatter(list(range(len(y_pre))),y_test,label='real',color='b',s=1)
plt.plot(list(range(len(y_pre))),y_pre,label='predict',color='r')
plt.legend()
plt.show()

【机器学习案例一】PM2.5的预测(回归)

岭回归

要求

建立岭回归模型,并利用基于 5 折交叉验证的格子搜索技术确定最优惩罚因子;在最优惩罚因子下,分别评价岭回归在训练集和测试集的预测精度。

模型参数

from sklearn.linear_model import Ridge
Ridge.get_params()

{‘alpha’: 1.0,‘copy_X’: True,‘fit_intercept’: True, ‘max_iter’: None, ‘normalize’: False,‘random_state’: None, ‘solver’: ‘auto’, ‘tol’: 0.001}

格子搜索确定最优惩罚因子

parameters={'alpha':np.arange(0.0001,0.001,0.0001)}
ridge=Ridge()
ridge_cv=GridSearchCV(ridge,param_grid=parameters,cv=5)
ridge_cv.fit(x,y)  
print(ridge_cv.best_params_)   
print(ridge_cv.best_score_)

best_params_:0.0009
best_score:0.2797

用最优惩罚因子训练模型

ridge=Ridge(alpha = 0.0009)
ridge.fit(x_train,y_train)
ridge.score(x_train,y_train)
ridge.score(x_test,y_test)  

训练集精度:0.2951
测试集精度:0.2924

Lasso回归

要求

请建立 Lasso 回归模型,并利用基于 5 折交叉验证的格子搜索技术确定最优惩罚因子;在最优惩罚因子下,分别评价 Lasso 回归在训练集和测试集的预测精度。

模型参数

from sklearn.linear_model import Lasso
lasso=Lasso()
lasso.get_params()

{‘alpha’: 1.0,
‘copy_X’: True,
‘fit_intercept’: True,
‘max_iter’: 1000,
‘normalize’: False,
‘positive’: False,
‘precompute’: False,
‘random_state’: None,
‘selection’: ‘cyclic’,
‘tol’: 0.0001,
‘warm_start’: False}

格子搜索确定最优惩罚因子

lasso=Lasso()
parameters={'alpha':np.arange(1,10,1)}
lasso_cv=GridSearchCV(lasso,param_grid=parameters,cv=5)
lasso_cv.fit(x,y)  
print(lasso_cv.best_params_)   
print(lasso_cv.best_score_) 

best_params_:{‘alpha’: 1}
best_score:0.2457

lasso=Lasso()
parameters={'alpha':np.arange(0.01,0.1,0.01)}
lasso_cv=GridSearchCV(lasso,param_grid=parameters,cv=5)
lasso_cv.fit(x,y)  
print(lasso_cv.best_params_)    
print(lasso_cv.best_score_)  

best_params_:{‘alpha’: 0.02}
best_score:0.2798

用最优惩罚因子训练模型

lasso=Lasso(alpha=0.02)
lasso.fit(x_train,y_train)
lasso.score(x_test,y_test)  
lasso.score(x_train,y_train) 

训练集精度:0.2951
测试集精度:0.2923

基于lasso回归,评价模型变量的重要性

lasso.coef_
imporant=pd.DataFrame({'variable':x.columns,'coef':lasso.coef_}).sort_values(by='coef',ascending=False)
imporant['coef2']=imporant['coef']**2
imporant=imporant.sort_values(by='coef2',ascending=False)

【机器学习案例一】PM2.5的预测(回归)

XGBRegressor

  • 模型建立
    由于以上模型模型对数据的拟合效果不是很佳,现在尝试用集成学习的模型xgboost对数据进行分析,发现集成学习模型的预测效果明显高于以上模型,但是预测的效果依然不是很理想
from xgboost import XGBRegressor
xgb=XGBRegressor(max_depth=4,n_estimators=301,learning_rate=0.25)
xgb.fit(x_train,y_train)
xgb.score(x_train,y_train)
xgb.score(x_test,y_test)

训练集精度:0.5572
测试集精度:0.4525

  • 画图
y_pre=xgb.predict(x_test)
plt.rcParams['savefig.dpi']=300 
plt.rcParams['figure.dpi'] = 100 
plt.rcParams['figure.figsize']=(8.0,6.0)
plt.figure()
plt.scatter(list(range(len(y_pre))),y_test,label='real',color='b',s=1)
plt.plot(list(range(len(y_pre))),y_pre,label='predict',color='r')
plt.legend()
plt.show()

【机器学习案例一】PM2.5的预测(回归)