【数据挖掘】葡萄酒质量分析及异常值检测

背景介绍

葡萄酒在人类历史中扮演着非常重要的角色,它能舒缓疲劳、减轻病痛、消毒杀菌、美容养颜等等直到19世纪晚期,葡萄酒都是西方医学中不可缺少的用品,适量饮用对人的身体会有益处。无论是用于交际会谈,还是滋身养颜,优良的葡萄酒因其独特的风味与绝佳的品质往往具有高昂的价格。因而,葡萄酒的质量评估成为酒品酿造行业的重要过程。

通常情况下,我们根据葡萄酒的理化性质及行业的前导经验判断葡萄酒的品质。本次实验,我们基于葡萄酒数据集,通过数据挖掘的方法实现了对数据集的可视化及数据清洗,利用异常检测的方法筛除劣质葡萄酒。

数据可视化探索分析

2.1. 数据整体情况介绍

数据来源于UCI机器学习库中与葡萄牙“Vinho Verde”葡萄酒的红白变体(白葡萄酒和红葡萄酒)有关的两个数据集。“Vinho Verde”葡萄酒是葡萄牙米尼奥(西北)地区的独特产品,由于其酒精含量适、新鲜度高等特点受到市场欢迎。

我们得到原始的葡萄酒数据集,利用info函数查看数据集基本情况:

可以得知,总数据量为6497条,包含13种属性,其中葡萄酒种类(type)为object类型,感官评分(quality)为int类型,其余属性均为float类型。数据集中的各属性描述如表1所示:

Field

Attribute

Description

type

类型

葡萄酒种类:白葡萄酒和红葡萄酒

fixed acidity

固定酸度

固定酸度是由于葡萄酒中存在非挥发性酸。例如,酒石酸、柠檬酸或苹果酸。这种酸结合了葡萄酒味道的平衡,使味道清新

volatile acidity

挥发性酸度

挥发性酸度是葡萄酒中可以通过嗅觉闻到的酸的一部分,是最常见的缺陷之一。葡萄酒中醋酸的含量过高会导致令人不愉快的醋味

citric acid

柠檬酸

可以用于葡萄酒的酸处理(增加酸度)、收集葡萄酒、清洗过滤器以防真菌和霉菌感染。少量柠檬酸可以增加葡萄酒的“新鲜度”和风味

residual sugar

残糖

发酵停止后剩余的糖量

chlorides

氯化物

葡萄酒中部分矿物质(例如盐)的含量

free sulfur dioxide

游离二氧化硫

游离形式的二氧化硫在分子SO₂(作为溶解气体)和亚硫酸氢根离子之间存在平衡;它可以防止微生物的生长和葡萄酒的氧化

total sulfur dioxide

二氧化硫总量

游离和结合形式的SO₂的量;在低浓度下,SO₂在葡萄酒中几乎检测不到,但在游离SO₂浓度超过50ppm时,SO₂在酒的鼻子和味道中变得明显

density

密度

葡萄酒的密度可以小于或大于水,其值主要由酒精浓度和糖的含量决定

pH

酸碱度

描述葡萄酒的酸度或碱度从0(非常酸性)到14(非常碱性)

sulphates

硫酸盐

一种葡萄酒添加剂,可以促进二氧化硫气体(SO₂)水平,作为抗菌剂和抗氧化剂

alcohol

酒精

葡萄酒的酒精含量百分比

quality

基于感官的评分

多名葡萄酒专家根据个人感官感受对这些酒做了评分,分数在0(⾮常差)和10(⾮常好)之间,仅作为最后预测效果的参考

表1 葡萄酒数据集属性介绍

作为一种常见的饮品,我国对葡萄酒的理化性质有着明确的规定。根据国家质量监督检验检疫总局颁布的GB/T 15037-2006 葡萄酒国家标准,我们了解到葡萄酒的基本理化要求,明确葡萄酒数据字段值范围的强制要求,方便后续处理可能的异常值时,能够较好地根据酒类学理论及国标对其进行处理。

结合上述图表,我们对数据集中各字段及酒品的特征要求进行分析:

查阅资料可知,葡萄酒的三大基本特征是酸度、酒精和甜味。

酸度可以从两方面考虑。一方面,酸可分为fixed acidity(固定酸)和volatile acidity(挥发酸),其总含量反映葡萄酒浓度。其中citric acid(柠檬酸)及挥发酸的含量能够较好地反映葡萄酒的健康状态,帮助我们判断葡萄酒的质量、预测贮藏的困难程度。另一方面,pH(酸碱度)同样可以指示酸度,反映葡萄酒品尝起来口感的浓郁度。

