<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Xgboost on 格物堂</title><link>https://gewutang.cn/tags/xgboost/</link><description>Recent content in Xgboost on 格物堂</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 14 Jul 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://gewutang.cn/tags/xgboost/index.xml" rel="self" type="application/rss+xml"/><item><title>使用机器学习模型(xgboost）来预测纳斯达克 100 指数</title><link>https://gewutang.cn/2025/07/14/xboost/</link><pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate><guid>https://gewutang.cn/2025/07/14/xboost/</guid><description>&#10;&lt;script src="https://gewutang.cn/2025/07/14/xboost/index_files/core-js/shim.min.js"&gt;&lt;/script&gt;&#10;&lt;script src="https://gewutang.cn/2025/07/14/xboost/index_files/react/react.min.js"&gt;&lt;/script&gt;&#10;&lt;script src="https://gewutang.cn/2025/07/14/xboost/index_files/react/react-dom.min.js"&gt;&lt;/script&gt;&#10;&lt;script src="https://gewutang.cn/2025/07/14/xboost/index_files/reactwidget/react-tools.js"&gt;&lt;/script&gt;&#10;&lt;link href="https://gewutang.cn/2025/07/14/xboost/index_files/htmltools-fill/fill.css" rel="stylesheet" /&gt;&#10;&lt;script src="https://gewutang.cn/2025/07/14/xboost/index_files/htmlwidgets/htmlwidgets.js"&gt;&lt;/script&gt;&#10;&lt;link href="https://gewutang.cn/2025/07/14/xboost/index_files/reactable/reactable.css" rel="stylesheet" /&gt;&#10;&lt;script src="https://gewutang.cn/2025/07/14/xboost/index_files/reactable-binding/reactable.js"&gt;&lt;/script&gt;&#10;&#10;&#10;&lt;div id="引言" class="section level1"&gt;&#10;&lt;h1&gt;引言&lt;/h1&gt;&#10;&lt;p&gt;XGBoost（eXtreme Gradient Boosting）是一种高效的梯度提升算法，在数据科学和机器学习领域广泛应用，尤其擅长处理结构化数据的回归和分类问题。以下从数学原理、发展历程、使用方法和竞争算法四个方面进行详细介绍：&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div id="一数学原理" class="section level1"&gt;&#10;&lt;h1&gt;一、数学原理&lt;/h1&gt;&#10;&lt;p&gt;XGBoost 是梯度提升框架（Gradient Boosting）的优化实现，其核心思想是迭代地训练多个弱学习器（通常是决策树），并将它们组合成一个强学习器。&lt;/p&gt;&#10;&lt;p&gt;具体数学原理如下：&lt;/p&gt;&#10;&lt;p&gt;1.目标函数&lt;/p&gt;&#10;&lt;p&gt;XGBoost 的目标函数由两部分组成：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;损失函数&lt;/strong&gt;：衡量模型预测值与真实值之间的误差（如均方误差 MSE、对数损失 log loss 等）。&#10;&lt;strong&gt;正则化项&lt;/strong&gt;：控制模型复杂度，防止过拟合，包括树的数量、深度、叶子节点数等。&lt;/p&gt;&#10;&lt;p&gt;目标函数表达式：&lt;/p&gt;&#10;&lt;p&gt;&lt;span class="math display"&gt;\[&#10;\text{Obj}(\theta) = \sum_{i=1}^n L(y_i, \hat{y}_i) + \sum_{k=1}^K \Omega(f_k)&#10;\]&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;其中：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;span class="math inline"&gt;\(L(y_i, \hat{y}_i)\)&lt;/span&gt; 是样本 &lt;span class="math inline"&gt;\(i\)&lt;/span&gt; 的损失函数，&lt;span class="math inline"&gt;\(\hat{y}_i\)&lt;/span&gt; 是预测值，&lt;span class="math inline"&gt;\(y_i\)&lt;/span&gt; 是真实值。&lt;/li&gt;&#10;&lt;li&gt;&lt;span class="math inline"&gt;\(\Omega(f_k)\)&lt;/span&gt; 是第 &lt;span class="math inline"&gt;\(k\)&lt;/span&gt; 棵树的正则化项，通常包括树的复杂度（如叶子节点数、叶子节点权重的 L2 正则化）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;2.梯度提升迭代&lt;/p&gt;&#10;&lt;p&gt;XGBoost 通过迭代方式逐步优化目标函数：&lt;/p&gt;&#10;&lt;p&gt;初始化模型为常数预测： &lt;span class="math inline"&gt;\(\hat{y}_i^{(0)} = \text{argmin}_c \sum_{i=1}^n L(y_i, c)\)&lt;/span&gt; 。&lt;/p&gt;&#10;&lt;p&gt;对于每一轮迭代 &lt;span class="math inline"&gt;\(t\)&lt;/span&gt; ：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;计算损失函数关于当前预测值的梯度（一阶导数）和海森矩阵（二阶导数）。&lt;/li&gt;&#10;&lt;li&gt;训练一棵新的决策树 &lt;span class="math inline"&gt;\(f_t\)&lt;/span&gt; ，拟合这些梯度（即预测梯度方向）。&lt;/li&gt;&#10;&lt;li&gt;更新预测值：&lt;span class="math inline"&gt;\(\hat{y}_i^{(t)} = \hat{y}_i^{(t-1)} + \eta f_t(x_i)\)&lt;/span&gt; ，其中 &lt;span class="math inline"&gt;\(\eta\)&lt;/span&gt; 是学习率（控制每次迭代的步长）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;3.决策树优化&lt;/p&gt;&#10;&lt;p&gt;XGBoost 在构建决策树时采用了以下优化策略：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;精确贪心算法&lt;/strong&gt;：通过枚举所有特征的所有可能分割点，找到最优分割。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;近似算法&lt;/strong&gt;：对于大规模数据，使用直方图近似快速找到分割点。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;缺失值处理&lt;/strong&gt;：自动学习缺失值的最优分裂方向。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;正则化剪枝&lt;/strong&gt;：通过正则化项控制树的复杂度，避免过拟合。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;div id="二发展历程" class="section level1"&gt;&#10;&lt;h1&gt;二、发展历程&lt;/h1&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;p&gt;2014 年：陈天奇（Tianqi Chen）在华盛顿大学读博期间开发了 XGBoost 的原型，最初作为研究项目用于解决大规模机器学习问题。&lt;/p&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;p&gt;2015 年：XGBoost 作为开源项目发布，因其在 Kaggle 竞赛中的优异表现迅速走红，成为数据科学领域的主流算法之一。&lt;/p&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;p&gt;2016 年：陈天奇加入微软，带领团队进一步优化 XGBoost，支持分布式计算和云计算平台。&lt;/p&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;p&gt;2017 年至今：XGBoost 持续更新，增加了更多功能（如 DART、GPU 加速、特征重要性分析等），并被集成到多种编程语言和工具中（如 Python、R、Scala 等）。&lt;/p&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;div id="三如何使用" class="section level1"&gt;&#10;&lt;h1&gt;三、如何使用&lt;/h1&gt;&#10;&lt;p&gt;我们将用联邦基金有效利率和失业率为输入参数，按照 xgboost 模型对纳斯达克 100 指数月度数据进行建模。&lt;/p&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 加载必要的R包&#10;library(tidyquant) # 获取数据&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Registered S3 method overwritten by &amp;#39;quantmod&amp;#39;:&#10;## method from&#10;## as.zoo.data.frame zoo&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## ── Attaching core tidyquant packages ────────────────── tidyquant 1.0.11.9000 ──&#10;## ✔ PerformanceAnalytics 2.0.8 ✔ TTR 0.24.4&#10;## ✔ quantmod 0.4.28 ✔ xts 0.14.1&#10;## ── Conflicts ────────────────────────────────────────── tidyquant_conflicts() ──&#10;## ✖ zoo::as.Date() masks base::as.Date()&#10;## ✖ zoo::as.Date.numeric() masks base::as.Date.numeric()&#10;## ✖ PerformanceAnalytics::legend() masks graphics::legend()&#10;## ✖ quantmod::summary() masks base::summary()&#10;## ℹ Use the conflicted package (&amp;lt;http://conflicted.r-lib.org/&amp;gt;) to force all conflicts to become errors&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;library(tidyverse) # 数据处理与可视化的核心包集合&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──&#10;## ✔ dplyr 1.1.4 ✔ readr 2.1.5&#10;## ✔ forcats 1.0.0 ✔ stringr 1.5.1&#10;## ✔ ggplot2 3.5.2 ✔ tibble 3.3.0&#10;## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1&#10;## ✔ purrr 1.0.4 &#10;## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──&#10;## ✖ dplyr::filter() masks stats::filter()&#10;## ✖ dplyr::first() masks xts::first()&#10;## ✖ dplyr::lag() masks stats::lag()&#10;## ✖ dplyr::last() masks xts::last()&#10;## ℹ Use the conflicted package (&amp;lt;http://conflicted.r-lib.org/&amp;gt;) to force all conflicts to become errors&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;library(tidymodels) # 机器学习建模框架&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## ── Attaching packages ────────────────────────────────────── tidymodels 1.3.0 ──&#10;## ✔ broom 1.0.8 ✔ rsample 1.3.0&#10;## ✔ dials 1.4.0 ✔ tune 1.3.0&#10;## ✔ infer 1.0.9 ✔ workflows 1.2.0&#10;## ✔ modeldata 1.4.0 ✔ workflowsets 1.1.1&#10;## ✔ parsnip 1.3.2 ✔ yardstick 1.3.2&#10;## ✔ recipes 1.3.1 &#10;## ── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──&#10;## ✖ scales::discard() masks purrr::discard()&#10;## ✖ dplyr::filter() masks stats::filter()&#10;## ✖ dplyr::first() masks xts::first()&#10;## ✖ recipes::fixed() masks stringr::fixed()&#10;## ✖ dplyr::lag() masks stats::lag()&#10;## ✖ dplyr::last() masks xts::last()&#10;## ✖ dials::momentum() masks TTR::momentum()&#10;## ✖ yardstick::spec() masks readr::spec()&#10;## ✖ recipes::step() masks stats::step()&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;library(modeltime) # 时间序列建模与预测&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## Attaching package: &amp;#39;modeltime&amp;#39;&#10;## &#10;## The following object is masked from &amp;#39;package:TTR&amp;#39;:&#10;## &#10;## growth&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;library(timetk) # 时间序列数据处理工具&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## Attaching package: &amp;#39;timetk&amp;#39;&#10;## &#10;## The following object is masked from &amp;#39;package:tidyquant&amp;#39;:&#10;## &#10;## FANG&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 获取失业率数据 (UNRATE)&#10;df_unrate &amp;lt;- &#10; tq_get(&amp;quot;UNRATE&amp;quot;, get = &amp;quot;economic.data&amp;quot;) %&amp;gt;% &#10; select(date, unrate = price) # 重命名价格列为unrate&#10;&#10;# 获取联邦基金有效利率数据 (FEDFUNDS)&#10;df_fedfunds &amp;lt;- &#10; tq_get(&amp;quot;FEDFUNDS&amp;quot;, get = &amp;quot;economic.data&amp;quot;) %&amp;gt;% &#10; select(date, fedfunds = price) # 重命名价格列为fedfunds&#10;&#10;# 获取纳斯达克100指数数据&#10;df_nasdaq &amp;lt;- &#10; tq_get(&amp;quot;^NDX&amp;quot;) %&amp;gt;% &#10; tq_transmute(select = close, # 选择收盘价&#10; mutate_fun = to.monthly, # 转换为月度数据&#10; col_rename = &amp;quot;nasdaq&amp;quot;) %&amp;gt;% # 重命名列&#10; mutate(date = as.Date(date)) # 确保日期格式正确&#10;&#10;# 合并三个数据集&#10;df_merged &amp;lt;- &#10; df_unrate %&amp;gt;% &#10; left_join(df_fedfunds) %&amp;gt;% &#10; left_join(df_nasdaq) %&amp;gt;% &#10; drop_na() # 删除包含缺失值的行&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Joining with `by = join_by(date)`&#10;## Joining with `by = join_by(date)`&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 时间序列数据分割&#10;splits &amp;lt;- &#10; time_series_split(&#10; df_merged,&#10; assess = &amp;quot;1 year&amp;quot;, # 测试集为1年数据&#10; cumulative = TRUE # 训练集包含所有历史数据&#10; )&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Using date_var: date&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;df_train &amp;lt;- training(splits) # 提取训练集&#10;df_test &amp;lt;- testing(splits) # 提取测试集&#10;&#10;# 创建机器学习预处理配方&#10;recipe_ml &amp;lt;- &#10; recipe(nasdaq ~ ., df_train) %&amp;gt;% # 以nasdaq为目标变量&#10; step_date(date, features = &amp;quot;month&amp;quot;, ordinal = FALSE) %&amp;gt;% # 从日期提取月份特征&#10; step_dummy(all_nominal_predictors(), one_hot = TRUE) %&amp;gt;% # 将分类变量转为虚拟变量&#10; step_mutate(date_num = as.numeric(date)) %&amp;gt;% # 将日期转换为数值型&#10; step_normalize(all_numeric_predictors()) %&amp;gt;% # 标准化数值预测变量&#10; step_rm(date) # 移除原始日期列&#10;&#10;# 定义XGBoost提升树模型规格，设置超参数为待调优&#10;mod_spec &amp;lt;- &#10; boost_tree(trees = tune(), # 树的数量&#10; min_n = tune(), # 节点最小样本量&#10; tree_depth = tune(), # 树的最大深度&#10; learn_rate = tune()) %&amp;gt;% # 学习率&#10; set_engine(&amp;quot;xgboost&amp;quot;) %&amp;gt;% # 使用xgboost引擎&#10; set_mode(&amp;quot;regression&amp;quot;) # 设置为回归模式&#10;&#10;# 提取模型的超参数集&#10;mod_param &amp;lt;- extract_parameter_set_dials(mod_spec)&#10;&#10;# 设置随机种子确保结果可复现&#10;set.seed(1234)&#10;&#10;# 创建随机超参数网格（50种组合）&#10;model_tbl &amp;lt;- &#10; mod_param %&amp;gt;% &#10; grid_random(size = 50) %&amp;gt;%&#10; create_model_grid(&#10; f_model_spec = boost_tree,&#10; engine_name = &amp;quot;xgboost&amp;quot;,&#10; mode = &amp;quot;regression&amp;quot;&#10; )&#10;&#10;# 从网格中提取模型列表&#10;model_list &amp;lt;- model_tbl$.models&#10;&#10;# 创建工作流集，将预处理配方与不同模型规格组合&#10;model_wfset &amp;lt;- &#10; workflow_set(&#10; preproc = list(recipe_ml), # 使用之前定义的预处理配方&#10; models = model_list, # 使用超参数网格生成的模型列表&#10; cross = TRUE # 交叉组合配方和模型&#10; )&#10;&#10;# 使用并行计算加速模型训练&#10;model_parallel_tbl &amp;lt;- &#10; model_wfset %&amp;gt;%&#10; modeltime_fit_workflowset(&#10; data = df_train, # 使用训练集数据&#10; control = control_fit_workflowset(&#10; verbose = TRUE, # 显示训练进度&#10; allow_par = TRUE # 允许并行计算&#10; )&#10; )&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## ℹ Fitting Model: 1&#10;## ✔ Model Successfully Fitted: 1&#10;## ℹ Fitting Model: 2&#10;## ✔ Model Successfully Fitted: 2&#10;## ℹ Fitting Model: 3&#10;## ✔ Model Successfully Fitted: 3&#10;## ℹ Fitting Model: 4&#10;## ✔ Model Successfully Fitted: 4&#10;## ℹ Fitting Model: 5&#10;## ✔ Model Successfully Fitted: 5&#10;## ℹ Fitting Model: 6&#10;## ✔ Model Successfully Fitted: 6&#10;## ℹ Fitting Model: 7&#10;## ✔ Model Successfully Fitted: 7&#10;## ℹ Fitting Model: 8&#10;## ✔ Model Successfully Fitted: 8&#10;## ℹ Fitting Model: 9&#10;## ✔ Model Successfully Fitted: 9&#10;## ℹ Fitting Model: 10&#10;## ✔ Model Successfully Fitted: 10&#10;## ℹ Fitting Model: 11&#10;## ✔ Model Successfully Fitted: 11&#10;## ℹ Fitting Model: 12&#10;## ✔ Model Successfully Fitted: 12&#10;## ℹ Fitting Model: 13&#10;## ✔ Model Successfully Fitted: 13&#10;## ℹ Fitting Model: 14&#10;## ✔ Model Successfully Fitted: 14&#10;## ℹ Fitting Model: 15&#10;## ✔ Model Successfully Fitted: 15&#10;## ℹ Fitting Model: 16&#10;## ✔ Model Successfully Fitted: 16&#10;## ℹ Fitting Model: 17&#10;## ✔ Model Successfully Fitted: 17&#10;## ℹ Fitting Model: 18&#10;## ✔ Model Successfully Fitted: 18&#10;## ℹ Fitting Model: 19&#10;## ✔ Model Successfully Fitted: 19&#10;## ℹ Fitting Model: 20&#10;## ✔ Model Successfully Fitted: 20&#10;## ℹ Fitting Model: 21&#10;## ✔ Model Successfully Fitted: 21&#10;## ℹ Fitting Model: 22&#10;## ✔ Model Successfully Fitted: 22&#10;## ℹ Fitting Model: 23&#10;## ✔ Model Successfully Fitted: 23&#10;## ℹ Fitting Model: 24&#10;## ✔ Model Successfully Fitted: 24&#10;## ℹ Fitting Model: 25&#10;## ✔ Model Successfully Fitted: 25&#10;## ℹ Fitting Model: 26&#10;## ✔ Model Successfully Fitted: 26&#10;## ℹ Fitting Model: 27&#10;## ✔ Model Successfully Fitted: 27&#10;## ℹ Fitting Model: 28&#10;## ✔ Model Successfully Fitted: 28&#10;## ℹ Fitting Model: 29&#10;## ✔ Model Successfully Fitted: 29&#10;## ℹ Fitting Model: 30&#10;## ✔ Model Successfully Fitted: 30&#10;## ℹ Fitting Model: 31&#10;## ✔ Model Successfully Fitted: 31&#10;## ℹ Fitting Model: 32&#10;## ✔ Model Successfully Fitted: 32&#10;## ℹ Fitting Model: 33&#10;## ✔ Model Successfully Fitted: 33&#10;## ℹ Fitting Model: 34&#10;## ✔ Model Successfully Fitted: 34&#10;## ℹ Fitting Model: 35&#10;## ✔ Model Successfully Fitted: 35&#10;## ℹ Fitting Model: 36&#10;## ✔ Model Successfully Fitted: 36&#10;## ℹ Fitting Model: 37&#10;## ✔ Model Successfully Fitted: 37&#10;## ℹ Fitting Model: 38&#10;## ✔ Model Successfully Fitted: 38&#10;## ℹ Fitting Model: 39&#10;## ✔ Model Successfully Fitted: 39&#10;## ℹ Fitting Model: 40&#10;## ✔ Model Successfully Fitted: 40&#10;## ℹ Fitting Model: 41&#10;## ✔ Model Successfully Fitted: 41&#10;## ℹ Fitting Model: 42&#10;## ✔ Model Successfully Fitted: 42&#10;## ℹ Fitting Model: 43&#10;## ✔ Model Successfully Fitted: 43&#10;## ℹ Fitting Model: 44&#10;## ✔ Model Successfully Fitted: 44&#10;## ℹ Fitting Model: 45&#10;## ✔ Model Successfully Fitted: 45&#10;## ℹ Fitting Model: 46&#10;## ✔ Model Successfully Fitted: 46&#10;## ℹ Fitting Model: 47&#10;## ✔ Model Successfully Fitted: 47&#10;## ℹ Fitting Model: 48&#10;## ✔ Model Successfully Fitted: 48&#10;## ℹ Fitting Model: 49&#10;## ✔ Model Successfully Fitted: 49&#10;## ℹ Fitting Model: 50&#10;## ✔ Model Successfully Fitted: 50&#10;## Total time | 22.065 seconds&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 评估模型在测试集上的准确性&#10;model_parallel_tbl %&amp;gt;% &#10; modeltime_calibrate(new_data = df_test) %&amp;gt;% # 校准模型&#10; modeltime_accuracy() %&amp;gt;% # 计算准确性指标&#10; table_modeltime_accuracy() # 以表格形式展示结果&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Warning: There were 12 warnings in `dplyr::mutate()`.&#10;## The first warning was:&#10;## ℹ In argument: `.nested.col = purrr::map(...)`.&#10;## Caused by warning:&#10;## ! A correlation computation is required, but `estimate` is constant and has 0&#10;## standard deviation, resulting in a divide by 0 error. `NA` will be returned.&#10;## ℹ Run `dplyr::last_dplyr_warnings()` to see the 11 remaining warnings.&lt;/code&gt;&lt;/pre&gt;&#10;&lt;div class="reactable html-widget html-fill-item" id="htmlwidget-1" style="width:auto;height:auto;"&gt;&lt;/div&gt;&#10;&lt;script type="application/json" data-for="htmlwidget-1"&gt;{"x":{"tag":{"name":"Reactable","attribs":{"data":{".model_id":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],".model_desc":["RECIPE_BOOST_TREE_1","RECIPE_BOOST_TREE_2","RECIPE_BOOST_TREE_3","RECIPE_BOOST_TREE_4","RECIPE_BOOST_TREE_5","RECIPE_BOOST_TREE_6","RECIPE_BOOST_TREE_7","RECIPE_BOOST_TREE_8","RECIPE_BOOST_TREE_9","RECIPE_BOOST_TREE_10","RECIPE_BOOST_TREE_11","RECIPE_BOOST_TREE_12","RECIPE_BOOST_TREE_13","RECIPE_BOOST_TREE_14","RECIPE_BOOST_TREE_15","RECIPE_BOOST_TREE_16","RECIPE_BOOST_TREE_17","RECIPE_BOOST_TREE_18","RECIPE_BOOST_TREE_19","RECIPE_BOOST_TREE_20","RECIPE_BOOST_TREE_21","RECIPE_BOOST_TREE_22","RECIPE_BOOST_TREE_23","RECIPE_BOOST_TREE_24","RECIPE_BOOST_TREE_25","RECIPE_BOOST_TREE_26","RECIPE_BOOST_TREE_27","RECIPE_BOOST_TREE_28","RECIPE_BOOST_TREE_29","RECIPE_BOOST_TREE_30","RECIPE_BOOST_TREE_31","RECIPE_BOOST_TREE_32","RECIPE_BOOST_TREE_33","RECIPE_BOOST_TREE_34","RECIPE_BOOST_TREE_35","RECIPE_BOOST_TREE_36","RECIPE_BOOST_TREE_37","RECIPE_BOOST_TREE_38","RECIPE_BOOST_TREE_39","RECIPE_BOOST_TREE_40","RECIPE_BOOST_TREE_41","RECIPE_BOOST_TREE_42","RECIPE_BOOST_TREE_43","RECIPE_BOOST_TREE_44","RECIPE_BOOST_TREE_45","RECIPE_BOOST_TREE_46","RECIPE_BOOST_TREE_47","RECIPE_BOOST_TREE_48","RECIPE_BOOST_TREE_49","RECIPE_BOOST_TREE_50"],".type":["Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test"],"mae":[3427.41,3693.7,4332.08,5324.17,3338.1,3204.96,3078.92,3418.09,3493.16,1435.28,2400.65,3591.03,7976.25,4047.48,3561.98,2942.64,2727.6,4147.96,4218.05,6301.8,1883.95,2620.27,11907.92,9158.61,16641.88,2622.77,1123.06,3291.36,3731.53,3267.55,3298.09,3999.73,7986.47,7091.48,2850.35,9948.4,3882.81,1403.43,4618.44,3618.64,1903.92,3483.62,1946.15,6692.92,3249.41,2129.04,6187.97,3329.09,3447.82,3949.36],"mape":[16.38,17.81,20.81,25.67,16.07,15.32,14.81,16.46,16.7,6.75,11.5,17.16,38.76,19.55,17.16,14.04,13.1,20.04,20.22,30.57,8.94,12.58,57.97,44.54,81.12,12.51,5.26,15.77,18,15.67,15.88,19.32,38.74,34.37,13.63,48.4,18.75,6.61,22.21,17.45,9.06,16.78,9.27,32.43,15.65,10.16,30.01,15.87,16.62,18.92],"mase":[4.68,5.04,5.91,7.27,4.56,4.38,4.2,4.67,4.77,1.96,3.28,4.9,10.89,5.53,4.86,4.02,3.72,5.66,5.76,8.6,2.57,3.58,16.26,12.51,22.72,3.58,1.53,4.49,5.09,4.46,4.5,5.46,10.9,9.68,3.89,13.58,5.3,1.92,6.31,4.94,2.6,4.76,2.66,9.14,4.44,2.91,8.45,4.55,4.71,5.39],"smape":[18.33,19.67,23.89,29.94,17.6,17.01,16.11,18.06,18.7,7.15,12.31,19.3,48.15,21.77,18.9,15.55,14.17,22.38,23.06,36.18,9.53,13.57,81.7,57.37,136.48,13.62,5.52,17.42,19.89,17.26,17.37,21.48,48.27,41.72,14.88,63.92,20.79,6.97,25.45,19.23,9.61,18.44,9.84,38.89,17.08,10.83,35.41,17.82,18.23,21.48],"rmse":[3924.06,3839.53,4835.9,5645.15,3501.61,3680.14,3244.57,3580.67,3989.87,1859.11,2604.44,4107.19,8039.09,4169.95,3720.66,3484.57,2954.76,4267.55,4687.98,6381.15,2236.95,2843.35,11950.1,9213.39,16672.09,3017.81,1530.27,3645.34,3875.05,3574.1,3467.13,4123.62,8099.8,7216.69,3197.56,9998.86,4010.32,1782.33,4981.11,3757.13,2169.9,3640.02,2221.36,6810.63,3402.37,2380.42,6268.77,3943.18,3590.8,4460.67],"rsq":[0.22,0.09,0.11,0.21,0.06,0.19,0.01,0.09,0.25,0.09,0.09,0.27,"NA","NA",0.09,0.15,0,"NA",0.28,"NA",0.09,0.01,"NA","NA","NA",0.14,0.08,0.19,0.09,0.14,0.06,"NA",0.24,0.23,0.18,"NA","NA",0.09,0.25,0.09,0.09,0.09,0.09,0.23,0.09,0.09,"NA",0.28,"NA",0.21]},"columns":[{"id":".model_id","name":".model_id","type":"numeric"},{"id":".model_desc","name":".model_desc","type":"character"},{"id":".type","name":".type","type":"character"},{"id":"mae","name":"mae","type":"numeric"},{"id":"mape","name":"mape","type":"numeric"},{"id":"mase","name":"mase","type":"numeric"},{"id":"smape","name":"smape","type":"numeric"},{"id":"rmse","name":"rmse","type":"numeric"},{"id":"rsq","name":"rsq","type":"numeric"}],"searchable":true,"defaultExpanded":true,"showSortable":true,"dataKey":"719a9363636e9045a4bf916efdc2e3a3"},"children":[]},"class":"reactR_markup"},"evals":[],"jsHooks":[]}&lt;/script&gt;&#10;&lt;pre class="r"&gt;&lt;code&gt;# 选择表现最好的模型（这里假设是RECIPE_BOOST_TREE_27）&#10;# 并在测试集上进行校准&#10;calibration_tbl &amp;lt;- &#10; model_parallel_tbl %&amp;gt;%&#10; filter(.model_desc == &amp;quot;RECIPE_BOOST_TREE_27&amp;quot;) %&amp;gt;% &#10; modeltime_calibrate(df_test)&#10;&#10;# 生成预测并绘制预测区间&#10;calibration_tbl %&amp;gt;% &#10; modeltime_forecast(&#10; new_data = df_test, # 在测试集上进行预测&#10; actual_data = df_merged %&amp;gt;%&#10; filter(date &amp;gt;= as.Date(&amp;quot;2024-07-01&amp;quot;)) # 实际数据从2024-07-01开始&#10; ) %&amp;gt;%&#10; plot_modeltime_forecast(&#10; .interactive = FALSE, # 生成静态图表&#10; .legend_show = FALSE, # 不显示图例&#10; .line_size = 1.5, # 设置线条粗细&#10; .color_lab = &amp;quot;&amp;quot;, # 设置颜色标签&#10; .title = &amp;quot;NASDAQ 100&amp;quot; # 设置图表标题&#10; ) +&#10; # 添加副标题（使用markdown格式）&#10; labs(subtitle = &amp;quot;&amp;lt;span style = &amp;#39;color:dimgrey;&amp;#39;&amp;gt;预测区间&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;lt;span style = &amp;#39;color:red;&amp;#39;&amp;gt;机器学习模型&amp;lt;/span&amp;gt;&amp;quot;) + &#10; # 设置x轴（日期）格式&#10; scale_x_date(&#10; expand = expansion(mult = c(.1, .15)), # 设置x轴扩展&#10; labels = scales::label_date(format = &amp;quot;%b&amp;#39;%y&amp;quot;) # 设置日期标签格式&#10; ) +&#10; # 设置y轴（纳斯达克指数）格式为货币格式&#10; scale_y_continuous(labels = scales::label_currency()) +&#10; # 设置图表主题&#10; theme_minimal(base_family = &amp;quot;Roboto Slab&amp;quot;, base_size = 20) +&#10; theme(&#10; legend.position = &amp;quot;none&amp;quot;, # 不显示图例&#10; plot.background = element_rect(fill = &amp;quot;azure&amp;quot;, color = &amp;quot;azure&amp;quot;), # 设置背景颜色&#10; plot.title = element_text(face = &amp;quot;bold&amp;quot;), # 设置标题字体为粗体&#10; axis.text = element_text(face = &amp;quot;bold&amp;quot;), # 设置坐标轴标签字体为粗体&#10; plot.subtitle = ggtext::element_markdown(face = &amp;quot;bold&amp;quot;) # 设置副标题为markdown格式并加粗&#10; )&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning&#10;## -Inf&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;img src="https://gewutang.cn/2025/07/14/xboost/index_files/figure-html/unnamed-chunk-1-2.png" width="672" /&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div id="四竞争算法" class="section level1"&gt;&#10;&lt;h1&gt;四、竞争算法&lt;/h1&gt;&#10;&lt;p&gt;XGBoost 的主要竞争对手包括：&lt;/p&gt;&#10;&lt;div id="lightgbm" class="section level2"&gt;&#10;&lt;h2&gt;1. LightGBM&lt;/h2&gt;&#10;&lt;p&gt;开发者：微软（2017 年发布）。&lt;/p&gt;&#10;&lt;p&gt;特点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;基于直方图的决策树构建，速度比 XGBoost 更快。&lt;/li&gt;&#10;&lt;li&gt;支持 Leaf-wise（按叶子生长）的树生长策略，而不是 XGBoost 的 Level-wise（按层生长）。&lt;/li&gt;&#10;&lt;li&gt;内存占用更小，适合大规模数据集。&lt;/li&gt;&#10;&lt;li&gt;适用场景：超大规模数据集、需要快速迭代的场景。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;div id="catboost" class="section level2"&gt;&#10;&lt;h2&gt;2. CatBoost&lt;/h2&gt;&#10;&lt;p&gt;开发者：Yandex（2017 年发布）。&lt;/p&gt;&#10;&lt;p&gt;特点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;自动处理类别特征（无需手动编码）。&lt;/li&gt;&#10;&lt;li&gt;采用对称树结构，减少过拟合风险。&lt;/li&gt;&#10;&lt;li&gt;支持 GPU 加速和分布式训练。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;适用场景：包含大量类别特征的数据集（如推荐系统、广告点击预测）。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div id="random-forest" class="section level2"&gt;&#10;&lt;h2&gt;3. Random Forest&lt;/h2&gt;&#10;&lt;p&gt;特点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;基于 Bagging 思想的集成学习算法，并行训练多棵决策树。&lt;/li&gt;&#10;&lt;li&gt;对异常值和过拟合更鲁棒。&lt;/li&gt;&#10;&lt;li&gt;计算复杂度较低，但预测精度可能低于 Boosting 算法。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;适用场景：快速 baseline 模型、对解释性要求较高的场景。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div id="neural-networks神经网络" class="section level2"&gt;&#10;&lt;h2&gt;4. Neural Networks（神经网络）&lt;/h2&gt;&#10;&lt;p&gt;特点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;适用于非结构化数据（如图像、文本、语音）。&lt;/li&gt;&#10;&lt;li&gt;需要大量数据才能表现良好。&lt;/li&gt;&#10;&lt;li&gt;计算资源消耗大，训练时间长。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;适用场景：深度学习擅长的领域（如计算机视觉、自然语言处理）。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="五算法选择建议" class="section level1"&gt;&#10;&lt;h1&gt;五、算法选择建议&lt;/h1&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;数据规模较小：可尝试 Random Forest 或 CatBoost（处理类别特征更方便）。&lt;/li&gt;&#10;&lt;li&gt;数据规模中等：XGBoost 和 LightGBM 均可，XGBoost 更成熟，LightGBM 速度更快。&lt;/li&gt;&#10;&lt;li&gt;包含大量类别特征：优先使用 CatBoost。&lt;/li&gt;&#10;&lt;li&gt;追求极致速度：选择 LightGBM。&lt;/li&gt;&#10;&lt;li&gt;非结构化数据：考虑神经网络（如 CNN、Transformer）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;XGBoost 的优势在于其高效性、灵活性和广泛的应用场景，尤其在 Kaggle 竞赛和工业界的结构化数据分析中表现突出。&lt;/p&gt;&#10;&lt;/div&gt;&#10;</description></item></channel></rss>