机器学习指标计算

news2024/10/6 21:53:47

一、有如下图

在这里插入图片描述

  1. accuracy

 accuracy  = T P + T N T P + T N + F P + F N \text { accuracy }=\frac{T P+T N}{T P+T N+F P+F N}  accuracy =TP+TN+FP+FNTP+TN accuracy指的是正确预测的样本数占总预测样本数的比值,它不考虑预测的样本是正例还是负例,考虑的是全部样本。

  1. precision(查准率)

 precision  = T P T P + F P \text { precision }=\frac{T P}{T P+FP}  precision =TP+FPTP

precision指的是正确预测的正样本数占所有预测为正样本的数量的比值,也就是说所有预测为正样本的样本中有多少是真正的正样本。从这我们可以看出,precision只关注预测为正样本的部分。

  1. recall(召回率)

 recall  = T P T P + F N \text { recall }=\frac{T P}{T P+FN}  recall =TP+FNTP

它指的是正确预测的正样本数占真实正样本总数的比值,也就是我能从这些样本中能够正确找出多少个正样本。

  1. F-score

F −  score  = 2 1 /  precision  + 1 /  recall  F-\text { score }=\frac{2}{1 / \text { precision }+1 / \text { recall }} F score =1/ precision +1/ recall 2 F-score相当于precision和recall的调和平均,用意是要参考两个指标。从公式我们可以看出,recall和precision任何一个数值减小,F-score都会减小,反之,亦然。

  1. specificity

 specificity  = T N T N + F P \text { specificity }=\frac{T N}{T N+F P}  specificity =TN+FPTN specificity指标平时见得不多,它是相对于sensitivity(recall)而言的,指的是正确预测的负样本数占真实负样本总数的比值,也就是我能从这些样本中能够正确找出多少个负样本。

  1. sensitivity(TPR)

 sensitivity  = T P T P + F N =  recall  \text { sensitivity }=\frac{T P}{T P+F N}=\text { recall }  sensitivity =TP+FNTP= recall 

  1. P-R曲线

我们将纵轴设置为precison,横轴设置成recall,改变阈值就能获得一系列的pair并绘制出曲线。对于不同的模型在相同数据集上的预测效果,我们可以画出一系列的PR曲线。一般来说如果一个曲线完全“包围”另一个曲线,我们可以认为该模型的分类效果要好于对比模型。

如下图所示:
在这里插入图片描述
样本不均衡下的指标

背景:

在大多数情况下不同类别的分类代价并不相等,即将样本分类为正例或反例的代价是不能相提并论的。例如在垃圾邮件过滤中,我们希望重要的邮件永远不要被误判为垃圾邮件,还有在癌症检测中,宁愿误判也不漏判。在这种情况下,仅仅使用分类错误率来度量是不充分的,这样的度量错误掩盖了样本如何被错分的事实。所以,在分类中,当某个类别的重要性高于其他类别时,可以使用Precison和Recall多个比分类错误率更好的新指标。

  1. roc(Receiver Operating Characteristic Curve)

在实际的数据集中经常会出现类别不平衡现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间而变化。而在这种情况下,ROC曲线能够保持不变。同时,我们可以断言,ROC曲线越接近左上角,该分类器的性能越好,意味着分类器在假阳率很低的同时获得了很高的真阳率。

以下是一个ROC曲线的实例:
在这里插入图片描述
其中,该曲线的横坐标为假阳性率(False Positive Rate, FPR),N是真实负样本的个数,FP是N个负样本中被分类器预测为正样本的个数,P是真实真样本的个数。 其中 F P R = F P F P + T N FPR = \frac{FP}{FP + TN} FPR=FP+TNFP, T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP

举个例子,如果有20个样本的2分类,分类结果如下所示:
在这里插入图片描述
现在我们指定一个阈值为0.9,那么只有第一个样本(0.9)会被归类为正例,而其他所有样本都会被归为负例,因此,对于0.9这个阈值,我们可以计算出FPR为0,TPR为0.1(因为总共10个正样本,预测正确的个数为1),那么我们就知道曲线上必有一个点为(0, 0.1)。依次选择不同的阈值(或称为“截断点”),画出全部的关键点以后,再连接关键点即可最终得到ROC曲线如下图所示。

在这里插入图片描述
其实还有一种更直观的绘制ROC曲线的方法,就是把横轴的刻度间隔设为 1 N \frac{1}{N} N1,纵轴的刻度间隔设为 1 P \frac{1}{P} P1,N,P分别为负样本与正样本数量。然后再根据模型的输出结果降序排列,依次遍历样本,从0开始绘制ROC曲线,每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线,每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线,遍历完所有样本点以后,曲线也就绘制完成了。