此外,二氧化硫作为酸性氧化物,既能杀菌抗氧、澄清酒液,又对酸度有影响,本数据集中有free sulfur dioxide(游离二氧化硫)和total sulfur dioxide(二氧化硫总量)两个相关字段。

酒精即葡萄酒中alcohol(酒精)的含量,大部分葡萄酒的酒精含量都在10-15%之间,酒精浓度过高会影响葡萄酒的口感;甜味则由葡萄酒中的residual sugar(残留糖分)决定。

葡萄酒的density(密度)主要由酒精浓度和糖的含量决定,这同样是葡萄酒酒精及甜味的重要衡量指标。

chlorides(氯化物)和sulphates(硫酸盐)都属于葡萄酒中的矿物盐成分,通常情况下含量分别是0.1-0.4g/L和0.25-0.85g/L,且红葡萄酒所含的矿物质多于白葡萄酒。

2.2. 数据质量分析

2.2.1. 缺失率和覆盖率

根据前述的数据集基本情况,我们发现部分字段存在缺失值。我们选择查看数据的缺失率和覆盖率情况。

绘制缺失值矩阵图:

图1 葡萄酒数据集缺失值矩阵图

由图可知原数据集的缺失值数量极少。

统计各个字段缺失率和整体的数据覆盖率(如果缺失字段同时为空,则表示该条数据没有从外部数据中获取到对应的实例数据,则数据未覆盖该实例):

由结果可以看出数据缺失率较低且覆盖率为100%。

综上可知,数据集极少存在数据字段缺失的情况,数据质量基本良好,具有开展数据挖掘的价值。

2.2.2. 重复率

我们认为所有属性值均相同的两个实例数据算作重复数据,在此基础上,我们计算重复数据在整个数据集中的比例大小:

图2 葡萄酒数据集重复率饼图

由图可以看出,数据集中重复值所占比例较小,数据整体可用性较高。

综上所述,该数据集数据质量较高,具有挖掘潜力。

2.3. 可视化探索分析

2.3.1. 箱线图分析

箱线图也称箱形图,用于反映一组或多组连续型定量数据分布的中心位置和散布范围。它不仅能够分析不同类别数据各层次水平差异,还能揭示数据间的离散程度、异常值、分布差异等。

基于葡萄酒数据集,我们绘制所有属性的箱型图进行预览:

我们选择葡萄酒中比较有代表性的三个属性:固定酸度(fixed acidity)、挥发性酸度(volatile acidity)、柠檬酸(citric acid),绘制箱型图:

图3 固定酸度、挥发性酸度、柠檬酸属性箱型图

以固定酸度(fixed acidity)的箱线图为例,我们将该属性下n条数据从小到大进行排序,分为四等份。位于第25%(n+1)位置的数字是第一四分位数Q1,位于第50%(n+1)位置的数字是第二四分位数Q2(即中位数),位于第75%(n+1)位置的数字是第三四分位数Q3。第三四分位数与第一四分位数的差值称为四分位距IQR(IQR=Q3-Q1),IQR表征在箱线图中即为箱体的长度。

如图所示,箱体填充部分包含了50%的数据,箱体的上边缘线值为Q3+1.5IQR,称为上限;下边缘线值为Q1-1.5IQR,称为下限。上限是非异常范围的最大值,下限是非异常范围的最小值,即正常范围是[Q1-1.5IQR,Q3+1.5IQR]。我们认为超过该正常范围的就是异常值(即图中黄色方框区域)。

由图3可知,固定酸度(fixed acidity)、挥发性酸度(volatile acidity)、柠檬酸(citric acid)这三个属性都有一定数量的离群值,且其大多集中在较大值一侧,数据分布呈右偏态。

查看这三个属性的数据描述,可以分别得到它们的四分位数、最大、最小值等重要信息。

根据箱线图,我们进一步绘制红葡萄酒和白葡萄酒(数据集中type属性值分别为red和white)的上述三个属性的对比箱线图,如图4所示。

以固定酸度(fixed acidity)属性为例,由图可以看出,在该属性下,红葡萄酒的异常值均集中在较大值一侧,而白葡萄酒的异常值则在较大值和较小值两侧均有分布。此外,红葡萄酒数据在这三个属性下的分布区间长度均大于白葡萄酒。这表明红葡萄酒的固定酸度、挥发性酸度属性的整体数值较白葡萄酒偏高。

