{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from google.colab import files\n\nuploaded = files.upload()\n\nfor fn in uploaded.keys():\n  print('User uploaded file \"{name}\" with length {length} bytes'.format(\n      name=fn, length=len(uploaded[fn])))\n  \n# Then move kaggle.json into the folder where the API expects to find it.\n!mkdir -p ~/.kaggle/ && mv kaggle.json ~/.kaggle/ && chmod 600 ~/.kaggle/kaggle.json","metadata":{"id":"ZmRLqdvLy8Oe","outputId":"eea71a0d-025c-466d-fd96-6c04f8471962"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!kaggle competitions download -c grasp-and-lift-eeg-detection","metadata":{"id":"uEpdhp9dzBul","outputId":"26c175ee-42d3-463f-e128-b2f42183726a"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip grasp-and-lift-eeg-detection","metadata":{"id":"z5TLid7xR0NG","outputId":"fa35ee74-2f87-4a32-ef44-44edd91ebd11"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip /content/test\n!unzip /content/train","metadata":{"id":"wf-sH_12zESm","outputId":"8f2d10dd-efd9-47f1-b149-f349cb6762b7"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom sklearn.linear_model import LogisticRegression\nfrom glob import glob\nimport scipy\nfrom scipy.signal import butter, lfilter, convolve, boxcar\nfrom scipy.signal import freqz\nfrom scipy.fftpack import fft, ifft\nimport os\n\nfrom sklearn.preprocessing import StandardScaler","metadata":{"id":"k9HC5r9RWDeZ"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_set_labels = pd.read_csv(\"../content/train/subj1_series1_events.csv\")\ntrain_set_signals = pd.read_csv(\"../content/train/subj1_series1_data.csv\")\ntrain_set_signals.head()\naxis = plt.gca()\ndownSampleToShow = 500\ntrain_set_signals[::downSampleToShow].plot(x=\"id\", y=\"Fp1\", ax=axis)\ntrain_set_signals[::downSampleToShow].plot(x=\"id\", y=\"PO10\", ax=axis, figsize=(15,5))\ntrain_set_labels[::downSampleToShow].plot(figsize=(15,5))\nplt.show()","metadata":{"id":"Unho2eo2WA0j","outputId":"6f028550-db15-444c-a425-97d793a58514"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"eeg_channels = train_set_signals.columns.drop('id')\nlabels = train_set_labels.columns.drop('id')\ntrain_set_complete = pd.concat([train_set_signals,train_set_labels], axis=1)\ntrain_set_complete.insert(0, \"order\", range(0, len(train_set_complete)))\ntrain_set_complete.head()\ndef highlight(indices,ax,color):\n    i=0\n    while i<len(indices):\n        ax.axvspan(indices[i]-0.5, indices[i]+0.5, facecolor=color, edgecolor='none', alpha=.35)\n        i+=1\nsecondsToShow = 8\nchannelsToShow = 3\nlabelsToShow = 6\n\nsample_set = train_set_complete[train_set_complete[\"order\"] < secondsToShow*500].drop(\"id\", axis=1).set_index(\"order\") #sample rate is 500hz \ncolors=[\"red\",\"purple\",\"black\",\"green\", \"yellow\", \"blue\"]\naxes = sample_set.plot(y=eeg_channels[:channelsToShow],subplots=True, figsize=(15,10))\nfor i in range(0, len(labels)):\n    print(labels[i], \"=\", colors[i])\n    \nfor axis in axes:    \n    colorindex = 0\n    for label in labels[:labelsToShow]:\n        highlight(sample_set[sample_set[label]==1].index, axis, colors[colorindex])        \n        colorindex = colorindex + 1\nplt.show()","metadata":{"id":"6pyGfy7oWFTH","outputId":"4b77b69a-3cba-4083-e70d-989ef651ee01"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_set_complete","metadata":{"id":"dXavvO3YRk09","outputId":"ffd7d29c-c047-4978-8379-9a4e2af18d02"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nsub1_events_file = 'train/subj1_series1_events.csv'\nsub1_data_file = 'train/subj1_series1_data.csv'\n\nsub1_events = pd.read_csv(sub1_events_file)\nsub1_data = pd.read_csv(sub1_data_file)\n\nsub1 = pd.concat([sub1_events, sub1_data], axis = 1)\nsub1[\"time\"] = range(0, len(sub1))\n\nsample_sub1 = sub1[sub1[\"time\"] < 5000]\n\nevent = \"HandStart\"\nevent1 = \"FirstDigitTouch\"\nEventColors = [\"lightgrey\", \"green\",\"blue\"]\n\nplot_columns = [\"O1\", \"O2\", \"C3\", \"C4\"]\n\nfig, axes = plt.subplots(nrows=len(plot_columns), ncols=1)\nfig.suptitle(event)\nfor (i, y) in enumerate(plot_columns):\n    # Plot all the columns\n    sample_sub1.plot(kind=\"scatter\", x=\"time\", y=y, edgecolors='none', ax=axes[i], figsize=(10,8), c=sample_sub1[event].apply(EventColors.__getitem__))","metadata":{"id":"Dn4GgwyiWHtj","outputId":"c255b242-1a1b-4acc-a218-12e38e72466a"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom scipy.signal import butter, lfilter\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA\nfrom sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis as QDA\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.ensemble import RandomForestClassifier","metadata":{"id":"BMOYlNzXyeDN"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n#############function to read data###########\nFNAME = \"../content/{0}/subj{1}_series{2}_{3}.csv\"\ndef load_data(subj, series=range(1,9), prefix = 'train'):\n    data = [pd.read_csv(FNAME.format(prefix,subject,s,'data'), index_col=0) for s in series]\n    idx = [d.index for d in data]\n    data = [d.values.astype(float) for d in data]\n    if prefix == 'train':\n        events = [pd.read_csv(FNAME.format(prefix,subject,s,'events'), index_col=0).values for s in series]\n        return data, events\n    else:\n        return data, idx\n\ndef compute_features(X, scale=None):\n    X0 = [x[:,0] for x in X]\n    X = np.concatenate(X, axis=0)\n    F = [];\n    for fc in np.linspace(0,1,11)[1:]:\n        b,a = butter(3,fc/250.0,btype='lowpass')\n        F.append(np.concatenate([lfilter(b,a,x0) for x0 in X0], axis=0)[:,np.newaxis])\n    F = np.concatenate(F, axis=1)\n    F = np.concatenate((X,F,F**2), axis=1)\n        \n    if scale is None:    \n        scale = StandardScaler()\n        F = scale.fit_transform(F)\n        return F, scale\n    else:\n        F = scale.transform(F)\n        return F\n\n\n#%%########### Initialize ####################################################\ncols = ['HandStart','FirstDigitTouch',\n        'BothStartLoadPhase','LiftOff',\n        'Replace','BothReleased']\n\nsubjects = range(5,9)\nidx_tot = []\nscores_tot = []\n\n###loop on subjects and 8 series for train data + 2 series for test data\n","metadata":{"id":"E9tDzw5VyafE"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for subject in subjects:\n\n    X_train, y = load_data(subject,[1,2,3,4,5,6])\n    X_test, idx = load_data(subject,[7,8])\n\n    ################ Train classifiers ###########################################\n    lda = LDA()\n    rf = RandomForestClassifier(n_estimators=150, n_jobs=-1, criterion=\"entropy\", random_state=1)\n    lr = LogisticRegression(max_iter=1000)\n\n    X_train, scaler = compute_features(X_train)\n    X_test = compute_features(X_test, scaler)   #pass the learned mean and std to normalized test data\n\n    y = np.concatenate(y,axis=0)\n    scores = np.empty((X_test.shape[0],6))\n\n    downsample = 50\n    for i in range(6):\n        print('Train subject %d, class %s' % (subject, cols[i]))\n        rf.fit(X_train[::downsample,:], y[::downsample,i])\n        lda.fit(X_train[::downsample,:], y[::downsample,i])\n        lr.fit(X_train[::downsample,:], y[::downsample,i])\n        \n        scores[:,i] = ((rf.predict_proba(X_test)[:,1]**0.85)*0.33 + \n                        (lda.predict_proba(X_test)[:,1]**0.95)*0.34 + \n                        (lr.predict_proba(X_test)[:,1]**0.85)*0.33)\n\n    scores_tot.append(scores)\n    idx_tot.append(np.concatenate(idx))\n    \n# #%%########### submission file ################################################\n# submission_file = 'Submission.csv'\n# # create pandas object for submission\n# submission = pd.DataFrame(index=np.concatenate(idx_tot),\n#                           columns=cols,\n#                           data=np.concatenate(scores_tot))\n\n# # write file\n# submission.to_csv(submission_file,index_label='id',float_format='%.3f')","metadata":{"id":"s050mUEv1KE5","outputId":"d0996e28-8c0a-4eae-c753-8730c21adb47"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from glob import glob\n\ndef prepare_data_test(fname):\n    \"\"\" read and prepare test data \"\"\"\n    # Read data\n    data = pd.read_csv(fname)\n    return data\n\nfor subject in subjects:\n    fnames =  glob('../content/train/subj%d_series[78]_events.csv' % (subject))\n    actual = []\n    idx=[]\n    ids_tot=[]\n    for fname in fnames:\n      data=prepare_data_test(fname)\n      actual.append(data)\n      idx.append(np.array(data['id']))\n    Y_actual= pd.concat(actual)\n    ids=np.concatenate(idx)\n    ids_tot.append(ids)\n    Y_actual=Y_actual.drop(['id' ], axis=1)#remove id\n    #transform test data in numpy array\n    Y_actual =np.asarray(Y_actual)","metadata":{"id":"YDza59yFzTOn"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prednp = np.array(scores)\nprednp[prednp<0.3]=0\nprednp[prednp>=0.3]=1\nprednp.max()","metadata":{"id":"8vfxe-oG16jD","outputId":"9543d514-647a-4e1e-e75c-5d11f25bee34"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import roc_auc_score,accuracy_score,roc_curve,auc\naucarr=[]\naccarr=[]\nfpr = dict()\ntpr = dict()\nroc_auc = dict()\n\nfor i in range(6):\n  try:\n    score = roc_auc_score(prednp[:,i], Y_actual[:,i])\n  except ValueError:\n    pass\n  accscore = accuracy_score(prednp[:,i], Y_actual[:,i])\n  fpr[i], tpr[i], _ = roc_curve(prednp[:, i], Y_actual[:, i])\n  roc_auc[i] = auc(fpr[i], tpr[i])\n  aucarr.append(score)\n  accarr.append(accscore)\n\nfor i in range(6):\n  plt.figure()\n  plt.plot(fpr[i], tpr[i], label='ROC curve (area = %0.2f)' % roc_auc[i])\n  plt.plot([0, 1], [0, 1], 'k--')\n  plt.xlim([0.0, 1.0])\n  plt.ylim([0.0, 1.05])\n  plt.xlabel('False Positive Rate')\n  plt.ylabel('True Positive Rate')\n  plt.title('Receiver operating characteristic example')\n  plt.legend(loc=\"lower right\")\n  plt.show()\n\n\nfinalscore = sum(aucarr)/len(aucarr)\nfinalacc= sum(accarr)/len(accarr)\nprint(finalscore)\nprint(finalacc)\n","metadata":{"id":"-tjToh-d4NL6","outputId":"134856e7-8300-4202-d55f-73f59bf64a2f"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prednp.shape","metadata":{"id":"-437YEmej_iF","outputId":"9fdea99f-98e4-4062-d7a6-dbb34089ba73"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"sIOIJAZj9XkE"},"execution_count":null,"outputs":[]}]}