评估数据挖掘模型
介绍
数据科学正在蓬勃发展,生物数据分析、预测、金融分析、零售业、欺诈检测、入侵检测、图像分类、文本挖掘等许多领域的问题也正在蓬勃发展。评估数据挖掘技术的性能是机器学习的一个基本方面。
确定任何机器学习模型的效率和性能都很困难。通常,这取决于业务场景。机器学习模型将用于预测,为了使模型可靠,选择正确的评估方法非常重要。选择最通用的模型或技术也很有用。评估方法可能因模型而异,但最广泛使用的数据挖掘技术是分类、聚类和回归。
分类问题的评估指标
在数据挖掘中,分类涉及预测新观察结果属于哪个类别或类别的问题。派生模型(分类器)基于对一组训练数据的分析,其中每个数据都被赋予一个类标签。然后使用训练后的模型(分类器)预测新的、未见过的数据的类标签。
要理解分类指标,最重要的概念之一就是混淆矩阵。
不用担心名字——它一点也不令人困惑。让我们来看看。
每个预测都会属于这四个类别之一。让我们看看它们是什么。
- 真负(TN):标记为错误的数据被预测为错误。
- 真正例(TP):标记为真的数据被预测为真。
- 假阳性 (FP):也称为“错误警报”,这是第 1 类错误,其中测试正在检查单一条件并错误地预测为阳性。
- 假阴性(FN):这是第 2 类错误,其中检查单一条件并且我们的分类器将真实实例预测为阴性。
为了便于解释,我们将使用sklearn python 库提供的数据集。我使用逻辑回归模型进行分类,并使用 UCI 存储库提供的Covertype数据集。
首先,创建一个任意名称的Python脚本并使用以下代码。
import numpy as np
import sklearn.datasets
import sklearn.linear_model
import sklearn.metrics
from sklearn.model_selection import train_test_split
# do not change for reproducibility
np.random.seed(42)
# Importing the dataset
dataset = sklearn.datasets.fetch_covtype()
# only use a random subset for speed - pretend the rest of the data doesn't exist
random_sample = np.random.choice(len(dataset.data), len(dataset.data) // 10)
# We are only intersted in Class 3 forest type.
COVER_TYPE = 3
features = dataset.data[random_sample, :]
target = dataset.target[random_sample] == COVER_TYPE
# Doing the 80-20% train test split of the data
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size = 0.2)
# Building the basic Logistic Regression
classifier = sklearn.linear_model.LogisticRegression(solver='liblinear')
classifier.fit(X_train, y_train)
predictions = classifier.predict(X_test)
# Printing out Confusion matrix for our predictions
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, predictions))
好了,我们刚刚构建了一个机器学习模型,它将预测数据行是否属于 3 型森林。执行后,您将看到我们预测的混淆矩阵。
输出解释:
- [0, 0] -> 真阴性
- [0, 1] -> 假阳性
- [1, 0] -> 假阴性
- [1, 1] -> 真阳性
1.准确性
分类器的准确度等于总正确预测数除以实例总数的百分比。
从数学上来说,
如果分类器的准确度被认为是可以接受的,则可以使用该分类器对类标签未知的未来数据元组进行分类。
但我们的情况是这样的吗?让我们看看准确率是否是这个问题的正确评估指标。
from sklearn.metrics import accuracy_score
print("Accuracy : %.2f"%(accuracy_score(y_test, predictions)*100))
输出:
Accuracy : 96.52
太棒了!我们的模型准确率达到了 96.52%。
数学解释
我们的混淆矩阵:
准确率 = (10766 + 451) / (10766 + 169 + 235 + 451) = 96.52%
** 如果我将每个数据行归类为假会怎样?**
在这种情况下,我们的真阳性将变成假阴性,我们的准确率将是:
准确率 = (10766 + 0) / (10766 + 169 + 686 + 0) = 92.64%
根据这个,每次我们预测数据为假时,我们都会得到 92% 的准确率,这似乎非常好。那么我们为什么需要机器学习模型呢!?
让我们看一下数据中的类标签分布。
print("Classes: "+ str(np.unique(target, return_counts=True)))
输出:
Classes: (array([False, True]), array([54560, 3541]))
我们有大量的错误例子,而真实类别中的数据却少得多。
当我们拥有大致相等的数据比例(真假类别标签各占 50%)时,准确度是可靠的,而如果数据集不平衡,准确度总是不可靠的。在大多数数据挖掘问题中,准确度是最少使用的指标,因为它不能提供有关预测的正确信息。
2. 回忆
召回率是用于评估不平衡数据集的最常用指标之一。它计算我们的模型预测为正例(真阳性)的实际正例数。
召回率也称为真实阳性率 (TPR)、敏感度或检测概率。
从数学上来说,
在混淆矩阵中:
让我们计算数据集的召回率,看看我们的分类器有多好。
from sklearn.metrics import recall_score
print("Recall : %.2f"%(recall_score(y_test, predictions)*100))
输出:
Recall : 65.74
召回率远低于准确率。由于真实示例较少,错误示例较多,我们的模型无法更多地了解真实数据,并倾向于错误预测。
对于癌症检测等应用来说,召回率是一种更好的衡量标准,因为任何不能考虑假阴性的东西都是一个非常大的错误(例如,将癌症患者预测为非癌症患者)。
3. 精准
精度描述了我们的数据挖掘模型的准确度或精确度。在预测为阳性的案例中,有多少是实际为阳性的?
精确度也称为准确度或质量的度量,或阳性预测值。
从数学上来说,
在混淆矩阵中:
让我们计算数据集的精度并看看我们的分类器有多好。
from sklearn.metrics import precision_score
print("Recall : %.2f"%(precision_score(y_test, predictions)*100))
输出:
Precision : 72.74
准确率比召回率略好,因为我们的模型更偏向于错误预测。
对于 YouTube 推荐或垃圾邮件检测等应用,误报并不是什么大问题。没有人会因为错误的信息而丧命,因此准确率可以成为更好的评估指标。
4. F1 分数
当召回率和准确率都必不可少时,F1 分数就会发挥作用。它试图平衡召回率和准确率。请记住,它仍然比准确率要好,因为对于 F1 分数,我们不会寻找任何真正的负面数据。
从数学上来说,它被定义为召回率和准确率的调和平均值:
让我们计算数据集的 F1 分数并看看我们的分类器有多好。
from sklearn.metrics import f1_score
print("F1 Score : %.2f"%(f1_score(y_test, predictions)*100))
输出:
F1 Score : 69.07
它在召回率和准确率之间进行了权衡。
5. ROC 曲线
有时很难找出要使用哪个评估指标,而使用不同的阈值进行可视化可以帮助我们选择最佳的评估指标。
接收者操作特性曲线或 ROC 曲线是显示分类模型在所有分类阈值下的性能的图表。ROC 曲线是比较两个分类模型的有用可视化工具。ROC 描述了分类模型的真阳性率 (TPR) 和假阳性率 (FPR) 之间的性能权衡。
从数学上来说,
当我们降低分类器的阈值时,它会将更多项目归类为正面,从而增加假正面和真正面。
ROC 是最流行的图表之一,有助于解释分类器。
聚类问题的评估指标
聚类涉及另一类数据挖掘算法,该算法试图对相似的数据进行聚类。聚类解决了未标记数据的问题(当实际的类标签未知时)。聚类算法属于无监督学习类别。
我们可以通过很多种方法来估计两个数据对象之间的相似度。
- 余弦相似度
- 曼哈顿距离
- 欧几里德距离相似度
如果两个数据对象的距离较大,则表明它们不相似,因此不应存在于一个聚类中。相似性通常根据距离函数(曼哈顿、欧几里得等)根据对象在空间中的“接近程度”来定义。在分类任务中,初始数据集带有标签,用于训练数据挖掘模型,而聚类则在不知道真实类别标签的情况下分析数据对象。一般来说,类别标签不存在于训练数据中,因为它们是未知的。标记数据总是昂贵的,而聚类通过对相似的数据对象进行聚类并为它们生成类别标签来解决此问题。
聚类算法的工作原理很简单:最大化两个簇之间的分离度,最小化簇中数据对象之间的凝聚度。数据对象簇的形成方式是,簇中的对象与另一个簇中的对象具有较高的相似度。
<font style="vertical-al
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~