图4 红葡萄酒和白葡萄酒的固定酸度、挥发性酸度、柠檬酸属性对比箱型图

2.3.2. 数据集统计特征

常见的数据统计特征包括均值(Mean)、标准差(Std)、最小值(Min)、下四分位数(25%)、中位数(50%)、上四分位数(75%)、最大值(Max)等。

经过计算,我们将数据集的统计特征结果进行可视化,结果如图5所示。

图5 数据集各属性统计特征条形图

2.3.3. 数据集数据可视化

直方图是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况,用横轴表示数据类型,纵轴表示分布情况。直方图可以对数据集中各属性的频数表进行可视化,用于探索各属性下数值变量的分布。我们绘制直方图如下。

图6 数据集各属性直方图

热力图是一种通过对色块着色来显示数据的统计图表。利用热力图,我们可以根据图中颜色直观地查看数据集中多个属性两两之间的相似度大小,相似度由皮尔逊相关系数度量。

图7 数据集各属性相关系数热力图

Python中sns.pairplot() 函数可以探索数据集中的多个成对双变量的分布,它会同时展示出输入的Dataframe中每对变量的关系,并在对角线上展示每个变量自身作为单变量时的分布情况,有利于帮助我们理解变量间的关系。

绘图时,我们按葡萄酒种类(type)进行分类。

图8 数据集部分属性成对关系图

图9 数据集各属性成对关系图

数据清洗

3.1. 缺失值处理

根据2.2.1节中的缺失值分析可知,部分数据的部分字段存在缺失值,可能会对后续分析造成影响,因此我们需要对数据集中的缺失值进行处理。

统计所有实例属性的缺失值情况:

由于缺失值大于1的实例数量极少,我们使用删除的方法进行处理;缺失值小于等于1的实例有留存及后续处理的意义,对于缺失值等于1的实例,我们选用该缺失值所在特征属性的中位数进行填充:

经过处理,我们实现了对缺失数据的删除及填充。

3.2. 数据去重

由2.2.2节中的重复率分析可知,数据集中存在小部分重复的实例。在本次数据分析工作中,重复值对质量评估及异常检测几乎没有影响,因而我们将异常的重复数据进行处理,减少无效冗余。

3.3. 数据异常值识别和处理

异常值通常指与数据集中的大多其他数据对象有明显不同或其字段值不符合范围的数据对象。

由于不同类型的酒的风味、工艺及评价标准不同,我们选择在异常值处理及后续过程中,根据酒的类型将原始数据集划分为两部分。其中,去重后的红酒数据集的实例数为1357,去重后的白酒数据集的实例数为3968.

基于上述两类数据集,我们将异常值的处理分为两个步骤:

3.3.1. 异常值挖掘

由于数据来源于同一种酒,因而我们认为酒的理化性质值及其感官评分均表现出一定的稳定性,界于某个合理的范围内。因而,若数据某字段值偏大或偏小,则该字段可能存在异常。我们接受部分数据的部分字段值与其他数据的存在差异,但拒绝差距极大的假设。

在此,我们选用3σ原则发现异常值。

3σ原则是指我们认为服从正态分布或近似正态分布的数据,其值有99.7%的概率集中在(μ-3σ,μ+3σ)区间内(μ为平均值,σ为标准差),超出这个范围的可能性仅占0.3%,属于极个别的小概率事件,因此我们将超出(μ-3σ,μ+3σ)范围的值认为是异常值。

3σ原则中涉及到的重要数据特征为平均值与标准差。此外,数据的最大值和最小值也能帮助我们了解数据的分布情况。

因而,我们计算并可视化了去重后的数据的关键统计特征,结果如图10和图11所示:

图10 红葡萄酒的关键数据特征条形图

图11 白葡萄酒的关键数据特征条形图

我们根据红葡萄酒和白葡萄酒的均值与标准差,对各属性计算3σ区间范围,并对负值进行归零处理,获得3σ区间向量。

我们认为数据任意字段的属性值不在3σ区间内则数据的该字段值存在异常可能,我们记录各类型葡萄酒的各属性下异常值对应的数据索引值。以红葡萄酒为例:

红葡萄酒和白葡萄酒的异常字段值的数据索引列表如下:

