news 2026/4/17 21:06:01

如何在 Python 中对面板数据进行交叉验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在 Python 中对面板数据进行交叉验证

原文:towardsdatascience.com/how-to-cross-validate-your-panel-data-in-python-9ad981ddd043?source=collection_archive---------5-----------------------#2024-03-08

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9ba98d4b8300f30aeec7177892adf319.png

西班牙加那利群岛兰萨罗特岛的 Salinas de Janubio。图片来源:imag3s 4 u

使用 PanelSplit 进行面板数据交叉验证简介

https://medium.com/@eric.frey?source=post_page---byline--9ad981ddd043--------------------------------https://towardsdatascience.com/?source=post_page---byline--9ad981ddd043-------------------------------- Eric Frey

·发布于 Towards Data Science ·6 分钟阅读·2024 年 3 月 8 日

动机:作为一名处理面板数据的人员,我经常需要进行交叉验证。这涉及到在某个时间点之前进行训练,在一部分观察数据上进行测试,然后在更远的时间点继续训练,再在不同的观察数据子集上进行测试,并在面板数据集上反复进行这种过程。听起来很熟悉吧?手动实现这个过程可能会非常令人沮丧。为了简化这一过程,我创建了一个名为PanelSplit的包,它能在处理面板数据时提供帮助。

本文展示了如何在处理面板数据时使用 PanelSplit;从特征工程到超参数调优,再到生成预测,PanelSplit 都可以为您提供帮助!

什么是面板数据?

我所说的面板数据是指存在多个实体随时间变化的数据。这些实体可以是国家、个人、组织或任何其他分析单元。对这些多个实体在不同时间点进行了多次观察记录。

什么是交叉验证?

假设我们想要估计在使用模型时预测的准确性。我们该如何进行?标准方法是交叉验证,它涉及将数据分割成连续的多个折叠,每个折叠都有其独特的训练集和测试集。下方的可视化展示了时间序列数据的交叉验证过程。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/17f39de9360687fc291f49de080a28d0.png

时间序列交叉验证的示例。

虽然已经有一个名为TimeSeriesSplit的 scikit-learn 函数可以用于时间序列交叉验证,但它不适用于面板数据。与单一实体的时间序列不同,面板数据包含多个实体,我们需要一个工具来处理多个实体。

这就是 PanelSplit 的作用所在。PanelSplit是一个允许我们将 TimeSeriesSplit 扩展到面板数据的包。它还提供了转换、预测等功能,但在本文中,我将只介绍基本内容。

使用 PanelSplit 执行交叉验证

现在我们已经介绍了什么是面板数据,以及在这种环境下交叉验证的样子,让我们看看如何使用 PanelSplit 执行交叉验证。

首先,让我们生成一些示例数据进行操作:

importpandasaspdimportnumpyasnp# generate example datanum_countries=3years=range(2000,2005)num_years=len(years)data={'country_id':[cforcinrange(1,num_countries+1)for_inyears],'year':[yearfor_inrange(num_countries)foryearinyears],'y':np.random.normal(0,1,num_countries*num_years),'x1':np.random.normal(0,1,num_countries*num_years),'x2':np.random.normal(0,1,num_countries*num_years)}panel_data=pd.DataFrame(data)# display the generated panel datadisplay(panel_data)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ae47ac32ee235a6dc360a5ba0a5095db.png

生成的面板数据。观察的国家有 3 个,时间范围是 2001–2004 年。

生成面板数据集后,我们现在可以应用 PanelSplit。

初始化 PanelSplit

当我们初始化 PanelSplit 时,需要定义我们将使用的交叉验证方法。

!pip install panelsplitfrompanelsplitimportPanelSplit panel_split=PanelSplit(periods=panel_data.year,n_splits=3,gap=0,test_size=1,plot=True)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/46ac5e7af26beffef69e4b1ba42715cc.png

初始化 PanelSplit 时的输出(当 plot=True)。根据我们提供的参数,拆分次数为 3 次,训练集和测试集之间没有间隔,每次拆分的测试集大小为一个周期。

理解 PanelSplit 的工作原理

为了更好地了解拆分的情况,让我们使用split()函数返回每次拆分中的不同训练集和测试集。

splits=panel_split.split()

splits对象包含了交叉验证过程中的 3 次拆分。在每次拆分中,有一个列表,其中包含训练集索引(第一个项)和测试集索引(第二个项)。这些索引是布尔值,表示某一行是否属于某个特定拆分的训练集/测试集。可以利用这些索引对数据进行过滤,选择不同的数据子集,如下图所示。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dcb54e616816b5223fcf3737cbc5acbc.png

演示每次拆分中的不同训练集和测试集。

超参数调整

现在我们已经创建了 PanelSplit 的实例,让我们进行一些超参数调整

在这里,我们进行一个基本的超参数搜索,使用 Ridge 模型,并指定GridSearchCV的 cv 参数为 panel_split。在 GridSearchCV 的拟合过程中,它调用 panel_split 的 split()函数,返回每个训练集和测试集的索引。它使用这些索引来过滤提供给 fit()函数的 X 和 y 数据。

