如何用置信区间报告分类器性能

在为分类问题选择机器学习算法后,您需要向利益相关者报告模型的性能。

这很重要,因为这样您可以为模型在新数据上的表现设定预期。

一个常见的错误是仅报告模型的分类准确率。

在本文中,您将学习如何计算模型性能的置信区间,从而为模型的技能提供经过校准且可靠的指示。

通过我的新书《机器学习统计学》启动您的项目,其中包含分步教程和所有示例的Python源代码文件。

让我们开始吧。

How to Report Classifier Performance with Confidence Intervals

如何用置信区间报告分类器性能
照片由 Andrew 拍摄,保留部分权利。

分类准确率

分类机器学习算法的技能通常以分类准确率来报告。

这是所有预测中正确预测的百分比。计算方法如下:

分类器的准确率可能是 60% 或 90%,其好坏程度仅在问题域的上下文中才有意义。

分类错误

在与利益相关者谈论模型时,谈论分类错误或直接说错误可能更相关。

这是因为利益相关者假设模型表现良好,他们可能真正想知道模型容易犯错的程度。

您可以将分类错误计算为错误预测数占总预测数的百分比,表示为 0 到 1 之间的值。

分类器的错误可能是 0.25 或 0.02。

此值也可以通过乘以 100 转换为百分比。例如,0.02 将变为 (0.02 * 100.0) 或 2% 的分类错误。

验证数据集

您使用什么数据集来计算模型技能?

最好将验证数据集从建模过程中分离出来。

这意味着从可用数据中随机选择并移除一部分数据样本,以便在模型选择或配置期间不使用它。

在训练数据上准备好最终模型后,可以使用它在验证数据集上进行预测。这些预测用于计算分类准确率或分类错误。

需要机器学习统计学方面的帮助吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

置信区间

与其仅呈现一个误差分数,不如计算置信区间并将其作为模型技能的一部分进行呈现。

置信区间包含两部分:

  • 范围。这是模型技能的下限和上限。
  • 概率。这是模型技能落在该范围内的概率。

总的来说,分类误差的置信区间可以按以下方式计算:

其中误差是分类误差,常数是定义所选概率的常数值,sqrt 是平方根函数,n 是用于评估模型的观测数(行数)。从技术上讲,这称为威尔逊得分区间

常数值来自统计学,常用的值是:

  • 1.64 (90%)
  • 1.96 (95%)
  • 2.33 (98%)
  • 2.58 (99%)

使用这些置信区间会做出一些假设,您需要确保您能满足这些假设。它们是:

  • 验证数据集中的观测值是从该域独立抽取的(例如,它们是独立同分布的)。
  • 至少使用了 30 个观测值来评估模型。

这是基于一些抽样理论的统计学原理,该原理将分类器的误差视为二项分布,我们有足够的观测值来近似二项分布的正态分布,并且根据中心极限定理,我们分类的观测值越多,就越接近真实但未知的模型技能。

置信区间示例

考虑一个在包含 50 个样本的验证数据集(n = 50)上误差为 0.02(误差 = 0.02)的模型。

我们可以计算 95% 置信区间(常数 = 1.96),如下所示:

或者,换句话说:

模型在看不见的数据上的真实分类误差有 95% 的可能性会落在置信区间 [0.0, 0.0588] 内。

请注意,分类误差的置信区间必须截断为 0.0 和 1.0。不可能出现负误差(例如小于 0.0)或大于 1.0 的误差。

进一步阅读

总结

在本文中,您了解了如何为分类器计算置信区间。

具体来说,你学到了:

  • 在报告结果时,如何计算分类准确率和分类错误。
  • 在计算要报告的模型技能时使用什么数据集。
  • 如何为选定的似然水平计算分类误差的下限和上限。

您对分类器置信区间有任何疑问吗?
请在下面的评论中提出您的问题。

掌握机器学习统计学!

Statistical Methods for Machine Learning

培养对统计学的实用理解

...通过在 python 中编写代码

在我的新电子书中探索如何实现
机器学习的统计方法

它提供关于以下主题的自学教程
假设检验、相关性、非参数统计、重采样,以及更多...

探索如何将数据转化为知识

跳过学术理论。只看结果。

查看内容

