算法模型评审要点总结(合集8篇)

山崖发表网工作总结2024-03-12 13:14:2423

算法模型评审要点总结 第1篇

                                                                              

准确率是分类问题中最简单也是最直观的评价指标, 但存在明显的缺陷。 比如, 当负样本占99%时, 分类器把所有样本都预测为负样本也可以获得99%的准确率。 所以, 当不同类别的样本比例非常不均衡时, 占比大的类别往往成为影响准确率的最主要因素。为了解决这个问题, 可以使用更为有效的平均准确率(每个类别下的样本准确率的算术平均) 作为模型评估的指标

 P-R曲线的横轴是召回率, 纵轴是精确率。 对于一个排序模型来说, 其P-R曲线上的一个点代表着, 在某一阈值下, 模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本, 此时返回结果对应的召回率和精确率。即当阈值提高时,判定为正样本的标准更加严格,Precision值计算更加严格,分类器需要分类器需要尽量在“更有把握”时才把样本预测为正样本,FP减少,Precision值提高, 但此时往往会因为过于保守而漏掉很多“没有把握”的正样本, 导致Recall值降低

为更全面的评估模型,引入F1-SCORE,是精准率和召回率的调和平均值

                                                            

RMSE经常被用来衡量回归模型的好坏.一般情况下, RMSE能够很好地反映回归模型预测值与真实值的偏离程度。 但在实际问题中, 如果存在个别偏离程度非常大的离群点(Outlier) 时, 即使离群点数量非常少, 也会让RMSE指标变得很差。                                                                

                                                  

针对这个问题, 有什么解决方案呢? 可以从三个角度来思考。 第一, 如果我们认定这些离群点是“噪声点”的话, 就需要在数据预处理的阶段把这些噪声点过滤掉。 第二, 如果不认为这些离群点是“噪声点”的话, 就需要进一步提高模型的预测能力, 将离群点产生的机制建模进去(这是一个宏大的话题, 这里就不展开讨论了) 。 第三, 可以找一个更合适的指标来评估该模型。 关于评估指标, 其实是存在比RMSE的鲁棒性更好的指标, 比如平均绝对百分比误差(Mean AbsolutePercent Error, MAPE) :

                                                         

相比RMSE, MAPE相当于把每个点的误差进行了归一化, 降低了个别离群点带来的绝对误差的影响

算法模型评审要点总结 第2篇

ROC曲线横坐标为假阳性率/假正率(False Positive Rate, FPR),预测为正但实际为负的样本占所有负例样本的比例;

纵坐标为真阳性率/ 真正率(True Positive Rate, TPR),即召回率,预测为正且实际为正的样本占所有正例样本的比例。

事实上, ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点的,在二值分类问题中, 模型的输出一般都是预测样本为正例的概率。 假设测试集中有20个样本,样本按照预测概率从高到低排序。 在输出最终的正例、 负例之前, 我们需要指定一个阈值, 预测概率大于该阈值的样本会被判为正例, 小于该阈值的样本则会被判为负例。 上面所说的“截断点”指的就是区分正负预测结果的阈值

通过动态地调整截断点, 从最高的得分开始(实际上是从正无穷开始, 对应着ROC曲线的零点) , 逐渐调整到最低得分, 每一个截断点都会对应一个FPR和TPR, 在ROC图上绘制出每个截断点对应的位置, 再连接所有点就得到最终的ROC曲线。

10

如图所示,ROC曲线的绘制实际上是 遍历每个样本的 模型输出概率作为阈值(截断点),求该点对应的FPR,TPR

如 遍历到样本5,此时截断点(阈值)为,即求的横坐标与纵坐标。真实类别正样本数量为10,负为10

(1)当 阈值为时,大于的点被判定为正样本,否则被判断为负样本,则样本1-5 为 正,6-20为负

(2)此时  ,TP为1,2,4,5, ,FP为3

AUC指的是ROC曲线下的面积大小, 该值能够量化地反映基于ROC曲线衡量出的模型性能。 计算AUC值只需要就可以了。由于ROC曲线一般都处于y=x这条直线的上方(如果不是的话, 只要把模型预测的概率反转成1-p就可以得到一个更好的分类器) , 所以AUC的取值一般在~1之间。 AUC越大, 说明分类器越可能把真正的正样本排在前面, 分类性能越好。

