一种基于随机森林的模型训练方法和装置与流程

文档序号:12035075阅读:205来源:国知局
一种基于随机森林的模型训练方法和装置与流程

本申请涉及计算机处理的技术领域,特别是涉及一种基于随机森林的模型训练方法和一种基于随机森林的模型训练装置。



背景技术:

随着互联网的快速发展,人们生活的方方面面都与互联网产生了联系,在人们使用互联网的相关功能时,产生了海量的数据。

目前,经常使用随机森林(randomforest)算法进行模型训练,对这些海量的数据进行挖掘,从而进行分类、推荐等操作。

随机森林是一个树型分类器{h(x,k),k=1,…}的集合,元分类器h(x,k)一般是用cart(classificationandregressiontree,分类回归树)算法构建的没有剪枝的决策树,其中,x是输入向量,k是独立同分布的随机向量,决定了单颗树的生长过程,速记森林的输出通常采用多数投票法得到。

由于样本数据的规模达到几亿甚至几十亿,单机版的随机森林已经不能处理海量规模的,通常使用并行版的随机森林。

假设样本数据的全集为d,要训练100棵决策树,并行实现方案一般如下:

1、样本随机采样;

同时启动100个工作节点worker,每个worker从d中随机采样出一个样本数据的子集s,s的大小一般远远小于d,单台计算机可处理。

2、单个worker基于s、应用cart算法训练决策树。

在训练决策树时,对于非连续特征,一般是计算该特征的基尼系数gini,基于最佳基尼系数gini进行分裂。

在这种方案中,由于每个worker都是从样本数据的全集中采样子集,因此,需要扫面一次样本数据的全集,数据读取量大,耗费较多的时间进行读取,使得模型的迭代更新时间较长、训练效率较低。

在计算基尼系数gini时,通常需要使用穷举法,即假设有n个特征, 且cart树是二分类的,则所有分支的组合有(2n-1-1)种,需要计算(2n-1-1)次基尼系数gini,复杂度为o(2n-1-1),计算的复杂度为指数级别,在训练决策树时耗费大量的时间,同样使得使得模型的迭代更新时间较长、训练效率较低。



技术实现要素:

鉴于上述问题,提出了本申请实施例以便提供一种克服上述问题或者至少部分地解决上述问题的一种基于随机森林的模型训练方法和相应的一种基于随机森林的模型训练装置。

为了解决上述问题,本申请实施例公开了一种基于随机森林的模型训练方法,包括:

将工作节点划分成一个或多个分组;

由每个分组中的工作节点从预置的样本数据中进行随机采样,获得目标样本数据;

由每个分组中的工作节点采用所述目标样本数据训练一个或多个决策树对象。

优选地,每个分组中的工作节点包括一个或多个第一工作节点以及一个或多个第二工作节点;

所述由每个分组中的工作节点从预置的样本数据中进行随机采样的,获得目标样本数据步骤包括:

在每个分组中,由每个第一工作节点从预置的样本数据中读取部分样本数据;

由每个第一工作节点将读取的部分样本数据随机分发至每个第二工作节点中,以分发至第二工作节点的样本数据作为目标样本数据。

优选地,所述由每个分组中的工作节点采用所述目标样本数据训练一个或多个决策树对象的步骤包括:

在每个分组中,由每个第二工作节点采用所述目标样本数据训练一个决策树对象。

优选地,所述由每个分组中的工作节点采用所述目标样本数据训练一个或多个决策树对象的步骤包括:

当所述目标样本数据的属性信息的值为枚举值时,计算所述属性信息的值的权重;

按照所述权重对所述属性信息的值进行排序;

采用排序后的属性信息的值计算基尼系数;

按照所述基尼系数针对决策树对象的树节点进行分裂处理。

优选地,所述计算所述属性信息的值的权重的步骤包括:

当所述属性信息的分类列为二分类时,计算所述属性信息的值对于所述分类列的频率;

对所述频率进行归一化,获得权重。

优选地,所述计算所述属性信息的值的权重的步骤包括:

当所述属性信息的分类列为多分类时,计算所述属性信息的值针对所述分类列的权重概率矩阵,其中,所述权重概率矩阵的横坐标为所述属性信息的值、纵坐标为所述分类列的值;

