心电图信号多分类预测挑战赛-Task1 baseline学习笔记
[1] 本文参考datawhale3月组队学习.team-learning-data-mining/HeartbeatClassification
1.赛题概况
比赛地址:天池心跳信号分类预测
比赛要求选手根据给定的数据集,建立模型,预测不同的心跳信号。赛题以预测心电图心跳信号类别为任务,数据来自某平台心电图数据记录,总数据量超过20万,主要为1列心跳信号序列数据,其中每个样本的信号序列采样频次一致,长度相等。为了保证比赛的公平性,将会从中抽取10万条作为训练集,2万条作为测试集A,2万条作为测试集B,同时会对心跳信号类别(label)信息进行脱敏。
1.1 数据概况
train.csv
- id 为心跳信号分配的唯一标识
- heartbeat_signals 心跳信号序列(数据之间采用“,”进行分隔)
- label 心跳信号类别(0、1、2、3)
testA.csv
- id 心跳信号分配的唯一标识
- heartbeat_signals 心跳信号序列(数据之间采用“,”进行分隔)
1.2 预测指标
选手需提交4种不同心跳信号预测的概率,选手提交结果与实际心跳类型结果进行对比,求预测的概率与真实值差值的绝对值(abs-sum)。
真实值:
y
t
r
u
e
=
[
y
1
,
y
2
,
y
3
,
y
4
]
y_{true} = [y_1, y_2, y_3, y_4]
ytrue=[y1,y2,y3,y4], 预测值:
y
p
r
e
d
=
[
a
1
,
a
2
,
a
3
,
a
4
]
y_{pred} = [a_1, a_2, a_3, a_4]
ypred=[a1,a2,a3,a4],
a
b
s
−
s
u
m
=
∑
j
=
1
n
∑
i
=
1
4
∣
y
i
−
a
i
∣
abs - sum = \sum_{j=1}^n\sum_{i=1}^4 |y_i - a_i|
abs−sum=j=1∑ni=1∑4∣yi−ai∣
1.3 多分类算法常见评估指标
1.3.1 混淆矩阵 Confuse Matrix
实际\预测 | + | - |
---|---|---|
+ | TP | FN |
- | FP | TN |
1.3.2 准确率 Accuracy
代表整体 预测准确程度,包括正负样本。不适合样本不均衡情况,医疗大数据大部分都是样本不均衡数据。
A
c
c
u
r
a
c
y
=
C
o
r
r
e
c
t
T
o
t
a
l
=
T
P
+
T
N
T
P
+
T
N
+
F
P
+
F
N
Accuracy = \frac{Correct}{Total} = \frac{TP+TN}{TP+TN+FP+FN}
Accuracy=TotalCorrect=TP+TN+FP+FNTP+TN
1.3.3 精确率 P
代表所有被预测为正的样本中实际为正样本的概率。代表预测的正样本结果中的准测准确程度。
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
Precision = \frac{TP}{TP+FP}
Precision=TP+FPTP
1.3.4 召回率 R
实际为正的样本中被预测为正样本的概率。
R
e
c
a
l
l
=
T
P
T
P
+
F
N
Recall = \frac{TP}{TP+FN}
Recall=TP+FNTP
1.3.5 F1
F 1 = 2 ∗ P ∗ R P + R F1 = \frac{2*P*R}{P+R} F1=P+R2∗P∗R
1.3.6 其它
macro: 先求每个样本的P/R/F1,然后求平均值。
micro: 先将confuse matrix 的TP,FP,TN,FN对应位置求平均,然后求P/R/F1。
1.4 赛题分析
- 典型多分类问题, 4个类别。
- 应用 xgb、lgb、catboost模型。
2. baseline
流程:
-
导入第三方库:lightgbm, xgboost, catboost, sklearn
-
读取数据:.head(), .descirbe(), .info()
-
数据预处理:
- 定义减少使用内存函数reduce_mem_usage:根据每列数据最大,最小值确定数字精度,保存格式。np.int8/16/32/64及np.float16/32/64; object类保存为’category’。
- for loop + append,连接train数据每行id, 心跳信号序列,label,生成train_list;同理连接test数据每行id, 心跳信号序列,生成test_list。
- 将两列表变为pd.DataFrame, 并对列命名:id,s_1, …, s_n, (label)。
-
准备训练/测试数据: 将train数据分为输入(去掉id和label列), 输出(‘label’), test数据去掉id为test输入。
-
训练模型:
- 定义abs_sum指标函数
- 交叉验证:kf = kFold(n_splits, shuffle, random_state),这里nsplits=5(运行5批), shuffle=True(每次划分批次前打乱顺序),并定义seed,保证随机过程的结果可复现。
用kf.split(train_x, train_y)将数据划分为train dataset 和 validation datatset. - 使用lgb(boosting)分类器并定义超参数
- lgb.train函数
- train: early_stopping_rounds=200:训练到valid 分数200轮均无提高则停止。
- model.predict() 得到val_pred和test_pred.
- 将val_y标签变为单热向量(每个样本的四个概率仅有1个为1,其余为0)。
- 用预定义的abs_sum函数评分。val_y和valid_pred计算每个batch得分,取k次平均值作为最后模型分数。
- 最后得到k次预测概率矩阵test_pred的平均值作为test预测结果。
-
预测结果:使用lgb分类器,将生成test数据集预测结果按照官方提供格式’sample_submit.csv’保存成csv文件。
3. 提交成绩
之后进行EDA, 调参及模型融合。