我们对上述索引进行记录后,需要根据相关的酒类学理论对这些可能的异常值其进行核验,确定是否需要处理。

3.3.2. 异常值处理

由于酒品质量本身存在差异,葡萄酒的理化性质也会有所不同,数值有存在较大差异的可能且该差异是我们后续筛除劣质葡萄酒的重要区分条件,不能粗暴简单地以所谓的“严重偏离”来定义异常值。

我们假定,在数据本身记录无误的情况下,我们在此只认定不符合食品生产理化要求的数据为不符合生产要求的异常值,并予以剔除。

我们根据2.1中的GB/T 15037-2006 葡萄酒国家标准,明确其对葡萄酒的酒精含量、挥发酸含量及不同甜度下的柠檬酸含量的限制,即:

依此,我们筛除上述理化要求对应的异常值。

首先,根据3.3.1中的属性条形图可知,白葡萄酒和红葡萄酒数据的酒精含量属性值均高于国标阈值7.0,因而该字段不存在异常值。

其次,根据3.3.1中的属性条形图可知,白葡萄酒数据的挥发酸含量属性正常,红葡萄酒数据则存在异常值,我们利用3.3.1中的索引列表,迅速定位异常值。

最后,根据3.3.1中的属性条形图可知,数据多为残糖含量低于45g/L的非甜葡萄酒,且部分葡萄酒柠檬酸含量高于1g/L。因此,我们基于国标对葡萄酒甜度的分类,根据数据的residual sugar(残糖)字段值对不同类型葡萄酒的柠檬酸含量进行分析。

我们依据索引值在对应数据集中删除不符合生产要求的实例,由于白葡萄酒数据中没有不符合理化要求的实例,我们只对红葡萄酒数据集进行处理。

3.4. 数据噪声识别和处理

噪声是指数据集中的干扰数据,对场景描述不准确的数据,即测量变量中的随机误差或方差。我们选用箱线图对数据噪声情况进行分析。

首先,我们对不同类型的葡萄酒的各属性再次绘制箱线图,结果如图12所示。由箱线图可以看出,红葡萄酒和白葡萄酒的各属性均存在噪声,且数据特征间存在较明显的差异。

但红葡萄酒数据的citric acid(柠檬酸含量)属性相对白葡萄酒集中,噪声较少;白葡萄酒数据的alcohol(酒精含量)属性相对红葡萄酒集中,噪声较少,即红葡萄酒的柠檬酸含量和白葡萄酒的酒精含量字段无明显噪声。

考虑到算法特性,我们在此不处理这些噪声数据。

图12 不同类型葡萄酒的各属性箱线图

3.5. 主成分分析

PCA(主成分分析)是一种常见的数据降维方法,能够在“信息”损失较少的前提下,对高维的数据进行降维,从而减小计算量,其原理为如下:

基于最小投影距离和最大投影方差的思想,我们通过对n维样本x(i)求其k维(k<n)主成分,即为求其协方差矩阵XXT的前k个特征值对应的特征向量矩阵W,然后对样本x(i)做如下变换z(i)=WTx(i),即可达到降维目的。

接下来,我们将利用PCA对红葡萄酒和白葡萄酒的数值属性分别做主成分分析。

我们定义方法PCA:首先计算每一列的均值向量mean_vector,获得原始数据减掉均值后中心化得到的矩阵normal_data。

根据中心化后的数据,计算其协方差矩阵Covmatrix。我们默认行为数据的基本处理单位,对协方差矩阵进行对角化,计算出其特征值矩阵eig_val与特征向量矩阵eig_vec。我们利用切片方法,根据特征值大小从大到小对特征值矩阵进行排序,得到eig_val_sorted。

由PCA原理可知,eig_val_sorted的前k个特征值对应的k个特征向量即为前k个主成分。我们计算各主成分的累计率及累积贡献率,了解各主成分对方差的解释率,从而帮助我们选择合适的主成分数。

我们利用numpy中的argsort方法,得到特征值的有序索引列表,以便由此筛选出特征向量,组成用于降维的矩阵eig_tool。

最后,我们利用矩阵乘法,将中心化后的数据进行降维,得到降维后的数据new_data,并返回用于降维的矩阵、排序后的特征值向量及降维后的矩阵。

在主函数中,我们导入数据并除去“属性”和“质量”字段,仅保留其余11个与葡萄酒理化性质有关的字段。

