介绍
癫痫是一种中枢神经系统疾病(CNS),在美国影响约1.2%(340万人),全球影响超过6500万。此外大约每26人中就有一人会在其一生中的某个时刻患上癫痫症。癫痫发作的种类很多,每种都有不同的症状,如失去意识,抽搐运动或混乱。有些癫痫发作在视觉上难以察觉; 患者通常会表现出一些症状,例如在短时间内没有反应或茫然地凝视。癫痫发作可能意外发生,并可能导致诸如摔倒,咬舌头或失去对一个人的尿液或粪便的控制等伤害。因此这些是为什么癫痫发作检测对于怀疑易患癫痫发作的医疗监督患者至关重要的一些原因。
该数据集可在UCI的机器学习库中找到。该数据集包括每位患者超过23.5秒的4097个脑电图(EEG)读数,总共500名患者。然后将4097个数据点平均分成每个患者23个块; 每个块都被转换为数据集中的一行。每行包含178个读数,这些读数被转换为列; 换句话说,有178列构成了EEG读数的一秒。总而言之有11,500行和180列,第一行是患者ID,最后一列包含患者的状态,无论患者是否有癫痫发作。
https://archive.ics.uci.edu/ml/datasets/Epileptic Seizure Recognition
在这个项目中,将演示在Python中构建二进制分类机器学习算法的步骤。
Jupyter笔记本可以在Github上找到。
https://github.com/Mr-Jree/Epileptic-Seizure-Binary-Classification/blob/master/Seizure Binary Classfication Notebook.ipynb
数据探索
该数据集包含一个散列的患者ID列,一秒钟内有178个EEG读数,以及一个Y输出变量,用于描述患者在该秒钟的状态。当患者癫痫发作时,y表示为1,而所有其他数字是我们不感兴趣的其他状态。因此将Y变量转换为二元变量时,该问题成为二元分类问题。
也会选择删除第一列,因为患者ID被哈希无法使用它。使用以下代码来完成所有这些操作。
下一步是计算流行率,并将其定义为在课堂上为正数的样本的比例; 换句话说在数据集中,它是患有癫痫发作的患者的比例。
患病率为20%。这对于了解平衡类和使用“提升”指标评估模型非常有用。
数据处理和构建训练/验证/测试集
这里没有任何特征工程要做,因为所有特征都是脑电图读数的数值; 将数据集转储到机器学习模型中不需要任何处理。
优良作法是将预测变量和响应变量与数据集分开。
cols_input是预测变量,OUTPUT_LABEL是响应变量
现在是时候将数据集分成训练,验证和测试集了!多么激动人心!通常验证和测试集的大小相同,训练集通常占主数据集的50%到90%,具体取决于数据集的样本数。数据集的样本越多,可以承担的样本就越多地转移到我们的训练集中。
第一步是对我们的数据集进行洗牌,以确保没有与我们的样本相关的订单。
然后选择的分割是70/15/15,所以以这种方式分割数据集。将首先选择将验证和测试集与训练集分开,这是因为希望验证和测试集具有类似的分布。
然后可以检查每组中的患病率,以确保它们大致相同,因此大约20%。
接下来想要平衡数据集,以避免创建一个模型,它错误地将样本分类为属于多数类; 在案例中,患者没有癫痫发作。这被称为准确性悖论例如,当模型的准确性告诉有80%的准确度时,如果类不平衡,它将只反映基础类分布。由于模型发现大多数样本没有癫痫发作,因此获得高准确度评分的最佳方法是将样本分类为没有癫痫发作而不管要求它预测的是什么。可以帮助解决这个问题,这有两种直接且初学者友好的方式。二次采样和过采样。可以通过减少属于更主要类的样本数来对更具优势的类进行子样本,或者可以通过多次粘贴少数类的相同样本来进行过采样,直到两个类的数量相等。将选择在该项目中使用子采样。
然后保存train_all ,train ,valid ,和test套为.csv文件。在继续导入sklearn和构建第一个模型之前,需要扩展一些模型的变量才能工作。由于将构建九种不同的分类模型,因此应该使用StandardScaler 。
如果想在其他python笔记本中使用它,将缩放器转储为.csv文件以便快速访问
分类模型
进行设置,这样就可以使用一个函数打印所有模型指标print_report 。
由于已经平衡了数据,因此将阈值设置为0.5。该阈值用于确定样品是否被分类为阳性或阴性。这是因为模型返回属于正类的样本的百分比机会,因此如果没有设置阈值,它将不是二进制分类。如果样品返回的百分比高于阈值,那么它将被归类为阳性样品等。
分类模型
将介绍以下型号:
- K最近的邻居
- Logistic回归
- 随机梯度下降
- 朴素贝叶斯
- 决策树
- 随机森林
- 极端随机森林(ExtraTrees)
- 渐变提升
- 极端梯度提升(XGBoost)
将为所有模型使用基线默认参数,然后选择具有最高验证分数的模型来执行超参数调整。
K近邻(KNN)
KNN是人们在scikitlearn分类模型中学习的第一批模型之一。该模型基于最接近它的k个样本对样本进行分类。例如,如果k = 3,并且所有三个最接近的样本都是正类,那么样本将被归类为类1.如果三个最接近的样本中的两个是正类,那么样本将具有66%的可能性被归类为阳性。
获得了相当高的训练曲线下面积(AUC)接收器操作曲线(ROC),以及高验证AUC。该指标用于衡量分类模型的性能。AUC告诉模型能够区分类别的程度,AUC越高,模型在区分类别方面越好。如果AUC为0.5,那么可以猜测样本。
Logistic回归
Logistic回归是一种广义线性模型,它是常规线性模型的概念和能力的概括。
在逻辑回归中,模型预测某些事物是真还是假,而不是预测某些事物是连续的。该模型适合两个类的线性决策边界,然后通过sigmoid函数传递,从赔率对数转换为样本属于正类的概率。因为模型试图找到正类和负类之间的最佳分离,所以当数据分离明显时,该模型表现良好。这是需要缩放所有要素的模型之一,并且因变量是二分的。
随机梯度下降
梯度下降是一种算法,可以在许多不同模型中最小化许多损失函数,例如线性回归,逻辑回归和聚类模型。它类似于逻辑回归,其中梯度下降用于优化线性函数。不同之处在于,随机梯度下降允许小批量学习,其中模型使用多个样本来采取单步而不是整个数据集。在数据冗余的情况下尤其有用,通常通过群集看到。因此SGD比逻辑回归快得多。
朴素贝叶斯
朴素贝叶斯分类器使用贝叶斯定理来执行分类。它假设如果所有特征彼此不相关,那么一起看特征的概率只是每个特征发生概率的乘积。在给定所有不同的特征组合的情况下,它找到样本被分类为正的概率。该模型通常存在缺陷,因为模型的“天真”部分假设所有特征都是独立的,而且大多数情况并非如此。
决策树
决策树是一个模型,它在多个“问题”下运行样本以确定其类。分类算法通过将数据重复地分离到同一类的子区域来工作,并且当算法将所有样本划分为纯的类别或者通过满足分类器属性的某些标准时,树结束。
决策树是弱学习者,认为它们并不是特别准确,而且它们通常只比随机猜测好一些。几乎总是过度训练数据。
随机森林
由于决策树可能过度拟合,因此创建了随机森林来减少这种情况。许多决策树构成随机森林模型。随机森林包括引导数据集并使用每个决策树的随机特征子集来减少每个树的相关性,从而降低过度拟合的可能性。可以通过使用未用于任何树来测试模型的“袋外”数据来测量随机森林的有效性。随机森林也几乎总是优先于决策树,因为模型具有较低的方差; 因此,该模型可以更好地推广。
ExtraTrees
ExtraTrees分类器类似于随机森林,除了:
- 在拆分中选择变量时,将从整个训练集中抽取样本,而不是自举样本
- 节点拆分是随机选择的,而不是像随机森林中那样指定
这使ExtraTrees分类器不易过度拟合,并且它通常可以产生比随机森林更通用的模型。
渐变提升
梯度增强是另一种模拟决策树过度拟合的模型。但是GB和RF之间存在一些差异。渐变增强一次创建一个较短的树,每个新树减少了前一棵树所犯的错误。该错误称为伪残差。梯度提升比随机森林更快,并且在许多实际应用中都很有用。但是当数据集包含噪声数据时,渐变增强效果不佳。
极端梯度提升
XGBoost类似于梯度增强,除了
- 树具有不同数量的终端节点
- 用较少的证据计算的树木的叶重量会更加严重
- Newton Boosting提供了通往最小值的直接路线,而不是梯度下降
- 额外随机化参数用于减少树之间的相关性
- 使用更正则化的模型来控制过拟合,因为标准GBM没有正则化,这使其具有比GBM更好的性能。
- XGB实现并行处理,比GBM快得多。
模型选择和验证
下一步是在一个图表中可视化所有模型的性能; 它可以更容易地选择想要调整的那个。我选择评估模型的指标是AUC曲线。可以选择要优化的任何指标,例如准确度或提升,但是,AUC不受您选择的阈值的影响,因此它是大多数人用来评估其模型的指标。
九种模型中的七种具有非常高的性能,这很可能是由于患有癫痫发作且没有癫痫发作的患者之间的EEG读数的极端差异。决策树看起来像预期的那样过度装配,注意到训练AUC和验证AUC之间的差距。
将选择XGBoost和ExtraTrees分类器作为调整的两个模型。
学习曲线
学习曲线是在模型中可视化偏差 - 方差权衡的一种方式。使用了学习曲线代码,scikit-learn但绘制了AUC,因为这是选择用来评估模型的度量标准。
训练曲线和CV曲线都很高,因此我们在ExtraTrees分类器中发出低方差和低偏差的信号。
但是,如果看到两条曲线分数较低且相似,那就是高偏差的迹象。如果曲线有很大的差距,那就是高差异的迹象。
以下是在两种情况下如何做的一些提示:
高偏差:
- 增加模型复杂性
- 减少正则化
- 更改模型架构
- 添加新功能
高方差:
- 添加更多样本
- 减少特征数量
- 添加/增加正则化
- 降低模型复杂性
- 组合特征
- 更改模型架构
功能重要性
就像回归模型一样,可以通过特征系数来判断影响的大小; 可以在分类模型中做同样的事情。
根据您的偏差 - 方差诊断,可以根据此图表选择丢弃特征或通过组合一些来提出新变量。但是,对于模型没有必要这样做。从技术上讲,脑电图读数是我唯一的特征,读数越多,分类模型就越好。
超参数调整
应该执行的下一步是调整模型中的旋钮,也称为超参数调整。有几种方法可以做到这一点。
网格搜索
这是用于超参数调整的传统技术,这意味着它是第一个在手动调整每个超参数之外开发的技术。它需要相关超参数的所有输入(例如,您要测试的所有学习速率),并通过遍历超参数值的所有可能组合来使用交叉验证来测量模型的性能。这种方法的缺点是,需要花费很长时间来评估想要调整的大量超参数。
随机搜索
随机搜索使用超参数的随机组合来找到性能最佳的模型。仍然需要输入要调整的超参数的所有值,但算法会随机搜索网格,而不是搜索超参数的所有值的所有组合。这往往节拍在时间网格搜索由于其随机性质的模型能够更快比网格搜索按达到其最佳值。
遗传编程
遗传编程或遗传算法(GA)基于查尔斯达尔文的适者生存理论。GA对当前超参数应用小的,慢的和随机的变化。它的工作原理是为解决方案指定适合度值,适应度值越高,解决方案的质量越高。然后它选择具有最高适应值的个体并将它们放入“交配池”中,其中两个个体将产生两个后代(对后代施加一些变化),其预期具有比其父母更高的质量。这种情况一次又一次地发生,直到达到所需的最佳值。
TPOT是一个正在积极开发的开源库,最初由宾夕法尼亚大学的研究人员开发。它需要整个训练数据集的多个副本,并执行自己的单热编码变体(如果需要),然后使用遗传算法优化超参数。
将使用dasktpot的automl来执行此操作。通过xgboost和extratrees分类进入tpotconfig来告诉它只希望算法这两个分类模型内进行搜索。还告诉tpot将每个模型导出到目的地以防想要提前停止。
模型评估
性能最佳的模型,AUC为0.997,是优化的extratrees分类器。以下是它在所有三个数据集上的表现。
还创建了ROC曲线图以显示上述AUC曲线。
结论
在这个项目中,创建了一个分类机器学习模型,可以通过脑电图读数预测患者是否有癫痫发作。性能最佳的模型的提升度量为4.3,这意味着它比随机猜测好4.3倍。在预测测试集中的正类时,它也是97.4%正确的。如果将该模型投入生产以预测患者是否患有癫痫发作,可以期望该表现正确预测癫痫患者。