Python深度学习:脑电图癫痫发作检测

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)

Python深度学习:脑电图癫痫发作检测

我们来探索机器学习数据集

df.head()

Python深度学习:脑电图癫痫发作检测

有178个数据点(X1到X178),目标包含在data frame的“y”列中

df.info()

Python深度学习:脑电图癫痫发作检测

接下来,我们将目标变量转换为癫痫(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深度学习:脑电图癫痫发作检测

让我们绘制并观察一些脑电波。Python代码如下:

import matplotlib.pyplot as plt
# plotting an epileptic wave form 
plt.plot(range(178), df.iloc[11496,0:178])
plt.show()

Python深度学习:脑电图癫痫发作检测

Python深度学习:脑电图癫痫发作检测

癫痫波形

plt.plot(range(178), df.iloc[0,0:178])
plt.show()

Python深度学习:脑电图癫痫发作检测

Python深度学习:脑电图癫痫发作检测

非癫痫波形

仅仅通过观察波形是很难分辨的,让我们看看我们的神经网络是否能做得更好。

现在我们将把数据准备成神经网络可以接受的形式。我们将首先解析数据,然后标准化值,最后创建目标数组。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

Python深度学习:脑电图癫痫发作检测

我使用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()

Python深度学习:脑电图癫痫发作检测

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)

Python深度学习:脑电图癫痫发作检测

现在,让我们编译机器学习模型并训练它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)

Python深度学习:脑电图癫痫发作检测

经过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()

Python深度学习:脑电图癫痫发作检测

Python深度学习:脑电图癫痫发作检测

这个非常简单的深度学习模型能够达到0.994的AUC。

可以进一步改善AUC:

  • 超参数调整
  • 使用不同的架构,例如1DConvnet