fromsklearn.linear_modelimportRidgefromsklearn.model_selectionimportGridSearchCV param_grid={'alpha':[.1,.5]}# define the hyper-parameter grid space# define the gridsearch and call fit, specifying panel_split for the cv argumentgridsearch=GridSearchCV(estimator=Ridge(),param_grid=param_grid,cv=panel_split)gridsearch.fit(X=panel_data[['x1','x2']],y=panel_data['y'])print(gridsearch.best_params_)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a442388e0853686faa7ca8edac110bd3.png

在这次搜索中,Ridge 模型的最佳 alpha 值为 0.5。

太棒了!我们已经找到了最佳的超参数组合。现在我们可以使用这些参数进行预测。

注意:在实际应用中,我们会区分用于超参数调整的测试集和用于评估性能的测试集,但在这个示例中我们将验证集和测试集保持一致。

使用 cross_val_fit_predict 生成预测

使用 PanelSplit 生成预测非常简单。

使用cross_val_fit_predict,我们指定要使用我们最好的 Ridge 模型、我们的 X 和 y,PanelSplit 将在每个训练集上进行拟合,并在每个测试集上进行预测,每个分割都是如此。

predictions,models=panel_split.cross_val_fit_predict(estimator=Ridge(gridsearch.best_params_),X=panel_data[['x1','x2']],y=panel_data['y'])

预测结果以及拟合模型会返回。如果我们想要在预测中包含标识符,可以使用gen_test_labels生成标签,然后在我们的 predictions_df DataFrame 中创建一个新的 Pandas Series。

predictions_df=panel_split.gen_test_labels(panel_data[['country_id','year']])predictions_df['y_pred']=y_pred display(predictions_df)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/966f0a4c82ab4dfa922575405633e5cb.png

预测的 DataFrame。

PanelSplit 还能做什么?

这只是一个基础演示,但 PanelSplit 可以做更多的事情!例如:

如果您想查看更多示例并亲自尝试 PanelSplit,可以查看我创建的Jupyter notebook,其中我介绍了一些额外的功能。

这是我写的第一个包,所以在这个项目中我学到了很多东西。感谢您的阅读,希望 PanelSplit 能在您的下一个面板数据项目中提供帮助!

注意:除非另有说明,所有图片均由作者提供。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 17:28:22

LangFlow代码生成辅助工具实战搭建

LangFlow代码生成辅助工具实战搭建 在大语言模型(LLM)迅速普及的今天,越来越多团队希望快速验证AI创意——比如构建一个能自动回答客户问题的智能客服,或是一个基于私有知识库的问答助手。然而,直接使用 LangChain 编程…

作者头像 李华
网站建设 2026/4/15 7:21:33

新手教程:手把手教你掌握DRC基本概念与使用场景

从零开始搞懂DRC:为什么你的版图总被“红标”?你有没有过这样的经历——辛辛苦苦画完一块模拟电路,信心满满点下“DRC检查”,结果屏幕上突然冒出几百个红色标记,满屏都是“Violation”?更离谱的是&#xff…

作者头像 李华
网站建设 2026/4/17 20:55:48

为什么你的Mac工作效率总是不高?窗口置顶工具Topit彻底改变工作方式

你是否经常在多个应用窗口间来回切换,只为找到那个被埋没的重要文档?或者因为终端窗口被浏览器覆盖而中断了关键的编译过程?这些看似微小的效率损失,正是Topit窗口置顶工具要为你解决的痛点。 【免费下载链接】Topit Pin any wind…

作者头像 李华
网站建设 2026/4/11 23:44:26

谷歌闪电突袭:Gemini 3免费开放引爆AI革命

一、闪电突袭:免费开放的战略核爆 2025年12月18日凌晨,谷歌以“无预告突袭”方式发布Gemini 3 Flash,并宣布即日起取代前代成为全球数亿Gemini用户的默认免费模型——这意味着普通用户无需付费即可享受Gemini 3系列的顶尖推理能力45。 狙击Op…

作者头像 李华
网站建设 2026/4/17 22:59:05

LangFlow网络安全态势感知系统雏形

LangFlow网络安全态势感知系统雏形 在当今企业网络边界日益模糊、攻击手段愈发隐蔽的背景下,安全团队每天面对的是TB级的日志数据、千变万化的攻击载荷,以及“黄金一小时”应急响应压力。传统的SIEM规则引擎虽然稳定,但面对APT攻击、凭证滥用…

作者头像 李华
网站建设 2026/4/17 13:47:27

如何3分钟掌握Mac窗口管理:终极效率提升完全指南

你是否曾在多任务工作中陷入窗口混乱的困境?重要文档被浏览器遮挡,参考资料在层层叠叠的窗口中消失无踪?Mac窗口管理效率工具Topit正是为解决这一痛点而生,让你的工作流程从此井然有序。 【免费下载链接】Topit Pin any window to…

作者头像 李华