使用机器学习进行疾病预测
本文旨在实现一个强大的机器学习模型,该模型可以根据人的症状有效地预测他/她的疾病。让我们来看看我们如何处理这个机器学习问题。
步骤:
- 收集数据。数据准备是任何机器学习问题的首要步骤。我们将使用Kaggle的数据集来解决这个问题。这个数据集由两个CSV文件组成,一个用于训练,一个用于测试。数据集中总共有133列,其中132列代表症状,最后一列是预后。
- 清理数据。清洗是机器学习项目中最重要的一步。数据的质量决定了我们机器学习模型的质量。因此,在将数据送入模型进行训练之前,总是有必要对其进行清理。在我们的数据集中,所有的列都是数字,目标列即预后是一个字符串类型,并使用标签编码器编码为数字形式。
- 模型构建。在收集和清理数据后,数据已经准备就绪,可以用来训练机器学习模型。我们将使用这些清理过的数据来训练支持向量分类器、Naive Bayes分类器和随机森林分类器。我们将使用混淆矩阵来确定模型的质量。
- 推断。训练完这三个模型后,我们将通过结合所有三个模型的预测结果来预测输入症状的疾病。这使我们的整体预测更加稳健和准确。
最后,我们将定义一个函数,以逗号分隔的症状作为输入,通过使用训练好的模型根据症状预测疾病,并以JSON格式返回预测结果。
实现的工作流程:
确保下载训练和测试,并将train.csv、test.csv放在dataset文件夹中。打开jupyter笔记本,单独运行代码,以便更好地理解。
读取数据集
首先,我们将使用pandas库从文件夹中加载数据集。在读取数据集的同时,我们将删除空列。这个数据集是一个干净的数据集,没有空值,所有的特征都是0和1。每当我们解决一个分类任务时,有必要检查我们的目标列是否是平衡的。我们将使用柱状图,来检查数据集是否平衡。
输出:
从上面的图中,我们可以看到,数据集是一个平衡的数据集,即每种疾病正好有120个样本,不需要进一步的平衡。我们可以注意到,我们的目标列,即预后列是对象数据类型的,这种格式不适合训练机器学习模型。因此,我们将使用一个标签编码器来将预后列转换为数字数据类型。标签编码器通过给标签分配一个唯一的索引将标签转换成数字形式。如果标签的总数是n,那么分配给每个标签的数字将在0到n-1之间。
为训练和测试模型分割数据
现在,我们已经通过删除空值和将标签转换为数字格式来清理我们的数据,现在是时候将数据分割成训练和测试模型。我们将把数据分成80:20的格式,即80%的数据集将被用于训练模型,20%的数据将被用于评估模型的性能。
输出:
模型构建
模型的工作。我们将使用K-Fold交叉验证法来评估机器学习模型。我们将使用支持向量分类器、高斯Naive Bayes分类器和随机森林分类器进行交叉验证。在进入实施部分之前,让我们先熟悉一下K-折交叉验证和机器学习模型。
- K-折交叉验证法。K-Fold交叉验证是交叉验证技术之一,在该技术中,整个数据集被分成k个子集,也被称为折叠,然后在k-1个子集上进行模型训练,剩下的一个子集用于评估模型性能。
- 支持向量分类器。支持向量分类器是一种鉴别性分类器,即当给定一个标记的训练数据时,该算法试图找到一个最佳的超平面,以准确地将样本分成超空间中的不同类别。
- 高斯奈何贝叶斯分类器。它是一种概率机器学习算法,内部使用贝叶斯定理对数据点进行分类。
- 随机森林分类器。随机森林是一种基于集合学习的监督机器学习分类算法,内部使用多个决策树进行分类。在随机森林分类器中,所有的内部决策树都是弱学习者,这些弱决策树的输出被合并,即所有预测的模式作为最终预测。
使用K-Fold Cross-Validation进行模型选择。
输出:
从上面的输出中,我们可以注意到,我们所有的机器学习算法都表现得非常好,而且经过k fold交叉验证后的平均分数也非常高。为了建立一个稳健的模型,我们可以把三个模型的预测模式结合起来,这样即使其中一个模型做出了错误的预测,而另外两个模型做出了正确的预测,那么最终的输出也是正确的。这种方法将帮助我们在完全未见过的数据上保持更准确的预测。在下面的代码中,我们将在训练数据上训练所有三个模型,使用混淆矩阵检查我们模型的质量,然后结合所有三个模型的预测结果。
通过结合所有模型建立稳健的分类器:
输出:
从上述混淆矩阵中,我们可以看到模型在未见过的数据上表现非常好。现在我们将在我们下载的数据集中的全部训练数据上训练模型,然后在数据集中的测试数据上测试我们的组合模型。
在整个数据上拟合模型并在测试数据集上验证:
输出:
我们可以看到,我们的组合模型对所有的数据点进行了准确分类。我们已经来到了整个实现的最后一部分,我们将创建一个函数,将由逗号分隔的症状作为输入,并根据输入的症状使用组合模型输出预测的疾病。
创建一个可以将症状作为输入并生成疾病预测的函数。
输出:
注意:作为函数输入的症状应该在数据集中的132个症状中完全相同。