大数据机器学习:常见模型评估指标

news2024/11/24 7:42:09

大数据机器学习:常见模型评估指标

一.模型评估综述

1.1 什么是模型评估

模型评估是指在机器学习中,对于一个具体方法输出的最终模型,使用一些指标和方法来评估它的泛化能力。这一步通常在模型训练和模型选择之后,正式部署模型之前进行。模型评估不针对模型本身,而是针对问题和数据,因此可以用来评价不同方法的模型的泛化能力,以此决定最终模型的选择。

1.2 评估类型

机器学习的基本任务大致分为三类,分别是分类(Classification)回归(Regression)聚类(Clustering),在本文仅介绍分类的模型评估。

1.3 模型泛化能力

模型的泛化能力是机器学习的一个重要概念和指标。是指一个模型在训练集之外的未知数据上的表现能力,泛化能力强的模型能够正确学习到数据的普遍规律并将其运用到新的数据上从而做出准确的预测。

简单地说,当模型在训练样本上表现良好,并且能在新的数据样本上保持相同的表现,我们就可以说这个模型的泛化能力强。

1.4 过拟合与欠拟合

过拟合与欠拟合是机器学习中常见的两个概念,描述的是模型在训练数据和未知数据上表现的差异。下图中第一到第三的图分别是欠拟合、正好和过拟合三种状态。

在这里插入图片描述

1.4.1 过拟合

过拟合表现为在训练数据上表现优秀的那在新数据集上表现较差,通常是因为模型过于复杂,学习到了数据集中的细节和噪声而不是数据的真实分布,因而泛化能力差。

举个很经典的例子,当我们设计一个模型用于判断一个物品是否是树叶,而训练集中有几个样本的叶片边缘带有尖刺,模型作者希望他的模型能够符合贴近他的每一个样本,因而将带有“尖刺边缘”这一不是明显特征的特点纳入了参数中,这样一来,模型就能够完美贴合训练样本,但在应用时会发现模型容易钻牛角尖,会将不带尖刺边缘的样本排除,无法识别不带尖刺边缘的树叶,这就导致了模型的泛化能力差。

解决模型过拟合的问题,有以下几种方法:

  • 增加数据量以提供更多信息,减少噪声的影响
  • 简化模型,减少模型参数的数量
  • 通过交叉验证评估模型的泛化能力

1.4.2欠拟合

欠拟合则与过拟合相反,由于模型过于简单,无法学习到数据的足够特征,无法正确捕捉数据的复杂性和变化,没有学习到数据的规律。这就导致模型不管是在训练样本还是未知样本上的表现都不佳。

常见的解决欠拟合的方法有:

  • 增加模型的复杂度,如增加更多的特征或使用更复杂的模型
  • 收集更多的数据,提供更加丰富的信息给模型
  • 增加训练时间或者调整模型的超参数

二.常见的分类模型评估方式

2.1 混淆矩阵

混淆矩阵是分类模型巩固的一个重要工具,可以直观展示模型的预测结果和实际结果之间的关系,通常由以下四个部分构成:

  • 真正类 (True Positives, TP): 模型正确地预测正类的数量。
  • 假负类 (False Negatives, FN): 模型错误地将正类预测为负类的数量。
  • 假正类 (False Positives, FP): 模型错误地将负类预测为正类的数量。
  • 真负类 (True Negatives, TN): 模型正确地预测负类的数量。

二元混淆矩阵格式如下:

分类器真实结果
Positive(阳性)Negative(阴性)
预测结果PositiveTPFP
NegativeFNTN

多元分类矩阵格式如下:

分类器真实结果
ABCD
预测结果ATAFAFAFA
BFBTBFBFB
CFCFCTCFC
DFDFDFDTD

2.2 准确率(Accuracy)

准确率是指模型正确预测的样本总数占总样本总数的比例,其计算公式为:

[准确率 = \dfrac{TN+TF}{TN+FN+TP+FP} = \dfrac{T}{T+F} ]

2.3 精确率(Precision)