AUC的计算主要以下几种方法:

(1)计算ROC曲线下的面积,即沿着ROC横轴做积分。这是比较直接的一种方法,可以近似计算ROC曲线一个个小梯形的面积。几乎不会用这种方法 (2)从AUC统计意义去计算。在有M个正样本,N个负样本的数据集里。一共有M*N对样本(一对样本即,一个正样本与一个负样本)。统计这M*N对样本里,正样本的预测概率大于负样本的预测概率的个数。 公式如下:

具体的做法如下:

算法模型评审要点总结 第3篇

回归模型要拟合的真实值是连续值,所以回归模型的预测值也是连续值。我们评估的任务呢,就是确定这两个连续值序列的差距究竟有多大。如下图所示:

那么,常用的评估方法有以下几种:

第一种,MAE

它的定义是每一个预测值和真实值相减,然后取绝对值进行相加最后求平均。那我们的预测值减去我们的真实值,也即我们的残差。所以MAE指的就是残差绝对值的平均值。虽然MAE可以得到这么一个比较好的衡量,但是它的问题在于,如果我们用MAE求一个最优化函数的话,求导数就会比较麻烦。所以我们比较常用的,其实是第二个指标MSE。

第二种,MSE

MSE是指残差的平方求均值。

第三种,RMSE

它指的就是对MSE开根号。这是因为如果MSE比较小的话,接近于0,那么我们求一个开根号的话,会放大它的尺度。

第四种,决定系数

它定义是这样的:分子 y^{\wedge} 表示预测值, \bar{y} 代表的就是真实值的平均值。那么我们得出一个预测值和真实值的平均值的差再求平方和,得到分子。

分母就是真实值减去真实值的平均值,然后求平方再求和。

分母实际上代表的是真实值的离散程度,分子代表的是预测值相对于真实平均值的离散程度。分子和分母都是两个比较综合的指标。所以,R^{2} 他表示的含义也是比较综合的,它不是一个具体的值,而是一个比例。也有说法呢,把 R^{2} 认为是一个最好的进行回归的衡量,也是有道理的。因为它直接对比了预测值的偏离程度(也就是离散程度),和真实值离散程度的大小。那如果他们两个离散程度差不多呢,即使有那么一些的出入,我们也可以认为,它的综合指标是比较好的。

(2)python 实现

输出:

算法模型评审要点总结 第4篇

(1)k-fold交叉验证

(2)留一验证: 每次留下1个样本作为验证集, 其余所有样本作为测试集。 样本总数为n, 依次对n个样本进行遍历, 进行n次验证, 再将评估指标求平均值得到最终的评估指标。 在样本总数较多的情况下, 留一验证法的时间开销极大。 事实上, 留一验证是留p验证的特例。 留p验证是每次留下p个样本作为验证集, 而从n个元素中选择p个元素有 种可能, 因此它的时间开销更是远远高于留一验证, 故而很少在实际工程中被应用。

不管是Holdout检验还是交叉检验, 都是基于划分训练集和测试集的方法进行模型评估的。 然而, 当样本规模比较小时, 将样本集进行划分会让训练集进一步减小, 这可能会影响模型训练效果。 有没有能维持训练集样本规模的验证方法呢? 自助法可以比较好地解决这个问题。自助法是基于自助采样法的检验方法。 对于总数为n的样本集合, 进行n次有放回的随机抽样, 得到大小为n的训练集。 n次采样过程中, 有的样本会被重复采样, 有的样本没有被抽出过, 将这些没有被抽出的样本作为验证集, 进行模型验证, 这就是自助法的验证过程。

在自助法的采样过程中, 对n个样本进行n次自助抽样, 当n趋于无穷大时,最终有多少数据从未被选择过?

算法模型评审要点总结 第5篇

(1)概念

分类模型评估中我们先来看二分类模型的评估。

二分类,顾名思义,就是标注分类只有两类的分类。二分类在我们的挖掘任务中是非常常见的,我们一般把二分类的一个类叫做二分类任务中的正类,用 1 来表示;另一类,我们叫做二分类中负类,用 0 表示。