对所述权重概率矩阵进行主成分分析,获得最大特征值对应的特征向量;

将所述权重概率矩阵乘以所述特征向量,获得权重。

优选地,所述采用排序后的属性信息的值计算基尼系数的步骤包括:

按照排序的顺序依次将排序后的属性信息的值划分为两个属性子集;

依次采用所述两个属性子集计算基尼系数。

本申请实施例还公开了一种基于随机森林的模型训练装置,包括:

分组划分模块,用于将工作节点划分成一个或多个分组;

随机采样模块,用于由每个分组中的工作节点从预置的样本数据中进行随机采样,获得目标样本数据;

决策树训练模块,用于由每个分组中的工作节点采用所述目标样本数据训练一个或多个决策树对象。

优选地,每个分组中的工作节点包括一个或多个第一工作节点以及一个或多个第二工作节点;

所述随机采样模块包括:

部分数据读取子模块,用于在每个分组中,由每个第一工作节点从预置的样本数据中读取部分样本数据;

数据随机分发子模块,用于由每个第一工作节点将读取的部分样本数据随机分发至每个第二工作节点中,以分发至第二工作节点的样本数据作为目标样本数据。

优选地,所述决策树训练模块包括:

节点训练子模块,用于在每个分组中,由每个第二工作节点采用所述目标样本数据训练一个决策树对象。

优选地,所述决策树训练模块包括:

权重计算子模块,用于在所述目标样本数据的属性信息的值为枚举值时,计算所述属性信息的值的权重;

排序子模块,用于按照所述权重对所述属性信息的值进行排序;

基尼系数计算子模块,用于采用排序后的属性信息的值计算基尼系数;

分裂子模块,用于按照所述基尼系数针对决策树对象的树节点进行分裂处理。

优选地,所述权重计算子模块包括:

频率计算单元,用于在所述属性信息的分类列为二分类时,计算所述属性信息的值对于所述分类列的频率;

归一化单元,用于对所述频率进行归一化,获得权重。

优选地,所述权重计算子模块包括:

权重概率矩阵计算单元,用于在所述属性信息的分类列为多分类时,计算所述属性信息的值针对所述分类列的权重概率矩阵,其中,所述权重概率矩阵的横坐标为所述属性信息的值、纵坐标为所述分类列的值;

主成分分析单元,用于对所述权重概率矩阵进行主成分分析,获得最大特征值对应的特征向量;

权重获得单元,用于将所述权重概率矩阵乘以所述特征向量,获得权重。

优选地,所述基尼系数计算子模块包括:

子集划分单元,用于按照排序的顺序依次将排序后的属性信息的值划分为两个属性子集;

子集计算单元,用于依次采用所述两个属性子集计算基尼系数。

本申请实施例包括以下优点:

本申请实施例将工作节点划分成一个或多个分组,由每个分组中的工作节点从预置的样本数据中进行随机采样,获得目标样本数据,进而训练决策树对象,因此,每个分组中的工作节点仅是读取部分的样本数据,而不需要扫描一次完整的样本数据,大大降低了数据的读取量,减少了耗费的时间,进而减少模型的迭代更新时间、提高训练效率。

本申请实施例对此枚举值的属性,通过重要性排序的方式计算分裂点,无需进行穷举,大大减少了分裂点的计算量,假设属性有n个值,通过重要性排序的方式计算分裂点的方式,计算的复杂度可以从穷举法的o(2n-1-1),降低到o(n),减少了训练时间的耗费,进而减少模型的迭代更新时间、提高训练效率。

附图说明

图1是本申请的一种基于随机森林的模型训练方法实施例的步骤流程图;

图2是本申请实施例的一种分组示例图;

图3是本申请实施例的一种在hadoop的分组中进行模型训练的流程示例图;

图4是本申请的一种基于随机森林的模型训练装置实施例的结构框图。

具体实施方式

为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本申请作进一步详细的说明。

参照图1,示出了本申请的一种基于随机森林的模型训练方法实施例的步骤流程图,具体可以包括如下步骤:

步骤101,将工作节点划分成一个或多个分组;