我们先随机指定任意要降维到的维度,得到各主成分的累积贡献率。可以看出,前两个主成分解释了原数据99.5%的方差,所以使用两个主成分几乎可以完全代替原来11个变量,我们确定红酒数据的主成分数为2。

我们指定降维维度dim = 2,调用PCA方法得到与红葡萄酒数据相关的各矩阵,其中用于降维的两个主成分如下,红色框向量为第一主成分,蓝色框向量为第二主成分。

最后,我们利用上述数据绘制图像,得到去除与PCA无关字段后的特征值-字段索引值折线图,见图13。

图13 红葡萄酒字段索引值-特征值折线图

同理,利用白葡萄酒数据,我们可以得到白葡萄酒各主成分的累积贡献率、前两个主成分向量及其特征值-字段索引值折线图。

图14 白葡萄酒字段索引值-特征值折线图

至此,我们完成了对红葡萄酒和白葡萄酒数据的主成分分析。

3.6. 特征工程

特征工程的目的是最大限度地从原始数据中提取特征以供算法和模型使用。特征工程处理流程主要包括四个方面,我们在此仅关注特征处理和特征生成这两方面。

特征工程对数据挖掘具有重要的意义。通常情况下,特征越好,其灵活性越强,构建的模型在参数非最优的条件下仍然可以简单而性能出色,

由于我们的数据集均为数字特征,因此我们后续均针对数字特征选用合适的方法进行处理。

3.6.1. 数字特征处理

在数据挖掘过程中,不同评价指标间往往具有不同的量纲和单位,这会影响到数据分析的结果。为了消除指标之间量纲的影响,我们需要对数据进行标准化处理,使数据指标具有可比性。

常见的数据标准化处理方法是Z-score,这是一种基于原始数据的均值和标准差,通过减去均值然后除以标准差实现中心化和正态分布的方法,公式可表示为:

x =(x – μ)/σ

我们利用sklearn库中的preprocessing对数据进行处理,得到红葡萄酒和白葡萄酒的Z-score结果。

3.6.2. 数字特征构建

根据2.1中数据的整体情况介绍及查阅到的相关资料,我们决定基于数据的11个与理化性质有关的字段进行新的数字特征构建。

首先,我们选择将fixed acidity(固定酸度)、volatile acidity(挥发性酸度)和pH(酸碱度)进行合并,构建total acidity(总酸度)特征。由于citric acid(柠檬酸)是固定酸中的一种,我们忽略该字段。

其次,我们选择将residual sugar(残糖)、density(密度)和alcohol(酒精)进行合并,构建sugar alcohol percent(酒糖比例)特征。

此外,我们选择将chlorides(氯化物)和sulphates(硫酸盐)进行合并,构建mineral salt(矿物盐)特征。

最后,我们选择保留total sulfur dioxide(二氧化硫总量)特征和quality(质量)特征。由于free sulfur dioxide(游离二氧化硫)是二氧化硫中的一种组分,我们忽略该字段。

根据国标,我们对新的特征定义如下(均基于Z-score标准化后的字段):

我们构建的新特征含义如下:

  1. 总酸度特征反映葡萄酒的浓度及酸度,总酸度值越高(低),葡萄酒的口感越(不)酸。

  1. 酒糖比例特征反映葡萄酒的甜度及酒精度数,酒糖比例越高(低),葡萄酒的酒精度数越高(低),口感越涩(甜)。

  1. 矿物盐特征反映葡萄酒的矿物质含量,矿物盐量越高(低),葡萄酒的矿物质总含量越高(低)。其中,矿物盐特征的线性组合系数由原数据集两字段的均值之比经规范化处理后得到。

异常检测

4.1.相关原理及概念

4.1.1. 异常检测的概念

异常是数据集中的小比例数据对象,也被称作离群点。

异常检测也被称作离群值检测,即从整个数据集中识别出不同于大比例数据对象的离群对象以便进行后续分析。在本次数据挖掘任务中,我们的目标检测异常为经主成分分析后的葡萄酒数据中综合得分较差的数据,即原数据集中的劣质葡萄酒。

4.1.2. 异常检测的原理

异常检测的原理是基于相似性度量进行的相似度分析。

根据定义,异常是数据集中的小比例数据对象,它们通常表现为属性值与多数对象差异较大或在多维空间中的位置分布与其余数据对象距离很远,即与其他对象数据的相似程度比较低。

