一、简介

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

2.数据

  • 数据文件:
    train.csv 训练集,文件大小 273kb
    test.csv 预测集, 文件大小 179kb
    sample_submit.csv 提交示例 文件大小 97kb
    训练集中共有10000条样本,预测集中有7000条样本。
  • 数据来源:
    Laboratory of Artificial Intelligence and Decision Support (LIAAD), University of Porto, Portugal。为了公平起见,数据已经进行脱敏加工处理。
  • 下载链接:
    http://sofasofa.io/competition.php?id=1#c1下载链接

3.变量说明

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

4.评价方法

RMSE越小,说明模型预测得越准确。

二、标杆模型

  • 官方给出的三个模型:
    http://sofasofa.io/benchmarks.php?id=1传送门

1. 简单线性回归模型(Python)

# 引入模块
from sklearn.linear_model import LinearRegression
import pandas as pd# 读取数据
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")               #括号双引号里可以是数据文件所在的位置
submit = pd.read_csv("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 = map(lambda x: x if x >= 0 else 0, y_pred)# 输出预测结果至名为my_LR_prediction.csv的文件
submit['y'] = y_pred
submit.to_csv('my_LR_prediction.csv', index=False)       #绿色的是csv文件名,可以更改

—简单线性回归模型预测结果的RMSE为:39.132

2.决策树回归模型(Python)

# 引入模块
from sklearn.tree import DecisionTreeRegressor
import pandas as pd# 读取数据
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")               #括号双引号里可以是数据文件所在的位置
submit = pd.read_csv("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)           #绿色的是csv文件名,可以更改

—决策树回归模型预测结果的RMSE为:28.818

3.xgboost回归模型(Python)

# 引入模块
from xgboost import XGBRegressor
import pandas as pd# 读取数据
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")               #括号双引号里可以是数据文件所在的位置
submit = pd.read_csv("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()
reg.fit(train, y_train)
y_pred = reg.predict(test)# 输出预测结果至名为my_XGB_prediction.csv的文件
submit['y'] = y_pred
submit.to_csv('my_XGB_prediction.csv', index=False)          #绿色的是csv文件名,可以更改

—xgboost回归模型预测结果的RMSE为:18.947

4.总结

因为该比赛的评价方法是通过计算不同模型的RMSE进行比较。根据给出的三个不同的模型和其RMSE的值,可以知道xgboost回归模型的RMSE是三个模型里最低的,所以我们直接对xgboost回归模型进行处理。

三、基础准备

我觉得想要缩小模型的RMSE,要么优化算法,要么处理数据。优化算法我是做不到了,所以我选择从数据下手。

1.这个任务的类型是回归,分类问题的评价指标是准确率,回归算法的评价指标有MSERMSE

  • MSE(均方误差)
    这里的y是测试集上的,用真实值-预测值,然后平方之后,再求和平均。

    其实就是线性回归的损失函数;在线性回归的时候我们的目的就是让这个损失函数最小
    模型做出来了,我们可以试着把损失函数放到到测试集上去看看损失值,简单直观。

  • RMSE(均方根误差)

    其实就是MSE开了个根号。但其实质是一样的。只不过用于数据更好的描述

四、数据预处理

1.数据清理—缺失值检查

代码:

print(train.info())

结果:

可以看到结果图最后一行返回的是“None”,也就是说没有缺失值!

  • 若是有缺失值,可以用下面这行代码进行剔除
dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

更多关于缺失值的操作:https://blog.csdn.net/qq_41780234/article/details/102794601传送门

2.观察变量信息

代码:

print(train.describe())

结果:

通过观察可以得出一些猜测,如城市0 和城市1基本可以排除南方城市;整个观测记录时间跨度较长,还可能包含了一个长假期数据等等。

3.相关系数的查看

代码:

#导入numpy库
#补充在在最开始导入库的版块里
import numpy as np#格式:corr=文件名.corr
#0.2只是我的建议范围,波动范围在0.0~1.0
corr = train.corr()
corr[np.abs(corr) < 0.2] = np.nan       #绝对值低于0.2的就用nan替代
print(corr)

结果:
之所以选择0.2是因为:0.2-0.4弱正相关;0.4-0.6算中等相关;0.6-0.8达到强正相关。更多

通过观察可以发现用车的时间和当时的气温对借取数量y有较强的关系;气温和体感气温显强正相关(共线性)

五、Xgboost模型

1. 简介

Xgboost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器。因为Xgboost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器。而所用到的树模型则是CART回归树模型。(更多)

Xgboost一般和sklearn一起使用,但是由于sklearn中没有集成Xgboost,所以才需要单独下载安装。

2. Xgboost下载

  • python3.7;Windows 64-bit;cmd模式
  1. cmd内输入命令:
pip install xgboost

若如下图报错:
cmd内输入:

python -m pip install --upgrade pip

  1. cmd内输入命令:
pip list

目录里有显示xgboost即下载成功

血的教训:能一句pip搞定的就用pip搞,不要去看教程;实在不行 就pip uninstall xgboost再循环。

3. Xgboost回归模型调参过程

参数调优的一般方法需要进行如下步骤:

  1. 选择较高的学习速率(learning rate)。一般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动选择对应于此学习速率的理想决策树数量XGBoost有一个很有用的函数“cv”,这个函数可以在每一次迭代中使用交叉验证,并返回理想的决策树数量。
  2. 对于给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在确定一棵树的过程中,可以选择不同的参数
  3. xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。
  4. 降低学习速率,确定理想参数

3.1 Xgboost使用GridSearchCV调参过程

  1. Xgboost 的默认参数如下(在sklearn库中的默认参数):
def __init__(self, max_depth=3, learning_rate=0.1, n_estimators=100,silent=True, objective="rank:pairwise", booster='gbtree',n_jobs=-1, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0,subsample=1, colsample_bytree=1, colsample_bylevel=1,reg_alpha=0, reg_lambda=1, scale_pos_weight=1,base_score=0.5, random_state=0, seed=None, missing=None, **kwargs):
  • 第一步——调 n_estimators
#不可以直接import-xgboost库,因为下面要用到 XGBRegressor
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd# 读取数据
train = pd.read_csv(r"E:\my code\train.csv")
test = pd.read_csv(r"E:\my code\test.csv")           #绿色部分为数据集的位置
submit = pd.read_csv(r"E:\my code\sample_submit.csv")# 删除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)# 取出训练集的y
y_train = train.pop('y')param_test1 = {'n_estimators':range(100,1000,100)
}
gsearch1 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1,  max_depth=5,min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8,nthread=4, scale_pos_weight=1, seed=27),param_grid = param_test1, iid=False, cv=5)
gsearch1.fit(train, y_train)
print(gsearch1.best_params_, gsearch1.best_score_)
  • 结果:
    我们选择树的个数为200;得到结果{‘n_estimators’: 200} 0.903184767739565
  1. 调参 max_depth和min_child_weight
  • 树的最大深度,缺省值为3,范围是[1, 正无穷),树的深度越大,则对数据的拟合程度越高,但是通常取值为3-10
  • 孩子节点中的最小的样本权重和,如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结果
  • 下面对这两个参数调优,是因为他们对最终结果由很大的影响,所以直接小范围微调。
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd# 读取数据
train = pd.read_csv(r"E:\my code\train.csv")
test = pd.read_csv(r"E:\my code\test.csv")
submit = pd.read_csv(r"E:\my code\sample_submit.csv")# 删除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)# 取出训练集的y
y_train = train.pop('y')param_test2 = {'max_depth':range(3,10,2),     #调节部分'min_child_weight':range(1,6,2)
}
gsearch2 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, n_estimators=200 ),param_grid = param_test2)
gsearch2.fit(train, y_train)
print(gsearch2.best_params_, gsearch2.best_score_)
  • 结果:
  'max_depth':range(3,10,2),           #参数1'min_child_weight':range(1,6,2)