使用sklearn进行roc曲线绘制:

>>> from sklearnimport metrics
>>> import numpy as np
>>> y = np.array([1, 1, 2, 2]) #假设4个样本
>>> scores = np.array([0.1, 0.4, 0.35, 0.8])
>>> fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
>>> fpr #假阳性
array([ 0. ,  0.5,  0.5,  1. ])
>>> tpr #真阳性
array([ 0.5,  0.5,  1. ,  1. ])
>>> thresholds #阈值
array([ 0.8 ,  0.4 ,  0.35,  0.1 ])
>>> #auc(后面会说)
>>> auc = auc = metrics.auc(fpr, tpr)
>>> auc
0.75

绘制曲线:

import matplotlib.pyplot as plt
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

所画图像如图所示:
在这里插入图片描述
9. auc(Area under curve)

auc指的是计算roc的面积。 AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。

def AUC(label, pre):
  """
  适用于python3.0以上版本
   """
  #计算正样本和负样本的索引,以便索引出之后的概率值
    pos = [i for i in range(len(label)) if label[i] == 1]
    neg = [i for i in range(len(label)) if label[i] == 0]
 
    auc = 0
    for i in pos:
        for j in neg:
            if pre[i] > pre[j]:
                auc += 1
            elif pre[i] == pre[j]:
                auc += 0.5
 
    return auc / (len(pos)*len(neg))
 
 
if __name__ == '__main__':
    label = [1,0,0,0,1,0,1,0]
    pre = [0.9, 0.8, 0.3, 0.1, 0.4, 0.9, 0.66, 0.7]
    print(AUC(label, pre))

当然,也可以使用公式来进行计算: A U C = ∑ i ∈  positiveClass  rank ⁡ i − M ( 1 + M ) 2 M × N A U C=\frac{\sum_{i \in \text { positiveClass }} \operatorname{rank}_{i}-\frac{M(1+M)}{2}}{M \times N} AUC=M×Ni positiveClass ranki2M(1+M)

代码如下:

import numpy as np
def auc_calculate(labels,preds,n_bins=100):
    postive_len = sum(labels)
    negative_len = len(labels) - postive_len
    total_case = postive_len * negative_len
    pos_histogram = [0 for _ in range(n_bins)]
    neg_histogram = [0 for _ in range(n_bins)]
    bin_width = 1.0 / n_bins
    for i in range(len(labels)):
        nth_bin = int(preds[i]/bin_width)
        if labels[i]==1:
            pos_histogram[nth_bin] += 1
        else:
            neg_histogram[nth_bin] += 1
    accumulated_neg = 0
    satisfied_pair = 0
    for i in range(n_bins):
        satisfied_pair += (pos_histogram[i]*accumulated_neg + pos_histogram[i]*neg_histogram[i]*0.5)
        accumulated_neg += neg_histogram[i]

    return satisfied_pair / float(total_case)
 
 y = np.array([1,0,0,0,1,0,1,0,])
 pred = np.array([0.9, 0.8, 0.3, 0.1,0.4,0.9,0.66,0.7])
print("----auc is :",auc_calculate(y,pred))
  1. AUROC (Area Under the Receiver Operating Characteristic curve)

大多数时候,AUC都是指AUROC,这是一个不好地做法,AUC有歧义(可能是任何曲线),而AUROC没有歧义。

其余部分,与AUC一致。

二. 图像分割指标汇总

  1. pixel accuracy (标记正确/总像素数目)

为了便于解释,假设如下:共有 k + 1 k+1 k+1个类(从 L 0 L_{0} L0 L k L_{k} Lk,其中包含一个空类活着背景), p i j p_{ij} pij表示本属于类 i i i但是预测成类 j j j的像素数量。即, p i i p_{ii} pii表示真正的正样本,而 p i j , p j i p_{ij},p_{ji} pij,pji 表示被分别被解释成假正与假负。

其计算公式如下: P A = ∑ 0 k p i i ∑ i = 0 k ∑ j = 0 k p i j PA = \frac{\sum_{0}^{k}p_{ii}}{\sum_{i=0}^{k}\sum_{j=0}^{k}p_{ij}} PA=i=0kj=0kpij0kpii
图像中共有 k + 1 k+1 k+1类, P i i P_{ii} Pii 表示将第 i i i类分成第 i i i类的像素数量(正确分类的像素数量), P i j P_{ij} Pij表示将第 i i i类分成第 j j j类的像素数量(所有像素数量)
因此该比值表示正确分类的像素数量占总像素数量的比例。