精确率的概念比较容易与准确率的概念混淆,准确率的目标是所有样本,计算的是所有分类正确样本占总样本的多少,而精确率是指在所有被模型预测为正类的样本中,实际为正类的样本的比例,关注的是被模型分为此类的数据中有多少是正确的。

当我们使用精确率(下使用Precision代替)作为考量时,优点是不容易出现假正类,但是,当precision值过高时,容易出现模型偏向某一类别的情况,因为此时模型会倾向于预测多数类别而忽略了少数类别的预测。

举一个例子,假设在一个疾病诊断问题中,疾病发生的实际情况(正类)非常罕见。如果模型仅仅通过预测大多数人都是健康的(负类)来提高Precision,那么它可能会忽略真正的病例,因为这些病例在数据中占比很小。这样的模型虽然精确度高,但其实用性非常有限,因为它未能有效识别和预测少数但重要的正类样本。

在混淆矩阵中,这表现为某一行的T除以本行上所有数字的和,如下列表格标注了颜色的A行就是红色的TA值除以TA加FA的和。

预测/实际ABCD
A(\color{red}{TA})(\color{green}{FA})(\color{green}{FA})(\color{green}{FA})
BFBTBFBFB
CFCFCTCFC
DFDFDFDTD

其公式为:

[Precision = \dfrac{TP}{TP+FP} ]

2.4 召回率(Recall)

召回率(下使用Recall替代)衡量的是模型正确识别为正类的实例(真正类)占所有实际正类实例的比例。当recall值高时,模型会更容易捕捉到正类,但也会导致假正类出现的比例增加的情况。

举个例子说明,假设我们有一个用于检测信用卡欺诈的模型,其中正类(欺诈)非常罕见。在10,000个交易中,可能只有100个是欺诈性的。如果我们只关注召回率,模型可能会被调整为将更多的交易标记为欺诈,以确保它不会错过那些真正的欺诈案例。例如,模型可能会将1,000个交易标记为欺诈,其中包括所有100个真正的欺诈案例和900个实际上是合法的交易。在这种情况下,召回率是100%,因为所有的欺诈交易都被正确地识别了。然而,这样做的代价是产生了很多假正类(False Positives)—那些被错误标记为欺诈的合法交易。这会导致很多不必要的麻烦,比如客户满意度下降和增加的客户服务成本。

在混淆矩阵中,这表现为某一列中的T除以本列上左右数字的和,如下列表格,计算recall即红色字体的值除以红色和绿色字体的值的和,计算设计的数据包括正确分类的本类型样本的值和被错误分类至本类型的样本的值。

预测/实际ABCD
A(\color{red}{TA})FAFAFA
B(\color{green}{FB})TBFBFB
C(\color{green}{FC})FCTCFC
D(\color{green}{FD})FDFDTD

其公式为:

[Recall = \dfrac{TP}{TP+FN} ]

2.5 F1-score

正如上面所说的,当我们单独地使Precision值或者Recall值增高,都会使模型走向极端,因而我们引入了F1值,即Recall和Precision的调和平均数,,因为F1值综合考虑了Recall和Precision,因而其尤其适合在***数据不平衡(不同类别的样本数据量差异很大)***的情况时进行使用。当分数更高时,说明模型再识别少数类方面的能力更强,同时保持了较高的Recall和Precision平衡。其公式如下:

[F1 = 2\times \dfrac{Precision\times Recall}{Percision+Recall} ]

值得一提的是,这是在Recall和Precision的比重相同的同属情况下使用的,如果你认为其中某个值更加重要,你可以使用({\large F}_\beta)-score,其公式为:

[{\large F}_\beta = (1+\beta ^2)\cdot \dfrac{Precision\cdot Recall}{(\beta^2\cdot Precision)+Recall} ]

其中的(\beta)是Recall和Precision的比值,当$\beta $大于1时,该分数会给予Recall更高的权重。

2.6 ROC曲线及AUC值

在二分类的过程中,我们通常会设置一个阈值(取值为0到1之间),大于阈值的会被归于正类,小于阈值的会被归为负类,当我们降低阈值时,样本会更容易地被归为正类,但也会更容易出现假正类,反之则更容易出现遗漏的情况,而随着阈值的变化,混淆矩阵也会出现变化,为了直观地体现这种变化,我们引入了ROC曲线。