'max_depth':range(3,10,1),     #参数2
'min_child_weight':range(1,6,1)


两者一样,结果均为:{‘max_depth’: 5, ‘min_child_weight’: 3} 0.9044006740592734

  1. 总结
    我们对于数值进行较大跨度的48种不同的排列组合,可以看出理想的max_depth值为5,理想的min_child_weight值为5。

六、gamma参数调优

  • gamma值使得算法更加conservation,且其值依赖于loss function,在模型中应该调参
  • 在已经调整好其他参数的基础上,我们可以进行gamma参数的调优了。Gamma参数取值范围可以很大,我这里把取值范围设置为5,其实我们也可以取更精确的gamma值。
  • 代码
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd# 读取数据
train = pd.read_csv(r"E:\my code\train.csv")
test = pd.read_csv(r"E:\my code\test.csv")
submit = pd.read_csv(r"E:\my code\sample_submit.csv")# 删除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)# 取出训练集的y
y_train = train.pop('y')param_test4 = {'gamma': [i / 10.0 for i in range(0, 5)]
}
gsearch4 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, n_estimators=200,max_depth=5,min_child_weight=5 ),param_grid = param_test4)
gsearch4.fit(train, y_train)
print(gsearch4.best_params_, gsearch4.best_score_)
  • 结果:
    {‘gamma’: 0.2} 0.904291798478495