一般来说,正类是我们相对来说更加关注的类。比如员工近期离职了,我们就可以把这样的样本叫做正类。 再比如,从一些店铺里挖掘出存在刷单现象的店铺,那么存在刷单行为的店铺就是我们更关注的分类,即正类,对应正常的店铺不存在刷单就是负类;还比如,一个游戏App存在一些有外挂的用户及作弊用户,那么对于我们的挖掘任务来讲,真正的作弊用户就是我们关注的用户,他们也就是我们关注的正类,而非作弊的正常用户就是我们的负类。

所以,如果拿我们的测试集数据来说,得到的真实数据的标注就会是类似下图这样的,这里面只有 0 和 1 ,其中 1 代表正类, 0 代表负类。

如果数据经过了一个模型的计算,我们可以得到该模型下的输出,它也是仅包含 0 和 1 的。我们的目的是比较这个 Y_pred 的结果和真实值 Y_test 。如下图:

当然有的时候 0 和 1 不是直接得到的,而是我们得到了一个数据再经过模型输出后被划分为正类的概率,比如下图,这里代表着它为正类的概率。

所以上图如果Y_pred这个概率接近于 0 ,那么他应该被判为负类。那如果得到的是概率值, 有的时候我们也需要确定一个阈值,我们大于这个阈值分类结果将被判为正类,而小于这个阈值分类结果将被判为负类。当然一般情况下,我们会取 这个比较均衡、客观的阈值,但如果我们更加关注正负判别的质量,那么这个阈值就有可能比 高,也有可能比 低一些。

当然,这个就是后话了,如果我们把测试集的真实分类和经过模型预测后最终的判别结果进行整理(注意,我们用到的数据是测试集)。这样的话,把这些结果进行整理,会得到四种映射关系,这四种映射关系分别为:

如上图,

第一类是真实值为正类,预测值也为正类的映射。简称TP中,第一个字母是真实类别的情况,这里为T代表True,含义是真实为正类;第二个字母指的是预测的类别,这里P代表positive,代表是预测的类别为正类。合起来意思是真的正类,也就是说,它本来是正类,后来被判别为了正类。

第二类是真实值为正类,预测值为负类,简称FN。这种情况下我们也把它叫做漏分类。漏就是遗漏的漏。

第三类是真实值为正类,预测值为负类,简称FP。此时对于我们更关注的正样本,它被错分类注意刚才是漏分,这里是错分。

第四类是真实为负类,预测也为负类,简称FN。

如果我们把所有的测试集的样本的这四类映射都数出来,也就是数出单个数量,并且整理好组成一个矩阵的形式,就是分类模型中最常用到的混淆矩阵。这个矩阵每一行代表一个真实分类,每一列列代表一个预测分类。详见下图:

理论上来说,我们把它求个转置,也就是把每一行让他代表预测的分类,每一列代表真实的分类也是可以的。这个只是习惯问题。

混淆矩阵对应元素如下图:

上图,混淆矩阵中对角线上的元素代表着正确分类的数量。不是在对角线上的,就是没被正确分类的。所以我们最理想的模型,拿测试集来看,应该是一个对角阵,如果得不到对角阵,对角线上的数字加和占统治地位也是可以的。

有了混淆矩阵,我们就可以得到许多关注的指标了。

我们最容易想到的就是把混淆矩阵对角线上的数字加起来,因为这部分就是我们分类预测对的部分,不管是正类也好,负类也罢,总之是预测对了。对比下这部分的数据占整体数据的百分比,也就是我们经常说的正确率。正确率的表示如下:

正确率可以反映模型分类正确的能力。但如果只使用准确率的话就可能会带来问题。比如,下图这个例子:

上图这个例子中,一共有20个标注,其中有2个是正类,18个是负类,正类数量特别少,样本严重的不平衡。假如有一种特别简单的分类器,就是不管你输入的是什么,我们的输出都是0,都是负类。那么这样,正确率就会达到90%以上。如果一个分类器的正确率达到90%,按道理应该还不错,但问题题大家也看得出来,我们关注的正类一个都没找出来,所以分类器的实际意义不大。

所以下一个指标就应运而生了。这个指标叫做召回率,简称TPR ,也要真正例率。如下图,召回率就是真实被分为正类的数据除以所有真实的正类的数量,就是正类被召回的占有率。