在本申请实施例中,工作节点可以为训练模型的计算节点,可以部署在单台计算机中,也可以应用在计算机集群中,如分布式系统,本申请实施例对此不加以限制。

对于单台计算机而言,工作节点(worker)可以为cpu(centralprocessingunit,中央处理器)的内核(core),对于计算机集群,工作节点可以为单台计算机。

在本申请实施例中,可以按照样本数据的数据量、决策树的数量等因素,如图2所示,将工作节点划分为一个或多个分组(虚线框部分),每个分组中的工作节点包括一个或多个第一工作节点以及一个或多个第二工作节点。

其中,每个分组负责处理一份完整的样本数据,组内第一工作节点随机分发样本数据至第二工作节点,第二工作节点采用分发的样本数据训练决策树。

一般而言,考虑了系统的承受能力以及运算速度,分组的数目与决策树对象的数量成正比,例如,分组的数目=决策树的数量/100。

单个分组内,第一工作节点的数量与样本数据的数据量成正比,一个第二工作节点训练一棵决策树。

为使本领域技术人员更好地理解本申请实施例,在本申请实施例中,将hadoop作为计算机集群的一种实施例进行说明。

hadoop主要包括两部分,一是分布式文件系统(hadoopdistributedfilesystem,hdfs),另外是分布式计算框架,即mapreduce。

hdfs是一个高度容错性的系统,能提供高吞吐量的数据访问,适合那些有着超大数据集(largedataset)的应用程序。

mapreduce是一套从海量源数据提取分析元素最后返回结果集的编程模型,其基本原理可以是将大的数据分析分成小块逐个分析,最后再将提取 出来的数据汇总分析。

在hadoop中,用于执行mapreduce的机器角色有两个:一个是jobtracker,另一个是tasktracker。jobtracker可以用于调度工作,tasktracker可以用于执行工作。

进一步而言,在hadoop中tasktracker可以指所述分布式系统的处理节点,该处理节点可以包括一个或多个映射(map)节点和一个或多个化简(reduce)节点。

在分布式计算中,mapreduce负责处理了并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题,把处理过程高度抽象为两个函数:映射函数(map函数)和规约函数(reduce函数),map函数可以把任务分解成多个任务,reduce函数可以把分解后的多任务处理的结果汇总起来。

在hadoop中,每个mapreduce的任务可以被初始化为一个job,每个job又可以分为两种阶段:map阶段和reduce阶段。这两个阶段分别用两个函数表示,即map函数和reduce函数。

map函数可以接收一个<key,value>形式的输入(input),然后同样产生一个<key,value>形式的中间输出(output),hadoop函数可以接收一个如<key,(listofvalues)>形式的输入(input),然后对这个value集合进行处理,每个reduce函数产生0或1个输出(output),reduce函数的输出也是<key,value>形式的。

对于分组而言,第一工作节点可以为map节点,第二工作节点可以为raduce节点。

步骤102,由每个分组中的工作节点从预置的样本数据中进行随机采样,获得目标样本数据;

在具体实现中,在每个分组中,读取预置的样本数据,即样本数据的全集,可以由每个第一工作节点从预置的样本数据中读取部分样本数据,即样本数据的子集。

由每个第一工作节点将读取的部分样本数据随机分发至每个第二工作 节点中,以分发至第二工作节点的样本数据作为目标样本数据。

对于每条样本数据,第一工作节点均读取一次,但是否会分发到第二工作节点中是不确定的,即随机分发(采样)。

例如,如图2所示,某一条样本数据由第一工作节点a1读取,针对第二工作节点b1、b2、b3、b4、b5,分别生成一随机值,如果该随机值大于0.5,则分发到该第二工作节点中,反之,则不分发到该第二工作节点,对于该条样本数据,分发随机了5(第二工作节点的数量)次。

同理,对于第一工作节点a2、a3读取的样本数据,也可以随机分发至第二工作节点b1、b2、b3、b4、b5。

如图3所示,在hadoop中,一个分组的map节点和raduce节点处理一份完整的样本数据,每个map节点读取部分样本数据,随机分发至raduce节点中。

即在map节点中,可以定义map函数为随机分发,以将map节点的样本数据分发到reduce节点中。

map节点从输入的样本数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。