七、调整subsample 和 colsample_bytree 参数

  • subsample 用于训练模型的子样本占整个样本集合的比例,如果设置0.5则意味着XGBoost将随机的从整个样本集合中抽取出百分之50的子样本建立模型,这样能防止过拟合,取值范围为(0, 1]
  • 在建立树的时候对特征采样的比例,缺省值为1,物质范围为(0, 1]
  • 下一步是尝试不同的subsample 和colsample_bytree 参数。我们分两个阶段来进行这个步骤。这两个步骤都取0.6,0.7,0.8,0.9 作为起始值。
  • 代码
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd# 读取数据
train = pd.read_csv(r"E:\my code\train.csv")
test = pd.read_csv(r"E:\my code\test.csv")
submit = pd.read_csv(r"E:\my code\sample_submit.csv")# 删除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)# 取出训练集的y
y_train = train.pop('y')param_test5 = {'subsample': [i / 10.0 for i in range(6, 10)],'colsample_bytree': [i / 10.0 for i in range(6, 10)]
}
gsearch5 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, n_estimators=200,max_depth=5,min_child_weight=5,gamma=0.0 ),param_grid = param_test5)
gsearch5.fit(train, y_train)
print(gsearch5.best_params_, gsearch5.best_score_)
  • 结果:
    {‘colsample_bytree’: 0.9, ‘subsample’: 0.7} 0.9051710342641026

八、正则化参数调优

  • 由于gamma函数提供了一种更加有效的降低过拟合的方法,大部分人很少会用到这个参数,但是我们可以尝试用一下这个参数。
  • 代码
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd# 读取数据
train = pd.read_csv(r"E:\my code\train.csv")
test = pd.read_csv(r"E:\my code\test.csv")
submit = pd.read_csv(r"E:\my code\sample_submit.csv")# 删除id
train.drop('id', axis=1, inplace=True)
test.drop('id', axis=1, inplace=True)# 取出训练集的y
y_train = train.pop('y')param_test6 = {'reg_alpha': [0, 0.001, 0.005, 0.01, 0.05]
}
gsearch6 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, n_estimators=200,max_depth=5,min_child_weight=5,gamma=0.0,colsample_bytree= 0.9, subsample=0.7),param_grid = param_test6)
gsearch6.fit(train, y_train)
print(gsearch6.best_params_, gsearch6.best_score_)
  • 结果:
    {‘reg_alpha’: 0.005} 0.9051711319441929

九、汇总出得到的最佳参数并训练

