论文链接
原文链接
Proceedings of the Thirty-First AAAI Conference on Artificial Intelligence (AAAI-17)
文中所有的公式都没有弄过来,太麻烦了,都用()代替了,需要对照原文看。

Regularization in Hierarchical Time Series Forecasting with Application to Electricity Smart Meter Data

在电力智能测量数据应用中的分层时间序列预测正则化

摘要

精确的电力需求预测在可持续电力系统中扮演重要角色。很多场景下他帮助对发电和电力调度做更好的决策。电力需求数据经常呈现分层结构。比如一个国家的电力消耗可以被分成省市和用户。分层预测不仅需要在每一层都有较高的准确度,并且需要在不同的层之间具有一致性。为了满足总和约束,当前最好的方法通常在单独的层的预测上做调整。然而高维的误差协方差矩阵中,高维的非惩罚回归问题和估计误差可能导致在调整预测的时候增加变化性,从而导致预测表现变差。(大概这种意思吧,凑合理解)为了在调整估计误差的时候提供一种鲁棒性更强的方法,我们提出了一种新的分层预测算法,在满足总和约束的条件下计算稀疏调整。我们把这个问题表示为高维惩罚回归问题,这个问题可以用循环坐标下降算法高效解决。我们还在一个大规模的分层电力需求数据上做了实验。实验结果表明,不管是在调整的稀疏性还是在预测的准确性上,我们的方法都比当前最好的方法更有效。我们提出的方法在能源利用如太阳能风能等或者大量其他的应用上都将很有用。

介绍

最近,用户最新安装的智能电表搜集了大量的个人电力消耗数据。现在关键的技术挑战是分析这些数据然后更好的预测发电量和用电需求来达到更加可持续的发展的目的。
比如在理解需求反映行动问题上,需求预测是非常关键的。(这句话还是引用的到底什么鬼意思)。在预测合计电量需求问题上有大量的文献。在预测智能电表上的电力需求的文献却比较少。
我们关注分层结构下的电力需求预测问题。大多数的分层下都包含大量的时间序列数据,并且他们的总和也是一条时间序列数据。一层中的不同的时间序列可能会以一种变化的复杂的方式互相影响。特殊来说,不同层的时间序列可能包含完全不同的模式。比如电力需求的底层的时间序列是典型的非常有噪声的,有时还有一些间歇性离散数据什么的,但是加和的电力需求就回比较平滑。
预测这些分层结构的时候,我们必须确保预测满足总和的限制,比如各层的加和和总和必须一致。最简单的预测分层数据的方法就是把底层的单独的序列预测加起来。然而底层数据的高噪声和误差相关性导致高层预测的准确度很差。取而代之的方法可能是单独预测所有层级的每一条时间序列,但是这样由于不满足加和相等的限制仍不能让人满意。
Hyndman这个人呢2011年提出计算修订预测,修订不同层单独的预测来满足最后的加和统一。这个方法呢是通过计算对错误预测协方差信息的线性回归来得到的最优化预测组合。Williams这个人在2016年使用了相似的基于回归的预测组合方法在一个没有分层结构的数据集上进行了自适应的组合温度预测(啥?不是没有分层结构吗,怎么还用预测组合,什么鬼。)Mijung和marcel这两个人在2014年提出了一个在贝叶斯网络中基于预测分解的自上而下的预测方法。然而Hyndman这个人他说,任何自上而下的方法都会引入偏差,即使基础的预测是无偏的。哦。
在预测误差的协方差结构的强假设下,Hyndam这个人用简单的最小二乘法计算了这个修订预测。在Hyndman,Lee等等人在2016年的文章中和Wickramasuriya等人在2015年的文章中对Hyndman在2011年提出的这个算法进行了扩展,提出了对误差协方差矩阵的弱假设,并且有更好的计算复杂度。
在所有这些算法中,采用了修正的预测算法,在基础预测中加了调整,为了在分层结构的上层满足总和约束。然而在高维误差协方差矩阵中高维的非惩罚回归和预估误差可能导致调整预测的不确定性的增加,从而预测表现变差。
我们提出了一个新的结构化预测算法,在满足总和约束的条件下在基础预测中寻找稀疏调整。这个算法是基于高维的生成的有弹性的网络回归问题。在这种构想下,允许一些基础的预测保持不变,这样会使得调整的时候的估计误差更有鲁棒性。另一个优点是,我们提出的方法能在自底向上的预测和最佳线性无偏调整预测两者之间动态切换。最后通过增加一个额外的限制,我们的算法能够处理非负的调整预测问题,这很重要,因为有的数据必须是非负的,比如说电力需求。

