{"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":"markdown","source":"# Training","metadata":{}},{"cell_type":"code","source":"import scipy.sparse as sparse\nimport implicit","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"USER_ID = 'session'\nITEM_ID = 'aid'","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.concat([train_actions, test_actions])\ndf['user_label'], user_idx = pd.factorize(df[USER_ID])\ndf['item_label'], item_idx = pd.factorize(df[ITEM_ID])\nsparse_item_user = sparse.csr_matrix((np.ones(len(df)), (df['user_label'], df['item_label'])))\nepoch, emb_size = 5000, 64\nmodel = implicit.bpr.BayesianPersonalizedRanking(factors=emb_size, regularization=0.001, iterations=epoch,\n                                                 random_state=SEED)\nmodel.fit(sparse_item_user)\nu2emb = dict(zip(user_idx, model.user_factors.to_numpy()))\ni2emb = dict(zip(item_idx, model.item_factors.to_numpy()))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Making Feature","metadata":{"execution":{"iopub.status.busy":"2023-01-25T14:57:20.237975Z","iopub.execute_input":"2023-01-25T14:57:20.238432Z","iopub.status.idle":"2023-01-25T14:57:20.257010Z","shell.execute_reply.started":"2023-01-25T14:57:20.238328Z","shell.execute_reply":"2023-01-25T14:57:20.256087Z"}}},{"cell_type":"code","source":"dim = 64","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"default_emb = np.zeros(dim+1)\ndef user_item_dot(user_id, item_id, u2emb, i2emb):\n    u_mat = np.stack([u2emb.get(u, default_emb) for u in user_id])\n    i_mat = np.stack([i2emb.get(i, default_emb) for i in item_id])\n    return np.sum(u_mat * i_mat, axis=1)\nname = 'bpr'\nu2emb, i2emb = extra\nchunk_size = 5000000\nchunk_cnt = len(train_sample) // chunk_size\npred = np.concatenate([\n    user_item_dot(\n        train_sample[USER_ID].iloc[(c * chunk_size):((c + 1) * chunk_size)],\n        train_sample[ITEM_ID].iloc[(c * chunk_size):((c + 1) * chunk_size)],\n        u2emb, i2emb\n    ) for c in tqdm(range(chunk_cnt+1))\n])\ntrain_sample[name] = pred","metadata":{},"execution_count":null,"outputs":[]}]}