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

案例背景

数据集 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行,包含空值的数据所占总数据集的比例较少,可以直接删除。
在这里插入图片描述
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

在这里插入图片描述

  • 划分训练集测试集
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()

在这里插入图片描述

岭回归

要求

建立岭回归模型,并利用基于 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)

在这里插入图片描述

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()

在这里插入图片描述

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值