阿里天池心跳信号分类预测baseline

阿里天池又来了一个数据挖掘新人赛,是关于心跳信号分类的预测问题,主要针对初学者学习数据挖掘知识
比赛地址链接

这次数据比较有意思,和最常见的多属性结构化数据不同,本次数据是心电图数据记录,所以用一下传统的思维方法可能做出来效果并不好,但是baseline还是采用传统的方法做的,仅仅只是实现做出结果的步骤,没有优化方法,最后会提到几个优化的思路。

baseline代码如下:

import pandas as pd
import numpy as np
from lightgbm import LGBMClassifier
from sklearn.model_selection import StratifiedKFold, KFold
from sklearn.preprocessing import OneHotEncoder

train = pd.read_csv('train_xt.csv')
test=pd.read_csv('testA_xt.csv')
for data in [train,test]:   
    data1 = data["heartbeat_signals"].str.split(",", expand=True)
    for i in data1.columns:
        data[i] = data1[i].astype("float64")

train_x = train.drop(['id','label','heartbeat_signals'], axis=1)
target = train['label']
test1=test.drop(['id','heartbeat_signals'], axis=1)

def abs_sum(y_pre,y_tru):
    loss=sum(sum(abs(y_pre-y_tru)))
    return loss

clf = LGBMClassifier(
    learning_rate=0.1,#0.05
    n_estimators=10230,
    num_leaves=31,
    max_depth=7,
    subsample=0.8,
    colsample_bytree=0.8, 
    metric=None,
    objective='multiclass'
)
answers = []
mean_score = 0
onehot_encoder = OneHotEncoder(sparse=False)
sk = StratifiedKFold(n_splits=10, shuffle=True, random_state=2019)
for train, testA in sk.split(train_x, target):
    x_train = train_x.iloc[train]
    y_train = target.iloc[train]
    x_test = train_x.iloc[testA]
    y_test = target.iloc[testA]
    
    clf.fit(x_train,y_train,eval_set=[(x_test, y_test)],verbose=100, 
                      early_stopping_rounds=100)
    y_pre=clf.predict(x_test)
    y_test=np.array(y_test).reshape(-1, 1)
    y_test = onehot_encoder.fit_transform(y_test)
    
    y_pre=np.array(y_pre).reshape(-1, 1)
    y_pre = onehot_encoder.fit_transform(y_pre)
    
    print('lgb验证的auc:{}'.format(abs_sum(y_test, y_pre)))
    mean_score += abs_sum(y_test, y_pre) / 10
    y_pred_valid = clf.predict_proba(test1)
    answers.append(y_pred_valid)
print('mean valAuc:{}'.format(mean_score))
lgb_pre=sum(answers)/10
re=pd.DataFrame(lgb_pre)
result=pd.read_csv('sample_submit.csv')
result['label_0']=re[0]
result['label_1']=re[1]
result['label_2']=re[2]
result['label_3']=re[3]
result.to_csv('submit.csv',index=False)

上面代码只是将heartbeat_signals列中所有心跳信号数据记录分别单独提取出来了,然后将其放入模型中进行训练,也没有加额外的特征,也没有进行其他处理,全部是原始数据。

优化思路
1.可以将其转化为时序问题,因为心跳信号记录是根据时间进行变化的,所以可以对每个记录都添加时间序列,可能会有意想不到的效果。

2.根据信号值可以计算信号的变化率,心跳类别肯定和心跳信号的变化率有关系,或者是信号的统计特征也可以尝试加入训练。

3.模型方面可以尝试神经网络,我尝试了这次数据用传统的树模型或者传统机器学习的模型进行训练,但是感觉效果达不到预期,也可能是初步尝试思路不对,但是模型方面还是可以尝试神经网络,没准效果非常好。

写在最后

本人才疏学浅,有不正确或者理解错误的地方请指正!

你可能感兴趣的:(Python,数据挖掘,机器学习,数据挖掘,机器学习,python)