通过性能对比来选择机器学习模型
对于刚开始进入机器学习之旅的人来说,了解所有机器学习模型及其之间的差异似乎是一项艰巨的任务。在我们了解模型如何工作以及如何利用它之后,我们将需要进入现实世界并将我们学到的知识应用到现实世界中。对于现实世界的问题,我们没有给出一个特定的模型来调整。我们必须评估一组模型,然后决定我们想要使用哪种机器学习模型。
问题:
当我们开始考虑解决机器学习中的问题时,我们必须考虑以下几点:
- 问题定义
- 数据集的可用性
- 预期的解决方案
- 业务限制
鉴于上述所有信息,我们作为AI开发人员的工作是在给定数据集上设计和训练机器学习模型以获得预期结果。一旦我们知道要构建哪个模型,构建模型就会变得微不足道。有大量资源可以帮助我们。python构建简单机器学习模型的最佳库之一是scikit-learn。使用scikit-learn(scikit-learn.org),我们必须编写的代码量显著减少。我们可以在scikit-learn中找到几乎所有流行模型的实现,因此我们的工作现在已经简化并减少到只为我们的任务选择最佳模型并调整一些参数。这可以通过几行代码完成。
我们的目标是衡量不同分类模型的性能,并尝试为我们的任务挑选最佳分类模型。为此,我们将看到我们的模型在同一数据集上的表现。
数据集:
我们选择的数据集是Kaggle的汽车评估数据集(https://www.kaggle.com/elikplim/car-evaluation-data-set)。数据包括许多特征
- 相对购买成本
- 维修费用
- 门的数量
- boot space等
我们的任务是预测某辆车是否处于可接受的状态。
汽车可能属于4类:unacceptable, acceptable, good 和 very good。所以我们的问题变成了一个有4个类的分类问题。现在我们将尝试选择能够告诉我们汽车是否状况良好的最佳模型。
我们如何选择正确的模型?
我们可以通过多种方式衡量模型的表现。性能测量的核心思想是我们的模型能够准确地预测给定的数据点。还有其他考虑因素,如延迟,内存使用等,但本文中我们只讨论模型的预测准确性。
在本文中我们选择评估的指标是:
- 准确性
- 精度
- 召回
- F1得分
- ROC(AUC)
- 对数损失
所有这些度量将给我们一种不同的性能感觉。尽管一个好的模型在这些度量标准中表现良好,但是我们应该根据我们的问题陈述来选择度量标准。
混淆矩阵 :要理解大多数这些指标,我们首先需要了解混淆矩阵是什么。假设我们有一个2级分类问题。我们将一个类称为“YES”,将另一个类称为“NO”。现在我们有一组给出的实际分类作为我们的测试数据。我们还有一组相同测试数据点的预测值。
混乱矩阵
该图像描述了具有165个点的数据集的混淆矩阵。
- TN - 真阴性(实际数据集中的YES点数)
- TP - 真阳性(实际数据集中NO点数)
- FN - 假阴性(错误预测为NO的点数)
- FP - 误报(错误预测为YES的点数)
我们来看看这些指标的含义:
如果n =我们的测试数据集中的总点数
1.准确度:准确度衡量预测总数的正确预测数,即模型正确预测的次数。这是一个数据点。当我们有多个要测试的数据点时,准确度由整个测试数据集上模型的平均准确度给出。
(准确度公式)
准确度也可以用混淆矩阵定义为
Acc =(TP + TN)/ n
2.Precision:我们得到正确的Yes预测的次数
Precision = TP / predicted Yes
3.Recall:正确预测Yes的次数
Recall = TP/ actual Yes
4.F1分数:F1分数同时考虑精度和召回率
5.ROC(AUC):FPR(X轴)到TPR(Y轴)的图。其中:
FPR = FP rate = FP / actual No
TPR = TP rate = TP / actual Yes
6.对数损失:它也是预测值与实际值之差的度量。
测试我们的模型:
现在我们已经定义了我们的指标,让我们试着看看我们在不同模型上得到了什么结果。
我们将在分析中使用以下模型:
- Logistic回归
- 决策树
- 随机森林
- K最近邻
- 朴素贝叶斯(多个类的多项式)
我们一个接一个地尝试一下。
Logistic回归:
混淆矩阵
决策树:
混淆矩阵
随机森林:
混淆矩阵
K最近邻:
混淆矩阵
朴素贝叶斯:
混淆矩阵
比较我们的所有指标,我们得到如下图表:
观察:
根据我们在数据集上运行不同模型所收集的数据,我们可以看到Accuracy,Precision,Recall和F1 Scores都是相互成比例的。这意味着对于我们的情况,我们可以使用其中任何一个来评估我们的模型。
这些指标中表现最好的模型是简单的决策树,其次是随机森林和逻辑回归。
Confusion Matrices让我们更清楚地了解性能。我们必须看一下对角线上的高数字。对角线以外的数字越高,说明分类错误。我们可以看到决策树的错误分类最少。
如果我们查看对数损失比较,情况就会大不相同。这里决策树比我们所有的模型都要糟糕得多,而Logistic回归给我们带来了最好的结果。
这些差异违背了我们的直觉,因为我们期望更准确的模型具有最小的损失。这需要进一步调查我们为什么会在决策树中获得如此高的损失。
但对于我们的案例,决策树分类器似乎表现最好。如果我们想要稳扎稳打(这在现实生活中总是一个很好的策略),我们会选择随机森林或逻辑回归。
在查看这些结果时,我们需要记住以下几点:
- 我们的数据集仅包含大约1700个点,这远远不足以令人满意地训练我们的模型。在现实生活中,我们将拥有更大的数据集,因此在几个模型中具有不同程度的性能。
- 我们需要通过更严格的调整来评估我们的模型,以确定哪一个最拟合我们的数据。我们可以使用scikit-learn的模型选择库(https://scikit-learn.org/stable/modules/classes.html#module-sklearn.model_selection)来查找调整模型的最佳参数。
结论:
我们可以使用不同的度量标准来比较不同的模型,并选择最适合我们需求的模型。这些度量标准很重要,但是还有其他考虑因素。通常都有延迟性需求,最低准确度要求,更注重减少假阴性结果,等等。