如果充分考虑我们说到的正确率和召回率就可以衍生出这么一个指标,我们把它叫做F -measure,也叫F-score分数之类的。它的形式如下:

如果召回率和准确率有一个为0,那么F-measure就是0;如果召回率和准确率相等,那F-measure就是它们相等的这个数值。那一般情况下F- measure是召回率和正确率中间的一个数,也就是说F -measure实际上是召回和准确的一种权衡。如果有了F -measure这个参数,上面我们说的样本不均衡时难以有效评估的情况就不会再发生了。

除此以外,还有一些指标也是我们可能关注的,比如像下图的查准率,也叫精准率,它是指用真的正类除上真的正类与假的负类的和。也就是说,在所有最终被判为正类的样本中,有多大的比例是被正确的预测和判别的。

有的时候,这个查准率比之前讲到的准确率更有意义。比如,我们要进行电商刷单商铺的挖掘,并且要对挖出来的恶意刷单商铺进行惩罚。在这个例子里,查准率指的又是最终挖掘的结果中被判为刷单商铺的样本里,真实的刷单商铺占总体被判为刷单商铺的样本的数量的比例。如果这个比例很小,就意味着有很多我们认为的刷单商铺实际上并不存在刷单行为。如果这个比例高,就意味着我们认为的刷单商铺是八九不离十的。

但有时片面追求查准率,有可能会降低召回率。我们在计算查准率时,有一部分真实的正类数据是没有被关注的,就是FN(我们认为是负类,但事实上是正类的数据)。这部分是我们之前说的漏判的数据,在查准率是没有关注的,但这一部分也是属于真实的正类数据。所以如果片面追求的精准率,那么很有可能FN就会变多,召回率就会下降。(备注:为了提高查准率,我把少数正样本预测对了,其他的都尽可能预测为负类,这样会增加FN数量,减少FP数量)

另外两个指标都与错误分类有关。第一个指标FPR就是指False positive rate,公式如下。它的含义就是有多少负类被划分为了正类的比例。所以它又叫做错误接受率,有多少错误被接收了。

另外一个指标,FRR,指错误拒绝率,它的含义就是指真实的所有正类里有多少是被错误拒绝的,也就是说有多少真实的正类没有被判为正类。

刚才我们研究主要是二分类模型,二类分类模型有一个正类,也有个负类。这个正、负都是我们自己定的,表示我们对一个类的关注程度。那如果面对多类的分类模型,我们该如何评估呢?多类分类模型,我们也可以做出一个混淆矩阵,其对角线上的都是分类正确的数量,详见下图:

和二分类不同,一般多分类任务中,每个类都是我们关注的。那么这样,在计算我们上面讲到的属性时可能会有点麻烦。我们主要还是关注最重要的三个准确、召回和F值。

准确率实际上是没有什么问题的,多分类和二分类准确率的计算是一致的。

召回和F值的计算就可能会遇到些问题了,我们在进行二分类任务时,所谓的TP 、FN都是先确定了一个我们关注的正类。但是多分类任务这么多的分类,我们该怎么去确定正类呢?所以就得以下两种思路解决这个问题,如下图:

第一,先计算所有的TP、FN,再以二值方法进行计算。这种思路是分别把每个真实的分类别都分别看作是正类,然后把它们看作正类时得到的TP、FN都加起来,最后通过二值化的方法计算召回、F值。这里需要补充一点,就是我们在计算每个类的TP、FN时,一般只拿真实情况下该类的数据进行计算。真实情况下不是这个类的数据,我们不进行计算。比如我把Y1看作是正类的话,用到的数据只是所有真实情况下为Y1的数据,如果这些数据被分成了Y2、 Y3,那都是分错,就是这么来计算的。(最后一句有待思考)

第二种思路,我们分别把每个类当做正类,然后都计算一个召回率或者F值,最后可以取平均,这个平均可以按照类别的多少进行加权平均,也可以不加权。

(2)python 实现

输出:

算法模型评审要点总结 第6篇

(1)概念

刚才我们还讲到,我们有可能下图的预测值:

