{"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":"import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport xgboost as xgb\nfrom PIL import Image\nfrom sklearn.preprocessing import MinMaxScaler\nfrom keras.models import Sequential\nfrom keras.layers import Dense, LSTM, Dropout, GRU, Bidirectional\nfrom keras.optimizers import SGD\nimport math\nimport datetime\nfrom sklearn.metrics import mean_squared_error\nfrom tensorflow.keras.models import load_model\n\nimport torch\nimport torch.nn as nn\n\nsns.set_style('whitegrid')\nplt.style.use('fivethirtyeight')\n%matplotlib inline\n\nsns.set()\npd.set_option('display.max_column', 200)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-05-20T23:54:23.861747Z","iopub.status.idle":"2023-05-20T23:54:23.862686Z","shell.execute_reply.started":"2023-05-20T23:54:23.862439Z","shell.execute_reply":"2023-05-20T23:54:23.862465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dtypes={\n    #'session_id':np.int32,\n    'index':np.int32,\n    'elapsed_time':np.int32,\n    'event_name':'category',\n    'name':'category',\n    'level':np.uint8,\n    'page':'category',\n    'room_coor_x':np.float32,\n    'room_coor_y':np.float32,\n    'screen_coor_x':np.float32,\n    'screen_coor_y':np.float32,\n    'hover_duration':np.float32,\n    'text':'category',\n    'fqid':'category',\n    'room_fqid':'category',\n    'text_fqid':'category',\n    'fullscreen':'category',\n    'hq':'category',\n    'music':'category',\n    'level_group':'category'}\ntrain = pd.read_csv(\"/kaggle/input/predict-student-performance-from-game-play/train.csv\", dtype = dtypes)[0:5000]\ntrain['session_level']=np.nan\ntrain['q']=np.nan\ntrain['correct']=np.nan\ntrain['level_group']=train['level_group'].replace(['0-4', '5-12', '13-22'], [0,1,2])\ntrain=train.rename({'session_id': 'session'}, axis=1) \n#train=train_.reset_index()\ntrain\n","metadata":{"execution":{"iopub.status.busy":"2023-05-20T19:52:30.069296Z","iopub.execute_input":"2023-05-20T19:52:30.072961Z","iopub.status.idle":"2023-05-20T19:54:43.395426Z","shell.execute_reply.started":"2023-05-20T19:52:30.072916Z","shell.execute_reply":"2023-05-20T19:54:43.394636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#train_0=train.copy()\n#train_1=train.copy()","metadata":{"execution":{"iopub.status.busy":"2023-05-19T20:06:19.865501Z","iopub.execute_input":"2023-05-19T20:06:19.865847Z","iopub.status.idle":"2023-05-19T20:06:19.870046Z","shell.execute_reply.started":"2023-05-19T20:06:19.865818Z","shell.execute_reply":"2023-05-19T20:06:19.869130Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_1=train.copy()\ntab=pd.DataFrame({'session':[],'level_group0':[],'level_group1':[],'level_group2':[]})\nses_0=[];lg_0=[];lg_1=[];lg_2=[]\n#min_0=9999999\nfor sessi in train_1['session'].unique():\n    #print(sessi)\n    nlg0=math.floor(train_1.loc[train_1.session==sessi].loc[train_1.level_group==0].shape[0]/3)\n    nlg1=math.floor(train_1.loc[train_1.session==sessi].loc[train_1.level_group==1].shape[0]/10)\n    nlg2=math.floor(train_1.loc[train_1.session==sessi].loc[train_1.level_group==2].shape[0]/5)\n\n    if nlg0>8:\n        if nlg1>8:\n            if nlg2>8:\n                ses_0.append(sessi)\n                lg_0.append(nlg0)\n                lg_1.append(nlg1)\n                lg_2.append(nlg2)\n\n#tab.iloc[:,0]=ses_0\ntab.isetitem(0, ses_0)\ntab.isetitem(1, lg_0)\ntab.isetitem(2, lg_1)\ntab.isetitem(3, lg_2)\ntab=tab[0:math.floor(tab.shape[0]/3)*3]\nmin_0=tab.min().min()\nprint('min_0:',min_0)\ntab","metadata":{"execution":{"iopub.status.busy":"2023-05-20T19:54:43.396514Z","iopub.execute_input":"2023-05-20T19:54:43.397015Z","iopub.status.idle":"2023-05-20T19:54:43.458254Z","shell.execute_reply.started":"2023-05-20T19:54:43.396985Z","shell.execute_reply":"2023-05-20T19:54:43.457428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_0=train.copy()\n#train_1=train.copy()\n\nfor tab_ses in range(0,tab.shape[0]):\n#for tab_ses in range(0,3):  \n    j=(tab_ses*3)%9 \n    #print('tab_ses',tab_ses)    \n    for lg in [0,1,2]:\n        #print(' lg=',lg)        \n        awal=train_0.loc[train_0.session==tab.session[tab_ses]].loc[train_0.level_group==lg].index[0] \n        #print('awal',awal)\n        if lg==0:\n            slev=j\n            nq=[1, 2, 3] * min_0            \n            akhir=awal+ 3 * min_0\n            \n        if lg==1:\n            nq=[4,5,6,7,8,9,10,11,12,13] * min_0\n            slev=j+1\n            akhir=awal+ 10 * min_0\n     \n        if lg==2:\n            nq=[14,15,16,17,18] * min_0\n            slev=j+2     \n            akhir=awal+ 5 * min_0\n           \n        #print('   lg=',lg,' , slev=',slev)\n        #print('slev=',slev)\n        #print('awal=',awal,'akhir=',akhir)\n        train_0.iloc[awal:akhir,-2]=nq      #.loc[train_0.level_group==0]\n        train_0.iloc[awal:akhir,-3]=slev\n        #print('')\n        \ntrain_0[['session','index','level','level_group','session_level','q','correct']]#[50:100]\ntrain_0[:][train_0['q'].notnull()][['session','index','level','level_group','session_level','q','correct']]","metadata":{"execution":{"iopub.status.busy":"2023-05-20T19:54:43.460536Z","iopub.execute_input":"2023-05-20T19:54:43.461511Z","iopub.status.idle":"2023-05-20T19:54:43.520275Z","shell.execute_reply.started":"2023-05-20T19:54:43.461476Z","shell.execute_reply":"2023-05-20T19:54:43.519219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels=pd.read_csv(\"/kaggle/input/predict-student-performance-from-game-play/train_labels.csv\")\ntrain_labels['session'] = train_labels.session_id.apply(lambda x: int(x.split('_')[0]) )\ntrain_labels['q'] = train_labels.session_id.apply(lambda x: int(x.split('_')[-1][1:]) )\ntrain_labels=train_labels.sort_values(['session','q'])\ntrain_labels=train_labels.rename({'correct': 'correct_'}, axis=1) \n\n#train_labels=train_labels[['session','q','correct']]\ntrain_labels=train_labels[['session','q','correct_']]#.loc[train_labels.session==20090312431273200][:60]\ntrain_labels=train_labels.set_index(['session','q'])\n#train_labels","metadata":{"execution":{"iopub.status.busy":"2023-05-20T19:54:43.521800Z","iopub.execute_input":"2023-05-20T19:54:43.522197Z","iopub.status.idle":"2023-05-20T19:54:45.237857Z","shell.execute_reply.started":"2023-05-20T19:54:43.522170Z","shell.execute_reply":"2023-05-20T19:54:45.236951Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_2=train_0.dropna(subset=['q']).set_index(['session','q']).copy()\ntrain_3=pd.concat([train_2, train_labels.reindex(train_2.index)], axis=1)\ntrain_3['correct']=train_3['correct_']\ntrain_3=train_3.drop(['correct_'], axis=1).reset_index()\ntrain_3","metadata":{"execution":{"iopub.status.busy":"2023-05-20T19:54:45.239130Z","iopub.execute_input":"2023-05-20T19:54:45.239644Z","iopub.status.idle":"2023-05-20T19:54:45.304701Z","shell.execute_reply.started":"2023-05-20T19:54:45.239604Z","shell.execute_reply":"2023-05-20T19:54:45.303911Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def scal(quest,train_3):\n    train_scal = train_3.loc[train_3.q==quest][['event_name', 'name', 'level', 'room_coor_x', 'room_coor_y', 'screen_coor_x', 'screen_coor_y', 'hover_duration',\n                     'text','fqid','room_fqid','text_fqid','fullscreen','hq','music','correct']]\n    for col in ['room_coor_x', 'room_coor_y', 'screen_coor_x', 'screen_coor_y', 'hover_duration']:\n        # Scaling the coordinates and durations\n        train_scal[col] = (train_scal[col] - train_scal[col].min()) / (train_scal[col].max() - train_scal[col].min())\n        train_scal[col] = train_scal[col].fillna(0)\n    #train_scal\n    #df.vertebrates.astype(\"category\").cat.codes\n    train_scal.event_name=train_scal.event_name.astype(\"category\").cat.codes\n    train_scal.name=train_scal.name.astype(\"category\").cat.codes\n    train_scal.text=train_scal.text.astype(\"category\").cat.codes\n    train_scal.fqid=train_scal.fqid.astype(\"category\").cat.codes\n    train_scal.room_fqid=train_scal.room_fqid.astype(\"category\").cat.codes\n    train_scal.text_fqid=train_scal.text_fqid.astype(\"category\").cat.codes\n    train_scal.fullscreen=train_scal.fullscreen.astype(\"category\").cat.codes\n    train_scal.hq=train_scal.hq.astype(\"category\").cat.codes\n    train_scal.music=train_scal.music.astype(\"category\").cat.codes\n    #train_scal\n\n#==========================================================================================\n    train_scal_x=train_scal[0:].copy()\n    sc = MinMaxScaler(feature_range=(0,1))\n    training_set_scaled=sc.fit_transform(train_scal_x.iloc[:,:-1].values)\n    #training_set_scaled.shape,training_set_scaled\n\n    X_train = []\n    y_train = []\n    for i in range(0,training_set_scaled.shape[0]):\n        X_train.append(training_set_scaled[i])\n        y_train.append(train_scal_x.iloc[:,-1:]['correct'].values[i])   \n\n    X_train, y_train = np.array(X_train), np.array(y_train)\n    # Reshaping X_train for efficient modelling\n    X_train = np.reshape(X_train, (X_train.shape[0],X_train.shape[1],1))\n\n    return (X_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2023-05-20T20:35:34.796844Z","iopub.execute_input":"2023-05-20T20:35:34.797259Z","iopub.status.idle":"2023-05-20T20:35:34.814289Z","shell.execute_reply.started":"2023-05-20T20:35:34.797226Z","shell.execute_reply":"2023-05-20T20:35:34.813261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#baris_= 0 #range 0-7\n#quest=1  #question(q) range 1-18\n\ndef ok_train(train_3,iterasi_ulang,quest,baris):\n    his_0=[]    \n    nrow=500;\n    a0=0\n    b0=5000  #train_.shape[0]\n    #for row in range(nrow,train_.shape[0],nrow):\n    for row in range(a0+nrow,b0,nrow):\n        #print('row:',row)\n        #print('a0+nrow:',a0+nrow)\n        #if row>0:\n        print('   range:',a0,'-',row)\n        #print('  ====================')\n        train_=train[a0:row].copy()\n        #a0=row\n        train_=train_.reset_index()\n        #train_\n    #==========================================================================================\n\n    #==========================================================================================\n\n        #quest=1  #question(q) range 1-18\n        train_1=train_.copy()\n\n\n    #==========================================================================================\n        X_train, y_train = scal(quest,train_3)\n        \n    #==========================================================================================\n        #iterasi_ulang=1\n        \n        if iterasi_ulang==1:\n            # Memuat model yang telah disimpan\n            pretrained_model = load_model('output/Q-'+str(quest)+'.h5')\n            # Mendapatkan dimensi bobot lapisan terakhir dari model yang telah dilatih sebelumnya\n            last_layer_weights_shape = pretrained_model.layers[-1].get_weights()[0].shape\n\n        # The LSTM architecture\n        model = Sequential()\n        #regressor = load_model('d300rb-Q1_B1_E50.h5')\n        # First LSTM layer with Dropout regularisation\n        if mod[0][baris]== 'LSTM':\n            model.add(LSTM(units=node, return_sequences=True, input_shape=(X_train.shape[1],1)))\n        else:\n            model.add(GRU(units=node, return_sequences=True, input_shape=(X_train.shape[1],1), activation='tanh'))\n        model.add(Dropout(0.2))\n        # Second LSTM layer\n        if mod[1][baris]=='LSTM':\n            model.add(LSTM(units=node, return_sequences=True))\n        else:\n            model.add(GRU(units=node, return_sequences=True))\n        model.add(Dropout(0.2))\n        # Third LSTM layer\n        if mod[2][baris]=='LSTM':\n            model.add(LSTM(units=node, return_sequences=True))\n        else:\n            model.add(GRU(units=node, return_sequences=True, input_shape=(X_train.shape[1],1), activation='tanh'))\n        model.add(Dropout(0.2))\n        # Fourth LSTM layer\n        if mod[3][baris]=='LSTM':\n            model.add(LSTM(units=node))\n        else:\n            model.add(GRU(units=node, activation='tanh'))\n        model.add(Dropout(0.2))\n        # The output layer\n        model.add(Dense(units=1))\n\n        if iterasi_ulang== 1:\n            # Mengambil bobot dari model yang telah dilatih sebelumnya\n            weights = pretrained_model.get_weights()\n            # Menetapkan bobot ke model baru\n            model.set_weights(weights)\n        # Compiling the RNN\n        model.compile(optimizer=optim,metrics= [\"accuracy\"],loss='mean_squared_error')\n        # Fitting to the training set\n        history = model.fit(X_train,y_train,epochs=epo,batch_size=batchsize,verbose=0)\n         #verbose: 'auto', 0, 1, or 2. Verbosity mode.         \n            #0 = silent, 1 = progress bar, 2 = one line per epoch.         \n            #'auto' defaults to 1 for most cases, but 2 when used with\n\n        # Save the updated model\n        model.save('output/Q-'+str(quest)+'.h5')\n        #iterasi_ulang=1\n\n    #==========================================================================================\n        hist_=history.history\n        hist_df=pd.DataFrame(hist_)\n        if a0== 0:\n            hist=hist_df\n            hist=hist.reset_index()\n        if a0!= 0:\n            #his_0=his_0.append(hist_df)\n            hist=hist.drop(['index'], axis=1) \n            hist=pd.concat([hist,hist_df])  \n            hist=hist.reset_index()\n\n        hist=pd.DataFrame(hist)\n        a0=row\n        iterasi_ulang=1\n    print()\n    print('history range: 0 - ',row+nrow)\n#    print('==========================')\n    hist=hist.drop(['index'], axis=1)\n    print(hist)\n    print()\n\n    print(quest,desain_NN_1)\n    # Plot training\n    plt.rc('figure', figsize=(15, 8))\n    #plt.figure(figsize=(10,8))\n    plt.plot(range(hist.index[-1]+1),hist['accuracy'],color='blue',label='accuracy')\n    plt.plot(range(hist.index[-1]+1),hist['loss'],color='r',label='loss')\n    plt.title('Accuracy - Loss'); plt.xlabel('Epoch'); plt.ylabel('Accuracy');plt.legend() \n    plt.title('Question = '+str(quest), loc='left')\n    plt.title('Layer = '+str(desain_NN_1), loc='right')\n    plt.show()\n    print('')        \n    \n    #==========================================================================================\n    return (model,hist)","metadata":{"execution":{"iopub.status.busy":"2023-05-20T23:59:02.568114Z","iopub.execute_input":"2023-05-20T23:59:02.569348Z","iopub.status.idle":"2023-05-20T23:59:02.600988Z","shell.execute_reply.started":"2023-05-20T23:59:02.569302Z","shell.execute_reply":"2023-05-20T23:59:02.599411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"iterasi_ulang=0\nss=[]\n\nfor quest in range (1,19):\n    print('')\n    print('==============')\n    print('quest:',quest)\n    print('==============')\n    node=50\n    optim='rmsprop'   #'rmsprop'   #ADAM , SGD\n    epo=10\n    batchsize=64  #64\n    baris= 1     #MODEL LAYER - No urut Combinasi LSTM - GRU di 4 \n    mod=pd.DataFrame([['LSTM','LSTM','LSTM','LSTM'],   # baris=0 (model 0)\n                     ['GRU','GRU','GRU','GRU'],        # baris=1 (model 1)\n                     ['LSTM','LSTM','GRU','GRU'],      # baris=2 (model 2)\n                     ['GRU','GRU','LSTM','LSTM'],      # baris=3 (model 3)\n                     ['LSTM','GRU','LSTM','GRU'],      # baris=4 (model 4)\n                     ['GRU','LSTM','GRU','LSTM'],      # baris=5 (model 5)\n                     ['LSTM','GRU','GRU','LSTM'],      # baris=6 (model 6)\n                     ['GRU','LSTM','LSTM','GRU'],      # baris=7 (model 7)\n                     ])  #, columns=['L1','L2','L3','L4'])\n    #display(mod)\n    #desain_NN= \"  baris = \",baris,\", Layer = \",mod[0][baris],mod[1][baris],mod[2][baris],mod[3][baris]\n    desain_NN_1= mod[0][baris],mod[1][baris],mod[2][baris],mod[3][baris]\n    print(\"   baris = \",baris,\", Layer = \",mod[0][baris],mod[1][baris],mod[2][baris],mod[3][baris])\n    print('')\n\n    train_=train_3\n    model,his_0=ok_train(train_,iterasi_ulang,quest,baris)","metadata":{"execution":{"iopub.status.busy":"2023-05-20T23:59:05.526071Z","iopub.execute_input":"2023-05-20T23:59:05.526510Z","iopub.status.idle":"2023-05-21T00:35:24.565515Z","shell.execute_reply.started":"2023-05-20T23:59:05.526477Z","shell.execute_reply":"2023-05-21T00:35:24.564694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}