概述
数据挖掘之心电图心跳信号分类@TOC
数据来源:天池
https://tianchi.aliyun.com/competition/entrance/531883/introduction
- 赛题理解
目的:根据心电图感应数据预测心跳信号,
其中心跳信号对应正常病例以及受不同心律不齐和心肌梗塞影响的病例(4种),
问题:4分类,有监督学习
数据特征:
train:
id 为心跳信号分配的唯一标识
heartbeat_signals 心跳信号序列(数据之间采用“,”进行分隔)
标签:abel 心跳信号类别(0、1、2、3)
test:
id 心跳信号分配的唯一标识
heartbeat_signals 心跳信号序列(数据之间采用“,”进行分隔)
import pandas as pd
train=pd.read_csv('train.csv')
test=pd.read_csv('testA.csv')
数据预处理
数据分割
def split_data(data,predict=False):
data_=data.heartbeat_signals.str.split(',',expand=True)
data_.columns=['s_'+str(i) for i in range(data_.shape[1])]
data_=data_[['s_'+str(i) for i in range(data_.shape[1])]].astype(float)
data_['id']=data.id
data_.set_index('id')
if predict:
print(data_.shape)
data_.to_csv('test_.csv')
return data_
else:
data_['label']=data.label
data_.to_csv('test_.csv')
print(data_.shape)
return data_
train=split_data(train)
test=split_data(test,predict=True)
训练数据/测试数据准备
x_train=train.iloc[:,:-2]
y_train=train.iloc[:,-1]
x_test=test.iloc[:,:-1]
删除唯一值列
def delete_unique(data):
for i in data.columns:
if data[i].nunique()==1:
print(i)
data.drop(i,axis=1,inplace=True)
return data
train=delete_unique(train)# 无只有一个值的列
test=test[train.columns[:-1]]
查看缺失值
模型训练
评估指标 abs-sum
def abs_sum(y_pre,y_tru):
y_pre=np.array(y_pre)#此处为预测概率
y_tru=np.array(y_tru)
loss=sum(sum(abs(y_true-y_pr)))
2.2 交叉验证
def cv_model(clf,train_x,train_y,test_x,clf_name):
folds=5
seed=2021
kf=KFold(n_splits=folds,shuffle=True,random_state=seed)
test=np.zeros((test_x.shape[0],4))# n行4列的0矩阵,用于保存每个样本标签概率
cv_scores=[]
onehot_encoder=OneHotEncoder(sparse=False)
for i ,(train_index,valid_index) in enumerate(kf.split(train_x,train_y)):
print('************************************ {} ************************************'.format(str(i+1)))
trn_x,trn_y,val_x,val_y=train_x.iloc[train_index],train_y.iloc[train_index],train_x.iloc[valid_index],train_y.iloc[valid_index]
if clf_name=='lgb':
train_matrix=clf.Dataset(trn_x,label=trn_y)
valid_matrix=clf.Dataset(val_x,label=val_y)
params={
'boosting_type':'gbdt'
,'objective':'multiclass'
,'num_class':4
,'num_leaves':2**5
,'feature_fraction':0.8
,'bagging_fraction':0.8
,'bagging_freq':4
,'learning_rate':0.1
,'seed':seed
,'nthread':28
,'n_jobs':24
,'verbose':-1,
}
model=clf.train(params,train_set=train_matrix,valid_sets=valid_matrix
,num_boost_round=2000
,verbose_eval=100
,early_stopping_rounds=200)
val_pred=model.predict(val_x,num_iteration=model.best_iteration)
test_pred=model.predict(test_x,num_iteration=model.best_iteration)
val_y=np.array(val_y).reshape(-1,1)
val_y=onehot_encoder.fit_transform(val_y)
print('预测概率矩阵:')
print(test_pred.shape)
print(test_pred)
test+=test_pred
score=abs_sum(val_pred,val_y)
cv_scores.append(score)
print(cv_scores)
print("%s_scotrainre_list:" % clf_name, cv_scores)
print("%s_score_mean:" % clf_name, np.mean(cv_scores))
print("%s_score_std:" % clf_name, np.std(cv_scores))
test=test/kf.n_splits
return test
lightgbm
def lgb_model(x_train, y_train, x_test):
lgb_test = cv_model(lgb, x_train, y_train, x_test, "lgb")
return lgb_test
lgb=lgb_model(x_train,y_train,x_test)
结果
temp=pd.DataFrame(lgb)
result=pd.read_csv('sample_submit.csv')
result['label_0']=temp[0]
result['label_1']=temp[1]
result['label_2']=temp[2]
result['label_3']=temp[3]
result.to_csv('submit.csv',index=False)
最后
以上就是认真夏天为你收集整理的数据挖掘之心电图心跳信号分类数据预处理模型训练的全部内容,希望文章能够帮你解决数据挖掘之心电图心跳信号分类数据预处理模型训练所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复