本节将直接进入实战,以原始的脑电图时间序列数据为例,演示如何使用机器学习模型进行时间序列分类。 该脑电图数据集共有5个类别, - 睁眼和闭眼的健康人脑电图记录 - 癫痫患者在无癫痫发作期间的两个非癫痫相关区域脑电图记录 - 癫痫发作期间脑电图的颅内记录 本节将根据原始时间序列构造特征,再进行机器学习预测脑电图的分类。
Copy import matplotlib . pyplot as plt
from tsfresh import extract_features
import pandas as pd
import numpy as np
from sklearn . model_selection
import train_test_split from sklearn . ensemble
import RandomForestClassifier
import xgboost as xgb
Copy eeg = pd . read_csv ( 'data\eeg.csv' )
eeg . head ()
Copy # 观察不同类别的时间序列特征,为后面构造特征做准备
plt . subplot ( 3 , 1 , 1 )
plt . plot (eeg[eeg.id == 0 ][ 'times' ], eeg[eeg.id == 0 ][ 'measurements' ])
plt . legend (eeg.loc[ 0 , 'classes' ])
plt . subplot ( 3 , 1 , 2 )
plt . plot (eeg[eeg.id == 300 ][ 'times' ],eeg[eeg.id == 300 ][ 'measurements' ])
plt . legend (eeg.loc[ 300 * 4097 , 'classes' ])
plt . subplot ( 3 , 1 , 3 )
plt . plot (eeg[eeg.id == 450 ][ 'times' ],eeg[eeg.id == 450 ][ 'measurements' ])
plt . legend (eeg.loc[ 450 * 4097 , 'classes' ])
plt . tight_layout ()
将时间序列以可视化的形式画出可以为我们构造特征提供些许指导。 例如,从图表中发现,Z 类和 G 类的数据比 S 类曲折更少。此外,每个类都有相当不同的值域范围,数据点的分布似乎也有所不同。
Copy # 抽取特征,根据观察可视化人工选择了6个特征
fc_parameters = {
"skewness" : None ,
"ratio_beyond_r_sigma" : [ { "r" : 1 } ] ,
"maximum" : None ,
"minimum" : None ,
"mean_abs_change" : None ,
"longest_strike_above_mean" : None
}
data = extract_features(eeg, column_id = "id",column_sort = "times",column_value="measurements",chunksize=20, default_fc_parameters=fc_parameters)
# chunksize设置一个较小的值是为了防止电脑内存不足
Copy data . index . names = [ 'id' ]
data . reset_index ()
data = data . merge (eeg[[ 'id' , 'classes' ]]. drop_duplicates (), on = 'id' ,how = 'inner' )
本节将使用两种经典集成学习方法,随机森林和xgboost
Copy # 训练机器学习模型
X_train , X_test , y_train , y_test = train_test_split (data. drop ([ 'id' , 'classes' ], axis = 1 ), data[ "classes" ])
rf_clf = RandomForestClassifier ()
rf_clf . fit (X_train, y_train)
Copy # 模型评估
rf_clf . score (X_test, y_test)
使用默认参数随机森林算法的准确率是0.74
Copy # 使用XGBOOST模型
xgb_clf = xgb . XGBClassifier ()
xgb_clf . fit (X_train, y_train)
xgb_clf . score (X_test, y_test)
使用默认参数随机森林算法的准确率是0.72
通过上述流程,我们演示了如何在时间序列数据上使用基于机器学习的算法,这只是一个最基本的例子,如果想获得更为准备的模型,可以从特征构造和模型调参等角度进行进一步优化。