在ROC曲线中,x和y轴分别为假阳性率(TPR)真阳性率(FPR),其中,假阳性率表示在所有阴性(即Negative)样本中,被错误地预测为阳性(即Positive)的比例,计算公式为:

[FPR = \dfrac{FP}{FP+TN} ]

而真阳性率又称召回率,表示所有实际阳性样本被正确预测为阳性的比例,计算公式为:

[TPR = \dfrac{TP}{TP+FN} ]

通过ROC曲线,我们可以明确地直观地看出模型的好坏,为了模型准确率更高,我们自然而然地希望真阳性率更高而假阳性率更低,因此,当曲线越靠近左上角,我们会认定这条曲线所代表的模型判断准确率更高,如下图所示

在这里插入图片描述

这是通过KNN算法和决策树算法对sklearn库内置的乳腺癌库进行训练预测的ROC曲线结果图,如图所示,由于代表KNN算法的折线更靠近左上角,因而我们可以说在这个数据集上,使用了KNN算法的模型表现更好。

而***AUC(Area Under the Curve)***值就是指曲线下的面积,当AUC值越接近1,可说明模型的分类性能更好。如下图涂黄的部分就是该曲线的AUC值。

在这里插入图片描述

2.7 PR曲线

PR曲线,即精确率-召回率曲线,它是以***召回率(Recall)***为x轴,***精确率(Precision)***为y轴的曲线,在机器学习中,尤其在再不平衡数据集中非常有用。

当我们在改变模型的分类阈值时,TP、FP和FN等都会发生变化,从而导致Recall和Precision发生变化,PR曲线展示了这种变化关系,可以帮助我们理解模型在不同阈值下的性能表现。通常来说,曲线越靠近左上方,代表模型的表现越好。

其AUC值同样是一个重要的性能指标,反映了模型在所有可能的分类阈值上的平均效果,当AUC值越大表示模型性能越好。

如下图所示的是KNN算法和决策树算法对sklearn库内置的乳腺癌库进行训练预测的PR曲线的结果图:

在这里插入图片描述

三. PR曲线和ROC曲线的特点及其代码实现

3.1 ROC曲线的特点

  • 对于ROC曲线来说,由于衡量的是TPR和FPR,关注的是所有正样本中被正确分类的比例和所有负类样本中被错误分类的比例,因而其对于模型的考察更加全面
  • 对于阈值变化不敏感,具体来说,当阈值上升时,模型会更趋近于保守,TP和FN值会同时下降,也就导致了FPR和FDR的值同时下降,反之亦然。由于二者的变化趋势相同,因而曲线的形状会更加趋近于稳定而不会有太大的变化。这使得ROC曲线能够在不同数据集和情境下提供一致的性能评估。
  • 样本极度不平均的数据集下,ROC曲线可能会给出过于乐观的性能评估。当负样本基数远大于正样本且域值较小时,这时候判断较为宽松,TPR值较高,虽然FP也会随之增多,但由于负样本的基数大,FPR并不会有太大的变化,因此在这种极端的状态下,ROC曲线会给出过于乐观的性能评估而无法准确评判模型性能。
  • 简单直观,对于ROC曲线,能通过简单的肉眼观察确定模型的性能优劣,还能通过选择最靠近左上角点以判断最佳平衡点。

3.2 PR曲线的特点

  • 阈值变化敏感,随着阈值降低,Recall会增高,但Precision可能会发生剧烈变化,反之亦然,因而说对阈值的变化,PR曲线比ROC曲线更加敏感。这使其比ROC曲线更适用于不平衡的数据集。
  • PR曲线更加关注***少数类(大部分时候是正类)***的预测,能够直观反映出模型对正类的预测准确性,即使是少量的预测改变也能在曲线上体现出来,有助于识别模型在预测正类方面的微小变化。
  • PR曲线不如ROC曲线那样直观易懂,该曲线的性能评估不仅仅依赖于曲线下的面积,还需要考虑曲线的形状和位置,虽然提供的信息比ROC曲线更多,但对于非专业人士来说,较难理解。
  • 性能评估不全面,PR曲线没有考虑到所有的阈值。PR曲线的绘制不是按照阈值的变化绘制的,而是按照预测的概率进行排序,然后依据样本选择阈值,在该样本之前的都是正样本,之后的都是负样本,这意味着阈值的选择是基于模型对样本的预测概率而不是一个连续变化的值。可通过以下示例了解:

假设我们有一个数据集,其中包含5个样本,模型给出的预测概率如下:

样本实际类别预测概率
A0.9
B0.8
C0.7
D0.4
E0.3

我们首先按预测概率对样本进行排序,得到顺序为A, B, C, D, E。

现在,我们从最高概率的样本开始,逐个将样本标记为正例,并计算每次标记时的精确率和召回率。例如:

  • 当我们选择样本A作为阈值时,只有A被标记为正例。此时,精确率是100%,因为我们正确地将一个正类样本标记为正类,召回率是33%,因为我们只找到了一个实际为正的样本。
  • 接着,我们将阈值降低到样本B,现在A和B都被标记为正例。由于B实际上是负类,精确率下降到50%,而召回率仍然是33%,因为没有新的正类样本被找到。
  • 我们继续这个过程,直到所有样本都被考虑过。

每次改变阈值时,我们都会得到一对新的精确率和召回率,这些点连起来就形成了PR曲线。这个过程中,阈值并不是一个连续变化的数值,而是基于模型对每个样本的预测概率。因此,PR曲线上的每个点都是由数据集中的具体样本决定的,而不是由一个连续的阈值范围决定的。这就是为什么说PR曲线考虑了所有的阈值,但它反映的是模型在这些具体阈值下的性能。

3.3 曲线的绘制代码实操

主要使用sklearn库中内置的算法和数据集进行实操

解释from sklearn.datasets import load_breast_cancer  # 导入乳腺癌数据集
from sklearn.model_selection import train_test_split  # 导入数据集分割工具
from sklearn.neighbors import KNeighborsClassifier  # 导入K近邻分类器
from sklearn.tree import DecisionTreeClassifier  # 导入决策树分类器
from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score  # 导入性能评估工具
import matplotlib.pyplot as plt  # 导入绘图库

# 加载乳腺癌数据集
data = load_breast_cancer()
X = data.data  # 特征数据
y = data.target  # 标签数据

# 将数据集分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)  # 将训练集和测试集按8:2的比例拆分

# 初始化并训练K近邻分类器
knn_classifier = KNeighborsClassifier(n_neighbors=5)
knn_classifier.fit(X_train, y_train)

# 初始化并训练决策树分类器
tree_classifier = DecisionTreeClassifier(random_state=42)
tree_classifier.fit(X_train, y_train)

# 预测测试集的概率
y_scores_knn = knn_classifier.predict_proba(X_test)[:, 1]
y_scores_tree = tree_classifier.predict_proba(X_test)[:, 1]

# 计算KNN的ROC曲线和AUC值
fpr_knn, tpr_knn, _ = roc_curve(y_test, y_scores_knn)
roc_auc_knn = auc(fpr_knn, tpr_knn)

# 计算决策树的ROC曲线和AUC值
fpr_tree, tpr_tree, _ = roc_curve(y_test, y_scores_tree)
roc_auc_tree = auc(fpr_tree, tpr_tree)

# 计算KNN的精确度-召回率曲线和平均精确度
precision_knn, recall_knn, _ = precision_recall_curve(y_test, y_scores_knn)
average_precision_knn = average_precision_score(y_test, y_scores_knn)

# 计算决策树的精确度-召回率曲线和平均精确度
precision_tree, recall_tree, _ = precision_recall_curve(y_test, y_scores_tree)
average_precision_tree = average_precision_score(y_test, y_scores_tree)

# 绘制ROC曲线
plt.figure(figsize=(14, 6))

