一、前言
个人深度学习课程实验记录,最后修改于2023.5.25
比赛链接:https://tianchi.aliyun.com/competition/entrance/531883/
本代码最后排名:
二、题目要求
赛题背景
赛题以医疗数据挖掘为背景,要求选手使用提供的心跳信号传感器数据训练模型并完成不同心跳信号的分类的任务。
赛题数据
赛题以预测心电图心跳信号类别为任务,数据集数据来自某平台心电图数据记录,总数据量超过20万,主要为1列心跳信号序列数据,其中每个样本的信号序列采样频次一致,长度相等。从中抽取10万条作为训练集,2万条作为测试集A,2万条作为测试集B,同时会对心跳信号类别(label)信息进行脱敏。
字段表
评测要求
结果提交
三、主要涉及技术
reduce_mem_usage函数
该函数是使用pandas读取csv,减少读取内存的一个常见方法。主要目的是通过降低数据类型的精度来减小内存占用,同时保持数据的可用性。
# 这是用pandas读取csv,减少读取内存的一个常见方法
def reduce_mem_usage(df):
# 处理前 数据集总内存计算
start_mem = df.memory_usage().sum() / 1024**2
print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
# 遍历特征列
for col in df.columns:
# 当前特征类型
col_type = df[col].dtype
# 处理 numeric 型数据。numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
if col_type != object:
c_min = df[col].min()
c_max = df[col].max()
# int 型数据 精度转换
if str(col_type)[:3] == 'int':
if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
df[col] = df[col].astype(np.int8)
elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
df[col] = df[col].astype(np.int16)
elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
df[col] = df[col].astype(np.iZnt32)
elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
df[col] = df[col].astype(np.int64)
# float 型数据 精度转换
else:
if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
df[col] = df[col].astype(np.float16)
elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
df[col] = df[col].astype(np.float32)
else:
df[col] = df[col].astype(np.float64)
# 处理 object 型数据,即文本类如str。
else:
df[col] = df[col].astype('category')
# object 转 category。object类型(python中),category类型(pandas中特有)
# category实际上是动态枚举的一种形式。
# 如果某个字段的内容中,其可能值的范围是固定且有限的,则category类型数据最为适用
# 处理后 数据集总内存计算
end_mem = df.memory_usage().sum() / 1024**2
print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
print('Decreased by {:.1f}%'.format(
100 * (start_mem - end_mem) / start_mem))
return df
运行后效果:
SMOTE算法
SMOTE(Synthetic Minority Over-sampling Technique)是一种常用的数据不平衡问题处理算法,用于解决分类问题中的样本不平衡情况。在许多实际应用中,分类任务中的样本分布通常不平衡,即其中一个类别的样本数量明显少于其他类别。
SMOTE算法通过生成合成样本来增加少数类别的样本数量,从而平衡数据集。
主要思想:对于少数类别的每个样本,从其k个最近邻居中选择一个或多个样本,并在两个样本之间的特征空间中进行插值,生成新的合成样本。这样可以有效地增加少数类别的样本数量,使其更接近多数类别。
# 由于存在严重的类别不平衡问题。使用 SMOTE 对数据进行上采样以解决类别不平衡问题,提高精度。
# 但运算量大幅度增加,且容易导致过拟合
smote = SMOTE(random_state=2021, n_jobs=-1)
k_x_train, k_y_train = smote.fit_resample(x_train, y_train)
print(
f"after smote, k_x_train.shape: {
k_x_train.shape}, k_y_train.shape: {
k_y_train.shape}")
SMOTE算法主要步骤:
1、对于每个少数类别样本,计算其与其他样本之间的欧氏距离,并找出其k个最近邻居。
2、针对每个少数类别样本,从其k个最近邻居中随机选择一个或多个样本。
3、对于每个选中的最近邻居样本,计算其与原始样本的差值,乘以一个随机值(通常为0到1之间的随机数),并加到原始样本上,生成新的合成样本。
4、重复步骤2和步骤3,直到达到所需的样本增长比例。
SMOTE算法能够增加少数类别的样本数量,从而提高分类器在少数类别上的性能。它通常与其他分类算法(如决策树、逻辑回归、支持向量机等)结合使用,以改善对少数类别的分类准确性。
但SMOTE算法可能导致合成样本的过度生成,从而引入一定的噪音或过拟合风险。使用SMOTE算法时,需要谨慎选择合适的参数和合成样本生成策略,以避免不必要的问题。
四、LightGBM模型
LightGBM(Light Gradient Boosting Machine)是一种梯度提升框架,用于解决监督学习问题,适用于处理大规模数据集。它是由微软公司开发的一种基于梯度提升树的机器学习算法。
LightGBM 模型相比于传统的梯度提升树算法(如 XGBoost)具有更高的训练速度和更低的内存占用,这使得它适用于大规模数据集和资源受限的环境。此外,LightGBM 还提供了许多高级功能,如类别特征的自动处理、并行训练等,以提升模型的性能和效果。
LightGBM 模型的一般步骤
1、数据准备:将原始数据集划分为训练集和验证集,确保数据集的特征矩阵和目标向量正确准备。
2、参数设置:设置 LightGBM 模型的参数,包括树的深度、学习率、迭代次数、正则化参数等。这些参数会影响模型的性能和训练速度,需要根据具体问题进行调整。
3、创建 LightGBM 数据集:将准备好的训练集和验证集转换为 LightGBM 特定的数据集对象(例如 lgb.Dataset)以进行高效的训练和验证。
4、模型训练:使用准备好的训练集数据进行模型的训练。通过迭代的方式,逐步构建梯度提升树模型,每一轮迭代都会根据损失函数的梯度优化树的结构,使模型逐渐逼近目标。
5、模型验证:使用验证集数据评估训练好的模型在未见过的数据上的性能。可以计算各种指标(如准确率、精确率、召回率、F1 分数等)来衡量模型的效果。
6、参数调优:根据验证集的性能结果,调整模型的参数,例如增加迭代次数、调整学习率等,以提升模型的性能。
7、模型预测:使用训练好的模型对未知数据进行预测。可以使用模型的预测结果进行分类、回归或排序等任务。
模型定义代码
#单模型法,使用lightGBM模型进行分类。利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。