对于 P A PA PA而言,优点就是简单! 缺点:如果图像中大面积是背景,而目标较小,即使将整个图片预测为背景,也会有很高的PA得分,因此该指标不适用于评价以小目标为主的图像分割效果。

  1. MPA(Mean Pixel Accuracy)

其计算公式如下: M P A = 1 1 + K ∑ 0 k p i i ∑ j = 0 k p i j MPA = \frac{1}{1+K}\sum_{0}^{k}\frac{p_{ii}}{\sum_{j=0}^{k}p_{ij}} MPA=1+K10kj=0kpijpii

计算每类各自分类的准确率,再取均值!

  1. MIou(Mean Intersection over Union)

计算两个集合的交集与并集之比,在语义分割中,这两个集合为真实值和预测值。 M I o U = 1 k + 1 ∑ i = 0 k p i i ∑ j = 0 k p i j + ∑ j = 0 k p j i − p i i M I o U=\frac{1}{k+1} \sum_{i=0}^{k} \frac{p_{i i}}{\sum_{j=0}^{k} p_{i j}+\sum_{j=0}^{k} p_{j i}-p_{i i}} MIoU=k+11i=0kj=0kpij+j=0kpjipiipii

  1. FWIoU(Frequency Weighted Intersection over Union)

MIou的一种提升,这种方法可以根据每个类出现的频率为其设置权重: F W I o U = 1 ∑ i = 0 k ∑ j = 0 k p i j ∑ i = 0 k p i i ∑ j = 0 k p i j + ∑ j = 0 k p j i − p i i F W I o U=\frac{1}{\sum_{i=0}^{k} \sum_{j=0}^{k} p_{i j}} \sum_{i=0}^{k} \frac{p_{i i}}{\sum_{j=0}^{k} p_{i j}+\sum_{j=0}^{k} p_{j i}-p_{i i}} FWIoU=i=0kj=0kpij1i=0kj=0kpij+j=0kpjipiipii

三. 目标检测指标汇总

主要是用到以下的指标:

m A P mAP mAP: m e a n A v e r a g e P r e c i s i o n mean Average Precision meanAveragePrecision, 即各类别 A P AP AP的平均值
A P AP AP: P R PR PR曲线下面积,后文会详细讲解
P R PR PR曲线: P r e c i s i o n − R e c a l l Precision-Recall PrecisionRecall曲线
P r e c i s i o n : T P / ( T P + F P ) Precision: TP / (TP + FP) Precision:TP/(TP+FP)
R e c a l l : T P / ( T P + F N ) Recall: TP / (TP + FN) Recall:TP/(TP+FN)
T P : I o U > 0.5 TP: IoU>0.5 TP:IoU>0.5的检测框数量(同一 G r o u n d T r u t h Ground Truth GroundTruth只计算一次)
F P : I o U < = 0.5 FP: IoU<=0.5 FP:IoU<=0.5的检测框,或者是检测到同一个 G T GT GT的多余检测框的数量
F N FN FN: 没有检测到的GT的数量
I O U IOU IOU: 计算两个集合的交集与并集之比
N M S NMS NMS: 非极大值抑制
A P AP AP计算

要计算 A P AP AP,首先需要计算的是 T P 、 F P 、 F N TP、FP、FN TPFPFN.

对于单张图片,首先遍历图片中 g r o u n d ground ground t r u t h truth truth对象,然后提取我们要计算的某类别的 g t gt gt o b j e c t s objects objects,之后读取我们通过检测器检测出的这种类别的检测框(其他类别的先不管),接着过滤掉置信度分数低于置信度阈值,也有的是未设置置信度阈值。将剩下的检测框按置信度分数从高到低排序,最先判断置信度分数最高的检测框与 g t gt gt b b o x bbox bbox i o u iou iou是否大于 i o u iou iou阈值,若 i o u iou iou大于设定的 i o u iou iou阈值即判断为 T P TP TP,将此 g t b b o x gt_bbox gtbbox标记为已检测(后续的同一个 G T GT GT的多余检测框都视为 F P FP FP,这就是为什么先要按照置信度分数从高到低排序,置信度分数最高的检测框最先去与 i o u iou iou阈值比较,若大于 i o u iou iou阈值,视为 T P TP TP,后续的同一个 g t gt gt对象的检测框都视为 F P FP FP), i o u iou iou小于阈值的,为 F P FP FP。图片中某类别一共有多少个GT是固定的,减去TP的个数,剩下的就是FN的个数了

当有了 T P , F P , F N TP,FP,FN TP,FP,FN值之后,我们就可以计算这一类别的 p r e c i s i o n precision precision r e c a l l recall recall。从而计算 A P AP AP

