Python时间序列梯度提升模型预测优化共享单车调度

该文讨论了梯度提升模型在预测共享单车用户数量中的效用,强调其在处理外生变量、非线性关系及大规模数据时的强项。然而,也指出重塑数据、编程迭代预测和特殊验证策略等挑战。文章以2011-2012年自行车租赁系统的小时级数据为例,展示了数据预处理、训练验证测试集划分,并通过时间序列图形和自相关图分析了用户使用模式。此外,提到了使用LightGBM和CatBoost等工具应对预测问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

梯度提升模型在机器学习社区中脱颖而出,因为它们在众多用例(回归和分类)中取得了良好的效果。 尽管它们在预测中的使用受到限制,但近年来,已经表明它们可以取得非常有竞争力的结果。 使用这种类型的模型的一些优点是:

  • 除了自回归变量之外,易于包括外生变量。
  • 它们允许在模型中包含非线性关系。
  • 高可扩展性,允许在大量数据可用时应用它们。

尽管它们具有潜在的优势,但在将机器学习模型应用于预测问题时,会出现一些问题,使分析师不愿意使用它们,主要是:

  • 重塑数据,使其可以像回归问题一样使用。
  • 根据需要多少未来预测(预测范围),必须对迭代过程进行编程,其中每个新预测都依赖于先前的预测。
  • 模型验证需要特定的策略,例如回溯测试、前向验证或时间序列交叉验证。不能应用传统的交叉验证。

共享单车调度

共享单车系统是一种共享交通服务,其中单车可在短期内供个人共享使用。 许多单车共享系统允许人们从码头借用单车,然后在属于同一系统的另一个码头归还。 码头是特殊的单车位,可以锁定单车,只能通过计算机控制释放。

管理这些系统的主要挑战之一是需要重新分配自行车,以确保在所有码头都有可用的单车以及可供归还的空闲空间。

为了改进单车配送的规划和执行,建议创建一个能够预测未来 36 小时内用户数量的模型。 这样,在每天 12:00 时,负责管理系统的公司将能够了解当天剩余时间(12 小时)和次日(24 小时)的预期需求。 为了简化本文档中显示的示例,假设正在对单个站进行建模。

数据集

本文档中的数据代表 2011 年和 2012 年自行车租赁系统的每小时使用情况。除了每小时的用户数量外,还提供有关天气状况和节假日的信息。 原始数据已从机器学习存储库中获得,并且之前已应用以下修改进行了清理(代码):

  • 使用更具描述性的名称重命名列。
  • 重命名天气变量的类别。大雨的类别已与雨的类别合并。
  • 非归一化的温度、湿度和风变量。
  • 创建变量 date_time 并设置为索引。
  • 通过前向填充填补缺失值。

生成的数据集包含以下列:

  • date_time:日期和时间。
  • month:1月~12月。
  • hour:0时~23时。
  • holiday:如果当天是假期
  • weekday:星期几(星期一 = 0,星期日 = 6)。
  • workingday:如果是工作日。
  • weathersit:当天的天气(晴、雾、雨)。
  • temp:注册温度。
  • atemp:热感觉。
  • hum:记录的湿度。
  • windspeed:记录的风速。
  • users:单车租赁服务的用户总数。
# Split train-val-test
# ==============================================================================
end_train = '2012-03-31 23:59:00'
end_validation = '2012-08-31 23:59:00'
data_train = data.loc[: end_train, :]
data_val   = data.loc[end_train:end_validation, :]
data_test  = data.loc[end_validation:, :]

print(f"Dates train      : {data_train.index.min()} --- {data_train.index.max()}  (n={len(data_train)})")
print(f"Dates validacion : {data_val.index.min()} --- {data_val.index.max()}  (n={len(data_val)})")
print(f"Dates test       : {data_test.index.min()} --- {data_test.index.max()}  (n={len(data_test)})")

图形绘制

时间序列的图形探索对于识别趋势、模式和季节性非常有用,这有助于指导选择可能是良好预测指标的滞后。

data_train['users'].plot(ax=main_ax, label='train', alpha=0.5)
data_val['users'].plot(ax=main_ax, label='validation', alpha=0.5)
data_test['users'].plot(ax=main_ax, label='test', alpha=0.5)
min_y = min(data['users'])
max_y = max(data['users'])
main_ax.fill_between(zoom, min_y, max_y, facecolor='blue', alpha=0.5, zorder=0)
main_ax.set_xlabel('')
main_ax.legend(loc='lower center', ncol=3, bbox_to_anchor=(0.5, -0.8))

data.loc[zoom[0]: zoom[1]]['users'].plot(ax=zoom_ax, color='blue', linewidth=2)

main_ax.set_title(f'Number of users: {data.index.min()}, {data.index.max()}', fontsize=14)
zoom_ax.set_title(f'Number of users: {zoom}', fontsize=14)
plt.subplots_adjust(hspace=1)