通常情况下,我们利用相似度指标对数据进行分析,找出与大多数据存在明显差异的离群数据,实现异常检测。

常见的相似度指标有欧几里得距离、余弦相似度、皮尔逊相关系数、杰卡德相似度等。在本次数据挖掘任务中,我们得到的二维数据可以直观地表示在二维平面上,用欧氏距离衡量数据点间的相似性。距离越近(远),数据点间的相似度越高(低)。

4.2.算法描述及相关案例

根据数据在主成分分析后只有两个字段及其他特性,我们决定选用DBSCAN方法,利用聚类的思想实现离群值的检测。

4.2.1.算法介绍

DBSCAN是极具代表性的基于密度聚类算法。它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,是一种非常有效的聚类算法。

4.2.2.算法描述

DBSCAN算法的核心是“延伸”,其需要确定两个参数:

  1. 近邻距离(Epsilon):一个点邻域的半径。

  1. 数据个数阈值(MinPts):邻域内至少需要包含数据点的个数。

根据以上两个参数,结合近邻特征,我们把样本点分成三类:

  1. 核心点(Core point):核心点在其近邻距离内的数据点个数不少于阈值。

  1. 边缘点(Border point):边缘点在其近邻距离内的数据点个数少于阈值,但其位于核心点的近邻距离内。

  1. 离群点(Outlier):离群点既不是核心点也不是边缘点。

DBSCAN的一般步骤是(在已知Epsilon和MinPts的前提下):

  1. 选择一个在其邻域内至少有MinPts的随机点,建立一个簇。

  1. 对核心点邻域内的各点进行判断,确定该点在其自己的邻域内是否有MinPts个数据点 (包括点本身)。如果该点满足标准,即为另一个核心点,将其加入本簇内,该簇得到扩展;否则,它为边缘点,同样将其加入本簇内。

  1. 当簇被边缘点包围时,这个聚类簇已经搜索完全。选择一个新的随机点,重复以上过程以识别下一个簇。

  1. 当所有簇均形成时,聚类结束。

4.2.3.算法实现

基于上述算法描述,我们给出实现DBSCAN的伪代码:

源自网络

4.2.4.背景

为实现“确定输入参数所需的相关知识最少、能够发现任意形状的聚类以及在大型数据库上具有高效性”的目标,Ester 等人在1996年最初提出DBSCAN 算法,该算法基于密度的聚类概念,旨在发现任意形状的聚类。DBSCAN只需要两个输入参数且支持用户为其确定适当的值。

DBSCAN 自发表后受到了学界的一致推崇,众多科学文献引用该算法,同时DBSCAN 算法也是 PreDeCon 和 SUBCLU 等聚类算法中的一部分。

之后,DBSCAN算法不断得到精进与提高。1998年,Sander 和 Ester 提出了适用性更加广泛的 GDBSCAN 算法;2007年,Birant 提出了用于时空数据处理的 ST-DBSCAN 算法;2010年,Kisilevich 等人提出了通过地理标记照片数据挖掘地点和事件的P-DBSCAN算法。

2014年的时候,DBSCAN 算法获得了2014 SIGKDD Test of Time Award。

4.2.5.应用过程

我们将DBSCAN算法应用到我们的葡萄酒异常检测中。首先,我们介绍代码中涉及到的自定义方法。

我们利用sklearn库中的datasets模块,定义loadDataSet方法。该方法可以导入txt格式的数据集,方便我们后续进行DBSCAN运算。

我们利用numpy库及欧氏距离的公式,定义方法dist,计算并返回两个点之间的欧式距离,该方法的参数为两个元组。

我们根据DBSCAN算法的思路及伪代码,定义dbscan方法,进行聚类,该方法的参数为数据集、指定的近邻距离及数据个数阈值。

在聚类过程中,我们借助列表unvisited和visited确定数据的访问情况,并依据数据对象的邻域数据点数与阈值的大小关系确定其为核心点、边缘点还是噪声点。

我们借助列表C记录各数据索引最终对应的簇索引值。对于未被聚类的数据,其簇标签为-1;否则,其簇标签为非负整数k。

我们利用欧氏距离公式,定义select_MinPts方法,获知数据集各点的k近邻距离,以便后续我们通过绘制k近邻有序距离图找到拐点位置,确定DBSCAN参数的粗略范围。

我们借助kneed库中的KneeLocator模块,定义knee_point_search方法检测拐点,获知合理的参数Epsilon和minPts,以达到满足实际需求的聚类效果。

