{"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 numpy as np\nimport pandas as pd\nimport os\nfrom joblib import load\nfrom sklearn.model_selection import StratifiedKFold\nimport tensorflow as tf\n\nimport jo_wilder_310\n\nenv = jo_wilder_310.make_env()\niter_test = env.iter_test()\n\ndtypes={\n    'elapsed_time':np.int32,\n    'event_name':'category',\n    'name':'category',\n    'level':np.uint8,\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'}\n\ntrain = pd.read_csv(\"/kaggle/input/predict-student-performance-from-game-play/train.csv\", dtype=dtypes)\ntrain_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:]) )\n\nprint(\"db loaded\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"CATEGORICAL = ['event_name', 'name','fqid', 'room_fqid', 'text_fqid']\nNUMERICAL = ['elapsed_time','level','page','room_coor_x', 'room_coor_y', \n        'screen_coor_x', 'screen_coor_y', 'hover_duration']\nEVENTS = ['navigate_click','person_click','cutscene_click','object_click',\n          'map_hover','notification_click','map_click','observation_click',\n          'checkpoint']\n\ndef feature_engineer(dataset_df):\n    dfs = []\n    for c in CATEGORICAL:\n        tmp = dataset_df.groupby(['session_id','level_group'])[c].agg('nunique')\n        tmp.name = tmp.name + '_nunique'\n        dfs.append(tmp)\n    for c in NUMERICAL:\n        tmp = dataset_df.groupby(['session_id','level_group'])[c].agg('mean')\n        dfs.append(tmp)\n    for c in NUMERICAL:\n        tmp = dataset_df.groupby(['session_id','level_group'])[c].agg('std')\n        tmp.name = tmp.name + '_std'\n        dfs.append(tmp)\n    for c in EVENTS:\n        dataset_df[c] = (dataset_df.event_name == c).astype('int8')\n    for c in EVENTS + ['elapsed_time']:\n        tmp = dataset_df.groupby(['session_id','level_group'])[c].agg('sum')\n        tmp.name = tmp.name + '_sum'\n        dfs.append(tmp)\n\n    dataset_df = dataset_df.drop(EVENTS,axis=1)\n\n    dataset_df = pd.concat(dfs,axis=1)\n    dataset_df = dataset_df.fillna(-1)\n    dataset_df = dataset_df.reset_index()\n    dataset_df = dataset_df.set_index('session_id')\n    \n    return dataset_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# models = {}\n\n# for dirname, _ , filenames in os.walk(\"/kaggle/input/svm-models\"):\n#     print(\"Hello\")\n#     for filename in filenames:\n#         gridsearch = load(os.path.join(dirname, filename))\n#         models[int(filename.split('.')[0])] = gridsearch.best_estimator_","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = feature_engineer(train)\n\ndef preprocess_labels(df):\n    df[[\"session_id\", \"question_no\"]] = df[\"session_id\"].str.split('_q', expand=True)\n    return df\n\ntrain_labels = preprocess_labels(train_labels)\n\nmodels = []\nevaluations = {}\n\n# Train\nfor q_no in range(1,19):\n    print(\"\\nQuestion: \", q_no)\n    \n    if q_no <= 3:\n        group = '0-4'\n    elif q_no <= 13: \n        group = '5-12'\n    elif q_no <= 22:\n        group = '13-22'\n\n    # Initialise model for this level group\n    model = tf.keras.Sequential([\n        tf.keras.layers.Dense(128, activation='relu'),\n        tf.keras.layers.Dropout(0.5),\n        tf.keras.layers.Dense(64, activation='relu'),\n        tf.keras.layers.Dense(1, activation='sigmoid')\n    ])\n\n    # Compile model with loss function, optimizer and metrics\n    model.compile(optimizer='adam',\n                loss=tf.keras.losses.BinaryCrossentropy(),\n                metrics=[tf.keras.metrics.Accuracy()])\n\n    # Select rows with corresponding level group\n    train_rows = train.loc[train[\"level_group\"] == group]\n    train_users = train_rows.index.values\n    target_labels = train_labels.loc[train_labels.q==q_no].set_index('session').loc[train_users]\n    \n    # Select labels\n    labels = target_labels[\"correct\"]\n    \n    # Drop level_group as it shouldn't be fed into the neural network\n    train_rows = train_rows.drop([\"level_group\"], axis=1)\n\n    # Split training data via Stratified K-Fold\n    stratified_kfold = StratifiedKFold(3)\n    temp = 0\n    for train_index, validation_index in stratified_kfold.split(train_rows, labels):\n        fold_train_rows = train_rows.iloc[train_index]\n        fold_train_labels = labels.iloc[train_index]\n\n        fold_validation_rows = train_rows.iloc[validation_index]\n        fold_validation_labels = labels.iloc[validation_index]\n\n        # Fit model with training data\n        model.fit(fold_train_rows.values, np.array(fold_train_labels).astype(\"float32\"), epochs=3, verbose=2)\n        \n        # Validate model\n        print(\"Validation\")\n        loss, accuracy = model.evaluate(fold_validation_rows.values, np.array(fold_validation_labels).astype(\"float32\"), verbose=2)\n        temp += accuracy\n\n    evaluations[q_no] = temp / 3\n    \n    models.append(model)\n    \nprint(models)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"limits = {'0-4':(1,4), '5-12':(4,14), '13-22':(14,19)}\n\nfor (test, sample_submission) in iter_test:\n    test_df = feature_engineer(test)\n    grp = test_df.level_group.values[0]\n    a,b = limits[grp]\n    \n    test_df = test_df.loc[test_df.level_group == grp]\n    test_df = test_df.drop(\"level_group\", axis=1)\n    \n    for q in range(a,b):\n        est = models[q - 1]\n        prediction = est.predict(test_df) # the prediction for this question\n        print(prediction)\n        mask = sample_submission.session_id.str.contains(f'q{q}')\n        sample_submission.loc[mask,'correct'] = prediction\n\n    env.predict(sample_submission)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}