{"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\n\nimport torch\nimport torch.nn as nn\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-18T21:41:15.549004Z","iopub.execute_input":"2023-05-18T21:41:15.549339Z","iopub.status.idle":"2023-05-18T21:41:26.061019Z","shell.execute_reply.started":"2023-05-18T21:41:15.549315Z","shell.execute_reply":"2023-05-18T21:41:26.059830Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission=pd.read_csv(\"/kaggle/input/predict-student-performance-from-game-play/sample_submission.csv\")\nsample_submission['session'] = sample_submission.session_id.apply(lambda x: int(x.split('_')[0]) )\nsample_submission['q'] = sample_submission.session_id.apply(lambda x: int(x.split('_')[-1][1:]) )\n\n#sample_submission.loc[sample_submission.session==20090109393214576]","metadata":{"execution":{"iopub.status.busy":"2023-05-18T21:41:26.062823Z","iopub.execute_input":"2023-05-18T21:41:26.063343Z","iopub.status.idle":"2023-05-18T21:41:26.088648Z","shell.execute_reply.started":"2023-05-18T21:41:26.063322Z","shell.execute_reply":"2023-05-18T21:41:26.087977Z"},"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=train.rename({'session_id': 'session'}, axis=1) \n#train=train_.reset_index()\ntrain\n","metadata":{"execution":{"iopub.status.busy":"2023-05-18T21:41:26.089798Z","iopub.execute_input":"2023-05-18T21:41:26.090906Z","iopub.status.idle":"2023-05-18T21:42:50.868148Z","shell.execute_reply.started":"2023-05-18T21:41:26.090858Z","shell.execute_reply":"2023-05-18T21:42:50.867522Z"},"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[['session','q','correct']]","metadata":{"execution":{"iopub.status.busy":"2023-05-18T21:42:50.869877Z","iopub.execute_input":"2023-05-18T21:42:50.870289Z","iopub.status.idle":"2023-05-18T21:42:51.851566Z","shell.execute_reply.started":"2023-05-18T21:42:50.870267Z","shell.execute_reply":"2023-05-18T21:42:51.850921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def scal(quest,train_1):\n    train_scal = train_1.loc[train_1.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-18T21:42:51.852644Z","iopub.execute_input":"2023-05-18T21:42:51.853049Z","iopub.status.idle":"2023-05-18T21:42:51.865388Z","shell.execute_reply.started":"2023-05-18T21:42:51.853030Z","shell.execute_reply":"2023-05-18T21:42:51.863534Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"node=100\noptim='rmsprop'   #'rmsprop'   #ADAM , SGD\nepo=25\nbatchsize=128  #64\nbaris= 0     #MODEL LAYER - No urut Combinasi LSTM - GRU di 4 \nmod=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)\ndesain_NN= \"baris = \",baris,\", Layer = \",mod[0][baris],mod[1][baris],mod[2][baris],mod[3][baris]\nprint(desain_NN)","metadata":{"execution":{"iopub.status.busy":"2023-05-18T21:42:51.868823Z","iopub.execute_input":"2023-05-18T21:42:51.869750Z","iopub.status.idle":"2023-05-18T21:42:51.891268Z","shell.execute_reply.started":"2023-05-18T21:42:51.869672Z","shell.execute_reply":"2023-05-18T21:42:51.889558Z"},"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,iterasi_ulang=0):\n    nrow=10000;baris_=0;quest=1\n    a0=0\n    #for row in range(nrow,train_.shape[0],nrow):\n    for row in range(nrow,1000000,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        train_1=train_.copy()\n        tab=pd.DataFrame({'session':[],'level':[],'awal':[],'akhir':[],'panjang':[]})\n        se=[];le=[];aw=[];ak=[]\n\n        ses=train_1.session.unique()\n        colec_sess=[]\n        for sess in (ses):\n            colec_sess.append(sess)\n            #print(sess)\n            lev=train_1.loc[train_1.session==sess]\n            #print('sess:',sess)\n            for l in range (0,lev.level.unique().shape[0]):\n                #print(l)\n                j0=train_1.loc[train_1.session==sess].level.unique()[l]\n                p=lev.loc[train_1.level==j0].shape[0]\n                #print(l,p)        \n                if p > 0:\n                    if l > 0 :\n                       le_0=lev.level.unique()[0]\n                    else: \n                        le_0=lev.level.unique()[l]\n                    #print('   ',le_0)\n                    awal=lev.loc[train_1.level==j0].index[0]\n                    akhir=lev.loc[train_1.level==j0].index[p-1]\n                    se.append(sess)\n                    le.append(le_0)\n                    aw.append(awal)\n                    ak.append(akhir)     \n        print(colec_sess)\n        tab['session']=se\n        tab['level']=le\n        tab['awal']=aw\n        tab['akhir']=ak\n        tab['panjang']=tab['akhir']-tab['awal']\n        #tab=tab.loc[tab.session==20090312431273200]\n        #tab.head()\n    #==========================================================================================\n\n    #==========================================================================================\n        #quest=1  #question(q) range 1-18\n\n        train_1=train_.copy()\n        for t in range (0,tab.shape[0]):\n            #print(t)    \n            tses=tab.session[t]\n            tlev=tab.level[t]\n            tawal=tab.awal[t]\n            takhir=tab.akhir[t]\n            tpanjang=tab.panjang[t]\n\n            corec=0\n            for nq in range (tawal+quest-1,takhir,18):  #tawal,takhir+1):\n                #print('nq=',nq)\n                corec=train_labels.loc[train_labels.session==tses].loc[train_labels['q']==quest].correct.values[0]\n                nqc=train_1.loc[train_1.session==tses].loc[train_1.level==tlev].loc[train_1['index']==quest].index #[0]\n                train_1.iloc[nq,-1]=corec        \n                train_1.iloc[nq,-2]=quest  \n\n        #train_1[['session','index','level','level_group','session_level','q','correct']][0:55]\n        #train_1[:][train_1['q'].notnull()][['session','index','level','level_group','session_level','q','correct']] #[50:85]\n\n    #==========================================================================================\n        X_train, y_train = scal(quest,train_1)\n        \n    #==========================================================================================\n        #iterasi_ulang=1\n        from tensorflow.keras.models import load_model\n\n        if iterasi_ulang==1:\n            # Memuat model yang telah disimpan\n            pretrained_model = load_model('Q1_B0_E50_pretrain_mod_R500rb.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('Q1_B0_E50_pretrain_mod_R500rb.h5')\n        iterasi_ulang=1\n\n    #==========================================================================================\n        hist=history.history\n        hist_df=pd.DataFrame(hist)\n        print('')\n        print('hist_df.shape[0]:',hist_df.shape[0])\n        #print('hist_df.tail():')\n        print(hist_df.tail())\n        \n        \n        # Plot training\n        plt.figure(figsize=(5,4))\n        plt.plot(range(history.epoch[-1]+1),history.history['accuracy'],label='accuracy')\n        plt.plot(range(history.epoch[-1]+1),history.history['loss'],label='loss')\n\n        #plt.plot(range(history.epoch[-1]+1),history.history['loss'],label='loss')\n        #plt.plot(range(history.epoch[-1]+1),history.history['val_loss'],label='val_loss')\n\n        plt.title('Accuracy - Loss'); plt.xlabel('Epoch'); plt.ylabel('Accuracy');plt.legend(); \n        plt.show()\n        print('')\n        print('')\n        \n    #==========================================================================================\n    return ()\n\n","metadata":{"execution":{"iopub.status.busy":"2023-05-18T21:42:51.893272Z","iopub.execute_input":"2023-05-18T21:42:51.893555Z","iopub.status.idle":"2023-05-18T21:42:51.917121Z","shell.execute_reply.started":"2023-05-18T21:42:51.893531Z","shell.execute_reply":"2023-05-18T21:42:51.915613Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#iterasi_ulang=0\nok_train(train)\n","metadata":{"execution":{"iopub.status.busy":"2023-05-18T21:42:51.918399Z","iopub.execute_input":"2023-05-18T21:42:51.919079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}