在进行DBSCAN前,我们首先需要合理地确定两个参数的取值。通常情况下,我们绘制k近邻有序距离图,找出平滑曲线的拐点位置,对应的距离即为Epsilon的值;对应的数据个数+1即为MinPts的值。确定参数值的步骤如下:

首先,我们导入数据。以红葡萄酒数据集为例,我们使用loadDataSet函数导入只包含两个主成分属性的红酒数据集redForClustering.txt,借助select_MinPts方法获知数据集的k近邻距离列表,并按照距离大小从大到小排序。

通过绘制k近邻距离排序折线图,我们可以发现数据点的特性,进而了解参数的粗略范围。通过缩小折线图的数据范围,我们可以更加清晰地看到曲线上的数据点。

可以看出,数据集的拐点位置大致在([10-30],[10-15])间,但我们犹未可知拐点的具体坐标值,因而我们选择数学方法,通过计算得到拐点的精确坐标。

利用knee_point_search方法,我们发现红酒数据集存在拐点。

根据拐点坐标,我们选择合适的Epsilon和minPts作为DBSCAN算法的参数,并用indexList记录各簇数据点的索引值。

在此基础上,我们绘制散点图,用可视化的方法直观判断离群点。

可以看出,黄色的点形成的簇代表理化性质正常红葡萄酒,紫色的点则是我们本次异常检测的目标对象——理化性质不符合要求的劣质红葡萄酒及噪声点。

可以看出,右上角的紫色数据点为异常数据,左下角的紫色点数据为噪声数据,但其均属于我们要筛除的不符合要求的数据点,故在此不作另外区分。

我们将根据簇索引值打印劣质红葡萄酒的索引值列表,以便后续筛选分析。

同理,我们可以得到白葡萄酒数据集的相关信息。

其中,右下角的紫色数据点为异常数据,左上角的紫色点数据为噪声数据,但其同样均属于我们要筛除的不符合要求的数据点,也不作另外区分。

至此,我们通过基于聚类的方法DBSCAN实现了异常检测,找到了数据集中的离群点,挖掘出了不应流入市场的劣质的红、白葡萄酒。

4.2.6.结果分析

在利用DBSCAN进行异常检测的过程中,参数的选择是非常重要的。我们根据k近邻距离排序折线图,可以粗略地估计参数并绘制散点图观察聚类情况,但参数不合理的算法得到的聚类效果非常不理想。

由于数据集均源自同一类酒,其理化性质相对接近,数值本身不会存在大规模的极其明显的差异,因而在数据密集区域内出现多个簇的现象是不合理的。

我们通过计算拐点,得到最合适的参数后绘制出的散点图均只有若干代表“劣质葡萄酒”的离群点和代表“正常葡萄酒”的数据点形成的单一簇,比较符合数据本身的描述。

因而我们可知,本次异常检测得到的结果具有较高的可信度,是一次成功的异常检测。

4.3.未来挑战

异常检测面临着众多挑战,包括但不限于:

异常的定义问题:现实生活中的异常通常没有明确的定义,需要我们根据实际情况及应用需求进行合理定义。但复杂的现实因素使得我们很难挖掘并给出真正能够解决问题的异常定义。此外,我们也缺乏对异常的发生模式的合理定义。

异常的未知性:异常与许多未知因素有关,很多情况下它们直到真正发生时才为人所知,因而我们很难提前预知异常。例如,未知的突发行为、恐怖袭击、诈骗和网络入侵等。

异常的异构性:异常是不规则的,一类异常可能表现出与另一类异常完全不同的异常特征。例如,在视频监控中,抢劫、交通事故和盗窃等异常事件在视觉上有很大差异;

异常的类别不均衡:异常是小比例的数据实例,正常实例通常占数据的绝大部分。因此,收集大量具有标签的异常实例是困难甚至不可能的。这导致在大多数情况下,我们无法获得大规模的标记数据,异常检测的难度也会随之提高。

异常检测的性能要求:数据包含的噪音会严重影响异常检测的算法性能。此外,在时间序列的异常检测中,其数据通常是非平稳、非线性和动态演化的,随着时间序列长度的增加,异常检测的计算复杂度也在不断增长,对相关软、硬件的性能提出了很高的要求。

源代码及数据:https://github.com/YourHealer/DM-Wine-Quality-Analysis.git

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年11月30日
下一篇 2023年11月30日

相关推荐