分层的时间序列预测

一个分层时间序列是一个有层级结构的多变量时间序列。 y t 代表 t 时间包含所有变量的一个 n 维向量,而 b t 代表底层的向量。那么

y t = S b t , ( 1 )
()是一个求和矩阵,同样也可以写成()
a t 是在不同的合计层的 n 维向量,()是一个单位矩阵。
给定()历史观测值(),均方误差损失下的()步预测是这样的(),这里()。
式子3提出了一个预测的()的期望的估计值,比如对结构中的所有序列,更清晰的来说可以这样表示()
()是()的平均估计,这里所说的预测都是自下而上的预测。
实际上,在大多数的合计层很难预测准确,因为信噪比太低。所以自底向上的预测方法通常在上层的预测效果很差。
另一种法法叫做自顶向下的预测方法,这种方法先预测最顶部的合计序列,然后根据历史数据的比例进行分解。这种方法跟自底向上的方法相比就是预测的时候信噪比比较高。然而,这种方法的准确度依赖分解过程,并且所有的中间信息和最底层的情况是被忽略的。
既不分解也不聚合,还可以每一层都单独的做预测,比如每一层都估计,这样的话就是这样表示的:(),
我们叫这种方法叫基础的预测。
这样的话有很大的灵活性,比如我们可以在不同的层用不同的方法,比如在高层用高级的方法,获得平滑的结果,低层用简单的方法获得高信噪比。
但是,由于预测误差的存在,基础预测无法和加和限制所匹配,我们把这种一致误差定义如下:()
如果误差等于0,此时多层预测符合加和一致性。
定义3中的最佳预测定义为聚合一致的,所以一定满足聚合一致性。同样从决策制定的角度上来说,这样的约束能够保证整体决策的一致性。
Hyndman观察到所有的已有的层级预测都可以写成下面这种形式。()是选择的适当的矩阵,右边是基础预测,左边是修正的预测。
换句话说,已经存在的方法就是计算一个线性组合,低层的预测的线性组合相加得到上层的预测结果,从而得到整个结构的预测结果。
比如说,自底向上的预测中这个()矩阵是这样的(),自顶向下的矩阵是这样的(),其中()是一个加和为1的向量。当然,可以只要合理,也可以用别的方法定义矩阵()

最佳线性无偏修订预测

找到最佳的()的一种方法就是最小化均方误差(),这里的()就是由7得到的。
在基础预测是无偏估计的假设下,Wickramasuriya等这些人表明在求最优(比如方差最小)线性无偏修正预测问题上存在闭式解。这个解就是:()
其中()是()步预测误差的正定协方差矩阵,如下()其中()我们将用()来指代这个方法。
用式子9计算()包含了一个()的转置矩阵,()是层级中所有的序列数量。通过利用()的特定结构,我们可以写成这样()
这里()
此时只需要一个()矩阵的转置,()是层级()的序列数量。这个量比()顺序减小很多。
总之,这个()修订预测方法整个结构可以这样来运算(),其中()是这样的()

预测误差协方差估计

这个BLU(最优线性无偏)修正估计按照14式子来算依赖误差协方差矩阵(),从式子9中可以看到。但是实际中,这个矩阵是得不到而需要通过历史基础预测误差估计的。Wickramasuriya这些人就说,既然这个()这么难估计,那我们就假设(),这样这个矩阵就可以通过()来估计了。
这个式子中,()是一个正则化常亮()是一个随时间衰减的指数参数,这使得最近的观测值更重要。当()并且()的时候,这个式子就变成了一个单样本的协方差。
然而,既然在现实中这个矩阵()是高维的,也就是(),那单样本的协方差估计由于估计误差积累,表现将会显著变差。在实际中,样本的协方差矩阵不总是正定的,所以有时不可逆。
为了克服这些困难,我们可以在矩阵元素上做一些结构假设。比如Hyndman这个人啊,到现在都还是他,醉了,他2011年就用()最简单的假设了。Hyndman这几个人2016年用(),其中()是对每个序列的基本预测误差方差估计。
在我们的工作中,我们将使用一个收缩估计(),()是收缩因子。结果是当对角元素不变的时候,非对角元素就向0收缩。Schafer等人2005年提出了这个最佳收缩因子的闭式表示()
这里的()是样本协方差矩阵()的()元素。同样的收缩估计还被用在Wickramasuriya等人在2015年的旅游业问题估计上。

分层预测中的正则化

