阿里天池又來了一個資料挖掘新人賽,是關于心跳信號分類的預測問題,主要針對初學者學習資料挖掘知識
比賽地址鏈接
這次資料比較有意思,和最常見的多屬性結構化資料不同,本次資料是心電圖資料記錄,所以用一下傳統的思維方法可能做出來效果并不好,但是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.模型方面可以嘗試神經網路,我嘗試了這次資料用傳統的樹模型或者傳統機器學習的模型進行訓練,但是感覺效果達不到預期,也可能是初步嘗試思路不對,但是模型方面還是可以嘗試神經網路,沒準效果非常好,
寫在最后
本人才疏學淺,有不正確或者理解錯誤的地方請指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271989.html
標籤:python
下一篇:SOLO代碼閱讀決議
