第三届Python数据分析职业技能比赛A题

第三届Python数据分析职业技能比赛A题

Hello World!

大家好!这里是一名练习时长两年半的大数据专业练习生,这一篇也是第一篇blog,来的实在是晚了些。平时没有记录的习惯,自然少了些分享的欲望。对于这次学校在期末举办的水友赛,由于种种原因没有呈交最后的论文,以至于在 “清灰” 时对这个文件夹里面的,几乎快无法辨认的代码感到非常惊讶。

回望那段被八篇结课论文追到美国人作息的生活,依然硬挤出来这份不那么完美的作品,相较于放假后我狂刷b站不理会老贾头的潇洒,着实显得可贵。

于是!我决定赶紧动一动我这刚勤劳一会就会僵硬滴小手,把完整的赛题、思路、代码放上来,供大家娱乐。

搜到这篇的小朋友们要继续加油哦 别怕,有我在~(气泡音

赛题

竞赛背景

心血管疾病 (CVD) 是全球第一大死因,估计每年夺走 1790 1790 1 7 9 0万人的生命,占全球所有死亡人数的 31 % 31\%3 1 %。五分之四的心血管疾病死亡是由心脏病发作和中风引起的,其中三分之一的死亡过早发生在 70 70 7 0 岁以下的人群中。心力衰竭是由 CVD 引起的常见事件,该数据集包含 11 11 1 1 个可用于分析可能的心脏病的特征。患有心血管疾病或处于高心血管风险(由于存在一种或多种风险因素,如高血压、糖尿病、高脂血症或已确诊的疾病)的人需要早期检测和管理。

字段说明

字段解释Age患者年龄性别患者的性别[M:男,F:女]ChestPainType胸痛类型 [TA:典型心绞痛,ATA:非典型心绞痛,NAP:非心绞痛,ASY:无症状]RestingBP静息血压 [mm Hg]Cholesterol血清胆固醇 [mg/dl]FastingBS空腹血糖 [1:如果 FastingBS > 120 mg/dl,0:其它]RestingECG静息心电图结果 [正常:正常,ST:有 ST-T 波异常(T 波倒置和/或 ST 抬高或压低 > 0.05 mV),LVH:根据埃斯蒂斯标准显示可能或明确的左心室肥大]MaxHR达到的最大心率 [60 到 202 之间的数值]ExerciseAngina运动诱发的心绞痛 [Y:是,N:否]Oldpeakoldpeak = ST [在抑郁症中测量的数值]ST_Slope运动 ST 段的坡度[Up:向上倾斜,Flat:平坦,Down:向下倾斜]HeartDisease输出类[1:心脏病,0:正常]

考核目标

  1. 数据的预处理;
  2. 数据的可视化;
  3. 分析可能导致心脏病的原因,并提出合理建议。

任务

根据所给的数据集“A 题.csv”提取码qwer, 完成以下任务:

任务一 数据预处理

  1. 将 CSV 文件的数据先按照 Age 进行排序,然后取出前100 条数据,并命名为”task1_1.csv”保存在结果文件夹中;
  2. 针对取出的前 100 条数据,统计出每个年龄的HeartDisease 为 1 的条数;
  3. 统计出患有心脏病的人群中,各类型 ChestPainType 所占的比例,并写成百分比的格式以及四舍五入保留两位小数

任务二 数据可视化

  1. 采用合适的可视化方法展示 HeartDisease 与 Age 之间的关系
  2. 采用合适的可视化方法展示对于 HeartDisease 取不同值,RestingBP 和 Cholesterol 的
    大小关系
  3. 采用合适的可视化方法展示 Sex 和 Cholesterol 对 HeartDisease 人数的影响

任务三 数据分析

  1. 选取适当的方法分析哪些指标的异常会导致心脏病
  2. 针对可能导致心脏病的指标,提出预防心脏病的合理建议

任务一思路

老三样,首先是一些基本的文件操作。

数据集共计12个变量,918个观测。为了方便用图形、表格展示处理结果,统计缺失值空值,绘制数据柱状图如下:

第三届Python数据分析职业技能比赛A题

可以看出数据完整;根据字段说明寻找异常值这一步同样没有操作空间。注意到大多数变量为字符型变量,如果在这里就直接数值化交一套描述性统计分析只能说是比较幽默的。所以属于是一整个明牌的状态给到,上代码 :

import pandas as pd
df = pd.read_csv('A题.csv')

df.sort_values(by='Age').head(100).to_csv('./result/task1_1.csv',encoding='utf_8_sig',index=False)

data = pd.read_csv('./result/task1_1.csv')
data1_2 = data.loc[data['HeartDisease']==1]
data1_2.shape[0]
data_group = data1_2.groupby('Age').agg({'HeartDisease':'sum'})

data1_3=df.loc[df['HeartDisease']==1]
data1_3.shape[0]
nums = data1_3.groupby('ChestPainType').size()/data1_3.shape[0]
nums.map(lambda x: format(x, '.2%'))

熟悉pandas模块处理起来速度不输Excel的超级透视表。你忘了groupby语句也没有关系,只要思想不滑坡,这里安利一个超超级好用的pandas语句生成工具:D-Tale,请使用jupyter nootbook以获得更佳的交互体验。

为了更好的展示结果,分别对1.2、1.3绘制条形图、环形图如下:

1.2

第三届Python数据分析职业技能比赛A题

该样本中以38岁心脏病患者最多…

; 1.3

第三届Python数据分析职业技能比赛A题

由于python自带的matplotlib模块画图稳定且一般…pyecharts提供了echarts图表接口,丰富的模板示例。需要注意0.版本和1.版本的pyecharts代码风格完全不一致,以python3.8为例,此处使用的就是pyecharts1.9.0版本。

pip install pyecharts==1.9.0

其中输入的数据的类型非常严格,以条形图x轴为例,必须由列表传入数据,且列表元素类型必须为字符串。

不同的图表携带的信息不相同,不同颜色所代表的信息也不同。比如环形图就较饼图有更好展示比例的效果;红色相较蓝色更显得?危险。因此对于任务二来说选取合适的图表很重要。

任务二思路

2.1

展示两个变量间的关系,散点图无疑是最好的选择。但对于 HeartDisease二值变量来说,散点往往会连成线。所以,此处使用红色表示HeartDisease=1,使用蓝色表示HeartDisease=0,重点研究患病人群,绘制堆叠条形图如下:

第三届Python数据分析职业技能比赛A题
好起来了,有点中心极限定理那味了吧。

; 2.2

然后2.2就有点那个法网恢恢但是咱们另辟蹊径逃之夭夭,咱也进行了一个头脑风暴,既然,二维已经不能满足需求,那就是一个论文中不常见也不推荐的3D散点图给到,毕竟这一个图可以进行三个维度的产出,理论上携带的信息会更多 (可以编的更多) :

第三届Python数据分析职业技能比赛A题

切记一切以论文输出为重点,选择自己熟悉,好说明的图形放在论文里,这里同样可以以HeartDisease为维数,绘制成两张散点图进行分析。切忌本末倒置。

2.3

最单纯,咱想看Sex和Cholesterol对HeartDisease人数的影响,趋势嘛,画多折线图:

第三届Python数据分析职业技能比赛A题

这…是啥也看不出来,反倒是奇怪的血清胆固醇含量(Cholesterol)增加了。别怕 有我在~ 这个时候反而走了一条弯路:注意到不同性别是否患病四个样本的规模并不一致,如果画在同一张图,数据量较少,不存在的血清胆固醇含量一律用None值替代的话,pyecharts可能就会画出原本并不存在的折线(平滑过渡效果的弊端),从而影响分析结果。以HeartDisease区分,当即绘制大聪明双条形图如下:

第三届Python数据分析职业技能比赛A题
第三届Python数据分析职业技能比赛A题

坏了,效果稍显一丢,但同样劝退吹水(震)…

这件事告诉我们无论如何画图效果都不好的情况下,请一定要找个中数据的原因。不要拘泥于字段说明,哪怕他什么都没说,时至今日也没有血清胆固醇为0,还活着的人!!! 但是作为一个平时对心脏病毫无研究的无辜大学生,就算去除了异常值,x轴的长度同样是令人费解的,以医学上的分段(高中低)来展示Cholesterol 对 HeartDisease 人数这个方面的影响,图形精简,同时会损失一部分信息…所以就需要尽可能的发挥大家的想象力啦~

; 任务三思路

3.1

题目有意思的是要选取合适的方法,好嘛,文字游戏。单纯建立模型去写个人感觉并不好彩,所以3.1依然先走可视化的路线:
来啊 一发变量关系图甩过去:

第三届Python数据分析职业技能比赛A题
似乎并不能发现什么很明显的关系…

接下来使用sklearn中LabelEncoder(),将标签变量数值化,并绘制各变量的密度曲线+直方图(这一步是做着玩的,可以更清楚的看到各个变量的分布情况)比如:

第三届Python数据分析职业技能比赛A题
第三届Python数据分析职业技能比赛A题

为了研究哪些指标的异常会导致心脏病,首先研究哪些指标和心脏病有关。针对心脏病患者,绘制不同变量下的折线图,通过患者人数判断何处为指标异常点,举栗:

第三届Python数据分析职业技能比赛A题
心脏病患者在抑郁症中测量的各个数值(Oldpeak)人数如图,可以看出-0.6到0.1之间的患者数量最多。

第三届Python数据分析职业技能比赛A题
心脏病患者运动 ST 段的各坡度(ST_Slope)人数如图,绝大多数人平时选择1,即平坦的路段进行运动,可以作为该项指标的异常…

; 3.2

为了减少后续小作文的压力,给建模方面一定的人文关怀,还是决定上个模型。这里选择了一个较为曲折、效果最差的老朋友:主成分!因为数据变量太多,变量可能存在一定的相关性,欲使其线性组合进行说明。

首先画一个相关系数热力图:

第三届Python数据分析职业技能比赛A题
很好,变量间的相关性并不高。但我们不知道为什么还是想用主成分,ok,不忘初心,手写一个基于方差阵提取主成分走起:

from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
ss = StandardScaler()
mm = MinMaxScaler()
data = ss.fit_transform(data.iloc[:,0:11])
data = mm.fit_transform(data)

data1 = np.matrix(data)
meanvals = np.mean(data1,axis=0)
meanremoved=data1-meanvals
covmat = np.cov(meanremoved.T)
eigvals,eigvects=np.linalg.eig(np.mat(covmat))
eigvects_lis = list(zip(eigvals,eigvects))
sortarray=np.sort(eigvals)
sortarray=sortarray[-1::-1]

arraysum=sum(eigvals)

arrayshare = []
for i in sortarray:
    arrayshare.append(i/arraysum)

percentage = 0.90
tempsum=0
k=0
for i in sortarray:
    tempsum+=i
    k+=1
    if tempsum>=arraysum*percentage:
        break
print('大到小排序的特征值:',sortarray)
print('各个特征值的贡献率:',arrayshare)
print('累计贡献率超过0.85的特征个数:',k)

eigvalind = sortarray[:k:1]
redeigvects = np.zeros(shape=(7,11))
for key,i in enumerate(eigvalind):
    for j in eigvects_lis:
        if i==j[0]:
            redeigvects[key] = np.array(j[1])

print('特征值:',eigvalind)
print('特征值对应的特征向量:',redeigvects)
print('综合评价模型权重:',arrayshare[0:k])

不出所料,吹水的同学还是得继续扛米,6个主成分的解释向来也是个想象力环节,至于综合评价模型也需要根据主成分的系数,也就是贡献率进一步说明…emm 这向来不是我的活,或许以后更新算法内容时再进一步说明, 此处便不做赘述。

总结

算是一个新手一般友好的题,数据量上并没有要求,着重可视化和论文能力。至于标签变量的处理相对有难度。不要局限于已有的模型,总归是有合适的,为什么不能是树状模型呢?

最后 大家可以去b站关注一下嘉然今天吃什么吗?

第三届Python数据分析职业技能比赛A题

Original: https://blog.csdn.net/longlongloveyou/article/details/122548970
Author: 理科生拯救世界i
Title: 第三届Python数据分析职业技能比赛A题



相关阅读

Title: SSD(Single Shot MultiBox Detector)原理详解

在这篇文章中,我将讨论用于目标检测任务的 Single Shot Multi-box Detector。 该算法属于一次性分类器系列,因此它的速度很快,非常适合嵌入到实时应用程序中。 SSD的关键特征之一是它能够预测不同大小的目标,并且为现在很多算法提供了基本的思路。 我们从讨论算法的网络架构开始这篇文章,然后我们将深入研究数据增强、锚框和损失函数。

模型架构

SSD 算法已经在各种预训练算法上进行了训练,如 ResNet50、ResNet101、ResNet152、MobileNet、EfficientNet 和 VGG16。 但在本文中,我们将讨论在 SSD [1] 的原始实现过程中使用的 VGG-16。

第三届Python数据分析职业技能比赛A题

VGG-16 被用作 SSD 算法的基础网络来提取图像的特征。 VGG-16 在SSD出现时是图像分类任务中最准确的模型,所以 SSD 中使用它时几乎没有进行修改。只是最上面几层做了优化:

  • pool5 从 2×2 (stride = 2) t改为 3×3 (stride = 1)
  • fc6 和 fc7被转换为卷积层并进行下采样
  • 在fc6中使用了Atrous 卷积
  • 删除了fc8 和所有的dropout

Atrous 卷积包含一个rate参数控制元素之间的膨胀空间。在可训练参数的数量保持不变的情况下提高了感受野。

在网络的最上面几层,添加了一堆卷积层来预测边界框。我们从每个卷积层预测边界框。这使 SSD 能够预测不同大小的目标。架构中较前的层预测的边界框有助于网络预测小目标,而架构中使用较后的层预测的边界框有助于网络预测大目标。中间层有助于预测中等大小的目标。现在我们对SSD的架构有了一个完整的了解。那么让我们继续了解什么是默认框?他们如何帮助算法?

; Anchor Boxes

注:Anchor Boxes这里我把它翻译成锚框。

锚框是用于帮助检测器预测默认边界框。与 YOLO 不同,在 SSD 中锚框的高度和宽度不是固定的,而是具有固定的纵横比。这是可以避免不同特征图的锚框大小相同的问题,因为随着特征图大小的变化,锚框的大小也会发生变化。这些纵横比用于根据其特征图缩放锚框,对于 conv4_3、conv10_2 和 conv11_2,我们只在每个特征图位置关联了 4 个默认框。对于所有其他层,我们有 6 个默认框(1、2、3、2/3、1/3)。特征图会被划分为网格,每个锚框被平铺到特征图中的每个网格上。在每个特征图网格和每个默认框中,我们预测相对于锚框中心的x和y偏移量、宽度和高度偏移量以及每个类别和背景的分数。因此,如果有k个检测器(锚框)和m x n个特征图和c个类别进行分类,那么我们预测每个网格和检测器的4个边界框参数和c+1个类别得分。因此,我们预测了一个特征图的kmn(c+1+4)值。在几个特征图中允许不同的默认框形状让我们有效地离散化可能的输出框形状的空间。

计算锚框尺寸的比例尺的方法是

第三届Python数据分析职业技能比赛A题

网络预测的 4 个值不直接用于在目标周围绘制边界框。 这 4 个值是偏移量,因此它们是与锚框大小一起用于预测边界框的残差值。 这有助于模型的稳定训练和更好的收敛。

第三届Python数据分析职业技能比赛A题

公式中的10和5值称为variance scale,是不可学习的超参数。

现在让我们看看最后输出是什么:

  • num 个类别的置信度分数 和 1 个背景类别。
  • 四个边界框属性:到匹配的默认框中心的x偏移量(cx),到匹配的默认框中心的y偏移量(cy),边界框宽度的对数尺度变换 (w) 和边界框高度的对数尺度变换 (h)。
  • 四个默认框值:默认框距图像左侧的中心 x 偏移、默认框距图像顶部的中心 y 偏移、默认框的宽度和默认框的高度。
  • 四个方差值:用于编码/解码边界框( Bounding-Box)的值。

匹配策略

本节我们将介绍如何为计算模型的损失解码真实的边界框。还有就是ssd 如何为其检测器做了一些特殊的操作。

上面的架构图中能够看到,SSD 为每个图像预测大约 8700 个框。但是一般图像中只有 6 个或更少的目标。所以我们是否应该在所有真实的边界框上惩罚所有预测框?如果我们这样做了那么将迫使每个检测器预测每个真实的边界框。检测器将尝试预测所有目标,最终预测则变成了它们之间某处的框。

为了避免这种情况,我们必须专门研究如何让我们的检测器一起工作,让他们成为一个团队而不是各自为战。为了实现这一点,我们将每个真实边界框与某个预测框匹配。该预测框负责预测特定的真实边界框,在反向传播时为该特定预测框添加了匹配的真实边界框的损失。

在这里将真实框与预测框匹配的策略称为匹配策略:我们首先将每个真实边界框与具有最高 jaccard 重叠的默认框匹配,将默认框与任何具有高于阈值的 jaccard 重叠的真实框匹配可以使许多预测框与特定的真实框相关联。上述过程是通过使用二分匹配算法实现的。这种策略有助于检测器专注于预测特定大小的目标。

Hard Negative Mining

由于框的数量很大, negative boxes(候选负样本集)的数量也很大。 这会造成正例数和负例数之间的不平衡。 负例增加的损失将是巨大的并且会覆盖掉正例的损失。 使得模型训练变得非常困难并且不会收敛。 因此按照最高置信度对负样本进行排序,然后以 1:3 的比例筛选正负样本, 这样更快和稳定的进行训练。 在 YOLO 中不使用这种方式,而是通过某种方法对负样本的损失进行加权,虽然方法不同但目的是相同的。

数据增强

对于Data Augmentation,每个训练图像随机选择以下的操作:

  • 使用原始图像。
  • 使与图像0.1,0.3,0.5,0.7或0.9的最小jaccard重叠,进行patch
  • 随机一个patch

还可以使用光学增强。在目标检测中,这种增强技术会影响原始图像的亮度和颜色,但不会对图像中物体周围的边框产生影响。我们可以使用许多方法来变换图像以实现这种增强。比如:随机亮度,随机对比度,随机色调,随机照明噪声,随机饱和度等等。

以上就是SSD算从输入到输出的前向传播的整个过程以及边界框的编码和解码过程,接下来介绍损失函数。

损失函数

损失函数由两部分组成,分类损失和回归损失。

第三届Python数据分析职业技能比赛A题

分类损失用于类别预测。SSD采用softmax 来预测类概率。所以我们使用的分类损失是交叉熵损失。有些算法使用sigmoid代替softmax。如果我们有重叠的类那么就需要使用sigmoid,因为softmax假设只有一个类可以分配给特定的对象。

第三届Python数据分析职业技能比赛A题

回归损失用于边界框坐标。使用平滑L1损失是因为它对异常值不那么敏感。

第三届Python数据分析职业技能比赛A题

此外,SSD 还将这两种损失与比例因子 alpha 结合在一起。对于匹配的正例框,SSD 计算分类和回归损失。 对于负框,它只计算分类损失并忽略回归损失。 在结果中还有有一些预测框既不是背景也没有高 IOU 需要匹配。 这种框被称为中性框(neutral boxes)。SSD 也会忽略这些框的损失。

; 总结

以上就是对SSD原理的完整介绍,这个算法虽然是2016年发布的,但是现在很多的最新的目标检测算法都能看到他的影子,所以深入的了解他的工作原理对于我们现在学习最新的目标检测技术还是有很大的帮助的。

引用

  1. SSD: Single Shot MultiBox Detector. https://arxiv.org/pdf/1512.02325.pdf
  2. VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION. https://arxiv.org/pdf/1409.1556.pdf
  3. Lukasz Janyst’s web site . https://jany.st/post/2017-11-05-single-shot-detector-ssd-from-scratch-in-tensorflow.html
  4. Implementing Single Shot Detector (SSD) in Keras: Part I — Network Structure. https://towardsdatascience.com/implementing-ssd-in-keras-part-i-network-structure-da3323f11cff
  5. Implementing Single Shot Detector (SSD) in Keras: Part II — Network Structure. https://towardsdatascience.com/implementing-single-shot-detector-ssd-in-keras-part-ii-loss-functions-4f43c292ad2a
  6. Implementing Single Shot Detector (SSD) in Keras: Part III — Network Structure. https://towardsdatascience.com/implementing-single-shot-detector-ssd-in-keras-part-iii-data-preparation-624ba37f5924
  7. Implementing Single Shot Detector (SSD) in Keras: Part I V— Network Structure. https://towardsdatascience.com/implementing-single-shot-detector-ssd-in-keras-part-iv-data-augmentation-59c9f230a910
  8. Implementing Single Shot Detector (SSD) in Keras: Part V— Network Structure. https://towardsdatascience.com/implementing-single-shot-detector-ssd-in-keras-part-v-predictions-decoding-2305a6e4c7a1
  9. Implementing Single Shot Detector (SSD) in Keras: Part VI — Network Structure. https://towardsdatascience.com/implementing-single-shot-detector-ssd-in-keras-part-vi-model-evaluation-c519852588d1

作者:Akshay Shah

Original: https://blog.csdn.net/m0_46510245/article/details/121762681
Author: deephub
Title: SSD(Single Shot MultiBox Detector)原理详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/250496/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总