14式中的MinT底层调整预测算法也可以通过广义最小乘(GLS)法来算出,回归模型如下:()
其中()()
之前的回归模型是高维的,因为引入了()观测值,并且()预测中的(),这里的()和()是聚合层和底层的序列长度。
如果()那GLS回归优化问题可以表示成:
在这里()并且()就是6中定义的一致误差。这样底层修正预测就是()
其中()就是估计的调整值。
更进一步,如果我们把11加到14中,我们发现MinT调整有一个相似形式的表达()
之前已经说明了对()适当估计的重要性,因为调整()依赖(),然后()又是通过12式用()计算出来的。换句话说,高维的()矩阵的估计误差会对修正预测产生负面影响。尤其是当()的时候,也就是说当不满足总和约束的时候,MinT调整()不会是稀疏的,即使是在()是一个单位矩阵的情况下。这意味着,MinT调整不允许基础预测的数据保持不变,也就是任何时候所有基础数据都需要调整。
最后从21和22式,我们可以看出,()的一致性误差将会影响()的底层基本预测,因为几乎在所有的数据中()都比()要显著的小。然而比如在电力需求估计中,我们想避开小的,单户对一致性误差的影响。

稀疏调整的修订预测

为了减轻调整量的估计误差的影响,我们提出在最好的预测准确度情况下做最稀疏的调整。有个重要的事情要说明,我们不是去寻找稀疏的修订预测,而是找稀疏的调整。这是非常重要的,当我们处理的事情是用电需求这种完全正的情况下。
为了满足聚合一致性,我们的修正预测也满足13式,也就是说,我们的修正预测的整个层级都是底层的基本修正后的预测加和得到的。稀疏性可以通过控制非零稀疏来实现(),()是()范数。MinT预测中(),而BU预测中()也就是没有调整。我们的目标就是在两种极端情况下找到一种平衡。
因为()是非凸的,凸松弛比如说LASSO就是在线性回归中得到稀疏估计的典型方法。我们提出如下的最小乘法问题
其中()
其中()是带权重参数()的弹性网络惩罚,我们把这种方法叫做MinT-REG。这个约束在电力需求预测这种非负量问题上是非常重要的。
25式中的惩罚是一个()时候ridge惩罚和()时候lasso惩罚的凸组合。它允许两种惩罚协同作用,并且在高维的时候很有用,因为此时lasso惩罚可能是不稳定的。
对所有的()这个惩罚方法是严格凸的,而当()的时候他在0的位置是奇异的。在我们的工作中我们认为(),从而让lasso一直起作用,并且允许稀疏估计。
当()的时候,目标函数23就等于调整限制低的19式子,

分层电力需求预测

智能电表数据

我们的数来源于4个能源供应公司在大不列颠地区进行智能电表试验的时候的数据。数据包括来自14000户人家从2008年1月到2010年9月每半小时一次的用电需求数据,并且还有一些地理和人口数据。
我们关注了没有丢失数据的5701条测试数据,从2009年4月到2010年7月,因此,每条时间序列的长度是22464个点。
分级基于地理数据分为6个层级,每层的序列数量如下:1(第一层),5(第二层),13(第三层),34(第四层),94(第五层),5701(第六层)。
也就是说,分层数据一共5748条数据,最底层是5701条,然后每一个聚合层是()条。图一给出了不同层的一周的电量需求。
()
图一:不同层一周的电力需求和每层聚合的条数。

实验计划

我们关注在上个部分提到的数据集上面的一天提前分级电力需求预测。更确切的说,如果预测起点是23:30,我们会生成()个半小时预测。
我们把数据分为训练集验证集和测试集,前12个月的数据作为训练集,接下来一个月是验证集,剩下的是测试集。每次验证和测试的时候我们把23:30作为起点然后预测1-48步48种多步提前预测。最终我们有1440训练集观测值和4416测试集观测值。(这里的数据是怎么回事啊)
每个时间实例,我们用分层结构预测中的整体的均方误差来衡量预测准确度。我们用式子16中提到的带区块对角化目标的收缩估计来对()进行估计,并且在验证集和测试集中都是每10天重新计算一次估计值。最后每个半小时都会用不同的()和(),通过最小化验证集中关联的半小时数据(这里又是什么鬼)。

预测方法

