{"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"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":53666,"databundleVersionId":6589269,"sourceType":"competition"}],"dockerImageVersionId":30587,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Sleep states classifier model with random forest","metadata":{}},{"cell_type":"code","source":"import joblib\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nfrom sklearn.preprocessing import MinMaxScaler\n\nfrom sklearn.metrics import roc_curve\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier\n\ndef MeanAbs(fragment):\n    return np.mean(np.abs(fragment))\n\ndef StdAbs(fragment):\n    return np.std(np.abs(fragment))\n\ndef MeanAbsDiff(fragment):\n    return MeanAbs(np.diff(fragment))\n\ndef StdAbsDiff(fragment):\n    return StdAbs(np.diff(fragment))\n\ndef FragmentSeries(timeseries,size=70):\n    \n    fragments_a = [timeseries['anglez'].iloc[k:k+size].values for k in range(0,len(timeseries),size)]\n    fragments_b = [timeseries['enmo'].iloc[k:k+size].values for k in range(0,len(timeseries),size)]\n    targets = [timeseries['awake'].iloc[k:k+size].values[-1] for k in range(0,len(timeseries),size)]\n    \n    return fragments_a[0:-1],fragments_b[0:-1],targets[0:-1]\n\ndef MakeFeatures(timeseries):\n    \n    fragments_a,fragments_b,targets = FragmentSeries(timeseries)\n    features = [np.mean,np.std,MeanAbsDiff,StdAbsDiff]\n    names = ['mean_a','mean_b','std_a','std_b','MeanAbsDiff_a','MeanAbsDiff_b','StdAbsDiff_a','StdAbsDiff_b','target']\n    innerData = np.zeros((len(fragments_a),2*len(features)+1))\n    \n    for k,func in enumerate(features):\n        innerContainer_a = []\n        innerContainer_b = []\n        for frag_a,frag_b in zip(fragments_a,fragments_b):\n            innerContainer_a.append(func(frag_a))\n            innerContainer_b.append(func(frag_b))\n        innerData[:,2*k] = innerContainer_a\n        innerData[:,2*k+1] = innerContainer_b\n    \n    innerData[:,-1] = targets\n    \n    innerDF = pd.DataFrame(innerData,columns=names)\n    \n    return innerDF\n","metadata":{"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data loading","metadata":{}},{"cell_type":"code","source":"data = pd.read_parquet('/kaggle/input/child-mind-institute-detect-sleep-states/train_series.parquet')\nevents = pd.read_csv('/kaggle/input/child-mind-institute-detect-sleep-states/train_events.csv')\n\nuniqueseries =  data['series_id'].unique()\n\ndef ProcessTimeSeries(seriesid,seriesframe=data,eventsframe=events):\n    \n    currentevents = eventsframe[eventsframe['series_id']==seriesid]\n    currentseries = seriesframe[seriesframe['series_id']==seriesid]\n    \n    currentevents = currentevents.dropna()\n    currentevents[\"step\"]  = currentevents[\"step\"].astype(\"int\")\n    currentevents[\"awake\"] = currentevents[\"event\"].replace({\"onset\":1,\"wakeup\":0})\n\n    train = pd.merge(currentseries, currentevents[['step','awake']], on='step', how='left')\n    train[\"awake\"] = train[\"awake\"].bfill(axis ='rows')\n\n    train['awake'] = train['awake'].fillna(1)\n    train[\"awake\"] = train[\"awake\"].astype(\"int\")\n    \n    return train","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model training","metadata":{}},{"cell_type":"code","source":"containerdf = []\n\nfor val in uniqueseries:    \n    \n    ser = ProcessTimeSeries(val)\n    containerdf.append(MakeFeatures(ser))\n    \ncontainerdf = pd.concat(containerdf)\n\nX_train, X_test, y_train, y_test = train_test_split(containerdf[['mean_a','mean_b','std_a','std_b','MeanAbsDiff_a','MeanAbsDiff_b','StdAbsDiff_a','StdAbsDiff_b']].values, \n                                                    containerdf['target'].values, \n                                                    test_size=0.1, random_state=42,\n                                                    stratify=containerdf['target'].values)\n\nkf = StratifiedKFold(n_splits=6,random_state=1,shuffle=True)\n\nfig,axs = plt.subplots(2,3,figsize=(16,8),sharex=True)\naxs = axs.ravel()\n\nfor i, (train_index, test_index) in enumerate(kf.split(X_train,y_train)):\n    \n    xtrain,xtest = X_train[train_index],X_train[test_index]\n    ytrain,ytest = y_train[train_index],y_train[test_index]\n\n    Scaler = MinMaxScaler()\n    Scaler.fit(xtrain)\n    \n    xtrain = Scaler.transform(xtrain)\n    xtest = Scaler.transform(xtest)\n\n    clf = RandomForestClassifier(150,random_state=0,n_jobs=-1,min_samples_leaf=0.005)\n    clf.fit(xtrain, ytrain)\n\n    preds = clf.predict_proba(xtest)\n    \n    rcurve = roc_curve(ytest, preds[:, 1])\n    axs[i].plot(rcurve[0],rcurve[1])\n    localscore = 'AUC = ' + str(round(roc_auc_score(ytest, preds[:, 1]),4))\n    axs[i].text(0.05,0.95,localscore)\n    \n    joblib.dump(Scaler,'/kaggle/working/scaler'+str(i)+'.pkl')\n    joblib.dump(clf,'/kaggle/working/model'+str(i)+'.pkl')\n    ","metadata":{},"execution_count":null,"outputs":[]}]}