\quad \quad 2016年6月,国务院办公厅印发《国务院办公厅关于促进和规范健康医疗大数据应用发展的指导意见》,文件指出健康医疗大数据应用发展将带来健康医疗模式的深刻变化,有利于提升健康医疗服务效率和质量。
\quad \quad 赛题以心电图数据为背景,要求选手根据心电图感应数据预测心跳信号,其中心跳信号对应正常病例以及受不同心律不齐和心肌梗塞影响的病例,这是一个多分类的问题。
赛题链接
\quad \quad 比赛要求参赛选手根据给定的数据集,建立模型,预测不同的心跳信号。赛题以预测心电图心跳信号类别为任务,数据集报名后可见并可下载,该该数据来自某平台心电图数据记录,总数据量超过20万,主要为1列心跳信号序列数据,其中每个样本的信号序列采样频次一致,长度相等。为了保证比赛的公平性,将会从中抽取10万条作为训练集,2万条作为测试集A,2万条作为测试集B,同时会对心跳信号类别(label)信息进行脱敏。
\quad \quad 一般而言,对于数据在比赛界面都有对应的数据概况介绍(匿名特征除外),说明列的性质特征。了解列的性质会有助于我们对于数据的理解和后续分析。
train.csv
testA.csv
\quad \quad 选手需提交4种不同心跳信号预测的概率,选手提交结果与实际心跳类型结果进行对比,求预测的概率与真实值差值的绝对值(越小越好)。
具体计算公式如下:
针对某一个信号,若真实值为 [ y 1 , y 2 , y 3 , y 4 ] [y_1,y_2,y_3,y_4] [y1,y2,y3,y4]模型预测概率值为 [ a 1 , a 2 , a 3 , a 4 ] [a_1,a_2,a_3,a_4] [a1,a2,a3,a4],那么该模型的平均指标 a b s − s u m abs-sum abs−sum为
a b s − s u m = ∑ j = 1 n ∑ i = 1 4 ∣ y i − a i ∣ {abs-sum={\mathop{ \sum }\limits_{{j=1}}^{{n}}{{\mathop{ \sum }\limits_{{i=1}}^{{4}}{{ \left| {y\mathop{{}}\nolimits_{{i}}-a\mathop{{}}\nolimits_{{i}}} \right| }}}}}} abs−sum=j=1∑ni=1∑4∣yi−ai∣
例如,心跳信号为1,会通过编码转成 [ 0 , 1 , 0 , 0 ] [0,1,0,0] [0,1,0,0],预测不同心跳信号概率为 [ 0.1 , 0.7 , 0.1 , 0.1 ] [0.1,0.7,0.1,0.1] [0.1,0.7,0.1,0.1],那么这个预测结果的 a b s − s u m abs-sum abs−sum为
a b s − s u m = ∣ 0.1 − 0 ∣ + ∣ 0.7 − 1 ∣ + ∣ 0.1 − 0 ∣ + ∣ 0.1 − 0 ∣ = 0.6 {abs-sum={ \left| {0.1-0} \right| }+{ \left| {0.7-1} \right| }+{ \left| {0.1-0} \right| }+{ \left| {0.1-0} \right| }=0.6} abs−sum=∣0.1−0∣+∣0.7−1∣+∣0.1−0∣+∣0.1−0∣=0.6
\quad \quad 分类是机器学习中比较常见的任务,对于分类任务一般有二分类、多分类和多标签分类。
多分类
: 表示分类任务中有多个类别,但是对于每个样本有且仅有一个标签,例如一张动物图片,它只可能是猫,狗,虎等中的一种标签(二分类特指分类任务中只有两个类别)
多标签
:一个样本可以有多个标签 。例如文本分类中,一个文本可以是宗教相关,也可以是新闻相关,所以它就可以有两个标签。
\quad \quad 对于二分类问题,我们有很多评价指标,因为只有正类和负类两种,往往我们只关心正类的准确率和召回率。但是对于多分类问题,有些二分类的评价标准就不怎么适用了。
\quad \quad 评价多分类问题时,通常把多分类问题分解成多个2分类问题。即n分类,分解为n个2分类,每次以其中一个类为正类,其余类统一为负类,计算之前提到的各种2分类指标,最后再平均计算多分类评价指标,有三种平均方式。
1、分别计算第i类的Precision、Recall和F1-score(把第i类当作正类,其余所有类统一为负类):
记
F 1 i = 2 ∗ P i ∗ R i P i + R i F1_i=\frac{2*P_i*R_i}{P_i+R_i} F1i=Pi+Ri2∗Pi∗Ri
\quad \quad 分别计算第i类的Precision、Recall和F1-score(把第i类当作正类,其余所有类统一为负类),然后分别进行平均(假设总共有n个类):
1、宏精确率(macro-P)
\quad \quad 计算每个样本的精确率然后求平均值
m a c r o − P = 1 n ∑ 1 n p i {macro-P=\frac{{1}}{{n}}{\mathop{ \sum }\limits_{{1}}^{{n}}{p\mathop{{}}\nolimits_{{i}}}}} macro−P=n11∑npi
2、宏召回率(macro-R)
\quad \quad 计算每个样本的召回率然后求平均值 m a c r o − R = 1 n ∑ 1 n R i {macro-R=\frac{{1}}{{n}}{\mathop{ \sum }\limits_{{1}}^{{n}}{R\mathop{{}}\nolimits_{{i}}}}} macro−R=n11∑nRi
3、宏F1(macro-F1)
m a c r o − F 1 = 2 × m a c r o − P × m a c r o − R m a c r o − P + m a c r o − R {macro-F1=\frac{{2 \times macro-P \times macro-R}}{{macro-P+macro-R}}} macro−F1=macro−P+macro−R2×macro−P×macro−R
\quad \quad Micro 算法在计算 Precision 与 Recall 时会将所有类直接放到一起来计算。记TP、FP、TN、FN的平均值为 T P ‾ \overline{TP} TP 、 F P ‾ \overline{FP} FP 、 T N ‾ \overline{TN} TN 、 F N ‾ \overline{FN} FN
4、微精确率(micro-P)
m i c r o − P = T P ‾ T P ‾ × F P ‾ {micro-P=\frac{{\overline{TP}}}{{\overline{TP} \times \overline{FP}}}} micro−P=TP×FPTP
5、微召回率(micro-R)
m i c r o − R = T P ‾ T P ‾ × F N ‾ {micro-R=\frac{{\overline{TP}}}{{\overline{TP} \times \overline{FN}}}} micro−R=TP×FNTP
6、微F1(micro-F1)
m i c r o − F 1 = 2 × m i c r o − P × m i c r o − R m i c r o − P + m i c r o − R {micro-F1=\frac{{2 \times micro-P\times micro-R }}{{micro-P+micro-R}}} micro−F1=micro−P+micro−R2×micro−P×micro−R
其实,
micro- P = 1 n ∑ i T P i 1 n ∑ i T P i + 1 n ∑ i F P i = ∑ i T P i ∑ i T P i + ∑ i F P i \text{micro-}P = \frac{\frac{1}{n} \sum_i TP_i}{ \frac{1}{n} \sum_i TP_i + \frac{1}{n} \sum_i FP_i } = \frac{ \sum_i TP_i}{ \sum_i TP_i + \sum_i FP_i } micro-P=n1∑iTPi+n1∑iFPin1∑iTPi=∑iTPi+∑iFPi∑iTPi
而
micro- R = 1 n ∑ i T P i 1 n ∑ i T P i + 1 n ∑ i F N i = ∑ i T P i ∑ i T P i + ∑ i F N i = A c c u r a c y \text{micro-}R =\frac{\frac{1}{n} \sum_i TP_i}{ \frac{1}{n} \sum_i TP_i + \frac{1}{n} \sum_i FN_i } = \frac{ \sum_i TP_i}{ \sum_i TP_i + \sum_i FN_i } = Accuracy micro-R=n1∑iTPi+n1∑iFNin1∑iTPi=∑iTPi+∑iFNi∑iTPi=Accuracy
因为在某一类中的False Positive样本,一定是其他某类别的False Negative样本,所以 m i c r o − P = m i c r o − R micro- P = micro- R micro−P=micro−R
且
micro- F 1 = micro- P = micro- R = A c c u r a c y 。 \text{micro-}F_1 = \text{micro-}P = \text{micro-}R = Accuracy。 micro-F1=micro-P=micro-R=Accuracy。
以后看到Accuracy指标也就知道是指微F1指标。
Macro vs. Micro
\quad \quad Macro 相对 Micro 而言,小类别起到的作用更大,小类别相当程度上拉高了 Precision 的值。而对于 Micro 来说,其考虑到了这种样本不均衡的问题, 因此在这种情况下相对较佳。
\quad \quad 总的来说, 如果你的类别比较均衡,则随便; 如果你认为大样本的类别应该占据更重要的位置, 使用Micro; 如果你认为小样本也应该占据重要的位置,则使用 Macro; 如果 Micro << Macro , 则意味着在大样本类别(样本数比较多的类)中出现了严重的分类错误; 如果 Macro << Micro , 则意味着小样本类别中出现了严重的分类错误。
\quad \quad 为了解决 Macro 无法衡量样本均衡问题,一个很好的方法是求加权的 Macro, 因此 Weighed F1 出现了。
\quad \quad Weighted 算法是 Macro 算法的改良版,是为了解决Macro中没有考虑样本不均衡的原因, 在计算 Precision与Recall 时候,各个类别的 Precision 与 Recall要乘以该类在总样本中的占比来求和:
w e i g h t − P = 1 n ∑ 1 n p i ∗ w i {weight-P=\frac{{1}}{{n}}{\mathop{ \sum }\limits_{{1}}^{{n}}{p\mathop{{}}\nolimits_{{i}}*w_i}}} weight−P=n11∑npi∗wi
m a c r o − R = 1 n ∑ 1 n R i ∗ w i {macro-R=\frac{{1}}{{n}}{\mathop{ \sum }\limits_{{1}}^{{n}}{R\mathop{{}}\nolimits_{{i}}*w_i}}} macro−R=n11∑nRi∗wi
M a c r o − w e i g h t e d − F 1 = 2 × w e i g h t − P × w e i g h t − R w e i g h t − P + w e i g h t − R {Macro -weighted-F1=\frac{{2 \times weight-P \times weight-R}}{{weight-P+weight-R}}} Macro−weighted−F1=weight−P+weight−R2×weight−P×weight−R
from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.metrics import f1_score
y_true = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,5,5,6,6,6,0,0,0,0] #真实值
y_pred = [1, 1, 1, 3, 3, 2, 2, 3, 3, 3, 4, 3, 4, 3,5,1,3,6,6,1,1,0,6] #预测值
#计算准确率
print("accuracy:", accuracy_score(y_true, y_pred))
#计算精确率
#计算macro_precision
print("macro_precision", precision_score(y_true, y_pred, average='macro'))
#计算micro_precision
print("micro_precision", precision_score(y_true, y_pred, average='micro'))
#计算召回率
#计算macro_recall
print("macro_recall", recall_score(y_true, y_pred, average='macro'))
#计算micro_recall
print("micro_recall", recall_score(y_true, y_pred, average='micro'))
#计算F1
#计算macro_f1
print("macro_f1", f1_score(y_true, y_pred, average='macro'))
#计算micro_f1
print("micro_f1", f1_score(y_true, y_pred, average='micro'))
#计算weight_f1
print("weighted_f1",f1_score(y_true,y_pred,average='weighted'))
accuracy: 0.5217391304347826
macro_precision 0.7023809523809524
micro_precision 0.5217391304347826
macro_recall 0.5261904761904762
micro_recall 0.5217391304347826
macro_f1 0.5441558441558441
micro_f1 0.5217391304347826
weighted_f1 0.5399209486166009
比较常用的多分类评价准则进行整理
\quad \quad kappa系数是用在统计学中评估一致性的一种方法,取值范围是[-1,1],实际应用中,一般是[0,1],与ROC曲线中一般不会出现下凸形曲线的原理类似。这个系数的值越高,则代表模型实现的分类准确度越高。
定义:
K = P 0 − P e 1 − P e K=\frac{P_0-P_e}{1-P_e} K=1−PeP0−Pe
from sklearn.metrics import cohen_kappa_score
kappa = cohen_kappa_score(y_true,y_pred,label=None) #(label除非是你想计算其中的分类子集的kappa系数,否则不需要设置)
\quad \quad 海明距离也适用于多分类的问题,简单来说就是衡量预测标签与真实标签之间的距离,取值在0~1之间。距离为0说明预测结果与真实结果完全相同,距离为1就说明模型与我们想要的结果完全就是背道而驰。
from sklearn.metrics import hamming_loss
ham_distance = hamming_loss(y_true,y_pred)
\quad \quad 它与海明距离的不同之处在于分母。当预测结果与实际情况完全相符时,系数为1;当预测结果与实际情况完全不符时,系数为0;当预测结果是实际情况的真子集或真超集时,距离介于0到1之间。
\quad \quad 我们可以通过对所有样本的预测情况求平均得到算法在测试集上的总体表现情况。
from sklearn.metrics import jaccard_similarity_score
jaccrd_score = jaccrd_similarity_score(y_true,y_pred,normalize = default)
#normalize默认为true,这是计算的是多个类别的相似系数的平均值,normalize = false时分别计算各个类别的相似系数
\quad \quad 铰链损失(Hinge loss)一般用来使“边缘最大化”(maximal margin)。损失取值在0~1之间,当取值为0,表示多分类模型分类完全准确,取值为1表明完全不起作用。
from sklearn.metrics import hinge_loss
hinger = hinger_loss(y_true,y_pred)