公共自行车低碳、环保、健康,并且解决了交通中“最后一公里”的痛点,在全国各个城市越来越受欢迎。希望通过分析时间、天气等信息,预测出该街区在一小时内的被借取的公共自行车的数量。
数据来源: http://sofasofa.io/competition.php?id=1#c1,代码:https://gitee.com/wang-gaopeng/public-bicycle-usage-forecast/tree/master/
数据文件包括三个:train.csv训练集,test.csv测试集,sample_submit.csv输出结果试例。数据中的字段包括:
字段 | 含义 |
---|---|
id | 行编号没有实际意义,数字类型 |
city | 城市,数据集中有两个城市 分别为0和1 |
hour | 时间24小时制 |
is_workday | 是否是工作日,1表示是,0是周末或节假日 |
weather | 当时的天气状况,1为晴朗,2为多云、阴天,3为轻度降水天气,4为强降水天气 |
temp_1 | 当时的气温,单位为摄氏度 |
temp_2 | 当时的体感温度,单位为摄氏度 |
wind | 风速,值越大,风速越高 |
y | 因变量 一小时内自行车被借取的数量 ,被预测的量 |
使用工具jupter,pandas,matplotlib,scikit-learn
一.数据导入与清洗。
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.tree import DecisionTreeRegressor
import numpy as np
import math
train=pd.read_csv('C:/Users/wanggaopeng/Desktop/train.csv',encoding='utf-8')
test=pd.read_csv('C:/Users/wanggaopeng/Desktop/test.csv',encoding='utf-8')
submit=pd.read_csv('C:/Users/wanggaopeng/Desktop/sample_submit.csv',encoding='utf-8')
train.head(5)
image.png
test.head(5)
image.png
id与我们分析目标不相关,将其剔除。
train.drop('id',axis=1,inplace=True)
test.drop('id',axis=1,inplace=True)
训练集的描述性统计分析。
train.describe()
image.png
箱线图
plt.rcParams['font.sans-serif']=['Simhei']#解决中文乱码
plt.rcParams['axes.unicode_minus']=False #解决负号不显示
plt.title('箱线图')
figure=plt.figure()
figure.add_subplot(3,2,1)
plt.boxplot(train['hour'],labels=['hour'])
figure.add_subplot(3,2,2)
plt.boxplot(train['temp_1'],labels=['temp_1'])
figure.add_subplot(3,2,3)
plt.boxplot(train['temp_2'],labels=['temp_2'])
figure.add_subplot(3,2,4)
plt.boxplot(train['wind'],labels=['wind'])
figure.add_subplot(3,2,5)
plt.boxplot(train['y'],labels=['y'])
image.png
取出训练集中的y值
y_train=train.pop('y')
二.建模
2.1多元线性回归模型
reg = LinearRegression()
reg.fit(train, y_train)
y_pred = reg.predict(test)
reg.coef_
reg.intercept_
reg.score(train,y_train)
# 输出预测结果至my_lr_prediction.csv
submit['y'] = y_pred
submit.to_csv('C:/Users/wanggaopeng/Desktop/my_lr_prediction.csv', index=False)
回归系数:
image.png
截距:
image.png
预测值:
image.png
确定系数R^2:越接近1回归结果越好。
image.png
预测结果:
image.png
2.2决策树模型
#建立最大深度为6的决策树模型
reg1 = DecisionTreeRegressor(max_depth=6)
reg1.fit(train, y_train)
y_pred1 = reg1.predict(test)
# 输出预测结果至my_dt_prediction.csv
submit['y'] = y_pred1
submit.to_csv('C:/Users/wanggaopeng/Desktop/my_dt_prediction.csv', index=False)
image.png
2.3模型评估
评价方法为RMSE(Root of Mean Squared Error)。
image.png
RMSE越小,说明模型预测得越准确。
submit.drop('id',axis=1,inplace=True)
y=submit['y']
mae1=y-y_pred1
sub1=mae1**2
tob1=sub1.sum(axis=0)
mob1=tob1/len(y)
mae2=y-y_pred
sub2=mae2**2
tob2=sub2.sum(axis=0)
mob2=tob2/len(y)
RMSE1=math.sqrt(mob1)
RMSE2=math.sqrt(mob2)
image.png
说明所建立的模型多元线性回归拟合度要优于决策树模型,这两个模型的RMSE都比较大,说明模型的结果不是很理想,模型有进一步优化的空间,也可以使用其他的方法来进行预测分析。
网友评论