V O C 2010 VOC2010 VOC2010以前,只需要选取当 R e c a l l > = 0 , 0.1 , 0.2 , . . . , 1 Recall >= 0, 0.1, 0.2, ..., 1 Recall>=0,0.1,0.2,...,1 11 11 11个点时的 P r e c i s i o n Precision Precision最大值,然后 A P AP AP就是这 11 11 11 P r e c i s i o n Precision Precision的平均值。
V O C 2010 VOC2010 VOC2010及以后,需要针对每一个不同的 R e c a l l Recall Recall值(包括0和1),选取其大于等于这些 R e c a l l Recall Recall值时的 P r e c i s i o n Precision Precision最大值,然后计算 P R PR PR曲线下面积作为 A P AP AP值。
C O C O COCO COCO数据集,设定多个 I O U IOU IOU阈值( 0.5 − 0.95 0.5-0.95 0.50.95, 0.05 0.05 0.05为步长),在每一个 I O U IOU IOU阈值下都有某一类别的 A P AP AP值,然后求不同 I O U IOU IOU阈值下的 A P AP AP平均,就是所求的最终的某类别的 A P AP AP值。
m A P mAP mAP计算

顾名思义,所有类的 A P AP AP值平均值就是 m A P mAP mAP

四. 模型效率衡量

FLOPs(floating point operations)

假设卷积操作的实现是按照滑窗的形式,并且非线性函数是不消耗计算资源的。那么对于卷积核的 F L O P s FLOPs FLOPs为: F L O P s = 2 H W ( C i n K 2 + 1 ) C o u t FLOPs = 2HW(C_{in}K^{2}+1)C_{out} FLOPs=2HW(CinK2+1)Cout 其中 H H H, W W W C i n C_{in} Cin是高,宽与输入特征的通道数, K K K是卷积核的宽度与长度, C o u t C_{out} Cout是输出通道数。同时,假设了输入输出的尺寸是一样的。

对于全连接层: F L O P s = ( 2 I − 1 ) O FLOPs = (2I - 1)O FLOPs=(2I1)O 其中, I I I是输入的维度, O O O是输出维度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/750977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ubuntu源码安装PostgreSQL】

Ubuntu源码安装PostgreSQL 1. PostgreSQL官网下载压缩包2. 解压&安装2.1 解压文件2.2 安装依赖2.3 执行安装2.4 执行安装2.5 添加路径到文件 3. 初始化数据库与使用3.1 初始化数据库3.2 启动数据库服务3.3 启动数据库 1. PostgreSQL官网下载压缩包 下载地址&#xff1a;ht…

基于linux下的高并发服务器开发(第一章)- 动态库加载失败的原因1.7

01 / 动态库的制作 02 / 工作原理 静态库&#xff1a;GCC进行链接时&#xff0c;会把静态库中代码打包到可执行程序中动态库&#xff1a;GCC进行链接时&#xff0c;动态库的代码不会被打包到可执行程序中程序启动之后&#xff0c;动态库会被动态加载到内存中&#xff0c;通过 …

Spring Cloud之Config分布式配置应⽤

. 右键⽗⼯程【 yx-parent 】选择【 New 】 - 【 Module 】选项&#xff0c;然后选择创建【 Maven 】类型项⽬&#xff08;不勾选模 板&#xff09;&#xff0c;将项⽬名称设置为【yx-cloud-config 】。 在yx-cloud-config⼯程的pom.xml⽂件中引⼊以下依赖坐标&#xff08;需要…

AI原生云向量数据库Zilliz Cloud查看备份快照和恢复备份

目录 快照状态 查看快照详情 相关文档 本文介绍如何查看已创建的快照信息。您可以手动或自动创建快照。 快照状态 根据不同场景,快照可能会处于如下状态: 创建中 如果快照处于此状态,则无法创建其他快照。但您可以单击操作列中的更多按钮,然后选择取消来终止创建过程。…

SpringCloud——分布式请求链路跟踪Sleuth

安装运行zipkin SpringCloud从F版已不需要自己构建Zipkin Server&#xff0c;只需要调用jar包即可 https://dl.bintray.com/oenzipkin/maven/io/zipkin/java/zipkin-server/ 下载&#xff1a;zipkin-server-2.12.9-exec.jar 运行&#xff1a;java -jar zipkin-server-2.12.9-e…

【Excel】excel多个单元格的内容合并到一个单元格,并使用分隔符