86 条对《如何报告分类器性能及置信区间》的回复

  1. Birkey 2017 年 6 月 2 日 下午 3:12 #

    这个(置信区间)与 F1 分数有何不同?F1 分数被广泛使用,而且 IMHO 更容易理解,因为它是一个同时涵盖精确率和召回率的分数。

    • Jason Brownlee 2017 年 6 月 3 日 上午 7:20 #

      F1 是模型的技能度量。它可以是准确率或任何其他指标。

      在本文中,我们讨论的是计算出的技能分数的置信度(不确定性)。

  2. Elie Kawerk 2017 年 6 月 3 日 上午 3:17 #

    嗨,Jason,

    感谢您发布的好文章。您报告的这个误差置信区间仅对应于二元分类。那么对于多类分类呢?

    此致

    • Jason Brownlee 2017 年 6 月 3 日 上午 7:25 #

      一个非常好的问题。我预计您会使用 logloss 或 AUC,并报告这些指标的置信区间。

      • Elie Kawerk 2017 年 6 月 3 日 下午 5:03 #

        我明白了。

        但是,我认为(AUC 或任何其他指标)的置信区间表达式会有所不同,因为这个过程不会用二项分布来描述。

        对于多类分类,分布是否应该是多项分布?在这种情况下,误差置信区间的表达式是否会发生变化,我猜是这样。

        此致
        Elie

        • Jason Brownlee 2017 年 6 月 4 日 上午 7:49 #

          我明白了,是的,您是正确的。我建议采用一种经验方法来总结分布,使用引导法(一篇文章已安排)。

  3. Jonad 2017 年 6 月 4 日 上午 1:23 #

    嗨,Jason,
    非常好的文章。但我有一个问题。如果我们使用不同的技能度量(例如 F1 分数)来评估我们的模型,分类错误是否会有所不同?
    谢谢

    • Jason Brownlee 2017 年 6 月 4 日 上午 7:54 #

      你好 Jonad,

      不同的度量将以不同的方式评估技能。它们将从同一潜在模型错误中提供不同的视角。

      这有道理吗?

      • jonad 2017 年 6 月 5 日 上午 2:45 #

        是的,我当时就在想,分类误差公式(错误预测数 / 总预测数)可能会根据评估指标的不同而有所不同。现在我明白了。
        谢谢

  4. Simone 2017 年 6 月 7 日 下午 9:25 #

    好文章!
    如何将置信区间与交叉验证结合使用?

    • Jason Brownlee 2017 年 6 月 8 日 上午 7:42 #

      这是一个棘手的问题,我们通常对模型选择期间和最终模型呈现期间的模型技能的方差感兴趣。

      通常使用 CV 分数的标准差来捕捉模型技能方差,也许这通常足够了,我们可以将置信区间留给呈现最终模型或特定预测?

      我愿意接受更好的想法。

      • Simone 2017 年 6 月 9 日 下午 6:32 #

        好的,谢谢!
        最后一个问题:当我使用 k 折交叉验证时,“n”的值是等于所有观测值的数量还是所有观测值减去 k?

        • yerart 2019 年 9 月 15 日 上午 7:41 #

          @Simone,AFAIK n 的值是一个经验值,通常选择为 5 或 10。Jason 在这篇帖子中(像往常一样)解释得非常清楚。

          https://machinelearning.org.cn/k-fold-cross-validation/

        • yerartdev 2019 年 9 月 15 日 上午 7:45 #

          哦,@Simone,顺便说一句,如果“n”等于所有观测值的数量,那么这是一种称为“留一法交叉验证”(LOOCV)的交叉验证类型,它使用原始样本中的单个观测值作为验证数据,其余观测值作为训练数据。

      • yerart 2019 年 9 月 15 日 上午 8:00 #

        @Jason,关于这个呢?(我还没有完全读完,而且我还在努力理解它,但……嗯,我认为它可能也有效)

        Mach Learn. 2018;107(12):1895–1922。在线发布于 2018 年 5 月 9 日。doi:10.1007/s10994-018-5714-4。PMCID:PMC6191021,PMID:30393425。用于高效准确交叉验证的预测集外预测的引导。Ioannis Tsamardinos,Iissavet Greasidou(通讯作者)和 Giorgos Borboudakis。

        https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6191021/

    • yerart 2019 年 9 月 15 日 上午 7:36 #

      嗯,@Simone,从开发者的角度来看,如果您查看 scikit-learn 文档,然后阅读“3.1.1. 计算交叉验证指标”部分(https://scikit-learn.cn/stable/modules/cross_validation.html#computing-cross-validated-metrics),您会看到分数估计的 95% 置信区间报告方式与 Jason 在本帖中的说法一致。

  5. Sathish 2018 年 2 月 6 日 上午 8:47 #

    嗨 Jason
    是否有用于计算 CI 和绘制它们的 R 代码?

    谢谢

  6. Thomas 2018 年 2 月 12 日 下午 11:25 #

    错误只是准确率的相反,难道不说这个会更简单吗?

    这导致了一个基本问题,即准确率或分类误差本身通常是平庸的或无用的指标,因为数据集通常是不平衡的。因此,对该错误的信心同样无用。

    我因为另一个原因发现了这篇帖子,我想找找是否有人像我一样,按类别概率对指标进行分组。当模型具有 0.9 的类别概率时,其精确度是多少?比如 0.6?这对于最终用户来说可能非常有用的信息,因为指标通常会根据类别概率而发生很大的变化。

  7. Peipei 2018 年 5 月 3 日 上午 12:02 #

    嗨,Jason,

    好文章。在计算误差、AUC 或其他指标的置信区间时,需要指标的标准误差。我应该如何计算标准误差?

  8. Manoj 2018 年 5 月 3 日 下午 1:33 #

    嗨,Jason,

    我正在尝试对我的客户进行分组。例如,GAP HK、GAP US 应归入客户 GAP 组。

    一些客户已经分组。例如 GAP HK 已分组到 GAP 下,但 GAP US 未分组。

    我正在使用随机森林分类器。我将已分组的客户名称作为训练数据,将分组客户代码作为要预测的标签。

    分类器正在按预期分配标签。我面临的问题是,即使客户名称与训练数据不完全匹配,分类器也会为客户分配标签或分组客户代码。它尽力匹配。这对我来说是个问题,因为我需要手动取消这些客户的分组。您能建议如何克服这个问题吗?是否有可能知道分类器对每个预测标签的正确概率?如果可能,那么我可以忽略概率较低的那些。

    提前感谢您的建议。

  9. Anish 2018 年 7 月 12 日 上午 3:31 #

    嗨,Jason,
    我不确定是否有人提过,但我发现了一个问题。您建议的基于置信区间的度量不是“威尔逊得分区间”。根据维基百科页面(该页面在本链接中引用)。它实际上是“正态近似区间”,在威尔逊得分段落上方。如果我错了,请纠正我。

    谢谢
    -Anish

  10. AB 2018 年 9 月 4 日 上午 1:15 #

    嗨,Jason,
    我对交叉验证与此方法的关系感兴趣。

    拥有 150 个示例,我决定使用 100 次重复的 5 折交叉验证来了解我的分类器的行为。此时,我有了 100×5 个结果,我可以使用误差率的平均值和标准差来估计模型技能的方差。

    mean(errorRate) +/- 1.96*(std(errorRate))

    我可以使用平均误差率来估计真实误差(我将在看不见的数据上获得)的置信区间。

    mean(errorRate) +/- const * sqrt( (mean(errorRate) * (1 – mean(errorRate))) / n)

    两个问题
    1. 您认为这种方法正确吗?
    2. 在第二个方程中设置 n=150 是否正确,或者我应该使用每次 CV 折叠中使用的测试数据平均数量?

  11. Kostas Theodor 2018 年 9 月 15 日 上午 2:22 #

    你好 Jason,感谢您发布关于机器学习置信区间/引导法的精彩文章。

    假设您使用
    A) 5 折 CV
    B) 30 折 CV

    进行模型评估。您选择最终模型,并在所有可用数据上训练它。

    在每种情况下,报告最终模型技能的范围(不确定性)有哪些选择?
    是否仍然应该保留一些数据点用于验证+二项置信区间?
    使用引导置信区间是否为时已晚,因为最终模型已经训练完毕?

    谢谢

    • Jason Brownlee 2018 年 9 月 15 日 上午 6:16 #

      我不确定是否理解您的问题?

      选择一个最终模型,并使用首选方法来报告预期性能。这与您如何选择该模型无关。

      • Kostas Theodor 2018 年 9 月 16 日 下午 10:29 #

        谢谢 Jason。我发现您另一篇关于测试集和验证集区别的帖子非常有帮助。
        我可以确认以上报告分类器性能及置信区间的程序是否适用于最终训练模型吗?如果是这样,那么似乎应该将提到的验证数据集称为测试集,以使其与链接帖子的定义一致?

  12. mars 2018 年 10 月 6 日 上午 6:30 #

    嗨,Jason,

    谢谢您的帖子!

    在您的示例中,您使用了准确率和误差率,并计算了置信区间。

    可以将“误差率”替换为例如精确率、召回率或 F1 分数吗?为什么可以或不可以?

    例如,假设样本量为 50,f1 评分为 0.02。
    这是否意味着……

    模型在看不见的数据上的真实 F1 分数有 95% 的可能性会落在置信区间 [0.0, 0.0588] 内?

    谢谢!

    • Jason Brownlee 2018 年 10 月 6 日 上午 11:42 #

      也许对某些评分可以。本示例中的示例特定于比率。我相信您可以将其用于其他比率,如精确率、召回率和 F1 分数。

  13. jecy 2018 年 11 月 1 日 下午 12:49 #

    嗨 Jason

    感谢您的帖子。

    如何在 python 中获取 AUC 曲线的标准误差?

    • Jason Brownlee 2018 年 11 月 1 日 下午 2:33 #

      我不确定是否理解。标准误差是指分布的统计量,我不确定如何为一个曲线计算它。

  14. Lorenzo Famiglini 2018 年 12 月 29 日 上午 1:17 #

    你好 Jason,
    我想知道我是否可以计算召回率和精确率的置信区间。如果可以,您能否解释一下我该如何做?
    非常感谢您,
    此致

    Lorenzo

    • Jason Brownlee 2018 年 12 月 29 日 上午 5:54 #

      是的,我认为引导法是一个不错的起点。

  15. Franco Arda 2019 年 4 月 14 日 上午 7:23 #

    Jason 的又一篇优秀文章。谢谢。

    “[0.0, 0.0588]”中可能有一个小笔误——我认为应该是 [0.0, 0.0388]。

  16. Daniel Wigmore 2019 年 4 月 19 日 上午 12:12 #

    我正在运行一个分类器,训练集为 41,验证集为 14(共 55 个观测值)。我使用不同的随机数据切片作为训练集和测试集重复了 50 次。显然,我无法用这么小的验证集来计算置信区间。

    但是,由于我使用不同的训练集和验证集切片重复运行,我能否获得 50 次测试的平均误差率并计算置信区间?

    const * sqrt( (error * (1 – error)) / n)

    N 将是 700(14*50)。如果我有 50 次测试,平均准确率为 77.4%(误差为 0.226),那么置信区间将是 0.26 和 0.2。

    这可行吗?或者这些置信区间是否不可靠?

    感谢您出色的文章。

    Dan

    • Jason Brownlee 2019 年 4 月 19 日 上午 6:12 #

      为什么它们会不可靠?

      您具体担心什么?每次试验的数据集选择?

      • Daniel 2019年4月23日上午5:37 #

        布朗利先生,您好,

        感谢您的及时回复,也很抱歉我的回复晚了。我正在处理社会科学数据,验证集相当有限。我担心如何为有限的验证样本确定置信区间。

        我的一位朋友想出了一个解决方案,就是将所有准确率输出保留在一个向量中,然后像直方图一样绘制出来(我好像无法将直方图粘贴到此回复窗口中,但如有必要,可以通过电子邮件发送)。

        通过查看准确率向量的第5个和第95个百分位数,我能否获得置信区间?

        有放回地随机抽样(引导法)是否比无放回抽样有优势?

        再次感谢

        Dan

        • Jason Brownlee 2019年4月23日上午7:58 #

          只是重复而不进行引导?我认为这种分布只能捕捉模型的方差,而不能捕捉数据的方差。

          我鼓励您使用引导法来计算准确率得分的分布。

  17. Daniel 2019年4月24日下午10:03 #

    谢谢 Jason,

    最后一个问题,

    我的训练模型有以下输出,最好的调整后的邻居数量是5。

    我通过创建重采样中准确率的直方图来创建置信区间。有没有办法子集化模型最佳调整的重采样结果(在这种情况下是k = 5)?

    无预处理
    重采样:引导(1000次重复)
    样本量摘要:32、32、32、32、32、32、...
    跨调优参数的重采样结果

    k 准确率 Kappa
    5 0.7262690 0.4593792
    7 0.6830904 0.3830819
    9 0.6655405 0.3522427

    准确度用于使用最大值选择最优模型。
    模型使用的最终值为 k = 5。

    • Jason Brownlee 2019年4月25日上午8:15 #

      我建议使用一个带有选定配置和引导法的新程序来估计模型性能的置信区间。

  18. Daniel 2019年4月25日上午5:50 #

    抱歉,作为更新,我在train control方法中为returnResamp参数选择了‘final’。我认为这应该只保留最佳调整模型的重采样结果。

    但通常当我检查重采样的平均值,mean(model$resample$Accuracy)时,平均值低于k=5的准确率(通常是0.65)。这是有原因的吗?我认为最佳调整重采样的平均准确率应该等于结果中的模型准确率。

    在此之后,我保证不再打扰您(感谢您一直以来的耐心)

  19. Kalen Gordon 2019年6月18日上午7:19 #

    这对分类非常有用。

    对于回归分析,我将如何计算置信区间?
    我是否可以使用相同的公式,但用MAE代替分类错误,或者我应该使用RMSE?

  20. Fajar 2019年10月28日下午9:25 #

    嗨 Jason,我的问题与此主题关系不大,只是略有涉及。

    我有一个用于二元分类的神经网络(MLP),具有介于0和1之间的逻辑输出。每次运行,我都需要在测试集上调整我的阈值以最小化误分类。我的问题是,在呈现我的结果时,我是否应该多次运行,每次都调整阈值,然后取其他指标(如F1分数)的平均值,或者我根本不优化阈值?

    • Jason Brownlee 2019年10月29日上午5:24 #

      嗯,好问题。

      我会将测试视为对“系统”的评估,该系统包括模型和自动阈值调整程序。在这种情况下,对整个系统的结果进行平均是合理的,前提是您清楚地说明了您正在做什么。

      太酷了!

  21. dave 2020年2月14日上午1:06 #

    嗨 @Jason,我有一个与此主题相关的问题。

    在以下论文中 http://arno.uvt.nl/show.cgi?fid=147278,用户计算AUC标准差作为稳健性指标。

    假设我进行了一个重复(10次)10折交叉验证实验,并通过马尔可夫链模型实现了预测。作为稳健性指标,我想计算测试集在各次运行/折叠上的AUC的标准差。

    直观地说,相对较小的标准差意味着模型在区分转化与非转化方面产生了稳定的结果。

    该项目基于10x10交叉验证程序,因此会产生100个AUC。

    现在,为了导出总结模型的AUC SD,我认为过程应该是(论文中没有明确定义):

    a. SD是根据实际折叠的AUC值在折叠之间计算的(我们得到10个SD,每个重复一个)。

    b. 在步骤b1中获得的SD在各次运行之间进行平均(最后留下1个SD)。

    然而,由于关于这个主题的文献不多,我想知道是否有人能验证上述推理。

    任何帮助或建议都将不胜感激。

    • Jason Brownlee 2020年2月14日上午6:38 #

      是的。

      您应该收集所有重复和所有折叠的AUC得分样本。然后计算平均值和标准差等汇总统计数据。

  22. John 2020年4月9日上午9:59 #

    Wilson分数是不同的,您描述的是根据维基百科的“正态近似区间” https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval#Normal_approximation_interval

    Wilson分数区间是不对称的。

  23. charu 2020年6月19日下午8:22 #

    对于不平衡数据集的二元分类问题,当无法平衡数据时,如何计算置信区间?

  24. Siva Karthik Gade 2020年9月4日下午4:25 #

    谢谢 Jason – 很棒的文章!

    关于样本量最小要求,使(样本)错误率满足正态分布近似的一个后续问题 ->

    我看到一些帖子/幻灯片提到CLT,它们指出-为了使二项分布的样本比例(或
    平均值或错误率)近似于正态分布(以计算置信区间),它应该遵循以下两个条件:
    np > 10
    n(1-p) > 10
    例如,参考 http://homepages.math.uic.edu/~bpower6/stat101/Sampling%20Distributions.pdf

    在当前示例中,对于样本量(n)=50且错误率=0.02,n*p (50 * 0.02 = 1) 不满足 np > 10。

    在这种情况下,我们是否应该增加n以满足上述要求(或者)我是否遗漏了什么?

    • Jason Brownlee 2020年9月5日上午6:40 #

      感谢分享。

      也许可以尝试增加样本量,看看它是否会影响结果。

  25. Manuel Gonçalves 2020年10月3日上午11:49 #

    如何使用交叉验证计算CI?我们是否使用CI来汇总平均结果?n值是测试部分还是它们的总和?在 https://scikit-learn.cn/stable/modules/cross_validation.html#computing-cross-validated-metrics 中使用的公式,通过乘以std * 2并不清楚。

    • Jason Brownlee 2020年10月3日下午12:30 #

      您可以使用引导法来获得可靠的估计。

      • Manuel Gonçalves 2020年10月4日上午11:12 #

        也许是不可靠的估计,是否有参考或论文/书籍说明这个公式的来源?CV会给我一个[acc1, acc2, acc3, … acc30]的准确率列表,我只需要计算平均值+/- 2 * std来表示CI(CI = 2* std)。“n”值或1.96 z值呢?

          • Manuel Gonçalves 2020年10月24日上午1:03 #

            非常感谢您的评论……那么您对此场景有何看法?

            第一步 – 将数据分为训练/验证集80/20,并使用训练集(80%)进行交叉验证,以获取作为均值和标准差的性能指标。
            第二步 – 使用引导法在剩余的20%数据上训练最终模型,并计算带有置信区间的性能。

            这是一个有效的场景吗?有什么建议吗,或者我可以使用嵌套交叉验证来完成?在CV循环内进行引导是否有效?

          • Jason Brownlee 2020年10月24日上午7:05 #

            我不确定我是否喜欢它 – 除非您有大量数据。但如果它对您有效,那就去做吧!

            嵌套CV适用于在单个测试框架中选择模型和超参数。

            用于报告的最终评估可以是您拥有的整个数据集的引导。

      • Manuel Gonçalves 2020年10月4日上午11:24 #

        关于这个公式的讨论正在进行中: https://github.com/scikit-learn/scikit-learn/issues/6059

  26. Manuel 2020年10月24日上午1:54 #

    这篇文章的结论是,在交叉验证方案中无法计算可靠的CI。那十几篇展示CV结果CI的论文呢?

    • Jason Brownlee 2020年10月24日上午7:07 #

      它们很可能是在总结CV过程本身的平均值和标准差。这很常见。

  27. Manuel 2020年10月27日上午3:55 #

    在您的教程中,CI是基于单个训练/测试分割执行计算的,但对于重复执行,例如30次,情况如何?

  28. Sourabh 2021年4月19日下午9:39 #

    嗨,Jason,
    error * (1 -error) 这个项是什么意思?

    • Jason Brownlee 2021年4月20日上午5:57 #

      您可以在“进一步阅读”部分找到更多关于此项的来源和推导方式。

  29. ASP 2021年11月12日上午8:56 #

    你好 Jason,
    如果我需要为现有模型的预测提供CI,并且报告的错误是测试样本的MAE,您有什么建议吗?感谢您的时间。

  30. Bahar 2023年2月8日下午11:20 #

    嗨 Jason

    感谢您的帖子。

    您能指导我如何将CI应用于F1分数吗?

    我应该使用Bootstrap,还是可以使用这个公式?

    F1 +/- const * sqrt( (F1* (1 – F1)) / n)

  31. Bahar 2023年3月11日下午9:14 #

    您好,Jason,

    CI是否报告了仅在同一数据集上训练的多个分类器的性能?我有一个相反的场景。

    有两个数据集(i)由GAN生成的数据和(ii)原始数据。SVM已在这两个数据集上进行了训练。

    现在,我可以使用CI来比较这两个结果的性能吗?(i)在人工数据上训练的SVM和(ii)在原始数据上训练的SVM?

Leave a Reply

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。