from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd# 读取数据
train = pd.read_csv(r"E:\my code\train.csv")
test = pd.read_csv(r"E:\my code\test.csv")
submit = pd.read_csv(r"E:\my code\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= XGBRegressor( learning_rate =0.1, n_estimators=150,max_depth=5,min_child_weight=5,gamma=0.0,colsample_bytree= 0.9, subsample=0.7,reg_alpha=0.001)
reg.fit(train, y_train)
y_pred = reg.predict(test)# 输出预测结果至my_XGB_prediction.csv
submit['y'] = y_pred
submit.to_csv('my_XGB_tc_prediction6.csv', index=False)
  • 最后在文件夹内生成名为my_XGB_tc_prediction6.csv的csv文件

十、最后

  • 最开始的xgboost的RMSE值为18.947;改良调参后最终的RMSE为15.116,比直接使用xgboost提高了3.831。
  • 调参调到后阶段,都是对n_estimators进行调参,最后将其敲定在150。






    我排名后,所以大嘎找自己的排名时可以直接Ctrl+F,输入自己的用户名。
    就这样吧 = =

十一、参考

  1. https://blog.csdn.net/abc_138/article/details/82876923
  2. https://www.cnblogs.com/wj-1314/p/10620131.html
  3. https://www.jianshu.com/p/742d48840a52
  4. https://www.jianshu.com/p/a13b2a563b29
  5. https://www.jianshu.com/p/9ee85fdad15

sofasofa—公共自行车使用量预测—参数调整、优化结果相关推荐

  1. 机器学习(10)-随机森林案例(调参)之公共自行车使用量预测

    随机森林案例之公共自行车使用量预测 1. 前言 1.1 背景介绍 1.2 任务类型 1.3 数据文件说明 1.4 数据变量说明 1.5 评估方法 2. 数据预处理 2.1 观察数据有没有缺失值 2.2 ...

  2. 机器学习之算法案例公共自行车使用量预测

    公共自行车使用量预测 公共自行车低碳.环保.健康,并且解决了交通中"最后一公里"的 痛点,在全国各个城市越来越受欢迎.本练习赛的数据取自于两个城市某 街道上的几处公共自行车停车桩. ...

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

    一 简介 背景介绍:  公共自行车低碳.环保.健康,并且解决了交通中"最后一公里"的痛点,在全国各个城市越来越受欢迎.本练习赛的数据取自于两个城市某街道上的几处公共自行车停车桩.我 ...

  4. 数据竞赛实战(3)——公共自行车使用量预测

    前言 1,背景介绍 公共自行车低碳,环保,健康,并且解决了交通中"最后一公里"的痛点,在全国各个城市越来越受欢迎.本次练习的数据取自于两个城市某街道上的几处公共自行车停车桩.我们希 ...

  5. 音频带宽预测与动态参数调整优化报告【音频质量专题】

                                 音频带宽预测与动态参数调整优化报告 目录 音频带宽预测与动态参数调整优化报告 优化背景与目的 优化内容与思路 测试结果汇总 A. 随机丢包网络 ...

  6. infobright安装部署及参数调整优化

    2019独角兽企业重金招聘Python工程师标准>>> #####一.认知Infobright数据仓库 Infobright是开源的DATA Warehouse,可以作为Mysql的 ...

  7. oracle基本参数调整优化

    step1: 关闭审计 关于审计:Oracle使用大量不同的审计方法来监控使用何种权限,以及访问哪些对象.审计不会防止使用这些权限,但可以提供有用的信息,用于揭示权限的滥用和误用 --所有操作在sys ...

  8. Docker 容器 jvm 内存参数调整优化

    前言 在使用Docker部署java 项目时,发现容器占用内存很高,导致服务器内存压力大,一个简单的boot项目,占用达到1G多内存,有些容器甚至达到快3G内存,并且发现java -jar 启动的项目 ...

  9. 第十四章_超参数调整

    文章目录 14.1 写在前面 14.2 超参数概述 14.2.1 什么是超参数,参数和超参数的区别 14.2.2 神经网络中包含哪些超参数 14.2.3 模型优化寻找最优解和正则项之间的关系 14.2 ...

最新文章

  1. 号称下一代可视化监控系统,结合SpringBoot使用,贼爽!
  2. 独家 | AI仍然受困于仇恨言论——但科学家们在衡量每个系统失败的地方正做得越来越好...
  3. Delphi的实数计算结果中只保留2位小数
  4. AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法
  5. python-函数-局部变量与全局变量
  6. 宁波华为服务器项目招聘,宁波服务器
  7. 华瑞网研(苏州)2014-11部分笔试题(社招)
  8. mine layer(2008 World Final C)
  9. flume的几种使用方式
  10. Failed to execute goal com.github.wvengen:proguard-maven-plugin:2.0.10:proguard (default) on project
  11. TFS无法连接:TF31002
  12. OICQ登录号码清除器实现原理
  13. 把prn文件输出到网络打印机
  14. guid分区怎么装win7_gpt分区无法安装win7原因分析及解决方法(完美解决)
  15. 服务器解压gz文件命令,gz解压(手机怎么解压gz文件)
  16. 福特汉姆大学计算机科学专业,Fordham的Computer and Information Science「福特汉姆大学计算机与信息科学系」...
  17. 关于中低端游戏本玩3A游戏降频的优化
  18. 计算机管理员注销,肿么注销计算机管理员
  19. ami主板uefi_BIOS和UEFI 你真的认识?
  20. php做网站步骤_新手如何用PHP开发一个完整的网站?

热门文章

  1. 01迷宫(记忆化搜索)
  2. 用友ERP系统排名?用友ERP办公系统怎么选?什么是用户口碑最好的用友ERP系统?
  3. 【流式计算系列day4】Streaming流式架构101—它是什么?
  4. 手机程序电量测试之docker toolbox安装docker
  5. 【论文分享】 Regression Greybox Fuzzing
  6. ARChon 分析之四:ARC的下载与编译
  7. 角形级联h桥,角形级联h桥,角形级联h桥statcom,不平衡电网
  8. 云财经智能炒股手环 6大实用功能帮助股民高效炒股
  9. indesign选中不了图片删除_有办法了!批量删除多个Word页眉页脚
  10. 看一看,赋能智慧城市,京东方亮相北京市建筑设计研究院创新日活动