方法一&#xff1a;使用连接符 & 左键单击选中“D2”单元格&#xff0c;在D2单元格中输入公式“A2&B2&C2”&#xff0c;按“Enter”即可实现数据合并。 ------如果想连接的时候&#xff0c;中间加分隔符&#xff0c;可以使用&#xff1a;公式A2&"&#xf…

4G无线红外电表电能量力参数采集仪器功能DL/T645-1997、DL/T645-2007、DL∕T698.45-2017

红外抄表终端应支持4G通信&#xff0c;满足电信、移动、联通全网通的通信制式&#xff1b; &#xff08;2&#xff09;采集终端支持并兼容DL/T645-1997、DL/T645-2007、DL∕T698.45-2017版本电表&#xff1b; &#xff08;3&#xff09;采集终端以IR红外为数据采集方式&#xf…

pycharm import的类库修改后要重启问题的解决方法

通过将以下行添加到pycharm中的settings-> Build,Excecution,Deployment-> Console-> Python Console中&#xff0c;可以指示Pycharm在更改时自动重新加载模块&#xff1a; %load_ext autoreload %autoreload 2

SOLIDWORKS如何定制化异型孔向导及其孔标注

异型孔向导是SOLIDWORKS中一个极为方便的功能&#xff0c;只需要简单的几步设置就可以根据工程师设定好的标准、类型、大小创建符合标准的孔(包括:柱形沉头孔、锥形沉头孔、直孔、直螺纹孔、锥形螺纹孔等等)。此外由于工程图和三维模型的协同关联&#xff0c;生成孔的公差信息、…

Java将获取的参数,图片以及pdf文件放入到word文档指定位置

首先引入的依赖 <!-- poi库 --> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId&…

VQA评测evaluation代码:gqa / aokvqa / vqav2 / scienceQA

VQA评测分多种&#xff0c;这里提几种&#xff0c;代码参考来自lavis和mmpretrain。 一、gqa评测&#xff08;只有一个answer&#xff09; 数据集下载及格式&#xff1a; blip中json地址 图片下载 # gqa格式已重新整理&#xff0c;特点是每个question对应的gt_answers只有一…

Linux操作系统知识点总结(附VMware、CentOS以及finalshell的安装教程)

1. 计算机的组成部分&#xff1a;输入单元&#xff0c;中央处理器&#xff08;CPU&#xff09;&#xff0c;输出单元。 CPU的种类包括&#xff1a;精简指令集&#xff08;RISC&#xff09;和复杂指令集&#xff08;CISC&#xff09;。 计算机的五大单元包括输入单元、输出单元、…

vue3+element+sortablejs实现table表格 行列动态拖拽

vue3elementsortablejs实现table动态拖拽 1.第一步我们要安装sortablejs依赖2.在我们需要的组件中引入3.完整代码4.效果 1.第一步我们要安装sortablejs依赖 去博客设置页面&#xff0c;选择一款你喜欢的代码片高亮样式&#xff0c;下面展示同样高亮的 代码片. npm install so…

【力扣算法09】之 6. N 字形变换 python

文章目录 问题描述示例1示例2示例3提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果 完结 问题描述 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&…

组合(力扣)dfs + 回溯 + 剪枝 JAVA

给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2&#xff1a; 输入&#xff1a;n 1, …

设计模式之模板模式

1. 模板模式介绍 1、模板模式即模板方法模式自定义了一个操作中的算法骨架&#xff0c;而将步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构&#xff0c;可以自定义该算法的某些特定步骤&#xff1b; 2、父类中提取了公共的部分代码&#xff0c;便于代码复用&am…

rabbitmq延时队列自动解锁库存

使用了最终一致性来解决分布式事务 当order服务出现异常回滚&#xff0c;此时ware服务无法回滚&#xff0c;怎么办&#xff1f; 使用seata全局事务虽然能在order服务出现异常导致回滚时使其他服务的也能同时回滚&#xff0c;但在流量大的情况下是使用加锁的方式&#xff0c;效…

transformer 学习

原理学习: (3条消息) The Illustrated Transformer【译】_于建民的博客-CSDN博客 代码学习: https://github.com/jadore801120/attention-is-all-you-need-pytorch/tree/master/transformer mask学习: (3条消息) NLP 中的Mask全解_mask在自然语言处理代表什么_郝伟博士的…

HTTP原理解析-超详细

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

linux 安装 milvus 和 Attu

效果图 准备 建议使用docker安装&#xff0c;比较简单易操作 查看自己是否安装docker-compose docker-compose --version 如果docker-compose 的版本低于2.0&#xff0c;会报错&#xff0c;报错内容如下&#xff1a; 所以在此之前需要把docker-compose升级到2.0版本 升级d…