map节点中的map函数的输出经由mapreduce框架处理后,最后分发到reduce节点中的reduce函数。

步骤103,由每个分组中的工作节点采用所述目标样本数据训练一个或多个决策树对象。

每条样本数据,通常包括一个样本对象、一个或多个属性信息、一个分类标签。

对于随机采样之后的目标样本数据为一个数据集合,一般为二维数组的形式,即包括一组样本对象、一组或多组属性信息、一组分类标签(又称分类列)。

一个目标样本数据的示例如下表所示:

表1

其中,属性信息包括体温、表面覆盖、胎生、产蛋、能飞、水生、有腿、冬眠。

决策树(对象)是一种由节点和有向边构成的树状结构,训练时,在每一个非叶子节点针对某一属性进行分类。

在具体实现中,在每个分组中,由每个第二工作节点采用所述目标样本数据训练一个决策树对象。

如图3所示,在hadoop中,若map节点读取的部分样本数据随机分发至raduce节点中,则raduce节点可以采用该分发的样本数据(即目标样本数据)训练决策树。

在训练决策树时,在每一个非叶子节点针对某一属性进行分裂、迭代这一过程,直到每个叶子节点上的样本均处于单一的类别或者每个属性都被选择过为止。叶子节点代表分类的结果,从根节点到叶子节点的完整路径代表一种决策过程,决策树的训练本质是节点如何进行分裂。

训练得到的决策树一般是二叉树,少数情况下也存在非二叉树的情况,具体的训练过程如下:

(1)、构造决策树的根节点,为全体目标训练样本数据的集合t;

(2)、通过计算信息增益或基尼系数选择出t中区分度最高的属性,分割形成左子节点和右子节点;

(3)、在剩余的属性空间中,针对每一个子节点的样本数据,重复步骤2的过程,若满足以下条件之一则标记为叶子节点,此节点分裂结束:

a、该节点上所有样本数据都属于同一个分类;

b、没有剩余的属性可用以分裂;

c、当前数据集的样本数据个数小于某个给定的值;

d、决策树的深度大于设定的值。

本申请实施例将工作节点划分成一个或多个分组,由每个分组中的工作节点从预置的样本数据中进行随机采样,获得目标样本数据,进而训练决策树对象,因此,每个分组中的工作节点仅是读取部分的样本数据,而不需要扫描一次完整的样本数据,大大降低了数据的读取量,减少了耗费的时间,进而减少模型的迭代更新时间、提高训练效率。

在本申请的一个实施例中,步骤103可以包括如下子步骤:

子步骤s11,当所述目标样本数据的属性信息的值为枚举值时,计算所述属性信息的值的权重;

在实现应用中,属性信息的值一般分为连续值和枚举值,枚举值又称离散值,即不连续的值。

例如,表1中体温的值为冷血、恒温,属于枚举值。

在本申请实施例中,针对枚举值的属性信息,利用其重要性(权重)排序来计算最佳分裂点,来提升加速比。

在一个示例中,当属性信息的分类列为二分类(即具有两个分类)时,计算该属性信息的值对于分类列的频率,对频率进行归一化,获得权重。

在另一个示例中,当属性信息的分类列为多分类(即具有三个或三个以上的分类)时,计算属性信息的值针对分类列的权重概率矩阵,其中,权重 概率矩阵的横坐标为属性信息的值、纵坐标为分类列的值。

对所述权重概率矩阵进行主成分分析(principalcomponentanalysis,pca),获得最大特征值对应的特征向量,将权重概率矩阵乘以特征向量,获得权重。

子步骤s12,按照所述权重对所述属性信息的值进行排序;

在具体实现中,可以按照权重对属性信息的值进行顺序排序,也可以倒序排序,本申请实施例对此不加以限制。

子步骤s13,采用排序后的属性信息的值计算基尼系数;

基尼系数gini,可以用于决策树的节点的分裂标准,样本总体内包含的类别越杂乱,gini指数就越大。

在实际应用中,可以按照排序的顺序依次将排序后的属性信息的值划分为两个属性子集。