季节绘图

自相关图

极端梯度提升

外生变量

LightGBM | CatBoost

源代码

详情参阅 - 亚图跨际

利用XML文件作的多语言DEMO程序 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' '' '' 多語系設置類 '' '' Create: Bunny_Young 2010-03-12 '' email:yangmeiwen@163.com '' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' Modification history: '' '' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Imports System.Xml Imports System.Data Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Imports System.IO Public Class MutiLanguage Const _LANGUAGE_NAME = "language" Const _PAGE_NAME = "pageName" Const _CONTROL_NAME = "controlName" Const _CONTROL_TYPE = "controlType" Const _CONTROL_VALUE = "controlValue" Private _PageName As String ''resource讀取路徑 Private _languageType As String '' Private _xmlDoc As XmlDocument Private _savePath As String Private ds As DataSet Sub New(ByVal strLanguage As String, ByVal aspxPage As String) 'savePath = "~/Resource/" + strLanguage _PageName = "~/Resource/" + strLanguage + "/" + aspxPage + ".xml" _savePath = "~/Resource/" + strLanguage _savePath = HttpContext.Current.Server.MapPath(_savePath) _PageName = HttpContext.Current.Server.MapPath(_PageName) _languageType = strLanguage End Sub Public Sub GetDataSet() ds = New DataSet() ds.ReadXml(_PageName, XmlReadMode.Auto) End Sub Public Function UpdateLanguage(ByVal _controlName As String, ByVal _controlType As String, ByVal _controlValue As String) As Boolean GetDataSet() For Each dr As DataRow In ds.Tables(0).Rows If dr("controlName") = _controlName And dr("controlType") = _controlType Then dr("controlValue") = _controlValue End If Next ds.WriteXml(_PageName, XmlWriteMode.IgnoreSchema) ds.ReadXml(_PageName) End Function Public Function GetControlsList() As List(Of UIControl) GetDataSet() Dim dt As DataTable = ds.Tables(0) Dim ResultList As New List(Of UIControl) For Each dr As DataRow In dt.Rows Dim MyControl As New UIControl MyControl.ControlName = dr("controlName") MyControl.ControlType = dr("controlType") MyControl.ControlValue = dr("controlValue") ResultList.Add(MyControl) Next Return ResultList End Function ''' <summary> ''' 主動生成資源文件 ''' </summary> ''' <param name="strLanguage">語言類別</param> ''' <param name="Page">WEB PAGE</param> ''' <remarks></remarks> Public Sub WriteResourceFile(ByVal Page As UI.Page) Try If Not Directory.Exists(_savePath) Then Directory.CreateDirectory(_savePath) End If Dim writer As New XmlTextWriter(_PageName, Nothing) writer.Formatting = Formatting.Indented ''語言類別 writer.WriteStartElement(_LANGUAGE_NAME, _languageType) LoopAllControls(Page, writer) ''語言類別結束 writer.WriteEndElement() writer.Close() Catch ex As Exception End Try End Sub Private Sub LoopAllControls(ByVal oCtrl As Control, ByVal writer As XmlWriter) For Each _Ctrl As Control In oCtrl.Controls Dim _strName As String = _Ctrl.GetType.Name.ToUpper If _strName = "LABEL" Or _strName = "BUTTON" Then Dim strValue As String Dim strComment As String If _strName = "LABEL" Then strValue = CType(_Ctrl, Label).Text strComment = "label control" Else strValue = CType(_Ctrl, Button).Text strComment = "button control" End If writer.WriteComment(strComment) writer.WriteStartElement("Control") writer.WriteAttributeString(_CONTROL_VALUE, strValue) writer.WriteAttributeString(_CONTROL_NAME, _Ctrl.ID) writer.WriteAttributeString(_CONTROL_TYPE, _Ctrl.GetType.Name) writer.WriteEndElement() End If If _Ctrl.GetType.Name.ToUpper() = "GRIDVIEW" Then Continue For End If If _Ctrl.HasControls Then LoopAllControls(_Ctrl, writer) End If Next End Sub Public Sub ApplylanguageResource(ByVal _aspxPage As System.Web.UI.Page) GetDataSet() LoopApply(_aspxPage) End Sub Private Sub LoopApply(ByVal _control As Control) For Each ct As Control In _control.Controls Dim controlName As String = ct.ID Dim dr() As System.Data.DataRow = ds.Tables(0).Select("controlName='" + controlName + "'", "controlName DESC") If dr.Count > 0 Then If ct.GetType.Name.ToUpper = "LABEL" Then CType(ct, Label).Text = dr(0)("controlValue") End If If ct.GetType.Name.ToUpper = "BUTTON" Then CType(ct, Button).Text = dr(0)("controlValue") End If End If If ct.HasControls Then LoopApply(ct) End If Next End Sub End Class
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值