我们将我们的MinT-REG方法分别于BU,BASE,和MinT算法进行了对比
在基础的预测中,我们使用了基于TBATS算法的指数平滑,这个能处理多周期的问题。这个能捕获到没半小时一次的电力需求上,一天以内或者一周以内的周期。我们对两个周期建模,一个是48个点就是1天,一个是336个点就是一周。为了使变量更稳定且保证基本预测的非负性,我们用了一个log变换。TBATA模型的参数用最大似然估计,模型选择用ACI模型。多步预测用了递归的预测策略。更多信息我们引用了Livera等人2011年的文章。我们的TBATS模型的实现用的是R语言的预测算法包(这个也是Hyndman搞得,可能为了跟他们统一吧)。

实验结果

图2展示了第一天的用式子6计算的一致性误差。每一行都是上层的147个序列中的一条的误差,最上面一条就是最后的总和序列,然后下面按顺序排列。我们可以看到一致性误差随着聚合层数的增高而增高。这也表明BU预测算法不能仅仅通过原始的底层数据来获得确切的上层的数据的模式或者周期。除此之外我们发现了一个规律,白天的误差比晚上小,并且从06:00-12:00和17:00-22:00这两个时间段里面误差很高。这可以这样解释,电力需求在晚上是平坦的因此不管在哪个层级都很容易预测,但是白天的用电高峰期却比较难预测。一致性误差的不均匀性表明在某些时刻和某些聚合层底层基本预测需要更多的调整来匹配高层的基本预测结果。
图3和图4分别显示了聚合层和底层的总的平均误差。
()()
实线是没有聚合约束的基础预测,跟图2中的是一个结果的数据,其他的线就是有聚合约束的层级预测MSE。
在图3中我们可以看到BU预测算法在高峰的时候有更高的错误率,但是在晚上和其他时间错误率比较低。这显示了直接把带噪声的底层预测数据相加得到聚合数据的预测方法的局限性。
MinT-REG和MinT预测算法的MSE比BU预测算法更低,并且与基础预测的结果(就是直接预测)更接近,甚至比基础预测的错误率还低。不管是MinT-REG还是MinT算法都没有增加基础预测的错误率说明这两个算法的调整估计都估计的还算正确。这也显示了底层的预测能够提高高层聚合层预测的准确度。
总体而言,MinT-REG和MinT有相似的性能,除了在晚上MinT-REG有更低的错误率。MinT-REG有更稀疏的调整,可以从图5中看出来。具体来说,晚上调整数量的稀疏性更高,而高峰期调整的数量多一些。实际上,MinT-REG在晚上更像BU,在白天更像MinT,也就是说,MinT-REG有能够在两者之间动态切换的能力,能自动权衡那个更好,并且选择更好的那个。
总的来看,图5中的数据看起来跟图2中的数据是直接相关的,说明要调整的次数跟一致性误差是相关的。在这些实验里面,稀疏值是通过一个验证集选定的。然而也可以通过手动的设定收缩值来进行调整稀疏性和准确度之间的权衡,比如利用预测的先验知识来设定。
显然的是,基础预测和BU算法在底层的预测上是完全相等的,就想图4中的情况一样。然而MinT和MinT-REG算法却有着与基础预测相当甚至更好的准确度,这也表明在调整底层数据为了更好地接近高层聚合预测的时候,底层数据的准确度也能得到提高。
如果预测准确度就是唯一的评判标准,那基础预测的准确度一般是很难提高的,尤其在有大量序列每条序列有很多观测值的情况下,比如说电力需求数据。但是基本预测并不满足聚合约束。即使不能提高基础预测的准确度,MinT-REG在准确度损失最小的情况下使调整数量更稀疏。并且MinT-REG与MinT相比在调整的预估误差上更小。

总结

