sofasofa竞赛:一 公共自行车使用量预测

一 简介

背景介绍
公共自行车低碳、环保、健康,并且解决了交通中“最后一公里”的痛点,在全国各个城市越来越受欢迎。本练习赛的数据取自于两个城市某街道上的几处公共自行车停车桩。我们希望根据时间、天气等信息,预测出该街区在一小时内的被借取的公共自行车的数量。 

数据下载 地址:http://sofasofa.io/competition.php?id=1
数据文件(三个): 
train.csv 训练集,文件大小 273kb 
test.csv 预测集, 文件大小 179kb 
sample_submit.csv 提交示例 文件大小 97kb 

训练集中共有10000条样本,预测集中有7000条样本。 

变量说明: 

变量名 解释
id 行编号,没有实际意义
y 一小时内自行车被借取的数量。在test.csv中,这是需要被预测的数值。
city 表示该行记录所发生的城市,一共两个城市
hour 当时的时间,精确到小时,24小时计时法
is_workday 1表示工作日,0表示节假日或者周末
temp_1 当时的气温,单位为摄氏度
temp_2 当时的体感温度,单位为摄氏度
weather 当时的天气状况,1为晴朗,2为多云、阴天,3为轻度降水天气,4为强降水天气
wind 当时的风速,数值越大表示风速越大

评价方法

sofasofa竞赛:一 公共自行车使用量预测

 二  解决方法

简单线性回归模型(Python)



# 标杆模型
import pandas as pd
from sklearn.linear_model import LinearRegression

# 读取数据
train = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\train.csv")
test = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\test.csv")
submit = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\sample_submit.csv")

# 删除id
train.drop('id', axis=1, inplace=True)
test.drop('id',axis = 1,inplace = True)

# 取出训练集的y
y_train = train.pop('y')

# 建立回归模型
reg = LinearRegression()
reg.fit(train,y_train)
y_pred = reg.predict(test)

# 若预测值是负数,则取0
y_pred = list(map(lambda x: x if x >= 0 else 0, y_pred))

# 输出预测结果到my_LR_prediction.csv
submit['y'] = y_pred
submit.to_csv("my_LR_prediction3.csv",index = False)

该模型预测结果的RMSE为:39.132

决策树回归模型(Python)


# 决策树
from sklearn.tree import DecisionTreeRegressor
import pandas as pd

# 读取数据
train = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\train.csv")
test = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\test.csv")
submit = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\sample_submit.csv")

# 删除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)

# 取出训练集的y
y_train = train.pop('y')

# 建立最大深度为5的决策树回归模型
reg = DecisionTreeRegressor(max_depth=5)
reg.fit(train, y_train)
y_pred = reg.predict(test)

# 输出预测结果至my_DT_prediction.csv
submit['y'] = y_pred
submit.to_csv('my_DT_prediction.csv', index=False)

该模型预测结果的RMSE为:28.818

3 xgboost回归模型(Python)


from xgboost import XGBRegressor
import pandas as pd

# 读取数据
train = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\train.csv")
test = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\test.csv")
submit = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\sample_submit.csv")

# 删除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)

# 取出训练集的y
y_train = train.pop('y')

# 建立一个默认的xgboost回归模型
reg = XGBRegressor(learning_rate = 0.05,max_depth = 6,n_estimators = 500)
reg.fit(train, y_train)
y_pred = reg.predict(test)

# 输出预测结果至my_XGB_prediction.csv
submit['y'] = y_pred
submit.to_csv('my_XGB_tc_prediction.csv', index=False)

该模型预测结果的RMSE为:18.947

4 随机森林(Python)

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestRegressor
from sklearn import cross_validation, metrics
import pandas as pd

# 读取数据
train = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\train.csv")
test = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\test.csv")
submit = pd.read_csv(r"D:\PythonWenjian\sofasofa\bike_pre\data\sample_submit.csv")

# 删除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)

# 取出训练集的y
y_train = train.pop('y')
rf = RandomForestRegressor(n_estimators=70)
rf.fit(train,y_train)
y_pred = rf.predict(test)

submit['y'] = y_pred
submit.to_csv('my_rf_prediction.csv',index=False)

该模型预测结果的RMSE为:16.245