plt.subplot(1, 2, 1)
plt.plot(fpr_knn, tpr_knn, color='darkorange', lw=2, label='KNN (AUC = %0.2f)' % roc_auc_knn)
plt.plot(fpr_tree, tpr_tree, color='green', lw=2, label='Decision Tree (AUC = %0.2f)' % roc_auc_tree)
plt.plot([0, 1], [0, 1], color='navy', lw=2, 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('ROC Curve')
plt.legend(loc="lower right")

# 绘制精确度-召回率曲线
plt.subplot(1, 2, 2)
plt.plot(recall_knn, precision_knn, color='blue', lw=2, label='KNN (AP = %0.2f)' % average_precision_knn)
plt.plot(recall_tree, precision_tree, color='purple', lw=2, label='Decision Tree (AP = %0.2f)' % average_precision_tree)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('P-R Curve')
plt.legend(loc="lower left")

plt.tight_layout()
plt.show()
NN (AP = %0.2f)' % average_precision_knn)
plt.plot(recall_tree, precision_tree, color='purple', lw=2, label='Decision Tree (AP = %0.2f)' % average_precision_tree)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('P-R Curve')
plt.legend(loc="lower left")

plt.tight_layout()
plt.show()

最终结果图如下:
在这里插入图片描述

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

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

相关文章

ES全文检索支持拼音和繁简检索

ES全文检索支持拼音和繁简检索 1. 实现目标2. 引入pinyin插件2.1 编译 elasticsearch-analysis-pinyin 插件2.2 安装拼音插件 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4. 建立es索引5.测试检索6. 繁简转换 1. 实现目标 ES检索时…

CentOS7编译jsoncpp静态库

1. 官网下载源码 github地址:GitHub - open-source-parsers/jsoncpp at update 2. 编译 Unzip jsoncpp-master.zip Cd jsoncpp-master mkdir -p ./build/debug cd ./build/debug/ cmake -DCMAKE_BUILD_TYPEdebug -DBUILD_SHARED_LIBSOFF -DCMAKE_ARCHIVE_OUTPUT_D…

3d数字化在线云展平台打破传统束缚

在数字化浪潮的推动下,线上VR云展会正以其独特的魅力,为展览主办方打开一扇全新的大门。这一新兴展览形式不仅突破了传统实体展览的时间、空间和物理限制,更为国际性展览活动带来了前所未有的可能性。 作为展览主办方,您是否曾为实…

高扬程水泵的性能与应用领域 /恒峰智慧科技

在现代社会中,科技的发展为我们的生活带来了无数便利和可能性。其中,高扬程水泵作为一种高效能的水泵,其独特的设计使其在各个领域都有着广泛的应用,尤其是在森林消防中。 一、高扬程水泵的性能 1. 高扬程:高扬程水泵…

stm32HAL库-GPIO

一 什么是 GPIO: GPIO(general porpose intput output), 通用输入输出端口 . 二 我们先认识芯片控制 GPIO 输出控制。 2.1LED 硬件原理如图: 当电流从这根电线流通, LED 亮。当电流不通过这根电线, LED 灭。 上面 PF** ,芯片电…

HarmonyOS编程实践系列:第一节 - 创建健康App欢迎页

系列文章目录 (零)鸿蒙HarmonyOS入门:如何配置环境,输出“Hello World“ (一)鸿蒙HarmonyOS开发基础 (二)鸿蒙HarmonyOS主力开发语言ArkTS-基本语法 (三)鸿蒙…

C语言阶段性测试错题纠正与拓展

引言:在2024年4月26日,我进行了C语言知识的“期末考试”。通过这次考试,我发现了我的知识漏洞。所以,我写下这篇博客来记录我的错题,并进行纠正,然后对于以前遗忘知识的回顾。 更多有关C语言的知识详解可前…

螺栓的预紧力与夹紧力——​SunTorque智能扭矩系统​

预紧力与夹紧力是紧固件使用中两个重要的力学概念。了解它们之间的关系以及如何正确地应用它们,对于确保机械系统的稳定性和安全性至关重要。本文SunTorque智能扭矩系统将从紧固件的基本概念和用途出发,深入探讨预紧力与夹紧力的概念、影响因素以及实际应…

四信数字孪生水库解决方案,加快构建现代化水库运行管理矩阵

近年,水利部先后出台《关于加快构建现代化水库运行管理矩阵的指导意见》与《构建现代化水库运行管理矩阵先行先试工作方案》等文件,明确总体要求及试点水库、先行区域建设技术要求等,为全面推进现代化水库运行管理矩阵建设工作提供依据。 《2…

android studio项目实战——备忘录(附源码)

成果展示&#xff1a; 1.前期准备 &#xff08;1&#xff09;在配置文件中添加权限及启动页面顺序 ①展开工程&#xff0c;打开app下方的AndroidManifest.xml,添加权限&#xff0c;如下&#xff1a; <uses-permission android:name"android.permission.CAMERA"…

NGINX发布动态页面的方法

一、建立 [rootserver100 html]# vim index.php [rootserver100 html]# pwd /usr/share/nginx/html 二、下载PHP文件 [rootserver100 conf.d]# dnf install php.x86_64 -y 正在更新 Subscription Management 软件仓库。 无法读取客户身份 本系统尚未在权利服务器中注册。可…

【C++】:const成员,取地址及const取地址操作符重载

目录 一&#xff0c;const成员二&#xff0c;取地址及const取地址操作符重载 一&#xff0c;const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的…

微信私域:如何管理多号聊天

我经常要在不同的微信号之间来回切换&#xff0c;这真是既麻烦又容易漏回消息&#xff0c;让我头疼不已。我试过了很多方法&#xff0c;但效果都不太理想。直到有一天&#xff0c;朋友分享了一个微信私域流量管理系统给我&#xff0c;我决定试试看。试用之后&#xff0c;我感觉…

机器学习理论基础—聚类算法

机器学习理论基础—聚类算法 聚类的距离计算 聚类&#xff1a;物以类聚。将相似的样本聚集到一起&#xff0c;使得同一类簇的样本尽可能接近,不同类簇的样本尽可能远离。&#xff08;无监督算法&#xff09; 对于距离的定义&#xff1a;满足下面的四个特点 非负性同一性对称性…

实验 | RT-Thread:L0

1 理解 官网文档&#xff1a;RT-Thread 简介 在 RT-Thread 系统中&#xff0c;任务通过线程实现的&#xff0c;RT-Thread 中的线程调度器也就是以上提到的任务调度器。RT-Thread与FreeRTOS是同等地位的东西&#xff0c;都是属于RTOS项目设置&#xff1a;RT-Thread 4.0.2 基于…

单链表进阶算法题精析

目录 一、回文链表 1.1 题目 1.2 题解 1.3 分析 二、带环链表I 2.1 题目 2.2 题解 2.3 分析 2.3.1为什么该思路可行&#xff1f; 2.3.2为什么只能快指针走两步&#xff1f; 三、带环链表II 3.1 题目 3.2 题解 3.3 分析 四、相交链表 4.1 题目 4.2 题解 4.3 分…

uniapp:K线图,支持H5,APP

使用KLineChart完成K线图制作,完成效果: 1、安装KLineChart npm install klinecharts2、页面中使用 <template><view class="index"><!-- 上方选项卡 --><view class="kline-tabs"><view :style="{color: current==ite…

git出错、文件无法删除、文件无法访问、文件或目录损坏且无法读取 等相关问题处理

一、错误历程与解决方案 1. 在用idea时&#xff0c;突然出现 部分git的命令无法使用&#xff0c;提示错误 2. 尝试删除项目文件夹&#xff0c;重新从git拉取代码 3.发现无法删除文件夹&#xff0c;删除操作没有任何反应&#xff0c;但是可以对文件夹重命名。 4.重新clone g…

【哈希】Leetcode 219. 存在重复元素 II

题目讲解 219. 存在重复元素 II 算法讲解 class Solution { public:bool containsNearbyDuplicate(vector<int>& nums, int k) {map<int, int>Hash;for(int i 0; i < nums.size(); i){//这一步说明前面已经出现过一次这样的数字了&#xff0c;所以用后面…

Android Studio的button点击事件

xml添加onClick调用方法 public class MainActivity extends AppCompatActivity {// 创建系统时间的文本控件TextView systemTimeTextView;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activit…