Python深度学习:脑电图癫痫发作检测
问题陈述:深度学习算法在区分癫痫脑电图(EEG)波和非癫痫脑电波中的表现如何呢?
数据集: 癫痫发作识别数据集(https://archive.ics.uci.edu/ml/datasets/Epileptic+Seizure+Recognition)
该机器学习数据集是波恩大学癫痫数据集的预处理版本。它包括:
- 178个数据点的11,500个样本(178个数据点= 1秒的脑电图记录)
- 11,500个具有5个类别的目标:1个代表癫痫发作波形,而2-5代表非癫痫发作波形
将加载机器学习数据集。Python代码如下:
data = "/data/EEG/data.csv" import pandas as pd df = pd.read_csv(data, header=0, index_col=0)
我们来探索机器学习数据集
df.head()
有178个数据点(X1到X178),目标包含在data frame的“y”列中
df.info()
接下来,我们将目标变量转换为癫痫(y列编码为1)与非癫痫(2-5)
df["seizure"] = 0 for i in range(11500): if df["y"][i] == 1: df["seizure"][i] = 1 else: df["seizure"][i] = 0
让我们绘制并观察一些脑电波。Python代码如下:
import matplotlib.pyplot as plt # plotting an epileptic wave form plt.plot(range(178), df.iloc[11496,0:178]) plt.show()
癫痫波形
plt.plot(range(178), df.iloc[0,0:178]) plt.show()
非癫痫波形
仅仅通过观察波形是很难分辨的,让我们看看我们的神经网络是否能做得更好。
现在我们将把数据准备成神经网络可以接受的形式。我们将首先解析数据,然后标准化值,最后创建目标数组。Python代码实现如下:
# create df1 which only contains the waveform data points df1 = df.drop(["seizure", "y"], axis=1) # 1. parse the data import numpy as np wave = np.zeros((11500, 178)) for index, row in df1.iterrows(): wave[index,:] = row # print the wave.shape to make sure we parsed the data correctly print(wave.shape) > returned (11500, 178) # 2. standardize the data such that it has mean of 0 and standard deviation of 1 mean = wave.mean(axis=0) wave -= mean std = wave.std(axis=0) wave /= std # 3. create the target numpy array target = df["seizure"].values
我使用Keras构建了一个具有正则化和dropout的dense 网络,以减少过度拟合。Python代码如下:
from keras.models import Sequential from keras import layers from keras import regularizers model = Sequential() model.add(layers.Dense(64, activation="relu", kernel_regularizer=regularizers.l1(0.001), input_shape = (178,))) model.add(layers.Dropout(0.5)) model.add(layers.Dense(64, activation="relu", kernel_regularizer=regularizers.l1(0.001))) model.add(layers.Dropout(0.5)) model.add(layers.Dense(1, activation="sigmoid")) model.summary()
sklearn的train_test_split函数帮助我们创建训练和测试集。
from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(wave, target, test_size=0.2, random_state=42)
现在,让我们编译机器学习模型并训练它100个epochs。
model.compile(optimizer="rmsprop", loss="binary_crossentropy", metrics=["acc"]) history = model.fit(x_train, y_train, epochs=100, batch_size=128, validation_split=0.2, verbose=2)
经过100个epochs,我的验证准确率达到了96-97%左右
最后,我们将模型释放到测试集中,绘制ROC曲线,计算AUC。Python代码如下:
from sklearn.metrics import roc_curve, auc y_pred = model.predict(x_test).ravel() fpr_keras, tpr_keras, thresholds_keras = roc_curve(y_test, y_pred) AUC = auc(fpr_keras, tpr_keras) plt.plot(fpr_keras, tpr_keras, label='Keras Model(area = {:.3f})'.format(AUC)) plt.xlabel('False positive Rate') plt.ylabel('True positive Rate') plt.title('ROC curve') plt.legend(loc='best') plt.show()
这个非常简单的深度学习模型能够达到0.994的AUC。
可以进一步改善AUC:
- 超参数调整
- 使用不同的架构,例如1DConvnet
相关推荐
windhawkfly 2019-06-25