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 | 当时的风速,数值越大表示风速越大 |
评价方法
二 解决方法
1 简单线性回归模型(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
2 决策树回归模型(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