通过引入调整到分层时间序列的单个预测中,使得修正的预测能够满足加和限制。但是现有的方法中,计算这些调整需要引入高维的非惩罚回归和高维的协方差矩阵估计。因此现有的算法可能会因为基础预测的大幅度调整而导致预测准确度很低。 我们在满足加和限制的同时通过对调整增加一个稀疏限制克服了这个问题。这个算法是基于高维惩罚回归的,并且用了可以用循环边缘下降高效求解的适应收缩假设。 我们提出的方法有一个吸引人的性质,就是在数据驱动的方式下,我们可以切换自底向上的预测和BLU修订预测。除此之外,稀疏调整使得大部分的基础预测可以保持不变,这样就保证了稳定性。 用分层电力需求数据进行试验,结果显示我们的算法比当前最好的算法更有效。特别的,修订预测算法在晚上的时候调整稀疏性非常高,在峰值的时候几乎没有调整,变成了一个BLU的修订预测问题。换句话说,我们的算法也能实现MinT预测算法。当()的时候如果()我们的算法那就相当于MinT算法那,如果()我们的算法那就相当于BU算法。通过选择惩罚量,我们可以是完全稠密的MinT也可以是完全没有调整的BU,也可以是他两个之间的任何一个点。既然(),那么()朝着0的收缩就等价于底层调整预测()朝着底层基本预测()收缩。 23式中我们用的惩罚不是一个统一的惩罚(对每个需要一致的调整都有不同的惩罚),因为这个惩罚系数实际上是(),也就是由两部分相乘组成,一部分是一样的,另一部分是对于每个()都不一样的。这非常重要,因为我们不想在聚合层的收缩和在底层的收缩一样大。和Zou2016年采用的适应的lasso相同,我们用() 这里()是MinT的调整,并且() 如果()那么23式子中的一般的弹性网络回归问题就可以简化为标准的弹性网络回归问题,其中相应变量(),设计矩阵是()。 弹性网络问题可以被循环坐标下降高效的解决。我们的标准弹性网络也是基于glmnet这个R语言包里面的实现的。

在电力智能测量数据应用中的分层时间序列预测正则化Regularization in Hierarchical Time Series Forecasting with Application to的更多相关文章

  1. RxSwift使用教程

    前言RxSwift是Swift函数响应式编程的一个开源库,由Github的ReactiveX组织开发,维护。RxSwift的目的是让让数据/事件流和异步任务能够更方便的序列化处理,能够使用Swift进行响应式编程目前,RxSwift在Github上收到了5000+Star,600+fork。RxSwift的核心思想和这个类似。RxSwift的核心是想是Observablesequence,Observable表示可监听或者可观察,也就是说RxSwift的核心思想是可监听的序列。

  2. What’s New in Swift 3.1?

    作者:CosminPupaza译者:kmyhy重要消息:Xcode8.3以及Swift3.1现在推出了Beta版!这个版本包含了期待已久的Swift包管理器以及语言自身的一些改进。在本文,我将集中介绍Swift3.1的重要改变,这些都会对你的代码产生重大影响。但是,苹果已经在Xcode8.3中终止了对Swift2.3的支持。这些是Swift路线图的提案编号。注意:如果你需要复习一下Swift3.0的内容,请阅读我们的What’sNewinSwift3。嵌套的泛型Swift3.1允许你将嵌套类型和泛型混用。

  3. 使用Swift进行生长时间序列的峰值检测

    有人会有一个很好的算法来测量使用Swift增长时间序列数据的峰值吗?还要注意我已经关闭了负信号,因为OP的目的我们只想要正信号.SWIFT代码:对于样本数据的结果:更新您可以通过对平均值和标准差的滞后使用不同的值来提高算法的性能.例如.:然后使用例如let=Thresholdingalgo可以给出更好的结果:DEMO

  4. arrays – 序列数组中的奇数和偶数索引

    for循环中的for不起作用,因为int类型不符合协议序列.我有3个数组:1个主数组,存储数组1个奇数阵,开头为空1个偶数组,开头为空意思是主阵列的所有奇数索引将存储在奇数阵列中,而偶数阵列则相同.然而,这不够好.谁有更好的主意?这是另一种可能的解决方案元素直接从源阵列中的偶数/奇数位置“拾取”.表现比较:我的简单,不是非常复杂的特殊基准测试代码:结果:

  5. 时间序列分析之ARIMA模型预测餐厅销量

    这篇文章主要介绍了时间序列分析之ARIMA模型预测餐厅销量,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  6. linux mint下安装phpstorm2020包括JDK部分的教程详解

    这篇文章主要介绍了linux mint下安装phpstorm2020包括JDK部分的教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. 正则化DropPath/drop_path用法示例(Python实现)

    DropPath 类似于Dropout,不同的是 Drop将深度学习模型中的多分支结构随机"失效",而Dropout是对神经元随机"失效"这篇文章主要给大家介绍了关于正则化DropPath/drop_path用法的相关资料,需要的朋友可以参考下

  8. PyTorch搭建LSTM实现时间序列负荷预测

    这篇文章主要为大家介绍了PyTorch搭建LSTM实现时间序列负荷预测,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. pandas时间序列之如何将int转换成datetime格式

    这篇文章主要介绍了pandas时间序列之如何将int转换成datetime格式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  10. Python与AI分析时间序列数据

    预测给定输入序列中的下一个是机器学习中的另一个重要概念.本章为您提供有关分析时间序列数据的详细说明,有需要的朋友可以借鉴参考下,希望能够有所帮助

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部