预测值Y_pred代表着为正类的概率,所以如果这个概率接近于 0 ,那么应该被判为负类。如果得到的是概率值,有的时候我们也需要确定一个阈值,那么大于这个阈值分类结果就会被判为正类,小于这个阈值分类结果就会被判为负类。当然一般情况下,我们会取 ,这是个比较均衡、客观的阈值。但如果我们更关注正、负类别判别的质量,这个阈值就有可能比 要高一些,也有可能比 低一些。这个阈值怎么取,就需要借助我们下图中的ROC曲线,以及AUC参数了:

我们先来看ROC曲线,其横轴代表的是FPR,纵轴代表的是TPR。我们知道TPR实际上指的是召回率,而这里的FPR就是False positive rate。那么横轴和纵轴都是从0到1的。我们最理想的状态当然是希望FPR尽可能的小,也就是尽可能少的被误判,而TPR尽可能的高,也就是召回尽可能多,所以我们理想中的ROC曲线应该是尽量向左上方偏斜的。

极端情况下,ROC曲线应该是沿着图中的坐标轴和上坐标轴边重合的。对于对角线,就是虚线,意味着一个随机变量的分类。也就是说,如果有个随机判别为正类还是负类的判别器,就会沿着这条虚对角线走。在随机的分类下,所有被判为正的样本里,被正确分类的和被错误分类的一定是和,所以就是这么一条的直线了。这样我们就可以确定一个阈值,让FPR尽可能小,让TPR尽可能大。一般,我们确定阈值将让FPR和TPR都有所权衡,使它们的交点尽可能的接近于这个ROC拐点,这样就兼顾了FPR、TPR。

通过ROC曲线可以很容易的看到任意界限值对性能识别的影响力。我们所谓的AUC,也就是Area Under Curve,就是指这条ROC曲线下的面积,这个值可以直接反映ROC曲线向左上方的靠近程度。如下图:

Roc取线是怎么画的呢?我们来看下图:

我们首先将一个模型输出的所有预测结果以得分顺序,从大到小进行排列。注意这里给出的p(positive)或者是n(negative),即标注,均为真实分类。比如说第一条数据,它真实分类也是positive,而他的模型输出就是。而第三条数据的真实分类是negative,而它模型输出是。

在画ROC曲线时,我们可以从上到下一个一个的取它的阈值。比这个阈值大的,我们都判定为正类;比这个阈值小的,我们都判定为负类。以下图为例,如果我们以到之间作为阈值,则TPR就是召回率一共有10个召回了一个,所以TPR为,此时FPR=0,所以我们在图上取一点(0,)。

然后如下图把阈值调到至之间计算TPR、FPR,接着在图上画出(FPR, TPR)点。

依此类推,一直往下进行,直到取完全部间隔点,再把它们连成一条线,就是我们的ROC曲线。这条ROC曲线实际上是一条折线,但如果样本数比较多的话,就近似为一条直线。

分类模型的评估方法中,还有两个可以衡量我们的分类效果:

第一个,增益图

它的横轴是测试集的取样比例,而纵轴是正样本比例与随机平均算法的比例的比值。

举个例子,比如我们要挖一个游戏中的众多用户中的作弊用户。比如有100个用户,里面只有10个作弊用户。那么对于增益图来说,上图这条虚线就是平均比例本身的比值,也就是1。如果我们通过算法得到了所有的样本得分,比如说在这100个用户当中取出得分前10的10个用户,发现有9个是作弊用户,占到了这10个用户中的90%。我们在增益图中横轴取到,即它代表着我们取得得分前10%的用户是取了10个用户占着100个用户的10%,所以横轴取,表示的是一种测试集的取样比例。

那么在这得分前10的用户中,我们发现9个是作弊用户,占到90%。因为整体作弊用户的比例是10%(100个用户中有10个作弊用户)。所以得分横轴为,纵轴为9。因为这里是一个比例,比例就是最终在横轴,纵轴为的的地方戳一点,那么以此类推扩大测试集的比例就可以把所有点都戳下来,最后得到的一个结果,这样的一个形状的一个图就是我们的增益图了。

增益图可以在宏观上反映分类器的分类效果。

第二个,KS图

KS图横轴也为测试集的取样比例,纵轴则是两条曲线,一条是TPR,一条是FPR。我们比较关注的是这两条曲线的最大差距。这个差距反映了对正类样本分类的区分度。

(2)python 实现

输出:

算法模型评审要点总结 第7篇

