Stata如何做机器学习?——SHAP解释框架下的足球运动员价值驱动因素识别:基于H2O集成学习模型

SHAP解释框架下的足球运动员价值驱动因素识别------基于H2O集成学习模型⚽

欢迎关注 「阿水实证通」,前沿方法时刻看!🌟🌟🌟

文章目录

聚焦:决策树的足球运动员集合⚽

你是否拥有一个大型数据集?数据中是否存在复杂的、可能是非线性的关系?你是否不确定哪些预测变量最为重要?如果对上述任何一个问题的回答是"是",那么机器学习可能是处理你的数据的合适选择。

幸运的是,你不必成为程序员也能有效使用这些方法。借助H2O的支持,现在你可以在Stata中使用新的h2oml命令套件进行机器学习。流线型的H2O集成和图形界面使执行用于回归、二元分类和多分类的梯度提升机(GBM)和随机森林(RF)变得轻松。

在这篇聚焦文章中,我们通过分析场上表现指标如何预测足球运动员的平均市场价值------这是球员转会、合同谈判和足球行业整体估值的关键因素------来展示基本的H2O工作流程。我们将训练两个模型进行预测比较,并使用选定的模型解释预测变量的影响。

数据探索热身♾️

我们的分析始于一个从两个不同来源(GitHub)和Kaggle)合并的数据集(https://www.stata.com/stata-news/news40-3/ensemble-decision-trees/fifa.dta),其中包含2023年以来1000多名不同球员的观测数据。你可以使用以下命令获取这些数据:

复制代码
. use https://www.stata.com/users/lil/fifa, clear

我们生成箱线图,按位置可视化以百万欧元为单位的市场价值分布:

复制代码
. graph hbox mil_average_market_value, over(position) title("Market value distribution by position")
     ytitle("Market value (in millions)")

想知道最右边那个点是谁吗?那是法国前锋基利安·姆巴佩。在本文结尾,我们将探究他为何价值如此之高。

由于存在异常值和右偏分布,我们选择应用对数变换来稳定方差,这可能有助于我们的模型在后续更准确地泛化:

复制代码
. generate ln_average_market_value = log(average_market_value)

准备H2O开始分析 👍

让我们演示如何从Stata开始使用H2O。首先,h2o init 启动一个新的H2O集群,在Stata和H2O之间建立连接。接下来,我们将当前的Stata数据集传输到一个名为fifa的H2O框架中,并使其成为后续操作的当前活动框架:

复制代码
. h2o init
(output omitted)

. _h2oframe put, into(fifa) current

Progress (%): 0 100

现在我们已经建立了H2O环境,开始为机器学习准备数据。我们使用_h2oframe toenum将字符串变量转换为分类(枚举)类型。为了验证这种编码是否正确,我们运行_h2oframe describe

复制代码
. _h2oframe toenum position nationality league_rank, replace

. _h2oframe describe

          Rows:      1108
          Cols:        21



Column          Type        Missing     Zeros      +Inf      -Inf  Cardinality

name            string            0         0         0         0
position        enum              0       269         0         0            4
age             int               0         0         0         0
height          int               0         0         0         0
league_rank     enum              0       281         0         0            5
average_marke~e real              0         0         0         0
highest_marke~e int               0         0         0         0
total_played_~s int               0         0         0         0
average_minut~d real              0         0         0         0
average_assis~e real              0       419         0         0         0
total_assists   int               0       419         0         0         0
assist_per_mi~e real              0       419         0         0         0
average_goals~e real              0       414         0         0         0
total_goals     int               0       414         0         0         0
goals_per_min~e real              0       414         0         0         0
total_yellow_~s int               0       163         0         0         0
team_win_ratio  real              0         1         0         0         0
data_year       int               0         0         0         0
nationality     enum              0         6         0         0           73
mil_average_m~e real              0         0         0         0
ln_average_ma~e real              0         0         0         0

最后一步是使用_h2oframe split将数据分为训练集和测试集。我们使用标准的训练-测试拆分,分配80%的数据用于训练,保留剩余20%用于测试,并设置随机种子以确保可重复性:

复制代码
. _h2oframe split fifa, into(train test) split (0.8, 0.2) rseed(19)

机器学习实战

我们准备开始训练!首先,我们切换框架,使训练数据集成为工作框架:

复制代码
. _h2oframe change train

我们定义全局宏predictors来存储模型将使用的变量,这些变量包括球员人口统计信息、联赛信息、表现指标以及其他行为和球队成功指标:

复制代码
. global predictors position age height nationality league_rank average_minutes_played
     average_goals_per_game average_assists_per_game total_yellow_cards team_win_ratio

我们首先实现随机森林回归,使用cv()选项应用三折交叉验证,并使用h2orseed()选项确保可重复性:

复制代码
. h2oml rfregress ln_average_market_value $predictors, cv(3) h2orseed(19)

Progress (%): 0 28.9 100

Random forest regression using H2O

Response: ln_average_market_value
Frame:                                 Number of observations:
  Training: train                                  Training =    877
                                           Cross-validation =    877
Cross-validation: Random               Number of folds      =      3

Model parameters

Number of trees      =   50
              actual =   50
Tree depth:                            Pred. sampling value =     -1
           Input max =   20            Sampling rate        =   .632
                 min =   17            No. of bins cat.     =  1,024
                 avg = 18.9            No. of bins root     =  1,024
                 max =   20            No. of bins cont.    =     20
Min. obs. leaf split =    1            Min. split thresh.   = .00001

Metric summary



                             Cross-
    Metric     Training  validation

  Deviance     .6068654    .6541131
       MSE     .6068654    .6541131
      RMSE     .7790156    .8087726
     RMSLE     .0480274    .0497248
       MAE     .6133148    .6394611
 R-squared     .6423362    .6144901

在这个例子中,我们主要关注均方误差(MSE)作为整体拟合优度的关键指标。使用这个模型,我们通过交叉验证得到的MSE为0.65,作为基准性能水平。让我们看看是否可以通过调优降低这个值。

调优是通过调整超参数来调整模型的过程。为了演示,我们将仅通过比较20到80棵树的模型来调整树的数量。有关RF的可调整选项的完整列表,请参阅 h2oml rf(https://www.stata.com/manuals/h2omlh2omlrf.pdf)

复制代码
. h2oml rfregress ln_average_market_value $predictors, cv(3) h2orseed(19)
     ntrees(20(10)80)

Progress (%): 0 100

Random forest regression using H2O

Response: ln_average_market_value
Frame:                                 Number of observations:
  Training: train                                  Training =    877
                                           Cross-validation =    877
Cross-validation: Random               Number of folds      =      3

Tuning information for hyperparameters

Method: Cartesian
Metric: Deviance



                                        Grid values
 Hyperparameters            Minimum         Maximum         Selected

 Number of trees                 20              80               70


Model parameters

Number of trees      =   70
              actual =   70
Tree depth:                            Pred. sampling value =     -1
           Input max =   20            Sampling rate        =   .632
                 min =   17            No. of bins cat.     =  1,024
                 avg = 18.9            No. of bins root     =  1,024
                 max =   20            No. of bins cont.    =     20
Min. obs. leaf split =    1            Min. split thresh.   = .00001

Metric summary


                             Cross-
    Metric     Training  validation

  Deviance      .587266    .6434246
       MSE      .587266    .6434246
      RMSE     .7663328    .8021375
     RMSLE     .0472597    .0493562
       MAE     .6040548    .6320858
 R-squared     .6538873    .6207895

我们将MSE适度降低到0.64。在实践中,我们会继续调优以找到交叉验证MSE最低的模型。让我们继续存储这个模型:

复制代码
. h2omlest store rf

接下来,我们使用相同的三折交叉验证、随机数种子和树网格训练梯度提升回归,并存储此模型。

复制代码
. h2oml gbregress ln_average_market_value $predictors, cv(3) h2orseed(19)
     ntrees(20(10)80)

Progress (%): 0 100

Gradient boosting regression using H2O

Response: ln_average_market_value
Loss:     Gaussian
Frame:                                 Number of observations:
  Training: train                                 Training =    877
                                          Cross-validation =    877
Cross-validation: Random               Number of folds     =      3

Tuning information for hyperparameters

Method: Cartesian
Metric: Deviance



                                        Grid values
 Hyperparameters           Minimum          Maximum        Selected

 Number of trees                20               80              80



Model parameters

Number of trees      =  80             Learning rate       =     .1
              actual =  80             Learning rate decay =      1
Tree depth:                            Pred. sampling rate =      1
           Input max =   5             Sampling rate       =      1
                 min =   5             No. of bins cat.    =  1,024
                 avg = 5.0             No. of bins root    =  1,024
                 max =   5             No. of bins cont.   =     20
Min. obs. leaf split =  10             Min. split thresh.  = .00001

Metric summary


                             Cross-
    Metric     Training  validation

  Deviance     .1025126    .6337925
       MSE     .1025126    .6337925
      RMSE     .3201759    .7961109
     RMSLE     .0198991    .0492887
       MAE       .23022    .6083482
 R-squared     .9395829    .6264663

. h2omlest store gbm

为了帮助我们选择模型,我们使用h2oml 事后估计命令在测试样本上评估其预测性能。首先,我们使用h2omlest restore 恢复每个模型。然后,我们使用h2omlpostestframe test 激活测试数据集进行评估。准备好两个模型后,我们运行h2omlgof来比较它们在测试数据上的性能指标:

复制代码
. h2omlest restore rf
(results rf are active now)

. h2omlpostestframe test
(testing frame test is now active for h2oml postestimation)

. h2omlest restore gbm
(results gbm are active now)

. h2omlpostestframe test
(testing frame test is now active for h2oml postestimation)

. h2omlgof rf gbm

Performance metrics for model comparison using H2O
Testing frame: test


                                rf        gbm

Testing
  No. of observations          231        231
             Deviance     .5692276   .5008833
                  MSE     .5692276   .5008833
                 RMSE     .7544718   .7077311
                RMSLE     .0458549   .0430169
                  MAE     .6169705    .567296
            R-squared     .6051586   .6525652

GBM在测试集中具有最低的MSE,证明了其优越的预测性能。如果我们有兴趣在测试数据中进行预测,可以在恢复我们选择的模型后使用h2omlpredict

复制代码
. h2omlest restore gbm
(results gbm are active now)

. h2omlpredict gbm_pred_value

Progress (%): 0 100

利用变量重要性和SHAP解读洞见

现在我们已经选择了性能最佳的模型,我们通过使用h2omlgraph varimp绘制变量重要性图来检查其预测变量的影响。在基于树的模型中,变量重要性通过每个预测变量的分裂导致的MSE总减少量来衡量:

复制代码
. h2omlgraph varimp

变量重要性图确定市场价值的前三个预测变量为team_win_ratioagenationality 。相比之下,球员positionheight等变量的重要性较小。

为了进一步解释,我们现在转向SHAP(夏普利加性解释)值,以了解每个预测变量如何对每个球员的预测市场价值做出贡献。让我们使用h2omlgraph shapvalues查看我们最有价值的球员基利安·姆巴佩的SHAP贡献。他的预测平均市场价值(对数变换后)为18.65,比训练数据集的平均预测值15.59高出3.06个单位。我们使用SHAP值来解释这一差异:

复制代码
. h2omlgraph shapvalues, obs(590) title("SHAP values for Kylian Mbappé") frame(fifa)

团队胜率(1.3)、平均每场进球数(0.47)和平均出场时间(0.42)共同贡献了从基线到姆巴佩预测市场价值增长的三分之二以上,表明它们是其高估值的关键驱动因素。

最后,为了在样本层面获得洞见,我们可以使用h2omlgraph shapsummary命令生成SHAP汇总图,也称为蜂群图:

复制代码
. h2omlgraph shapsummary, frame(fifa)

Progress (%): 0 100

在这个图中,每个观测值对应每个预测变量有一个点,其水平位置表示该观测值的预测变量的SHAP值。预测变量的高观测值用红色表示,低观测值用蓝色表示。预测变量在y轴上按其整体SHAP重要性排序。

团队胜率是最强的预测变量,较高的胜率始终提升球员的市场价值。年龄呈现相反的模式------年轻增加价值,而年长降低价值,反映了对年轻球员的溢价。

虽然每个球员的个体预测变量贡献不同,但SHAP汇总结果与变量重要性排名大致一致,表明球队成功、年龄和表现指标是球员估值的最有影响力的驱动因素。

终场哨声

通过H2O,Stata的机器学习工具通过对变量重要性的详细评估,既提供了高预测准确性,又提供了有价值的可解释性。

对咱们实证分析有什么帮助?

上文所提到的H2O集成学习与SHAP解释框架的应用,对于实证分析领域,有何指导意义呢?

一、数据预处理:适配经济变量特性与多源整合逻辑

  1. 分布转换与异常值控制:针对经济学中常见的右偏变量(如收入、资产价格),采用对数变换等方法稳定方差(如文章对球员市场价值的处理),并通过箱线图等可视化工具识别极端值(如球星高估值样本),避免模型被异常点主导。
  2. 多源数据的结构化整合:经济学研究常涉及宏观-微观跨层数据(如行业指标与企业财务数据),需参照文章合并GitHub与Kaggle数据的思路,重点校验时间频率一致性(如季度数据与年度数据对齐)、量纲统一性(如货币单位标准化),并利用H2O等工具的自动缺失值算法(如均值插补、树模型预测填充)提升数据完整性。

二、集成模型与因果推断的协同建模策略

  1. 非线性关系捕捉与模型优化:突破线性回归假设,采用梯度提升机(GBM)、随机森林(RF)等集成模型捕捉经济变量的高阶交互效应(如人力资本理论中"年龄-经验-工资"的非线性关系),通过交叉验证(如3折CV)与超参数网格搜索(如树深度、学习率调优)优化预测精度,以均方误差(MSE)、R²等指标作为模型筛选基准。
  2. 因果机制的双重验证:机器学习模型的预测相关性需与传统计量方法结合:先用集成模型筛选关键变量(如文章中团队胜率、年龄等),再通过工具变量法(IV)、双重差分法(DID)等验证因果关系(如解决"球队胜率与球员能力"的内生性问题),避免将统计关联误判为因果效应。

三、SHAP解释框架与经济理论的双向映射

  1. 变量重要性的经济机理解构:基于H2O输出的特征重要性排序(如球队胜率>年龄>国籍),结合经济学理论解读驱动因素:例如"团队绩效对球员估值的溢出效应"可关联产业组织中的"品牌外部性"理论,"年龄的倒U型影响"对应劳动经济学的"经验溢价衰减"规律。
  2. 个体与总体层面的边际效应分析 :通过SHAP值实现双维度解释:
    • 个体层面:如文章中姆巴佩的SHAP贡献图,可用于分析特定经济主体(如龙头企业、高收入群体)的特征影响路径(如胜率+1.3、进球效率+0.47的价值贡献);
    • 总体层面:借助蜂群图分析变量边际效应异质性(如年龄对价值的非线性影响),对应计量经济学中的"异质性处理效应"分析,为政策模拟(如最低工资调整对不同年龄段就业的影响)提供微观基础。

核心价值:从"预测"到"解释"的经济学研究闭环

上述框架通过集成学习提升复杂经济关系的捕捉能力,以SHAP解释连接数据模式与理论机制,最终实现"数据驱动建模---因果机制验证---经济理论创新"的研究闭环,尤其适用于劳动经济学(工资决定)、行为经济学(决策偏差)、金融经济学(资产定价)等领域的高维非线性问题。

相关推荐
书玮嘎1 小时前
【WIP】【VLA&VLM——InternVL系列】
人工智能·深度学习
猫头虎1 小时前
猫头虎 AI工具分享:一个网页抓取、结构化数据提取、网页爬取、浏览器自动化操作工具:Hyperbrowser MCP
运维·人工智能·gpt·开源·自动化·文心一言·ai编程
要努力啊啊啊1 小时前
YOLOv2 正负样本分配机制详解
人工智能·深度学习·yolo·计算机视觉·目标跟踪
CareyWYR2 小时前
大模型真的能做推荐系统吗?ARAG论文给了我一个颠覆性的答案
人工智能
特立独行的猫a2 小时前
百度AI文心大模型4.5系列开源模型评测,从安装部署到应用体验
人工智能·百度·开源·文心一言·文心一言4.5
SKYDROID云卓小助手2 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理
小陈phd2 小时前
李宏毅机器学习笔记——梯度下降法
人工智能·python·机器学习
CareyWYR2 小时前
每周AI论文速递(250630-250704)
人工智能
Ai墨芯1112 小时前
靠机器学习+组合优化就发了CCF-A
人工智能