假设按权重排序得到的有序属性信息的值序列为f=(a1,a2,a3……an),那么,可以划分为左子树(属性子集)为a1~ai,右子树(属性子集)为ai+1~an,其中,i=1,2,…,n-1。

依次采用两个属性子集计算基尼系数gini。

假设有k个分类,样本数据属于第i类的概率为pi,则基尼指数gini定义为:

如果数据集合d被划分成d1和d2两部分,则在该条件下,集合d的基尼增益定义为:

子步骤s14,按照所述基尼系数针对决策树对象的树节点进行分裂处理。

基尼指数gini表示数据集合的不确定性,基尼指数gini的值越大,样本属于某个分类的不确定性也就越大。因此,最好的选取特征划分就是使得数据集合的基尼指数gini最小的划分。

本申请实施例对此枚举值的属性,通过重要性排序的方式计算分裂点, 无需进行穷举,大大减少了分裂点的计算量,假设属性有n个值,通过重要性排序的方式计算分裂点的方式,计算的复杂度可以从穷举法的o(2n-1-1),降低到o(n),减少了训练时间的耗费,进而减少模型的迭代更新时间、提高训练效率。

需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请实施例并不受所描述的动作顺序的限制,因为依据本申请实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本申请实施例所必须的。

参照图4,示出了本申请的一种基于随机森林的模型训练装置实施例的结构框图,具体可以包括如下模块:

分组划分模块401,用于将工作节点划分成一个或多个分组;

随机采样模块402,用于由每个分组中的工作节点从预置的样本数据中进行随机采样,获得目标样本数据;

决策树训练模块403,用于由每个分组中的工作节点采用所述目标样本数据训练一个或多个决策树对象。

在本申请的一个实施例中,每个分组中的工作节点包括一个或多个第一工作节点以及一个或多个第二工作节点;

所述随机采样模块401可以包括如下子模块:

部分数据读取子模块,用于在每个分组中,由每个第一工作节点从预置的样本数据中读取部分样本数据;

数据随机分发子模块,用于由每个第一工作节点将读取的部分样本数据随机分发至每个第二工作节点中,以分发至第二工作节点的样本数据作为目标样本数据。

在本申请的一个实施例中,所述决策树训练模块403可以包括如下子模块:

节点训练子模块,用于在每个分组中,由每个第二工作节点采用所述目标样本数据训练一个决策树对象。

在本申请的一个实施例中,所述决策树训练模块403可以包括如下子模块:

权重计算子模块,用于在所述目标样本数据的属性信息的值为枚举值时,计算所述属性信息的值的权重;

排序子模块,用于按照所述权重对所述属性信息的值进行排序;

基尼系数计算子模块,用于采用排序后的属性信息的值计算基尼系数;

分裂子模块,用于按照所述基尼系数针对决策树对象的树节点进行分裂处理。

在本申请的一个实施例中,所述权重计算子模块可以包括如下单元:

频率计算单元,用于在所述属性信息的分类列为二分类时,计算所述属性信息的值对于所述分类列的频率;

归一化单元,用于对所述频率进行归一化,获得权重。

在本申请的一个实施例中,所述权重计算子模块可以包括如下单元:

权重概率矩阵计算单元,用于在所述属性信息的分类列为多分类时,计算所述属性信息的值针对所述分类列的权重概率矩阵,其中,所述权重概率矩阵的横坐标为所述属性信息的值、纵坐标为所述分类列的值;

主成分分析单元,用于对所述权重概率矩阵进行主成分分析,获得最大特征值对应的特征向量;

权重获得单元,用于将所述权重概率矩阵乘以所述特征向量,获得权重。

在本申请的一个实施例中,所述基尼系数计算子模块可以包括如下单元:

子集划分单元,用于按照排序的顺序依次将排序后的属性信息的值划分为两个属性子集;

子集计算单元,用于依次采用所述两个属性子集计算基尼系数。

对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较 简单,相关之处参见方法实施例的部分说明即可。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

本领域内的技术人员应明白,本申请实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

在一个典型的配置中,所述计算机设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非持续性的电脑可读媒体(transitorymedia),如调制的数据信号和载波。

本申请实施例是参照根据本申请实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令 实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。

以上对本申请所提供的一种基于随机森林的模型方法和一种基于随机森林的模型装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1