过拟合是指模型对于训练数据拟合呈过当的情况, 反映到评估指标上, 就是模型在训练集上的表现很好, 但在测试集和新数据上的表现较差。过拟合由于训练数据包含抽样误差,训练时将误差也考虑在内,对抽样误差进行了很好地拟合。 欠拟合指的是模型在训练和预测时表现都不好的情况。

降低“过拟合”风险的方法

(1) 获得更多的训练数据。 更多的样本能够让模型学习到更多更有效的特征, 减小噪声的影响。 可以通过一定的规则来扩充训练数据。(2) 降低模型复杂度。 在数据较少时, 模型过于复杂是产生过拟合的主要因素, 适当降低模型复杂度可以避免模型拟合过多的采样噪声。 (3) 正则化方法。 给模型的参数加上一定的正则约束, 比如将权值的大小加入到损失函数中。 以L2正则化为例:                                                                                     这样, 在优化原来的目标函数C0的同时, 也能避免权值过大带来的过拟合风险。(4) 集成学习方法。 集成学习是把多个模型集成在一起, 来降低单一模型的过拟合风险, 如Bagging方法。

(5)Early Stopping。在迭代时进行迭代次数截断,即在模型队训练数据及迭代收敛之前停止迭代来防止过拟合。在训练过程中,记录目前最好的 validation accuracy,若连续k个epoch都没打到最佳accuracy,则可认为accuracy不再提高,此时可停止迭代。

(6)dropout。神经网络常用方法,训练时每次随机以一定概率丢弃隐藏层节点,使得每次结果独立,具体见神经网络

降低“欠拟合”风险的方法

(1) 添加新特征。 当特征不足或者现有特征与样本标签的相关性不强时, 模型容易出现欠拟合。 通过挖掘“上下文特征”“ID类特征”“组合特征”等新的特征, 往往能够取得更好的效果。 在深度学习潮流中, 有很多模型可以帮助完成特征工程, 如因子分解机、 梯度提升决策树、 Deep-crossing等都可以成为丰富特征的方法。(2) 增加模型复杂度。 简单模型的学习能力较差, 通过增加模型的复杂度可以使模型拥有更强的拟合能力。 例如, 在线性模型中添加高次项, 在神经网络模型中增加网络层数或神经元个数等。(3) 减小正则化系数。 正则化是用来防止过拟合的, 但当模型出现欠拟合现象时, 则需要有针对性地减小正则化系数。

算法模型评审要点总结 第8篇

(1)概念

聚类模型的评估有两个最主要的指标:

第一个,RMS

它的定义如下图,是每个聚类的值减去每个类的平均值,然后对它们求平方和,然后对这个和进行开方运算,再求均值。如果这个值比较小,它的聚类效果比较好;如果这个值比较大,即每个类和它的中心距离比较远,那么我们就认为,它的分类效果比较差。

同一个数据集,如果采用不同的算法进行聚类,我们就可以用而RMS的大小关系进行对这些算法的评价。

第二个,轮廓系数

它结合了内聚度和分离度两种因素。可以用来在相同的原始数据的基础上评价不同的算法或者算法不同设置方式对聚类结果所产生的影响。轮廓系统的定义如下:

这里的 a(i) 指的是某样本 i 与簇内其他样本的平均距离,表示它的内聚度; b(i) 代表的是样本 i 与其他某簇样本的平均距离,表示分离度。如果有多个簇的话,那么 b(i) 取最小的。

我们希望他的分离度越大越好,而内聚度越小越好。因为 b(i) 和 a(i) 肯定都是大于0的数。所以如果 b(i) 很大, a(i) 很小,轮廓系数是趋近于1的,这时它的聚类效果比较好。反之,如果 b(i) 比较小,即分离度比较小,而它的内聚度 a(i) 比较大的话,那么轮廓系数值就接近于-1,此时的聚类效果则比较糟糕。

(2)因为Kmeans是一种面向切割的分割方法,如果拿轮廓系数进行评价,它的评价效果确实是最好的。同时,评价指标只是一个参考,而真正在业务场景下怎么去评价它的结果,还需要我们根据实际的业务场景多思考、多分析。

(2)python 实现

输出:

显示全文

注:本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即后台留言通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意

点击下载文档

文档为doc格式

发表评论

评论列表(7人评论 , 39人围观)

点击下载
本文文档