diff --git a/Fairness Performance.ipynb b/Fairness Performance.ipynb
index df2a42c..1a6c733 100644
--- a/Fairness Performance.ipynb
+++ b/Fairness Performance.ipynb
@@ -9,7 +9,7 @@
},
{
"cell_type": "code",
- "execution_count": 29,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -18,32 +18,12 @@
"parentdir = os.path.dirname(currentdir)\n",
"sys.path.insert(0,parentdir)\n",
"\n",
- "import argparse\n",
- "from argparse import Namespace\n",
- "\n",
- "def read_line_number(file_path, line_num):\n",
- " with open(file_path, 'r') as fin:\n",
- " for i,line in enumerate(fin):\n",
- " if i == line_num:\n",
- " return line.strip()\n",
- " return \"\"\n",
- "\n",
- "def extract_args(log_path):\n",
- " print(log_path)\n",
- " argstr = read_line_number(log_path, 1)\n",
- " if 'fair_lambda' not in argstr:\n",
- " argstr = argstr[:-1] + ', fair_lambda=0.1)'\n",
- " if 'fair_rho' not in argstr:\n",
- " argstr = argstr[:-1] + ', fair_rho=1)'\n",
- " if 'fair_group_feature' not in argstr:\n",
- " argstr = argstr[:-1] + f\", fair_group_feature='{group_feature}')\"\n",
- " args = eval(argstr)\n",
- " return args"
+ "from utils import read_line_number, extract_args"
]
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -66,8 +46,8 @@
" user_groups[uid] = fairness_control.group_dict[uid]\n",
" return user_groups\n",
"\n",
- "def get_userwise_performance(model, at_k_list):\n",
- " model.reader.set_phase('test')\n",
+ "def get_userwise_performance(model, at_k_list, phase = 'test'):\n",
+ " model.reader.set_phase(phase)\n",
" eval_data = model.reader.get_eval_dataset()\n",
" eval_loader = DataLoader(eval_data, worker_init_fn = worker_init_func,\n",
" batch_size = 1, shuffle = False, pin_memory = False, \n",
@@ -94,7 +74,7 @@
},
{
"cell_type": "code",
- "execution_count": 31,
+ "execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
@@ -113,7 +93,7 @@
" device = \"cuda:\" + str(device)\n",
"else:\n",
" device = \"cpu\"\n",
- "params = {'at_k_list': [10,50], 'eval_sample_p': 1.0}"
+ "# params = {'at_k_list': [10,50], 'eval_sample_p': 1.0}"
]
},
{
@@ -125,7 +105,7 @@
},
{
"cell_type": "code",
- "execution_count": 32,
+ "execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
@@ -143,11 +123,16 @@
"# '/logs/f2rec_train_and_eval_FedMF_lr0.003_reg0.1_losspairwisebpr_local1_fedavg.log'\n",
" ], \n",
" 'FairMF': [\n",
- " '/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.1_gactivity.log'\n",
- " ,'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0_gactivity.log'\n",
- " ,'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.1_gactivity.log'\n",
- " ,'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.5_gactivity.log'\n",
- " ,'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda1.0_gactivity.log'\n",
+ " f'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.7_g{group_feature}.log'\n",
+ " ,f'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.5_g{group_feature}.log'\n",
+ " ,f'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.3_g{group_feature}.log'\n",
+ " ,f'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.1_g{group_feature}.log'\n",
+ " ,f'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.1_g{group_feature}.log'\n",
+ " ,f'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.3_g{group_feature}.log'\n",
+ " ,f'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.5_g{group_feature}.log'\n",
+ " ,f'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.7_g{group_feature}.log'\n",
+ " ,f'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.9_g{group_feature}.log'\n",
+ "# ,'/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda1.0_gactivity.log'\n",
" ],\n",
" 'F2MF': [\n",
"# '/logs/f2rec_train_and_eval_FairFedMF_lr0.0003_reg0.1_losspairwisebpr_lambda-0.1_sigma0_gactivity.log'\n",
@@ -189,7 +174,7 @@
},
{
"cell_type": "code",
- "execution_count": 33,
+ "execution_count": 5,
"metadata": {
"scrolled": true
},
@@ -198,8 +183,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.1_gactivity.log\n",
- "Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda-0.1_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=-0.1, fair_rho=1, fair_group_feature='activity')\n",
+ "/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.7_gactivity.log\n",
+ "Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda-0.7_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=-0.7, fair_rho=1, fair_group_feature='activity')\n",
"Loading train data file. Done.\n",
"Loading val data file. Done.\n",
"Loading test data file. Done.\n",
@@ -222,7 +207,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "100%|██████████| 6023/6023 [00:08<00:00, 737.67it/s] \n"
+ "100%|██████████| 6023/6023 [00:07<00:00, 818.00it/s]\n"
]
},
{
@@ -230,68 +215,146 @@
"output_type": "stream",
"text": [
"user activity: 1885(A) -- 4138(I), threshold (133.05495600199237)\n",
- "embedding: tensor([[-0.0063, -0.0224, -0.0381, ..., 0.0122, -0.0042, -0.0213],\n",
- " [-0.0065, 0.0187, -0.0209, ..., -0.0587, -0.0227, -0.0036],\n",
- " [ 0.0098, 0.0069, 0.0158, ..., -0.0135, 0.0217, -0.0402],\n",
+ "embedding: tensor([[-0.0102, 0.0165, 0.0270, ..., -0.0165, -0.0083, 0.0012],\n",
+ " [ 0.0408, 0.0174, 0.0196, ..., 0.0113, -0.0015, 0.0144],\n",
+ " [ 0.0059, -0.0147, -0.0018, ..., -0.0328, -0.0192, 0.0077],\n",
" ...,\n",
- " [-0.0206, -0.0156, 0.0366, ..., 0.0259, -0.0548, 0.0071],\n",
- " [-0.0071, 0.0350, -0.0368, ..., -0.0195, -0.0107, -0.0220],\n",
- " [-0.0391, 0.0144, -0.0225, ..., -0.0045, -0.0220, 0.0383]])\n",
- "embedding: tensor([[ 0.0057, -0.0034, 0.0334, ..., 0.0074, 0.0456, -0.0271],\n",
- " [-0.0323, -0.0125, -0.0087, ..., 0.0126, -0.0179, -0.0257],\n",
- " [-0.0033, 0.0130, 0.0422, ..., -0.0275, -0.0011, -0.0459],\n",
+ " [-0.0163, -0.0088, -0.0009, ..., -0.0178, -0.0296, -0.0039],\n",
+ " [-0.0225, -0.0289, 0.0003, ..., -0.0158, -0.0054, -0.0125],\n",
+ " [-0.0141, 0.0299, -0.0131, ..., 0.0300, -0.0158, -0.0013]])\n",
+ "embedding: tensor([[-4.0577e-05, 7.4671e-03, 1.7524e-02, ..., -1.8667e-03,\n",
+ " 1.2714e-02, 3.2318e-03],\n",
+ " [-1.6225e-02, -1.4440e-02, -3.8067e-02, ..., -1.4310e-02,\n",
+ " 4.1424e-02, -2.2690e-03],\n",
+ " [-3.4895e-02, -1.1444e-02, -1.9060e-02, ..., 1.9326e-02,\n",
+ " 1.8023e-02, -4.1046e-02],\n",
" ...,\n",
- " [ 0.0009, 0.0306, -0.0017, ..., 0.0039, 0.0061, 0.0210],\n",
- " [-0.0087, -0.0195, 0.0015, ..., -0.0127, 0.0223, -0.0244],\n",
- " [ 0.0212, -0.0036, -0.0294, ..., 0.0060, 0.0608, 0.0192]])\n",
- "Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda-0.1_gactivity.pkl\n"
+ " [-9.5959e-03, -1.2495e-02, -1.8470e-03, ..., -7.0209e-03,\n",
+ " -2.3703e-02, 5.1025e-02],\n",
+ " [ 6.0020e-03, -3.9752e-02, 9.1225e-04, ..., 2.9983e-02,\n",
+ " -2.8201e-03, 1.5765e-03],\n",
+ " [-7.4039e-03, 8.6611e-03, -3.8427e-03, ..., -2.0098e-03,\n",
+ " -8.2824e-03, 3.7646e-03]])\n",
+ "Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda-0.7_gactivity.pkl\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 6022/6022 [00:36<00:00, 165.18it/s]\n",
+ "100%|██████████| 6022/6022 [00:36<00:00, 166.02it/s]\n",
+ "100%|██████████| 6022/6022 [00:36<00:00, 165.09it/s]\n",
+ "100%|██████████| 6022/6022 [00:36<00:00, 165.60it/s]\n",
+ "100%|██████████| 6022/6022 [04:42<00:00, 21.31it/s]\n",
+ "100%|██████████| 6022/6022 [04:42<00:00, 21.31it/s]\n",
+ "100%|██████████| 6022/6022 [04:42<00:00, 21.29it/s]\n",
+ "100%|██████████| 6022/6022 [04:42<00:00, 21.29it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.5_gactivity.log\n",
+ "Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda-0.5_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=-0.5, fair_rho=1, fair_group_feature='activity')\n",
+ "embedding: tensor([[-3.4417e-03, 3.2665e-02, 3.4477e-02, ..., -6.7283e-03,\n",
+ " -7.8777e-03, 2.6371e-02],\n",
+ " [ 3.0404e-03, -1.5310e-02, 2.8141e-03, ..., 9.3149e-03,\n",
+ " -8.6102e-05, -2.5758e-03],\n",
+ " [ 2.8342e-03, -2.2138e-03, 7.2973e-03, ..., 2.6807e-02,\n",
+ " 5.1225e-02, -1.3322e-02],\n",
+ " ...,\n",
+ " [ 9.0445e-03, 1.3507e-02, 1.1591e-02, ..., 9.2701e-03,\n",
+ " 1.9650e-02, -3.2457e-02],\n",
+ " [ 3.8066e-03, 1.6751e-02, 1.9948e-02, ..., 1.8067e-04,\n",
+ " 3.0044e-02, 4.3310e-05],\n",
+ " [-2.0486e-03, -9.1874e-03, 1.9261e-02, ..., 1.7766e-02,\n",
+ " -1.7993e-02, 8.0760e-03]])\n",
+ "embedding: tensor([[ 0.0398, -0.0311, 0.0080, ..., 0.0034, 0.0108, -0.0141],\n",
+ " [-0.0374, 0.0257, -0.0357, ..., 0.0016, -0.0115, -0.0185],\n",
+ " [-0.0121, -0.0063, 0.0069, ..., -0.0293, 0.0145, 0.0286],\n",
+ " ...,\n",
+ " [ 0.0469, 0.0157, -0.0146, ..., 0.0018, -0.0077, 0.0115],\n",
+ " [ 0.0181, 0.0452, -0.0127, ..., -0.0798, 0.0701, 0.0337],\n",
+ " [ 0.0109, -0.0258, -0.0320, ..., -0.0213, 0.0062, 0.0105]])\n",
+ "Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda-0.5_gactivity.pkl\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 6022/6022 [05:44<00:00, 17.49it/s]\n",
+ "100%|██████████| 6022/6022 [05:44<00:00, 17.49it/s]\n",
+ "100%|██████████| 6022/6022 [05:44<00:00, 17.48it/s]\n",
+ "100%|██████████| 6022/6022 [05:44<00:00, 17.48it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.3_gactivity.log\n",
+ "Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda-0.3_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=-0.3, fair_rho=1, fair_group_feature='activity')\n",
+ "embedding: tensor([[ 0.0219, 0.0129, 0.0011, ..., 0.0065, 0.0036, -0.0196],\n",
+ " [-0.0152, 0.0033, -0.0272, ..., -0.0147, 0.0305, 0.0213],\n",
+ " [-0.0044, 0.0015, 0.0036, ..., -0.0134, -0.0058, 0.0005],\n",
+ " ...,\n",
+ " [ 0.0018, 0.0226, 0.0042, ..., 0.0100, 0.0020, -0.0039],\n",
+ " [-0.0033, 0.0024, 0.0256, ..., 0.0242, 0.0196, -0.0253],\n",
+ " [ 0.0090, -0.0408, -0.0312, ..., -0.0234, 0.0048, 0.0072]])\n",
+ "embedding: tensor([[-0.0768, -0.0110, 0.0170, ..., 0.0357, 0.0145, -0.0221],\n",
+ " [-0.0025, -0.0050, -0.0187, ..., 0.0028, -0.0112, 0.0185],\n",
+ " [-0.0247, 0.0318, 0.0415, ..., 0.0093, -0.0093, -0.0066],\n",
+ " ...,\n",
+ " [-0.0156, -0.0006, 0.0232, ..., -0.0091, 0.0083, 0.0046],\n",
+ " [-0.0289, 0.0157, -0.0027, ..., -0.0158, 0.0115, 0.0149],\n",
+ " [-0.0228, -0.0052, -0.0174, ..., -0.0032, -0.0203, -0.0226]])\n",
+ "Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda-0.3_gactivity.pkl\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
- "100%|██████████| 6022/6022 [00:55<00:00, 108.92it/s]\n",
- "100%|██████████| 6022/6022 [00:48<00:00, 124.13it/s]\n",
- "100%|██████████| 6022/6022 [00:55<00:00, 108.90it/s]\n",
- "100%|██████████| 6022/6022 [00:51<00:00, 117.56it/s]\n",
- "100%|██████████| 6022/6022 [05:04<00:00, 19.78it/s]\n",
- "100%|██████████| 6022/6022 [05:04<00:00, 19.78it/s]\n",
- "100%|██████████| 6022/6022 [05:04<00:00, 19.77it/s]\n",
- "100%|██████████| 6022/6022 [05:04<00:00, 19.77it/s]\n"
+ "100%|██████████| 6022/6022 [04:54<00:00, 20.45it/s]\n",
+ "100%|██████████| 6022/6022 [04:54<00:00, 20.45it/s]\n",
+ "100%|██████████| 6022/6022 [04:54<00:00, 20.43it/s]\n",
+ "100%|██████████| 6022/6022 [04:54<00:00, 20.44it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0_gactivity.log\n",
- "Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=0.0, fair_rho=1, fair_group_feature='activity')\n",
- "embedding: tensor([[ 0.0020, -0.0004, 0.0090, ..., -0.0011, -0.0132, -0.0087],\n",
- " [ 0.0257, -0.0170, -0.0278, ..., -0.0403, 0.0033, -0.0260],\n",
- " [ 0.0045, 0.0098, -0.0004, ..., 0.0102, -0.0120, -0.0167],\n",
+ "/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.1_gactivity.log\n",
+ "Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda-0.1_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=-0.1, fair_rho=1, fair_group_feature='activity')\n",
+ "embedding: tensor([[-0.0099, -0.0129, 0.0186, ..., -0.0081, -0.0148, -0.0095],\n",
+ " [ 0.0090, 0.0045, 0.0206, ..., 0.0326, -0.0026, -0.0107],\n",
+ " [ 0.0143, 0.0077, -0.0571, ..., -0.0066, 0.0027, 0.0062],\n",
" ...,\n",
- " [-0.0156, 0.0027, 0.0179, ..., 0.0133, -0.0126, 0.0467],\n",
- " [ 0.0267, -0.0073, 0.0251, ..., -0.0017, 0.0068, 0.0040],\n",
- " [-0.0436, -0.0142, 0.0206, ..., -0.0072, -0.0263, 0.0046]])\n",
- "embedding: tensor([[-0.0494, 0.0467, -0.0309, ..., -0.0129, -0.0281, -0.0132],\n",
- " [-0.0064, 0.0065, 0.0505, ..., -0.0050, -0.0195, -0.0379],\n",
- " [ 0.0256, 0.0228, -0.0121, ..., 0.0095, -0.0133, 0.0128],\n",
+ " [-0.0292, 0.0153, -0.0228, ..., -0.0064, 0.0197, 0.0022],\n",
+ " [ 0.0213, -0.0153, -0.0220, ..., 0.0086, -0.0177, -0.0100],\n",
+ " [-0.0038, 0.0066, 0.0123, ..., -0.0087, 0.0022, -0.0223]])\n",
+ "embedding: tensor([[ 0.0585, -0.0091, 0.0291, ..., -0.0460, 0.0288, -0.0300],\n",
+ " [-0.0014, -0.0267, -0.0049, ..., 0.0266, 0.0049, 0.0508],\n",
+ " [-0.0055, -0.0080, -0.0446, ..., 0.0336, -0.0168, -0.0318],\n",
" ...,\n",
- " [-0.0296, 0.0026, 0.0102, ..., -0.0303, 0.0008, 0.0089],\n",
- " [ 0.0150, -0.0191, 0.0014, ..., -0.0517, 0.0049, -0.0068],\n",
- " [-0.0195, 0.0408, -0.0051, ..., 0.0059, 0.0095, 0.0015]])\n",
- "Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0_gactivity.pkl\n"
+ " [-0.0181, -0.0223, 0.0297, ..., -0.0150, -0.0219, 0.0138],\n",
+ " [-0.0260, -0.0520, 0.0065, ..., -0.0015, 0.0259, 0.0245],\n",
+ " [ 0.0209, 0.0305, -0.0384, ..., -0.0392, -0.0162, -0.0421]])\n",
+ "Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda-0.1_gactivity.pkl\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
- "100%|██████████| 6022/6022 [04:19<00:00, 23.20it/s]\n",
- "100%|██████████| 6022/6022 [04:19<00:00, 23.21it/s]\n",
- "100%|██████████| 6022/6022 [04:19<00:00, 23.19it/s]\n",
- "100%|██████████| 6022/6022 [04:19<00:00, 23.20it/s]\n"
+ "100%|██████████| 6022/6022 [05:08<00:00, 19.54it/s]\n",
+ "100%|██████████| 6022/6022 [05:08<00:00, 19.54it/s]\n",
+ "100%|██████████| 6022/6022 [05:08<00:00, 19.53it/s]\n",
+ "100%|██████████| 6022/6022 [05:08<00:00, 19.54it/s]\n"
]
},
{
@@ -300,20 +363,20 @@
"text": [
"/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.1_gactivity.log\n",
"Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.1_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=0.1, fair_rho=1, fair_group_feature='activity')\n",
- "embedding: tensor([[-0.0150, -0.0265, 0.0212, ..., 0.0251, -0.0268, 0.0098],\n",
- " [ 0.0162, -0.0267, -0.0174, ..., -0.0055, 0.0150, -0.0059],\n",
- " [ 0.0083, -0.0014, -0.0251, ..., -0.0132, 0.0074, 0.0059],\n",
+ "embedding: tensor([[-0.0021, 0.0101, 0.0134, ..., 0.0040, -0.0023, -0.0156],\n",
+ " [-0.0201, -0.0099, -0.0134, ..., 0.0231, -0.0021, 0.0127],\n",
+ " [-0.0025, 0.0277, -0.0065, ..., 0.0022, -0.0012, -0.0330],\n",
" ...,\n",
- " [-0.0047, 0.0088, -0.0239, ..., 0.0144, 0.0163, 0.0107],\n",
- " [ 0.0070, 0.0139, -0.0194, ..., -0.0060, -0.0214, 0.0040],\n",
- " [-0.0370, 0.0051, -0.0113, ..., 0.0196, 0.0037, -0.0235]])\n",
- "embedding: tensor([[-0.0080, 0.0166, 0.0153, ..., 0.0366, 0.0590, -0.0280],\n",
- " [-0.0198, -0.0241, 0.0332, ..., -0.0058, -0.0484, -0.0207],\n",
- " [ 0.0370, -0.0013, -0.0332, ..., -0.0063, -0.0243, -0.0476],\n",
+ " [ 0.0297, 0.0066, -0.0089, ..., 0.0039, 0.0390, 0.0164],\n",
+ " [ 0.0142, 0.0109, -0.0027, ..., -0.0125, 0.0167, -0.0003],\n",
+ " [-0.0078, 0.0296, -0.0078, ..., 0.0093, -0.0118, 0.0110]])\n",
+ "embedding: tensor([[ 0.0201, -0.0314, 0.0370, ..., -0.0300, 0.0088, 0.0066],\n",
+ " [-0.0049, -0.0227, 0.0245, ..., 0.0396, 0.0252, 0.0048],\n",
+ " [ 0.0203, -0.0168, -0.0040, ..., -0.0113, 0.0080, -0.0223],\n",
" ...,\n",
- " [ 0.0140, 0.0349, 0.0391, ..., 0.0099, 0.0157, 0.0346],\n",
- " [ 0.0157, -0.0292, -0.0081, ..., -0.0259, 0.0128, -0.0319],\n",
- " [-0.0228, 0.0050, -0.0761, ..., 0.0241, 0.0457, 0.0055]])\n",
+ " [ 0.0155, -0.0287, -0.0404, ..., -0.0340, 0.0017, -0.0127],\n",
+ " [ 0.0521, 0.0061, 0.0186, ..., 0.0376, -0.0038, -0.0133],\n",
+ " [-0.0002, -0.0210, -0.0103, ..., -0.0248, -0.0074, 0.0016]])\n",
"Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.1_gactivity.pkl\n"
]
},
@@ -321,10 +384,43 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "100%|██████████| 6022/6022 [04:44<00:00, 21.20it/s]\n",
- "100%|██████████| 6022/6022 [04:44<00:00, 21.20it/s]\n",
- "100%|██████████| 6022/6022 [04:44<00:00, 21.19it/s]\n",
- "100%|██████████| 6022/6022 [04:44<00:00, 21.19it/s]\n"
+ "100%|██████████| 6022/6022 [05:33<00:00, 18.07it/s]\n",
+ "100%|██████████| 6022/6022 [05:33<00:00, 18.07it/s]\n",
+ "100%|██████████| 6022/6022 [05:33<00:00, 18.06it/s]\n",
+ "100%|██████████| 6022/6022 [05:33<00:00, 18.06it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.3_gactivity.log\n",
+ "Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.3_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=0.3, fair_rho=1, fair_group_feature='activity')\n",
+ "embedding: tensor([[-0.0101, 0.0077, 0.0083, ..., -0.0237, -0.0046, -0.0263],\n",
+ " [-0.0517, -0.0025, 0.0109, ..., 0.0075, 0.0022, 0.0096],\n",
+ " [-0.0096, 0.0165, 0.0082, ..., -0.0288, -0.0132, -0.0031],\n",
+ " ...,\n",
+ " [-0.0091, -0.0151, -0.0066, ..., -0.0048, 0.0118, -0.0152],\n",
+ " [-0.0170, -0.0004, -0.0230, ..., -0.0234, -0.0159, -0.0189],\n",
+ " [-0.0104, -0.0078, 0.0109, ..., -0.0429, 0.0137, -0.0223]])\n",
+ "embedding: tensor([[ 0.0070, -0.0088, -0.0409, ..., 0.0456, 0.0605, -0.0248],\n",
+ " [-0.0273, -0.0198, 0.0072, ..., -0.0096, -0.0234, -0.0383],\n",
+ " [ 0.0005, 0.0166, -0.0016, ..., 0.0284, -0.0067, 0.0398],\n",
+ " ...,\n",
+ " [-0.0356, 0.0130, 0.0279, ..., 0.0351, 0.0064, 0.0055],\n",
+ " [ 0.0172, -0.0301, 0.0401, ..., 0.0386, -0.0076, -0.0128],\n",
+ " [-0.0046, 0.0162, -0.0560, ..., -0.0048, -0.0193, 0.0177]])\n",
+ "Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.3_gactivity.pkl\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 6022/6022 [04:54<00:00, 20.48it/s]\n",
+ "100%|██████████| 6022/6022 [04:53<00:00, 20.49it/s]\n",
+ "100%|██████████| 6022/6022 [04:54<00:00, 20.48it/s]\n",
+ "100%|██████████| 6022/6022 [04:54<00:00, 20.48it/s]\n"
]
},
{
@@ -333,20 +429,20 @@
"text": [
"/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.5_gactivity.log\n",
"Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.5_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=0.5, fair_rho=1, fair_group_feature='activity')\n",
- "embedding: tensor([[ 0.0144, 0.0021, -0.0184, ..., -0.0036, 0.0297, -0.0087],\n",
- " [-0.0140, -0.0014, 0.0128, ..., 0.0392, -0.0321, -0.0193],\n",
- " [-0.0208, -0.0069, -0.0119, ..., -0.0230, 0.0045, 0.0158],\n",
+ "embedding: tensor([[-0.0072, -0.0058, -0.0276, ..., 0.0048, -0.0203, -0.0329],\n",
+ " [ 0.0118, 0.0062, 0.0082, ..., 0.0244, 0.0086, 0.0130],\n",
+ " [ 0.0180, -0.0068, 0.0016, ..., -0.0030, 0.0145, -0.0156],\n",
" ...,\n",
- " [-0.0192, 0.0216, 0.0238, ..., 0.0213, -0.0044, -0.0150],\n",
- " [-0.0077, 0.0215, 0.0014, ..., -0.0385, -0.0016, -0.0058],\n",
- " [ 0.0090, 0.0030, 0.0044, ..., -0.0087, 0.0219, 0.0334]])\n",
- "embedding: tensor([[-0.0258, 0.0063, 0.0372, ..., -0.0105, 0.0158, -0.0025],\n",
- " [ 0.0019, -0.0109, 0.0702, ..., -0.0251, -0.0303, -0.0068],\n",
- " [ 0.0255, -0.0340, 0.0148, ..., -0.0029, 0.0074, 0.0137],\n",
+ " [-0.0199, -0.0149, -0.0132, ..., -0.0184, 0.0253, 0.0148],\n",
+ " [ 0.0090, 0.0136, 0.0135, ..., -0.0026, 0.0217, -0.0137],\n",
+ " [ 0.0047, 0.0287, 0.0039, ..., 0.0067, 0.0079, -0.0066]])\n",
+ "embedding: tensor([[-0.0100, -0.0273, 0.0223, ..., 0.0103, -0.0425, -0.0028],\n",
+ " [ 0.0146, 0.0362, 0.0075, ..., 0.0163, 0.0090, -0.0018],\n",
+ " [-0.0249, 0.0180, 0.0020, ..., -0.0066, 0.0206, -0.0225],\n",
" ...,\n",
- " [ 0.0102, 0.0270, 0.0100, ..., 0.0135, 0.0040, -0.0158],\n",
- " [-0.0086, 0.0208, -0.0234, ..., -0.0394, 0.0322, -0.0169],\n",
- " [-0.0408, -0.0129, 0.0059, ..., -0.0148, -0.0173, 0.0068]])\n",
+ " [-0.0343, 0.0273, 0.0177, ..., 0.0146, -0.0516, 0.0085],\n",
+ " [ 0.0233, -0.0018, -0.0562, ..., 0.0232, 0.0517, 0.0040],\n",
+ " [ 0.0177, 0.0036, -0.0226, ..., -0.0180, -0.0274, -0.0108]])\n",
"Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.5_gactivity.pkl\n"
]
},
@@ -354,43 +450,76 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "100%|██████████| 6022/6022 [04:25<00:00, 22.69it/s]\n",
- "100%|██████████| 6022/6022 [04:25<00:00, 22.69it/s]\n",
- "100%|██████████| 6022/6022 [04:25<00:00, 22.67it/s]\n",
- "100%|██████████| 6022/6022 [04:25<00:00, 22.68it/s]\n"
+ "100%|██████████| 6022/6022 [04:51<00:00, 20.68it/s]\n",
+ "100%|██████████| 6022/6022 [04:51<00:00, 20.68it/s]\n",
+ "100%|██████████| 6022/6022 [04:51<00:00, 20.67it/s]\n",
+ "100%|██████████| 6022/6022 [04:51<00:00, 20.68it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.7_gactivity.log\n",
+ "Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.7_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=0.7, fair_rho=1, fair_group_feature='activity')\n",
+ "embedding: tensor([[ 0.0071, -0.0096, -0.0262, ..., 0.0222, 0.0279, 0.0089],\n",
+ " [ 0.0210, -0.0025, -0.0015, ..., 0.0075, 0.0126, -0.0104],\n",
+ " [-0.0073, 0.0204, 0.0250, ..., 0.0041, -0.0211, 0.0256],\n",
+ " ...,\n",
+ " [ 0.0270, -0.0224, 0.0003, ..., 0.0208, -0.0245, 0.0087],\n",
+ " [-0.0210, 0.0283, -0.0091, ..., 0.0024, -0.0125, -0.0044],\n",
+ " [ 0.0009, -0.0106, 0.0047, ..., -0.0131, 0.0290, -0.0034]])\n",
+ "embedding: tensor([[-0.0387, -0.0245, 0.0051, ..., -0.0139, -0.0011, -0.0350],\n",
+ " [ 0.0020, -0.0126, -0.0110, ..., 0.0032, -0.0308, -0.0253],\n",
+ " [ 0.0205, -0.0028, 0.0146, ..., -0.0130, 0.0075, 0.0127],\n",
+ " ...,\n",
+ " [ 0.0325, 0.0112, 0.0039, ..., 0.0060, 0.0260, 0.0054],\n",
+ " [-0.0383, -0.0022, 0.0120, ..., 0.0256, 0.0104, 0.0527],\n",
+ " [ 0.0649, 0.0089, 0.0103, ..., 0.0008, -0.0032, -0.0037]])\n",
+ "Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.7_gactivity.pkl\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 6022/6022 [05:27<00:00, 18.40it/s]\n",
+ "100%|██████████| 6022/6022 [05:27<00:00, 18.40it/s]\n",
+ "100%|██████████| 6022/6022 [05:27<00:00, 18.38it/s]\n",
+ "100%|██████████| 6022/6022 [05:27<00:00, 18.38it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda1.0_gactivity.log\n",
- "Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda1.0_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=1.0, fair_rho=1, fair_group_feature='activity')\n",
- "embedding: tensor([[ 0.0135, 0.0131, 0.0033, ..., -0.0188, 0.0332, 0.0046],\n",
- " [-0.0096, 0.0008, 0.0132, ..., -0.0060, 0.0073, 0.0151],\n",
- " [ 0.0096, 0.0186, 0.0073, ..., -0.0028, 0.0165, 0.0312],\n",
+ "/home/sl1471/workspace/experiments/ml-1m/logs/f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.9_gactivity.log\n",
+ "Namespace(cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.9_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=0.9, fair_rho=1, fair_group_feature='activity')\n",
+ "embedding: tensor([[ 0.0035, -0.0056, -0.0398, ..., -0.0488, -0.0226, -0.0143],\n",
+ " [-0.0178, -0.0113, -0.0134, ..., 0.0108, 0.0047, -0.0191],\n",
+ " [ 0.0148, -0.0087, -0.0027, ..., -0.0107, -0.0342, 0.0120],\n",
" ...,\n",
- " [-0.0271, 0.0341, 0.0423, ..., 0.0142, 0.0075, 0.0178],\n",
- " [-0.0010, -0.0224, 0.0363, ..., 0.0227, 0.0035, -0.0224],\n",
- " [-0.0320, -0.0299, -0.0160, ..., -0.0191, -0.0078, -0.0090]])\n",
- "embedding: tensor([[-0.0243, -0.0038, -0.0151, ..., -0.0056, 0.0129, -0.0132],\n",
- " [ 0.0051, -0.0411, -0.0140, ..., -0.0107, -0.0103, 0.0025],\n",
- " [ 0.0010, -0.0246, 0.0071, ..., 0.0016, 0.0089, -0.0112],\n",
+ " [-0.0485, 0.0016, 0.0013, ..., -0.0224, -0.0388, -0.0126],\n",
+ " [-0.0109, -0.0148, -0.0105, ..., -0.0271, 0.0075, 0.0242],\n",
+ " [ 0.0612, 0.0190, -0.0064, ..., 0.0193, 0.0064, -0.0010]])\n",
+ "embedding: tensor([[ 0.0309, -0.0134, 0.0277, ..., -0.0086, 0.0225, 0.0306],\n",
+ " [ 0.0365, -0.0488, -0.0017, ..., 0.0233, 0.0298, -0.0201],\n",
+ " [-0.0052, 0.0111, 0.0308, ..., 0.0028, -0.0250, 0.0346],\n",
" ...,\n",
- " [ 0.0146, -0.0193, 0.0085, ..., 0.0155, 0.0319, 0.0339],\n",
- " [ 0.0233, 0.0367, 0.0521, ..., 0.0165, 0.0174, -0.0182],\n",
- " [-0.0059, 0.0076, 0.0377, ..., 0.0185, 0.0260, -0.0117]])\n",
- "Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda1.0_gactivity.pkl\n"
+ " [-0.0480, -0.0043, -0.0128, ..., 0.0334, -0.0083, 0.0398],\n",
+ " [-0.0209, -0.0010, 0.0216, ..., -0.0143, -0.0077, 0.0249],\n",
+ " [ 0.0253, 0.0272, 0.0173, ..., -0.0113, 0.0210, 0.0354]])\n",
+ "Load (checkpoint) from /home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.9_gactivity.pkl\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
- "100%|██████████| 6022/6022 [04:32<00:00, 22.08it/s]\n",
- "100%|██████████| 6022/6022 [04:32<00:00, 22.08it/s]\n",
- "100%|██████████| 6022/6022 [04:32<00:00, 22.06it/s]\n",
- "100%|██████████| 6022/6022 [04:32<00:00, 22.06it/s]\n"
+ "100%|██████████| 6022/6022 [05:06<00:00, 19.68it/s]\n",
+ "100%|██████████| 6022/6022 [05:05<00:00, 19.68it/s]\n",
+ "100%|██████████| 6022/6022 [05:06<00:00, 19.67it/s]\n",
+ "100%|██████████| 6022/6022 [05:06<00:00, 19.67it/s]\n"
]
}
],
@@ -401,7 +530,10 @@
"import torch\n",
"import numpy as np\n",
"\n",
- "metrics = ['F1@10','NDCG@10','F1@50','NDCG@50','AUC']\n",
+ "phase = 'test'\n",
+ "measures = ['RECALL','F1','NDCG']\n",
+ "k_list = [10,50]\n",
+ "metrics = [f'{m}@{k}' for m in measures for k in k_list] + ['AUC']\n",
"# for data_key in data_key_list:\n",
"result_file_path = ROOT + data_key + \"/results/fairness_\" + group_feature + \"_\" + datetime.datetime.now().strftime('%Y%m%d_%H%M%S') + \".csv\"\n",
"with open(result_file_path, 'w') as fout:\n",
@@ -435,7 +567,7 @@
" fout.write('\\t'.join(['all','-','-','group'] + [str(g) for g in uG.values()]) + '\\n')\n",
" count += 1\n",
" # evaluation\n",
- " user_results = get_userwise_performance(model, params['at_k_list'])\n",
+ " user_results = get_userwise_performance(model, k_list, phase)\n",
" for m in metrics:\n",
" fout.write('\\t'.join([modelName,args.fair_group_feature,str(args.fair_lambda),m] + \n",
" [str(user_results[uid][m]) if uid in user_results else '0' for uid in uG]) + '\\n')"
@@ -443,7 +575,7 @@
},
{
"cell_type": "code",
- "execution_count": 34,
+ "execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
@@ -459,7 +591,7 @@
},
{
"cell_type": "code",
- "execution_count": 35,
+ "execution_count": 7,
"metadata": {},
"outputs": [
{
@@ -494,16 +626,16 @@
"
8 | \n",
" 9 | \n",
" ... | \n",
- " 17 | \n",
- " 18 | \n",
- " 19 | \n",
- " 20 | \n",
- " 21 | \n",
- " 22 | \n",
- " 23 | \n",
- " 24 | \n",
- " 25 | \n",
- " 26 | \n",
+ " 55 | \n",
+ " 56 | \n",
+ " 57 | \n",
+ " 58 | \n",
+ " 59 | \n",
+ " 60 | \n",
+ " 61 | \n",
+ " 62 | \n",
+ " 63 | \n",
+ " 64 | \n",
" \n",
" \n",
" \n",
@@ -559,47 +691,47 @@
" 2 | \n",
" fair_lambda | \n",
" - | \n",
- " -0.1 | \n",
- " -0.1 | \n",
- " -0.1 | \n",
- " -0.1 | \n",
- " -0.1 | \n",
- " 0.0 | \n",
- " 0.0 | \n",
- " 0.0 | \n",
+ " -0.7 | \n",
+ " -0.7 | \n",
+ " -0.7 | \n",
+ " -0.7 | \n",
+ " -0.7 | \n",
+ " -0.7 | \n",
+ " -0.7 | \n",
+ " -0.5 | \n",
" ... | \n",
- " 0.5 | \n",
- " 0.5 | \n",
- " 0.5 | \n",
- " 0.5 | \n",
- " 0.5 | \n",
- " 1.0 | \n",
- " 1.0 | \n",
- " 1.0 | \n",
- " 1.0 | \n",
- " 1.0 | \n",
+ " 0.7 | \n",
+ " 0.7 | \n",
+ " 0.7 | \n",
+ " 0.9 | \n",
+ " 0.9 | \n",
+ " 0.9 | \n",
+ " 0.9 | \n",
+ " 0.9 | \n",
+ " 0.9 | \n",
+ " 0.9 | \n",
" \n",
" \n",
" 3 | \n",
" metric | \n",
" group | \n",
+ " RECALL@10 | \n",
+ " RECALL@50 | \n",
" F1@10 | \n",
- " NDCG@10 | \n",
" F1@50 | \n",
+ " NDCG@10 | \n",
" NDCG@50 | \n",
" AUC | \n",
- " F1@10 | \n",
- " NDCG@10 | \n",
- " F1@50 | \n",
+ " RECALL@10 | \n",
" ... | \n",
- " F1@10 | \n",
" NDCG@10 | \n",
- " F1@50 | \n",
" NDCG@50 | \n",
" AUC | \n",
+ " RECALL@10 | \n",
+ " RECALL@50 | \n",
" F1@10 | \n",
- " NDCG@10 | \n",
" F1@50 | \n",
+ " NDCG@10 | \n",
" NDCG@50 | \n",
" AUC | \n",
"
\n",
@@ -609,23 +741,23 @@
" inactive | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.03846153989434242 | \n",
- " 0.11164668947458267 | \n",
- " 0.9680675049636003 | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.03846153989434242 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.9631039046988749 | \n",
+ " 0.0 | \n",
" ... | \n",
" 0.0 | \n",
+ " 0.12895093858242035 | \n",
+ " 0.9680675049636003 | \n",
+ " 0.0 | \n",
+ " 0.5 | \n",
" 0.0 | \n",
" 0.03846153989434242 | \n",
- " 0.12262944132089615 | \n",
- " 0.9669920582395765 | \n",
- " 0.1666666716337204 | \n",
- " 0.2640681564807892 | \n",
- " 0.03846153989434242 | \n",
- " 0.2640681564807892 | \n",
- " 0.978325612177366 | \n",
+ " 0.0 | \n",
+ " 0.1395953744649887 | \n",
+ " 0.9761747187293184 | \n",
" \n",
" \n",
" 5 | \n",
@@ -635,45 +767,45 @@
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.8937123745819399 | \n",
" 0.0 | \n",
" 0.0 | \n",
+ " 0.9117056856187291 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
+ " 0.905685618729097 | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.9109030100334449 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.6861538461538461 | \n",
+ " 0.871571906354515 | \n",
"
\n",
" \n",
" 6 | \n",
" 2 | \n",
" inactive | \n",
+ " 0.0833333358168602 | \n",
+ " 0.0833333358168602 | \n",
" 0.09090909361839294 | \n",
- " 0.22009176015853882 | \n",
- " 0.032258063554763794 | \n",
- " 0.19635792076587677 | \n",
- " 0.783387668725692 | \n",
- " 0.09090909361839294 | \n",
- " 0.22009176015853882 | \n",
" 0.032258063554763794 | \n",
+ " 0.07336392253637314 | \n",
+ " 0.06545264273881912 | \n",
+ " 0.7570064058567834 | \n",
+ " 0.0833333358168602 | \n",
" ... | \n",
- " 0.09090909361839294 | \n",
- " 0.22009176015853882 | \n",
- " 0.032258063554763794 | \n",
- " 0.19635792076587677 | \n",
- " 0.7802705330587967 | \n",
" 0.0 | \n",
+ " 0.04543294385075569 | \n",
+ " 0.7982298101121025 | \n",
+ " 0.0 | \n",
+ " 0.0833333358168602 | \n",
" 0.0 | \n",
" 0.032258063554763794 | \n",
- " 0.0447048544883728 | \n",
- " 0.7856039807824297 | \n",
+ " 0.0 | \n",
+ " 0.04041965305805206 | \n",
+ " 0.8007177991306337 | \n",
"
\n",
" \n",
" 7 | \n",
@@ -683,45 +815,45 @@
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.8746657754010695 | \n",
" 0.0 | \n",
" 0.0 | \n",
+ " 0.8711898395721924 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
+ " 0.8809491978609626 | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.8651737967914439 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.8631016042780748 | \n",
+ " 0.9002673796791444 | \n",
"
\n",
" \n",
" 8 | \n",
" 8 | \n",
" inactive | \n",
" 0.0 | \n",
+ " 0.07692307978868484 | \n",
" 0.0 | \n",
" 0.0317460335791111 | \n",
- " 0.04568304494023323 | \n",
- " 0.7312062937062938 | \n",
" 0.0 | \n",
+ " 0.04668193683028221 | \n",
+ " 0.7485166348802713 | \n",
" 0.0 | \n",
- " 0.0317460335791111 | \n",
" ... | \n",
- " 0.08695652335882187 | \n",
- " 0.06362078338861465 | \n",
- " 0.0317460335791111 | \n",
- " 0.05397642403841019 | \n",
- " 0.6976451578724306 | \n",
" 0.0 | \n",
+ " 0.04668193683028221 | \n",
+ " 0.6992079889807163 | \n",
+ " 0.0 | \n",
+ " 0.07692307978868484 | \n",
" 0.0 | \n",
" 0.0317460335791111 | \n",
- " 0.04668193683028221 | \n",
- " 0.6701896588260224 | \n",
+ " 0.0 | \n",
+ " 0.047794464975595474 | \n",
+ " 0.6717789785971604 | \n",
"
\n",
" \n",
" 9 | \n",
@@ -731,116 +863,104 @@
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.6991292773556652 | \n",
" 0.0 | \n",
" 0.0 | \n",
+ " 0.6895531769360177 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
+ " 0.7531658440093912 | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.7338472630469748 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
- " 0.701772872645259 | \n",
+ " 0.768814818922966 | \n",
"
\n",
" \n",
"\n",
- "10 rows × 27 columns
\n",
+ "10 rows × 65 columns
\n",
""
],
"text/plain": [
- " 0 1 2 3 \\\n",
- "0 model all FairMF FairMF \n",
- "1 fair_group - activity activity \n",
- "2 fair_lambda - -0.1 -0.1 \n",
- "3 metric group F1@10 NDCG@10 \n",
- "4 4 inactive 0.0 0.0 \n",
- "5 1 inactive 0.0 0.0 \n",
- "6 2 inactive 0.09090909361839294 0.22009176015853882 \n",
- "7 3 inactive 0.0 0.0 \n",
- "8 8 inactive 0.0 0.0 \n",
- "9 5 active 0.0 0.0 \n",
+ " 0 1 2 3 \\\n",
+ "0 model all FairMF FairMF \n",
+ "1 fair_group - activity activity \n",
+ "2 fair_lambda - -0.7 -0.7 \n",
+ "3 metric group RECALL@10 RECALL@50 \n",
+ "4 4 inactive 0.0 0.0 \n",
+ "5 1 inactive 0.0 0.0 \n",
+ "6 2 inactive 0.0833333358168602 0.0833333358168602 \n",
+ "7 3 inactive 0.0 0.0 \n",
+ "8 8 inactive 0.0 0.07692307978868484 \n",
+ "9 5 active 0.0 0.0 \n",
"\n",
- " 4 5 6 \\\n",
- "0 FairMF FairMF FairMF \n",
- "1 activity activity activity \n",
- "2 -0.1 -0.1 -0.1 \n",
- "3 F1@50 NDCG@50 AUC \n",
- "4 0.03846153989434242 0.11164668947458267 0.9680675049636003 \n",
- "5 0.0 0.0 0.8937123745819399 \n",
- "6 0.032258063554763794 0.19635792076587677 0.783387668725692 \n",
- "7 0.0 0.0 0.8746657754010695 \n",
- "8 0.0317460335791111 0.04568304494023323 0.7312062937062938 \n",
- "9 0.0 0.0 0.6991292773556652 \n",
+ " 4 5 6 \\\n",
+ "0 FairMF FairMF FairMF \n",
+ "1 activity activity activity \n",
+ "2 -0.7 -0.7 -0.7 \n",
+ "3 F1@10 F1@50 NDCG@10 \n",
+ "4 0.0 0.0 0.0 \n",
+ "5 0.0 0.0 0.0 \n",
+ "6 0.09090909361839294 0.032258063554763794 0.07336392253637314 \n",
+ "7 0.0 0.0 0.0 \n",
+ "8 0.0 0.0317460335791111 0.0 \n",
+ "9 0.0 0.0 0.0 \n",
"\n",
- " 7 8 9 ... \\\n",
- "0 FairMF FairMF FairMF ... \n",
- "1 activity activity activity ... \n",
- "2 0.0 0.0 0.0 ... \n",
- "3 F1@10 NDCG@10 F1@50 ... \n",
- "4 0.0 0.0 0.03846153989434242 ... \n",
- "5 0.0 0.0 0.0 ... \n",
- "6 0.09090909361839294 0.22009176015853882 0.032258063554763794 ... \n",
- "7 0.0 0.0 0.0 ... \n",
- "8 0.0 0.0 0.0317460335791111 ... \n",
- "9 0.0 0.0 0.0 ... \n",
+ " 7 8 9 ... 55 \\\n",
+ "0 FairMF FairMF FairMF ... FairMF \n",
+ "1 activity activity activity ... activity \n",
+ "2 -0.7 -0.7 -0.5 ... 0.7 \n",
+ "3 NDCG@50 AUC RECALL@10 ... NDCG@10 \n",
+ "4 0.0 0.9631039046988749 0.0 ... 0.0 \n",
+ "5 0.0 0.9117056856187291 0.0 ... 0.0 \n",
+ "6 0.06545264273881912 0.7570064058567834 0.0833333358168602 ... 0.0 \n",
+ "7 0.0 0.8711898395721924 0.0 ... 0.0 \n",
+ "8 0.04668193683028221 0.7485166348802713 0.0 ... 0.0 \n",
+ "9 0.0 0.6895531769360177 0.0 ... 0.0 \n",
"\n",
- " 17 18 19 \\\n",
- "0 FairMF FairMF FairMF \n",
- "1 activity activity activity \n",
- "2 0.5 0.5 0.5 \n",
- "3 F1@10 NDCG@10 F1@50 \n",
- "4 0.0 0.0 0.03846153989434242 \n",
- "5 0.0 0.0 0.0 \n",
- "6 0.09090909361839294 0.22009176015853882 0.032258063554763794 \n",
- "7 0.0 0.0 0.0 \n",
- "8 0.08695652335882187 0.06362078338861465 0.0317460335791111 \n",
- "9 0.0 0.0 0.0 \n",
+ " 56 57 58 59 \\\n",
+ "0 FairMF FairMF FairMF FairMF \n",
+ "1 activity activity activity activity \n",
+ "2 0.7 0.7 0.9 0.9 \n",
+ "3 NDCG@50 AUC RECALL@10 RECALL@50 \n",
+ "4 0.12895093858242035 0.9680675049636003 0.0 0.5 \n",
+ "5 0.0 0.905685618729097 0.0 0.0 \n",
+ "6 0.04543294385075569 0.7982298101121025 0.0 0.0833333358168602 \n",
+ "7 0.0 0.8809491978609626 0.0 0.0 \n",
+ "8 0.04668193683028221 0.6992079889807163 0.0 0.07692307978868484 \n",
+ "9 0.0 0.7531658440093912 0.0 0.0 \n",
"\n",
- " 20 21 22 \\\n",
- "0 FairMF FairMF FairMF \n",
- "1 activity activity activity \n",
- "2 0.5 0.5 1.0 \n",
- "3 NDCG@50 AUC F1@10 \n",
- "4 0.12262944132089615 0.9669920582395765 0.1666666716337204 \n",
- "5 0.0 0.9109030100334449 0.0 \n",
- "6 0.19635792076587677 0.7802705330587967 0.0 \n",
- "7 0.0 0.8651737967914439 0.0 \n",
- "8 0.05397642403841019 0.6976451578724306 0.0 \n",
- "9 0.0 0.7338472630469748 0.0 \n",
+ " 60 61 62 63 \\\n",
+ "0 FairMF FairMF FairMF FairMF \n",
+ "1 activity activity activity activity \n",
+ "2 0.9 0.9 0.9 0.9 \n",
+ "3 F1@10 F1@50 NDCG@10 NDCG@50 \n",
+ "4 0.0 0.03846153989434242 0.0 0.1395953744649887 \n",
+ "5 0.0 0.0 0.0 0.0 \n",
+ "6 0.0 0.032258063554763794 0.0 0.04041965305805206 \n",
+ "7 0.0 0.0 0.0 0.0 \n",
+ "8 0.0 0.0317460335791111 0.0 0.047794464975595474 \n",
+ "9 0.0 0.0 0.0 0.0 \n",
"\n",
- " 23 24 25 \\\n",
- "0 FairMF FairMF FairMF \n",
- "1 activity activity activity \n",
- "2 1.0 1.0 1.0 \n",
- "3 NDCG@10 F1@50 NDCG@50 \n",
- "4 0.2640681564807892 0.03846153989434242 0.2640681564807892 \n",
- "5 0.0 0.0 0.0 \n",
- "6 0.0 0.032258063554763794 0.0447048544883728 \n",
- "7 0.0 0.0 0.0 \n",
- "8 0.0 0.0317460335791111 0.04668193683028221 \n",
- "9 0.0 0.0 0.0 \n",
- "\n",
- " 26 \n",
+ " 64 \n",
"0 FairMF \n",
"1 activity \n",
- "2 1.0 \n",
+ "2 0.9 \n",
"3 AUC \n",
- "4 0.978325612177366 \n",
- "5 0.6861538461538461 \n",
- "6 0.7856039807824297 \n",
- "7 0.8631016042780748 \n",
- "8 0.6701896588260224 \n",
- "9 0.701772872645259 \n",
+ "4 0.9761747187293184 \n",
+ "5 0.871571906354515 \n",
+ "6 0.8007177991306337 \n",
+ "7 0.9002673796791444 \n",
+ "8 0.6717789785971604 \n",
+ "9 0.768814818922966 \n",
"\n",
- "[10 rows x 27 columns]"
+ "[10 rows x 65 columns]"
]
},
- "execution_count": 35,
+ "execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
@@ -853,7 +973,7 @@
},
{
"cell_type": "code",
- "execution_count": 36,
+ "execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
@@ -863,21 +983,21 @@
},
{
"cell_type": "code",
- "execution_count": 37,
+ "execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "100%|██████████| 2/2 [00:00<00:00, 27.54it/s]"
+ "100%|██████████| 2/2 [00:00<00:00, 14.34it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "{'active': {'FairMF-activity--0.1-F1@10': 0.04788724746782362, 'FairMF-activity--0.1-NDCG@10': 0.12004315365372666, 'FairMF-activity--0.1-F1@50': 0.0895838829577562, 'FairMF-activity--0.1-NDCG@50': 0.11788520608245535, 'FairMF-activity--0.1-AUC': 0.7751625785683649, 'FairMF-activity-0.0-F1@10': 0.04803834901010959, 'FairMF-activity-0.0-NDCG@10': 0.1202911107941711, 'FairMF-activity-0.0-F1@50': 0.08984669020068424, 'FairMF-activity-0.0-NDCG@50': 0.118057916258568, 'FairMF-activity-0.0-AUC': 0.776730031319056, 'FairMF-activity-0.1-F1@10': 0.04819667332556188, 'FairMF-activity-0.1-NDCG@10': 0.12075651478941307, 'FairMF-activity-0.1-F1@50': 0.09028496139285103, 'FairMF-activity-0.1-NDCG@50': 0.11863349908542886, 'FairMF-activity-0.1-AUC': 0.7779999268475992, 'FairMF-activity-0.5-F1@10': 0.04818783592215346, 'FairMF-activity-0.5-NDCG@10': 0.12068575711955443, 'FairMF-activity-0.5-F1@50': 0.09022910579129935, 'FairMF-activity-0.5-NDCG@50': 0.11819612358397846, 'FairMF-activity-0.5-AUC': 0.7825138848686926, 'FairMF-activity-1.0-F1@10': 0.04461496372852939, 'FairMF-activity-1.0-NDCG@10': 0.11317628383715526, 'FairMF-activity-1.0-F1@50': 0.08942004081049554, 'FairMF-activity-1.0-NDCG@50': 0.11521379407149411, 'FairMF-activity-1.0-AUC': 0.7682345567194494}, 'inactive': {'FairMF-activity--0.1-F1@10': 0.030976919205631934, 'FairMF-activity--0.1-NDCG@10': 0.041360288327129846, 'FairMF-activity--0.1-F1@50': 0.034506369477594015, 'FairMF-activity--0.1-NDCG@50': 0.08510886718750231, 'FairMF-activity--0.1-AUC': 0.8426082354244728, 'FairMF-activity-0.0-F1@10': 0.030205917939749034, 'FairMF-activity-0.0-NDCG@10': 0.04040198094363025, 'FairMF-activity-0.0-F1@50': 0.03459582420627449, 'FairMF-activity-0.0-NDCG@50': 0.08514570754542784, 'FairMF-activity-0.0-AUC': 0.843454465963513, 'FairMF-activity-0.1-F1@10': 0.03008767640983998, 'FairMF-activity-0.1-NDCG@10': 0.04031534223545569, 'FairMF-activity-0.1-F1@50': 0.034683430380984176, 'FairMF-activity-0.1-NDCG@50': 0.0852466344406546, 'FairMF-activity-0.1-AUC': 0.844230879736925, 'FairMF-activity-0.5-F1@10': 0.027632753146150015, 'FairMF-activity-0.5-NDCG@10': 0.0368171666183995, 'FairMF-activity-0.5-F1@50': 0.035241210293353455, 'FairMF-activity-0.5-NDCG@50': 0.08402029521122183, 'FairMF-activity-0.5-AUC': 0.8467967044414492, 'FairMF-activity-1.0-F1@10': 0.027764541362402143, 'FairMF-activity-1.0-NDCG@10': 0.03395063753343591, 'FairMF-activity-1.0-F1@50': 0.0330052497889689, 'FairMF-activity-1.0-NDCG@50': 0.07639648443403554, 'FairMF-activity-1.0-AUC': 0.8305386013174151}}\n"
+ "{'active': {'FairMF-activity--0.7-RECALL@10': 0.03168997032399875, 'FairMF-activity--0.7-RECALL@50': 0.11281246733592344, 'FairMF-activity--0.7-F1@10': 0.04736566817195251, 'FairMF-activity--0.7-F1@50': 0.0876078152283038, 'FairMF-activity--0.7-NDCG@10': 0.11827505801258416, 'FairMF-activity--0.7-NDCG@50': 0.11566177255348042, 'FairMF-activity--0.7-AUC': 0.7650679279047291, 'FairMF-activity--0.5-RECALL@10': 0.03201709352458385, 'FairMF-activity--0.5-RECALL@50': 0.113215869476411, 'FairMF-activity--0.5-F1@10': 0.04783080723186071, 'FairMF-activity--0.5-F1@50': 0.0879031938715623, 'FairMF-activity--0.5-NDCG@10': 0.11760060914473446, 'FairMF-activity--0.5-NDCG@50': 0.11530137017260575, 'FairMF-activity--0.5-AUC': 0.7688613738463135, 'FairMF-activity--0.3-RECALL@10': 0.03230175644737379, 'FairMF-activity--0.3-RECALL@50': 0.11408731027824967, 'FairMF-activity--0.3-F1@10': 0.04829150305107355, 'FairMF-activity--0.3-F1@50': 0.08864572253868735, 'FairMF-activity--0.3-NDCG@10': 0.1192854175635611, 'FairMF-activity--0.3-NDCG@50': 0.11649011308895497, 'FairMF-activity--0.3-AUC': 0.7722617076934682, 'FairMF-activity--0.1-RECALL@10': 0.03202131496623791, 'FairMF-activity--0.1-RECALL@50': 0.11510055193810943, 'FairMF-activity--0.1-F1@10': 0.04788724746782362, 'FairMF-activity--0.1-F1@50': 0.0895838829577562, 'FairMF-activity--0.1-NDCG@10': 0.12004315365372666, 'FairMF-activity--0.1-NDCG@50': 0.11788520608245535, 'FairMF-activity--0.1-AUC': 0.7751625785683649, 'FairMF-activity-0.1-RECALL@10': 0.03223638626492387, 'FairMF-activity-0.1-RECALL@50': 0.11574099375582263, 'FairMF-activity-0.1-F1@10': 0.04819667332556188, 'FairMF-activity-0.1-F1@50': 0.09028496139285103, 'FairMF-activity-0.1-NDCG@10': 0.12075651478941307, 'FairMF-activity-0.1-NDCG@50': 0.11863349908542886, 'FairMF-activity-0.1-AUC': 0.7779999268475992, 'FairMF-activity-0.3-RECALL@10': 0.031558192643863135, 'FairMF-activity-0.3-RECALL@50': 0.11529113031943533, 'FairMF-activity-0.3-F1@10': 0.04728444444573922, 'FairMF-activity-0.3-F1@50': 0.08998536549864303, 'FairMF-activity-0.3-NDCG@10': 0.11872620567165572, 'FairMF-activity-0.3-NDCG@50': 0.11764470098011531, 'FairMF-activity-0.3-AUC': 0.7800082930341399, 'FairMF-activity-0.5-RECALL@10': 0.03206556548317524, 'FairMF-activity-0.5-RECALL@50': 0.1156525433379712, 'FairMF-activity-0.5-F1@10': 0.04818783592215346, 'FairMF-activity-0.5-F1@50': 0.09022910579129935, 'FairMF-activity-0.5-NDCG@10': 0.12068575711955443, 'FairMF-activity-0.5-NDCG@50': 0.11819612358397846, 'FairMF-activity-0.5-AUC': 0.7825138848686926, 'FairMF-activity-0.7-RECALL@10': 0.03170375237661347, 'FairMF-activity-0.7-RECALL@50': 0.11536526066159696, 'FairMF-activity-0.7-F1@10': 0.047681693161593194, 'FairMF-activity-0.7-F1@50': 0.09005156433017089, 'FairMF-activity-0.7-NDCG@10': 0.12000241896201824, 'FairMF-activity-0.7-NDCG@50': 0.11769677276429115, 'FairMF-activity-0.7-AUC': 0.7836893578134864, 'FairMF-activity-0.9-RECALL@10': 0.03015118532366952, 'FairMF-activity-0.9-RECALL@50': 0.11461960117601906, 'FairMF-activity-0.9-F1@10': 0.04553247108185955, 'FairMF-activity-0.9-F1@50': 0.08941733787325395, 'FairMF-activity-0.9-NDCG@10': 0.11622596493371286, 'FairMF-activity-0.9-NDCG@50': 0.11581673727220107, 'FairMF-activity-0.9-AUC': 0.7838655006975198}, 'inactive': {'FairMF-activity--0.7-RECALL@10': 0.0442119355626172, 'FairMF-activity--0.7-RECALL@50': 0.16641216505033427, 'FairMF-activity--0.7-F1@10': 0.030582529333065985, 'FairMF-activity--0.7-F1@50': 0.03392924434026572, 'FairMF-activity--0.7-NDCG@10': 0.04021494217344837, 'FairMF-activity--0.7-NDCG@50': 0.08346181038829233, 'FairMF-activity--0.7-AUC': 0.8360932252441239, 'FairMF-activity--0.5-RECALL@10': 0.045027548918653175, 'FairMF-activity--0.5-RECALL@50': 0.16567511399831927, 'FairMF-activity--0.5-F1@10': 0.031061464972417654, 'FairMF-activity--0.5-F1@50': 0.03400075667422262, 'FairMF-activity--0.5-NDCG@10': 0.04057005202680906, 'FairMF-activity--0.5-NDCG@50': 0.08328927789583121, 'FairMF-activity--0.5-AUC': 0.8382657346456331, 'FairMF-activity--0.3-RECALL@10': 0.04536559651741982, 'FairMF-activity--0.3-RECALL@50': 0.16672438466306871, 'FairMF-activity--0.3-F1@10': 0.03093934972230899, 'FairMF-activity--0.3-F1@50': 0.03411902506818425, 'FairMF-activity--0.3-NDCG@10': 0.04039719102353556, 'FairMF-activity--0.3-NDCG@50': 0.08340662918986691, 'FairMF-activity--0.3-AUC': 0.8404746424113221, 'FairMF-activity--0.1-RECALL@10': 0.04522339725029016, 'FairMF-activity--0.1-RECALL@50': 0.1690464536237319, 'FairMF-activity--0.1-F1@10': 0.030976919205631934, 'FairMF-activity--0.1-F1@50': 0.034506369477594015, 'FairMF-activity--0.1-NDCG@10': 0.041360288327129846, 'FairMF-activity--0.1-NDCG@50': 0.08510886718750231, 'FairMF-activity--0.1-AUC': 0.8426082354244728, 'FairMF-activity-0.1-RECALL@10': 0.043735175377538245, 'FairMF-activity-0.1-RECALL@50': 0.170627260754902, 'FairMF-activity-0.1-F1@10': 0.03008767640983998, 'FairMF-activity-0.1-F1@50': 0.034683430380984176, 'FairMF-activity-0.1-NDCG@10': 0.04031534223545569, 'FairMF-activity-0.1-NDCG@50': 0.0852466344406546, 'FairMF-activity-0.1-AUC': 0.844230879736925, 'FairMF-activity-0.3-RECALL@10': 0.0422658992452641, 'FairMF-activity-0.3-RECALL@50': 0.172139141943638, 'FairMF-activity-0.3-F1@10': 0.02902053588321885, 'FairMF-activity-0.3-F1@50': 0.03488443586286468, 'FairMF-activity-0.3-NDCG@10': 0.03887263822337986, 'FairMF-activity-0.3-NDCG@50': 0.08492939229689922, 'FairMF-activity-0.3-AUC': 0.8456137490750278, 'FairMF-activity-0.5-RECALL@10': 0.04105153666340501, 'FairMF-activity-0.5-RECALL@50': 0.172941732855416, 'FairMF-activity-0.5-F1@10': 0.027632753146150015, 'FairMF-activity-0.5-F1@50': 0.035241210293353455, 'FairMF-activity-0.5-NDCG@10': 0.0368171666183995, 'FairMF-activity-0.5-NDCG@50': 0.08402029521122183, 'FairMF-activity-0.5-AUC': 0.8467967044414492, 'FairMF-activity-0.7-RECALL@10': 0.0365454569865979, 'FairMF-activity-0.7-RECALL@50': 0.17151095363535915, 'FairMF-activity-0.7-F1@10': 0.024865569769687804, 'FairMF-activity-0.7-F1@50': 0.03510887001060059, 'FairMF-activity-0.7-NDCG@10': 0.0338236169269588, 'FairMF-activity-0.7-NDCG@50': 0.0823813596682284, 'FairMF-activity-0.7-AUC': 0.8457193098911433, 'FairMF-activity-0.9-RECALL@10': 0.03182227203227599, 'FairMF-activity-0.9-RECALL@50': 0.16347840156226967, 'FairMF-activity-0.9-F1@10': 0.020826791682147103, 'FairMF-activity-0.9-F1@50': 0.033946553614384055, 'FairMF-activity-0.9-NDCG@10': 0.02914872616421407, 'FairMF-activity-0.9-NDCG@50': 0.07696885403478912, 'FairMF-activity-0.9-AUC': 0.8382559839247209}}\n"
]
},
{
@@ -903,7 +1023,7 @@
},
{
"cell_type": "code",
- "execution_count": 38,
+ "execution_count": 10,
"metadata": {
"scrolled": false
},
@@ -912,31 +1032,69 @@
"name": "stdout",
"output_type": "stream",
"text": [
+ "FairMF-activity--0.7-RECALL@10\t: 0.012521965238618447\t [0.03168997032399875, 0.0442119355626172]\n",
+ "FairMF-activity--0.7-RECALL@50\t: 0.053599697714410824\t [0.11281246733592344, 0.16641216505033427]\n",
+ "FairMF-activity--0.7-F1@10\t: 0.016783138838886522\t [0.04736566817195251, 0.030582529333065985]\n",
+ "FairMF-activity--0.7-F1@50\t: 0.053678570888038075\t [0.0876078152283038, 0.03392924434026572]\n",
+ "FairMF-activity--0.7-NDCG@10\t: 0.07806011583913579\t [0.11827505801258416, 0.04021494217344837]\n",
+ "FairMF-activity--0.7-NDCG@50\t: 0.0321999621651881\t [0.11566177255348042, 0.08346181038829233]\n",
+ "FairMF-activity--0.7-AUC\t: 0.07102529733939478\t [0.7650679279047291, 0.8360932252441239]\n",
+ "FairMF-activity--0.5-RECALL@10\t: 0.013010455394069323\t [0.03201709352458385, 0.045027548918653175]\n",
+ "FairMF-activity--0.5-RECALL@50\t: 0.05245924452190827\t [0.113215869476411, 0.16567511399831927]\n",
+ "FairMF-activity--0.5-F1@10\t: 0.016769342259443053\t [0.04783080723186071, 0.031061464972417654]\n",
+ "FairMF-activity--0.5-F1@50\t: 0.05390243719733968\t [0.0879031938715623, 0.03400075667422262]\n",
+ "FairMF-activity--0.5-NDCG@10\t: 0.07703055711792539\t [0.11760060914473446, 0.04057005202680906]\n",
+ "FairMF-activity--0.5-NDCG@50\t: 0.03201209227677454\t [0.11530137017260575, 0.08328927789583121]\n",
+ "FairMF-activity--0.5-AUC\t: 0.06940436079931966\t [0.7688613738463135, 0.8382657346456331]\n",
+ "FairMF-activity--0.3-RECALL@10\t: 0.013063840070046032\t [0.03230175644737379, 0.04536559651741982]\n",
+ "FairMF-activity--0.3-RECALL@50\t: 0.052637074384819044\t [0.11408731027824967, 0.16672438466306871]\n",
+ "FairMF-activity--0.3-F1@10\t: 0.01735215332876456\t [0.04829150305107355, 0.03093934972230899]\n",
+ "FairMF-activity--0.3-F1@50\t: 0.05452669747050311\t [0.08864572253868735, 0.03411902506818425]\n",
+ "FairMF-activity--0.3-NDCG@10\t: 0.07888822654002554\t [0.1192854175635611, 0.04039719102353556]\n",
+ "FairMF-activity--0.3-NDCG@50\t: 0.033083483899088065\t [0.11649011308895497, 0.08340662918986691]\n",
+ "FairMF-activity--0.3-AUC\t: 0.06821293471785383\t [0.7722617076934682, 0.8404746424113221]\n",
+ "FairMF-activity--0.1-RECALL@10\t: 0.013202082284052251\t [0.03202131496623791, 0.04522339725029016]\n",
+ "FairMF-activity--0.1-RECALL@50\t: 0.05394590168562248\t [0.11510055193810943, 0.1690464536237319]\n",
"FairMF-activity--0.1-F1@10\t: 0.016910328262191687\t [0.04788724746782362, 0.030976919205631934]\n",
- "FairMF-activity--0.1-NDCG@10\t: 0.07868286532659681\t [0.12004315365372666, 0.041360288327129846]\n",
"FairMF-activity--0.1-F1@50\t: 0.05507751348016218\t [0.0895838829577562, 0.034506369477594015]\n",
+ "FairMF-activity--0.1-NDCG@10\t: 0.07868286532659681\t [0.12004315365372666, 0.041360288327129846]\n",
"FairMF-activity--0.1-NDCG@50\t: 0.032776338894953044\t [0.11788520608245535, 0.08510886718750231]\n",
"FairMF-activity--0.1-AUC\t: 0.06744565685610793\t [0.7751625785683649, 0.8426082354244728]\n",
- "FairMF-activity-0.0-F1@10\t: 0.017832431070360553\t [0.04803834901010959, 0.030205917939749034]\n",
- "FairMF-activity-0.0-NDCG@10\t: 0.07988912985054085\t [0.1202911107941711, 0.04040198094363025]\n",
- "FairMF-activity-0.0-F1@50\t: 0.05525086599440975\t [0.08984669020068424, 0.03459582420627449]\n",
- "FairMF-activity-0.0-NDCG@50\t: 0.032912208713140156\t [0.118057916258568, 0.08514570754542784]\n",
- "FairMF-activity-0.0-AUC\t: 0.06672443464445699\t [0.776730031319056, 0.843454465963513]\n",
+ "FairMF-activity-0.1-RECALL@10\t: 0.011498789112614372\t [0.03223638626492387, 0.043735175377538245]\n",
+ "FairMF-activity-0.1-RECALL@50\t: 0.05488626699907938\t [0.11574099375582263, 0.170627260754902]\n",
"FairMF-activity-0.1-F1@10\t: 0.0181089969157219\t [0.04819667332556188, 0.03008767640983998]\n",
- "FairMF-activity-0.1-NDCG@10\t: 0.08044117255395739\t [0.12075651478941307, 0.04031534223545569]\n",
"FairMF-activity-0.1-F1@50\t: 0.05560153101186685\t [0.09028496139285103, 0.034683430380984176]\n",
+ "FairMF-activity-0.1-NDCG@10\t: 0.08044117255395739\t [0.12075651478941307, 0.04031534223545569]\n",
"FairMF-activity-0.1-NDCG@50\t: 0.033386864644774264\t [0.11863349908542886, 0.0852466344406546]\n",
"FairMF-activity-0.1-AUC\t: 0.06623095288932579\t [0.7779999268475992, 0.844230879736925]\n",
+ "FairMF-activity-0.3-RECALL@10\t: 0.010707706601400968\t [0.031558192643863135, 0.0422658992452641]\n",
+ "FairMF-activity-0.3-RECALL@50\t: 0.056848011624202666\t [0.11529113031943533, 0.172139141943638]\n",
+ "FairMF-activity-0.3-F1@10\t: 0.01826390856252037\t [0.04728444444573922, 0.02902053588321885]\n",
+ "FairMF-activity-0.3-F1@50\t: 0.055100929635778347\t [0.08998536549864303, 0.03488443586286468]\n",
+ "FairMF-activity-0.3-NDCG@10\t: 0.07985356744827586\t [0.11872620567165572, 0.03887263822337986]\n",
+ "FairMF-activity-0.3-NDCG@50\t: 0.03271530868321609\t [0.11764470098011531, 0.08492939229689922]\n",
+ "FairMF-activity-0.3-AUC\t: 0.06560545604088797\t [0.7800082930341399, 0.8456137490750278]\n",
+ "FairMF-activity-0.5-RECALL@10\t: 0.008985971180229771\t [0.03206556548317524, 0.04105153666340501]\n",
+ "FairMF-activity-0.5-RECALL@50\t: 0.0572891895174448\t [0.1156525433379712, 0.172941732855416]\n",
"FairMF-activity-0.5-F1@10\t: 0.020555082776003448\t [0.04818783592215346, 0.027632753146150015]\n",
- "FairMF-activity-0.5-NDCG@10\t: 0.08386859050115493\t [0.12068575711955443, 0.0368171666183995]\n",
"FairMF-activity-0.5-F1@50\t: 0.054987895497945895\t [0.09022910579129935, 0.035241210293353455]\n",
+ "FairMF-activity-0.5-NDCG@10\t: 0.08386859050115493\t [0.12068575711955443, 0.0368171666183995]\n",
"FairMF-activity-0.5-NDCG@50\t: 0.034175828372756636\t [0.11819612358397846, 0.08402029521122183]\n",
"FairMF-activity-0.5-AUC\t: 0.06428281957275661\t [0.7825138848686926, 0.8467967044414492]\n",
- "FairMF-activity-1.0-F1@10\t: 0.016850422366127247\t [0.04461496372852939, 0.027764541362402143]\n",
- "FairMF-activity-1.0-NDCG@10\t: 0.07922564630371935\t [0.11317628383715526, 0.03395063753343591]\n",
- "FairMF-activity-1.0-F1@50\t: 0.05641479102152664\t [0.08942004081049554, 0.0330052497889689]\n",
- "FairMF-activity-1.0-NDCG@50\t: 0.038817309637458566\t [0.11521379407149411, 0.07639648443403554]\n",
- "FairMF-activity-1.0-AUC\t: 0.06230404459796568\t [0.7682345567194494, 0.8305386013174151]\n"
+ "FairMF-activity-0.7-RECALL@10\t: 0.004841704609984426\t [0.03170375237661347, 0.0365454569865979]\n",
+ "FairMF-activity-0.7-RECALL@50\t: 0.05614569297376219\t [0.11536526066159696, 0.17151095363535915]\n",
+ "FairMF-activity-0.7-F1@10\t: 0.02281612339190539\t [0.047681693161593194, 0.024865569769687804]\n",
+ "FairMF-activity-0.7-F1@50\t: 0.0549426943195703\t [0.09005156433017089, 0.03510887001060059]\n",
+ "FairMF-activity-0.7-NDCG@10\t: 0.08617880203505944\t [0.12000241896201824, 0.0338236169269588]\n",
+ "FairMF-activity-0.7-NDCG@50\t: 0.035315413096062745\t [0.11769677276429115, 0.0823813596682284]\n",
+ "FairMF-activity-0.7-AUC\t: 0.062029952077656936\t [0.7836893578134864, 0.8457193098911433]\n",
+ "FairMF-activity-0.9-RECALL@10\t: 0.0016710867086064743\t [0.03015118532366952, 0.03182227203227599]\n",
+ "FairMF-activity-0.9-RECALL@50\t: 0.04885880038625061\t [0.11461960117601906, 0.16347840156226967]\n",
+ "FairMF-activity-0.9-F1@10\t: 0.02470567939971245\t [0.04553247108185955, 0.020826791682147103]\n",
+ "FairMF-activity-0.9-F1@50\t: 0.0554707842588699\t [0.08941733787325395, 0.033946553614384055]\n",
+ "FairMF-activity-0.9-NDCG@10\t: 0.08707723876949879\t [0.11622596493371286, 0.02914872616421407]\n",
+ "FairMF-activity-0.9-NDCG@50\t: 0.03884788323741195\t [0.11581673727220107, 0.07696885403478912]\n",
+ "FairMF-activity-0.9-AUC\t: 0.05439048322720108\t [0.7838655006975198, 0.8382559839247209]\n"
]
}
],
diff --git a/Recommendation Performance.ipynb b/Recommendation Performance.ipynb
index 9a873cf..7766c60 100644
--- a/Recommendation Performance.ipynb
+++ b/Recommendation Performance.ipynb
@@ -12,9 +12,10 @@
"parentdir = os.path.dirname(currentdir)\n",
"sys.path.insert(0,parentdir) \n",
"\n",
- "# data_key = 'ml-1m/'\n",
+ "data_key = 'ml-1m/'\n",
"# data_key = 'amz_Books/'\n",
- "data_key = 'amz_Movies_and_TV/'\n",
+ "# data_key = 'amz_Movies_and_TV/'\n",
+ "# data_key = 'amz_Electronics/'\n",
"PROCESSED_DATA_ROOT = \"/home/sl1471/workspace/experiments/\"\n",
"target_path = PROCESSED_DATA_ROOT + data_key"
]
@@ -37,14 +38,128 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "36it [00:01, 35.55it/s]"
+ "9it [00:00, 76.04it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "dict_keys([0, 1, 2, 3, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 32, 33, 35])\n"
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.5_gactivity.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.1_gGender.log\n",
+ "f2rec_train_and_eval_FedMF_lr0.01_reg0.1_losspairwisebpr_local1_fedavg.log\n",
+ "f2rec_train_and_eval_FedMF_lr0.003_reg0.1_losspairwisebpr_local3_fedavg.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda1.0_gGender.log\n",
+ "f2rec_train_and_eval_FedMF_lr0.001_reg0.1_losspairwisebpr_local1_fedavg.log\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\r",
+ "17it [00:00, 76.81it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "f2rec_train_and_eval_MF_lr0.00003_reg0.1_losspairwisebpr.log\n",
+ "f2rec_train_and_eval_MF_lr0.00001_reg0.1_losspairwisebpr.log\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "30it [00:00, 52.47it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "f2rec_train_and_eval_MF_lr0.0001_reg0.1_losspairwisebpr.log\n",
+ "f2rec_train_and_eval_FedMF_lr0.0003_reg0.1_losspairwisebpr_local1_fedavg.log\n",
+ "f2rec_train_and_eval_FedMF_lr0.01_reg0.1_losspairwisebpr_local3_fedavg.log\n",
+ "f2rec_train_and_eval_FedMF_lr0.0003_reg0.1_losspairwisebpr_local5_fedavg.log\n",
+ "f2rec_train_and_eval_MF_lr0.00001_reg1.0_losspairwisebpr.log\n",
+ "f2rec_train_and_eval_MF_lr0.00003_reg0_losspairwisebpr.log\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "45it [00:01, 36.06it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "f2rec_train_and_eval_FedMF_lr0.003_reg0.1_losspairwisebpr_local1_fedavg.log\n",
+ "f2rec_train_and_eval_MF_lr0.0001_reg1.0_losspairwisebpr.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.3_gactivity.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.1_gactivity.log\n",
+ "f2rec_train_and_eval_FedMF_lr0.001_reg0.1_losspairwisebpr_local3_fedavg.log\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\r",
+ "50it [00:01, 32.09it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "f2rec_train_and_eval_MF_lr0.0001_reg0_losspairwisebpr.log\n",
+ "f2rec_train_and_eval_MF_lr0.00001_reg0_losspairwisebpr.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.1_gAge.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.1_gAge.log\n",
+ "f2rec_train_and_eval_FedMF_lr0.0001_reg0.1_losspairwisebpr_local1_fedavg.log\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\r",
+ "56it [00:01, 34.60it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0_gGender.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.1_gactivity.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda1.0_gactivity.log\n",
+ "f2rec_train_and_eval_FedMF_lr0.0001_reg0.1_losspairwisebpr_local5_fedavg.log\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "72it [00:01, 43.94it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0_gactivity.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0.7_gactivity.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda0_gAge.log\n",
+ "f2rec_train_and_eval_FairMF_lr0.00003_reg0.1_losspairwisebpr_lambda-0.1_gGender.log\n",
+ "f2rec_train_and_eval_MF_lr0.00003_reg1.0_losspairwisebpr.log\n",
+ "dict_keys([1, 8, 15, 16, 19, 21, 23, 29, 30, 31, 32, 34, 38, 39, 41, 44, 45, 46, 47, 49, 51, 55, 56, 57, 59, 66, 69, 70, 71])\n"
]
},
{
@@ -58,8 +173,6 @@
"source": [
"from utils import extract_results\n",
"log_path = target_path + \"logs/\"\n",
- "# results = extract_results(log_path, ['n_interest', 'threshold_c'])\n",
- "# results = extract_results(log_path, ['n_interest'])\n",
"results = extract_results(log_path, ['lr', 'l2_coef', 'fair_group_feature', 'fair_lambda', 'fair_noise_sigma', 'n_local_step'], \"f2rec_train_and_eval\")\n",
"print(results.keys())"
]
@@ -78,97 +191,97 @@
"text": [
"Example:\n",
"{\n",
- " \"args\": \"cuda=3, seed=19, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/amz_Movies_and_TV/models/f2rec_FedMF_lr0.01_reg0.1_pairwisebpr_local1_fedavg.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, device_dropout_p=0.1, device_dropout_type='same', n_local_step=1, random_local_step=False, aggregation_func='fedavg', mitigation_trade_off=1.0, elastic_mu=0.01, data_file='/home/sl1471/workspace/experiments/amz_Movies_and_TV/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/amz_Movies_and_TV/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/amz_Movies_and_TV/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/amz_Movies_and_TV/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/amz_Movies_and_TV/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/amz_Movies_and_TV/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/amz_Movies_and_TV/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='SGD', epoch=40, check_epoch=1, lr=0.01, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=0.5, test_sample_p=1.0, stop_metric='_AUC', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1,\",\n",
- " \"model_name\": \"FedMF\",\n",
- " \"lr\": 0.01,\n",
+ " \"args\": \"cuda=2, seed=29, train=False, train_and_eval=True, continuous_train=False, eval=False, model_path='/home/sl1471/workspace/experiments/ml-1m/models/f2rec_FairMF_lr0.00003_reg0.1_pairwisebpr_lambda0.5_gactivity.pkl', loss='pairwisebpr', l2_coef=0.1, emb_size=32, data_file='/home/sl1471/workspace/experiments/ml-1m/tsv_data/', n_worker=4, user_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/user.meta', item_meta_data='/home/sl1471/workspace/experiments/ml-1m/meta_data/item.meta', user_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.meta', item_fields_meta_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.meta', user_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/user_fields.vocab', item_fields_vocab_file='/home/sl1471/workspace/experiments/ml-1m/meta_data/item_fields.vocab', n_neg=1, n_neg_val=100, n_neg_test=-1, n_round=1, optimizer='Adam', epoch=30, check_epoch=1, lr=3e-05, batch_size=256, eval_batch_size=1, temper=6, with_val=True, val_sample_p=1.0, test_sample_p=1.0, stop_metric='_NDCG@50', pin_memory=False, at_k=[1, 5, 10, 20, 50], n_eval_process=1, fair_lambda=0.5, fair_rho=1, fair_group_feature='activity',\",\n",
+ " \"model_name\": \"MF\",\n",
+ " \"lr\": 3e-05,\n",
" \"l2_coef\": 0.1,\n",
- " \"fair_group_feature\": \"NaN\",\n",
- " \"fair_lambda\": \"NaN\",\n",
+ " \"fair_group_feature\": \"activity\",\n",
+ " \"fair_lambda\": 0.5,\n",
" \"fair_noise_sigma\": \"NaN\",\n",
- " \"n_local_step\": 1,\n",
+ " \"n_local_step\": \"NaN\",\n",
" \"HR@1\": [\n",
- " 0.00747493163172288\n",
+ " 0.06858186648953836\n",
" ],\n",
" \"P@1\": [\n",
- " 0.00747493163172288\n",
+ " 0.06858186648953836\n",
" ],\n",
" \"RECALL@1\": [\n",
- " 0.0010341418818753203\n",
+ " 0.005869701477952304\n",
" ],\n",
" \"F1@1\": [\n",
- " 0.0017525567106882224\n",
+ " 0.009771999251468608\n",
" ],\n",
" \"NDCG@1\": [\n",
- " 0.00747493163172288\n",
+ " 0.06858186648953836\n",
" ],\n",
" \"HR@5\": [\n",
- " 0.03609845031905196\n",
+ " 0.2092328130189306\n",
" ],\n",
" \"P@5\": [\n",
- " 0.009845032054615108\n",
+ " 0.05881766959584381\n",
" ],\n",
" \"RECALL@5\": [\n",
- " 0.006226766596352146\n",
+ " 0.0219579737583823\n",
" ],\n",
" \"F1@5\": [\n",
- " 0.006892276030125516\n",
+ " 0.02528280524595117\n",
" ],\n",
" \"NDCG@5\": [\n",
- " 0.009898451592776594\n",
+ " 0.06318684952653393\n",
" ],\n",
" \"HR@10\": [\n",
- " 0.06946216955332725\n",
+ " 0.3027233477250083\n",
" ],\n",
" \"P@10\": [\n",
- " 0.00929808584580991\n",
+ " 0.05292261804988201\n",
" ],\n",
" \"RECALL@10\": [\n",
- " 0.011543219648437438\n",
+ " 0.03823875757427629\n",
" ],\n",
" \"F1@10\": [\n",
- " 0.009103384933204355\n",
+ " 0.03406688317483924\n",
" ],\n",
" \"NDCG@10\": [\n",
- " 0.011741163862110162\n",
+ " 0.06306962312698088\n",
" ],\n",
" \"HR@20\": [\n",
- " 0.1309024612579763\n",
+ " 0.44337429425440056\n",
" ],\n",
" \"P@20\": [\n",
- " 0.01042844140554083\n",
+ " 0.049178014771981284\n",
" ],\n",
" \"RECALL@20\": [\n",
- " 0.027579905640897608\n",
+ " 0.07501739317508571\n",
" ],\n",
" \"F1@20\": [\n",
- " 0.013533679318827397\n",
+ " 0.04616553749971411\n",
" ],\n",
" \"NDCG@20\": [\n",
- " 0.018424931326804644\n",
+ " 0.07136765470631155\n",
" ],\n",
" \"HR@50\": [\n",
- " 0.22260711030082042\n",
+ " 0.6328462304882099\n",
" ],\n",
" \"P@50\": [\n",
- " 0.008215132029684652\n",
+ " 0.03985054756578755\n",
" ],\n",
" \"RECALL@50\": [\n",
- " 0.05335067739419863\n",
+ " 0.15500913201842106\n",
" ],\n",
" \"F1@50\": [\n",
- " 0.013018028142818725\n",
+ " 0.05245346253739663\n",
" ],\n",
" \"NDCG@50\": [\n",
- " 0.027437968108439674\n",
+ " 0.09471797646041583\n",
" ],\n",
" \"MR\": [\n",
- " 710.5788100384318\n",
+ " 76.159751144686\n",
" ],\n",
" \"MRR\": [\n",
- " 0.0068026606860800785\n",
+ " 0.021771233552693246\n",
" ],\n",
" \"AUC\": [\n",
- " 0.6969213234012142\n",
+ " 0.8266749555691079\n",
" ]\n",
"}\n"
]
@@ -219,7 +332,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Dir exists: '/home/sl1471/workspace/experiments/amz_Movies_and_TV/results/'\n"
+ "Dir exists: '/home/sl1471/workspace/experiments/ml-1m/results/'\n"
]
}
],
@@ -234,18 +347,1229 @@
"df.to_csv(result_file_path, sep = '\\t')"
]
},
+ {
+ "cell_type": "markdown",
+ "id": "2adceabe",
+ "metadata": {},
+ "source": [
+ "## Plots"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b8c9d8da",
+ "metadata": {},
+ "source": [
+ "### Lambda"
+ ]
+ },
{
"cell_type": "code",
- "execution_count": null,
- "id": "4e4b7267",
+ "execution_count": 9,
+ "id": "fc79d054",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " args | \n",
+ " model_name | \n",
+ " lr | \n",
+ " l2_coef | \n",
+ " fair_group_feature | \n",
+ " fair_lambda | \n",
+ " fair_noise_sigma | \n",
+ " n_local_step | \n",
+ " HR@1 | \n",
+ " P@1 | \n",
+ " ... | \n",
+ " F1@20 | \n",
+ " NDCG@20 | \n",
+ " HR@50 | \n",
+ " P@50 | \n",
+ " RECALL@50 | \n",
+ " F1@50 | \n",
+ " NDCG@50 | \n",
+ " MR | \n",
+ " MRR | \n",
+ " AUC | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " 0.5 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.068582 | \n",
+ " 0.068582 | \n",
+ " ... | \n",
+ " 0.046166 | \n",
+ " 0.071368 | \n",
+ " 0.632846 | \n",
+ " 0.039851 | \n",
+ " 0.155009 | \n",
+ " 0.052453 | \n",
+ " 0.094718 | \n",
+ " 76.159751 | \n",
+ " 0.021771 | \n",
+ " 0.826675 | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " cuda=1, seed=19, train=False, train_and_eval=T... | \n",
+ " FedMF | \n",
+ " 0.00300 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 3 | \n",
+ " 0.066423 | \n",
+ " 0.066423 | \n",
+ " ... | \n",
+ " 0.043330 | \n",
+ " 0.067499 | \n",
+ " 0.598306 | \n",
+ " 0.037018 | \n",
+ " 0.141261 | \n",
+ " 0.048423 | \n",
+ " 0.088329 | \n",
+ " 101.560559 | \n",
+ " 0.020070 | \n",
+ " 0.766201 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " cuda=2, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " Gender | \n",
+ " 1.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.070907 | \n",
+ " 0.070907 | \n",
+ " ... | \n",
+ " 0.047562 | \n",
+ " 0.075499 | \n",
+ " 0.637662 | \n",
+ " 0.040136 | \n",
+ " 0.160273 | \n",
+ " 0.053017 | \n",
+ " 0.098994 | \n",
+ " 78.587273 | \n",
+ " 0.023570 | \n",
+ " 0.819796 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " cuda=2, seed=19, train=False, train_and_eval=T... | \n",
+ " FedMF | \n",
+ " 0.00100 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1 | \n",
+ " 0.064430 | \n",
+ " 0.064430 | \n",
+ " ... | \n",
+ " 0.043431 | \n",
+ " 0.066723 | \n",
+ " 0.597310 | \n",
+ " 0.036881 | \n",
+ " 0.140313 | \n",
+ " 0.048246 | \n",
+ " 0.087327 | \n",
+ " 103.807928 | \n",
+ " 0.019719 | \n",
+ " 0.761074 | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " cuda=3, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.066838 | \n",
+ " 0.066838 | \n",
+ " ... | \n",
+ " 0.040208 | \n",
+ " 0.063383 | \n",
+ " 0.613417 | \n",
+ " 0.038331 | \n",
+ " 0.146105 | \n",
+ " 0.050242 | \n",
+ " 0.088579 | \n",
+ " 88.060760 | \n",
+ " 0.020043 | \n",
+ " 0.810460 | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " cuda=3, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00001 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.048572 | \n",
+ " 0.048572 | \n",
+ " ... | \n",
+ " 0.036301 | \n",
+ " 0.055018 | \n",
+ " 0.581368 | \n",
+ " 0.034000 | \n",
+ " 0.120554 | \n",
+ " 0.043783 | \n",
+ " 0.074811 | \n",
+ " 105.109896 | \n",
+ " 0.016306 | \n",
+ " 0.779343 | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " cuda=3, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00010 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.072816 | \n",
+ " 0.072816 | \n",
+ " ... | \n",
+ " 0.044626 | \n",
+ " 0.070860 | \n",
+ " 0.613168 | \n",
+ " 0.038060 | \n",
+ " 0.148177 | \n",
+ " 0.050241 | \n",
+ " 0.093307 | \n",
+ " 85.632481 | \n",
+ " 0.022509 | \n",
+ " 0.813692 | \n",
+ "
\n",
+ " \n",
+ " 29 | \n",
+ " cuda=2, seed=19, train=False, train_and_eval=T... | \n",
+ " FedMF | \n",
+ " 0.00030 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1 | \n",
+ " 0.056460 | \n",
+ " 0.056460 | \n",
+ " ... | \n",
+ " 0.042102 | \n",
+ " 0.063283 | \n",
+ " 0.597144 | \n",
+ " 0.036390 | \n",
+ " 0.138362 | \n",
+ " 0.047650 | \n",
+ " 0.084244 | \n",
+ " 111.311681 | \n",
+ " 0.018173 | \n",
+ " 0.745807 | \n",
+ "
\n",
+ " \n",
+ " 30 | \n",
+ " cuda=1, seed=19, train=False, train_and_eval=T... | \n",
+ " FedMF | \n",
+ " 0.01000 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 3 | \n",
+ " 0.058784 | \n",
+ " 0.058784 | \n",
+ " ... | \n",
+ " 0.043660 | \n",
+ " 0.066233 | \n",
+ " 0.599469 | \n",
+ " 0.036778 | \n",
+ " 0.141029 | \n",
+ " 0.048138 | \n",
+ " 0.086796 | \n",
+ " 101.439389 | \n",
+ " 0.019163 | \n",
+ " 0.766446 | \n",
+ "
\n",
+ " \n",
+ " 31 | \n",
+ " cuda=1, seed=19, train=False, train_and_eval=T... | \n",
+ " FedMF | \n",
+ " 0.00030 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 5 | \n",
+ " 0.067586 | \n",
+ " 0.067586 | \n",
+ " ... | \n",
+ " 0.042064 | \n",
+ " 0.065302 | \n",
+ " 0.599801 | \n",
+ " 0.036921 | \n",
+ " 0.141175 | \n",
+ " 0.048308 | \n",
+ " 0.087170 | \n",
+ " 102.570915 | \n",
+ " 0.019655 | \n",
+ " 0.763850 | \n",
+ "
\n",
+ " \n",
+ " 32 | \n",
+ " cuda=3, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00001 | \n",
+ " 1.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.048987 | \n",
+ " 0.048987 | \n",
+ " ... | \n",
+ " 0.036854 | \n",
+ " 0.055570 | \n",
+ " 0.571156 | \n",
+ " 0.034034 | \n",
+ " 0.120417 | \n",
+ " 0.043732 | \n",
+ " 0.074782 | \n",
+ " 102.073324 | \n",
+ " 0.016043 | \n",
+ " 0.785295 | \n",
+ "
\n",
+ " \n",
+ " 34 | \n",
+ " cuda=3, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.038525 | \n",
+ " 0.038525 | \n",
+ " ... | \n",
+ " 0.024759 | \n",
+ " 0.041919 | \n",
+ " 0.526403 | \n",
+ " 0.031531 | \n",
+ " 0.110079 | \n",
+ " 0.039852 | \n",
+ " 0.065007 | \n",
+ " 95.821704 | \n",
+ " 0.014938 | \n",
+ " 0.796111 | \n",
+ "
\n",
+ " \n",
+ " 38 | \n",
+ " cuda=2, seed=19, train=False, train_and_eval=T... | \n",
+ " FedMF | \n",
+ " 0.00300 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1 | \n",
+ " 0.067918 | \n",
+ " 0.067918 | \n",
+ " ... | \n",
+ " 0.043169 | \n",
+ " 0.067350 | \n",
+ " 0.595898 | \n",
+ " 0.036843 | \n",
+ " 0.140132 | \n",
+ " 0.048169 | \n",
+ " 0.088002 | \n",
+ " 102.666916 | \n",
+ " 0.020191 | \n",
+ " 0.763786 | \n",
+ "
\n",
+ " \n",
+ " 39 | \n",
+ " cuda=3, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00010 | \n",
+ " 1.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.065178 | \n",
+ " 0.065178 | \n",
+ " ... | \n",
+ " 0.042057 | \n",
+ " 0.064812 | \n",
+ " 0.590418 | \n",
+ " 0.037164 | \n",
+ " 0.138205 | \n",
+ " 0.048377 | \n",
+ " 0.086210 | \n",
+ " 102.124333 | \n",
+ " 0.019064 | \n",
+ " 0.785940 | \n",
+ "
\n",
+ " \n",
+ " 41 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " 0.3 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.073065 | \n",
+ " 0.073065 | \n",
+ " ... | \n",
+ " 0.046049 | \n",
+ " 0.071955 | \n",
+ " 0.631020 | \n",
+ " 0.039628 | \n",
+ " 0.154345 | \n",
+ " 0.052132 | \n",
+ " 0.095170 | \n",
+ " 76.568376 | \n",
+ " 0.022294 | \n",
+ " 0.825078 | \n",
+ "
\n",
+ " \n",
+ " 44 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.075888 | \n",
+ " 0.075888 | \n",
+ " ... | \n",
+ " 0.046232 | \n",
+ " 0.072910 | \n",
+ " 0.632680 | \n",
+ " 0.039628 | \n",
+ " 0.153447 | \n",
+ " 0.052088 | \n",
+ " 0.095697 | \n",
+ " 77.132306 | \n",
+ " 0.022828 | \n",
+ " 0.823499 | \n",
+ "
\n",
+ " \n",
+ " 45 | \n",
+ " cuda=1, seed=19, train=False, train_and_eval=T... | \n",
+ " FedMF | \n",
+ " 0.00100 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 3 | \n",
+ " 0.060113 | \n",
+ " 0.060113 | \n",
+ " ... | \n",
+ " 0.042778 | \n",
+ " 0.065596 | \n",
+ " 0.596480 | \n",
+ " 0.036928 | \n",
+ " 0.140450 | \n",
+ " 0.048270 | \n",
+ " 0.086677 | \n",
+ " 101.905480 | \n",
+ " 0.019148 | \n",
+ " 0.765395 | \n",
+ "
\n",
+ " \n",
+ " 46 | \n",
+ " cuda=3, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00010 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.013617 | \n",
+ " 0.013617 | \n",
+ " ... | \n",
+ " 0.007669 | \n",
+ " 0.015222 | \n",
+ " 0.195948 | \n",
+ " 0.012433 | \n",
+ " 0.038308 | \n",
+ " 0.013953 | \n",
+ " 0.022954 | \n",
+ " 95.726770 | \n",
+ " 0.007679 | \n",
+ " 0.802866 | \n",
+ "
\n",
+ " \n",
+ " 47 | \n",
+ " cuda=3, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00001 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.041764 | \n",
+ " 0.041764 | \n",
+ " ... | \n",
+ " 0.033527 | \n",
+ " 0.050398 | \n",
+ " 0.564098 | \n",
+ " 0.032044 | \n",
+ " 0.111659 | \n",
+ " 0.041043 | \n",
+ " 0.069065 | \n",
+ " 107.054728 | \n",
+ " 0.015015 | \n",
+ " 0.776493 | \n",
+ "
\n",
+ " \n",
+ " 49 | \n",
+ " cuda=2, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " Age | \n",
+ " -0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.074726 | \n",
+ " 0.074726 | \n",
+ " ... | \n",
+ " 0.046312 | \n",
+ " 0.073483 | \n",
+ " 0.638160 | \n",
+ " 0.039220 | \n",
+ " 0.155998 | \n",
+ " 0.052003 | \n",
+ " 0.096918 | \n",
+ " 77.508152 | \n",
+ " 0.023794 | \n",
+ " 0.821338 | \n",
+ "
\n",
+ " \n",
+ " 51 | \n",
+ " cuda=2, seed=19, train=False, train_and_eval=T... | \n",
+ " FedMF | \n",
+ " 0.00010 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1 | \n",
+ " 0.067419 | \n",
+ " 0.067419 | \n",
+ " ... | \n",
+ " 0.039983 | \n",
+ " 0.063697 | \n",
+ " 0.586848 | \n",
+ " 0.032763 | \n",
+ " 0.127363 | \n",
+ " 0.043263 | \n",
+ " 0.081222 | \n",
+ " 142.006245 | \n",
+ " 0.018861 | \n",
+ " 0.688310 | \n",
+ "
\n",
+ " \n",
+ " 55 | \n",
+ " cuda=2, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " Gender | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.054965 | \n",
+ " 0.054965 | \n",
+ " ... | \n",
+ " 0.042423 | \n",
+ " 0.065703 | \n",
+ " 0.644138 | \n",
+ " 0.037466 | \n",
+ " 0.151432 | \n",
+ " 0.049559 | \n",
+ " 0.089664 | \n",
+ " 80.228796 | \n",
+ " 0.020679 | \n",
+ " 0.815622 | \n",
+ "
\n",
+ " \n",
+ " 56 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " -0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.075556 | \n",
+ " 0.075556 | \n",
+ " ... | \n",
+ " 0.046070 | \n",
+ " 0.072908 | \n",
+ " 0.635005 | \n",
+ " 0.039303 | \n",
+ " 0.152160 | \n",
+ " 0.051747 | \n",
+ " 0.095368 | \n",
+ " 77.756452 | \n",
+ " 0.022846 | \n",
+ " 0.821496 | \n",
+ "
\n",
+ " \n",
+ " 57 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " 1.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.058452 | \n",
+ " 0.058452 | \n",
+ " ... | \n",
+ " 0.043155 | \n",
+ " 0.065792 | \n",
+ " 0.622551 | \n",
+ " 0.038811 | \n",
+ " 0.145112 | \n",
+ " 0.050664 | \n",
+ " 0.088547 | \n",
+ " 84.239693 | \n",
+ " 0.019396 | \n",
+ " 0.811036 | \n",
+ "
\n",
+ " \n",
+ " 59 | \n",
+ " cuda=1, seed=19, train=False, train_and_eval=T... | \n",
+ " FedMF | \n",
+ " 0.00010 | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 5 | \n",
+ " 0.068084 | \n",
+ " 0.068084 | \n",
+ " ... | \n",
+ " 0.041640 | \n",
+ " 0.064878 | \n",
+ " 0.597310 | \n",
+ " 0.036835 | \n",
+ " 0.139636 | \n",
+ " 0.048162 | \n",
+ " 0.086652 | \n",
+ " 105.918481 | \n",
+ " 0.019377 | \n",
+ " 0.756618 | \n",
+ "
\n",
+ " \n",
+ " 66 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.075556 | \n",
+ " 0.075556 | \n",
+ " ... | \n",
+ " 0.046104 | \n",
+ " 0.072716 | \n",
+ " 0.634009 | \n",
+ " 0.039469 | \n",
+ " 0.152966 | \n",
+ " 0.051890 | \n",
+ " 0.095448 | \n",
+ " 77.485304 | \n",
+ " 0.022833 | \n",
+ " 0.822568 | \n",
+ "
\n",
+ " \n",
+ " 69 | \n",
+ " cuda=2, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " Age | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.054965 | \n",
+ " 0.054965 | \n",
+ " ... | \n",
+ " 0.042423 | \n",
+ " 0.065703 | \n",
+ " 0.644138 | \n",
+ " 0.037466 | \n",
+ " 0.151432 | \n",
+ " 0.049559 | \n",
+ " 0.089664 | \n",
+ " 80.228796 | \n",
+ " 0.020679 | \n",
+ " 0.815622 | \n",
+ "
\n",
+ " \n",
+ " 70 | \n",
+ " cuda=2, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " Gender | \n",
+ " -0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.069910 | \n",
+ " 0.069910 | \n",
+ " ... | \n",
+ " 0.046319 | \n",
+ " 0.072994 | \n",
+ " 0.639156 | \n",
+ " 0.039313 | \n",
+ " 0.156522 | \n",
+ " 0.052165 | \n",
+ " 0.096782 | \n",
+ " 77.245593 | \n",
+ " 0.023645 | \n",
+ " 0.821809 | \n",
+ "
\n",
+ " \n",
+ " 71 | \n",
+ " cuda=3, seed=19, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 1.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.057207 | \n",
+ " 0.057207 | \n",
+ " ... | \n",
+ " 0.038632 | \n",
+ " 0.059676 | \n",
+ " 0.582946 | \n",
+ " 0.035354 | \n",
+ " 0.127351 | \n",
+ " 0.045721 | \n",
+ " 0.080073 | \n",
+ " 101.548925 | \n",
+ " 0.017884 | \n",
+ " 0.786067 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
29 rows × 36 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " args model_name lr \\\n",
+ "1 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "8 cuda=1, seed=19, train=False, train_and_eval=T... FedMF 0.00300 \n",
+ "15 cuda=2, seed=19, train=False, train_and_eval=T... MF 0.00003 \n",
+ "16 cuda=2, seed=19, train=False, train_and_eval=T... FedMF 0.00100 \n",
+ "19 cuda=3, seed=19, train=False, train_and_eval=T... MF 0.00003 \n",
+ "21 cuda=3, seed=19, train=False, train_and_eval=T... MF 0.00001 \n",
+ "23 cuda=3, seed=19, train=False, train_and_eval=T... MF 0.00010 \n",
+ "29 cuda=2, seed=19, train=False, train_and_eval=T... FedMF 0.00030 \n",
+ "30 cuda=1, seed=19, train=False, train_and_eval=T... FedMF 0.01000 \n",
+ "31 cuda=1, seed=19, train=False, train_and_eval=T... FedMF 0.00030 \n",
+ "32 cuda=3, seed=19, train=False, train_and_eval=T... MF 0.00001 \n",
+ "34 cuda=3, seed=19, train=False, train_and_eval=T... MF 0.00003 \n",
+ "38 cuda=2, seed=19, train=False, train_and_eval=T... FedMF 0.00300 \n",
+ "39 cuda=3, seed=19, train=False, train_and_eval=T... MF 0.00010 \n",
+ "41 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "44 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "45 cuda=1, seed=19, train=False, train_and_eval=T... FedMF 0.00100 \n",
+ "46 cuda=3, seed=19, train=False, train_and_eval=T... MF 0.00010 \n",
+ "47 cuda=3, seed=19, train=False, train_and_eval=T... MF 0.00001 \n",
+ "49 cuda=2, seed=19, train=False, train_and_eval=T... MF 0.00003 \n",
+ "51 cuda=2, seed=19, train=False, train_and_eval=T... FedMF 0.00010 \n",
+ "55 cuda=2, seed=19, train=False, train_and_eval=T... MF 0.00003 \n",
+ "56 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "57 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "59 cuda=1, seed=19, train=False, train_and_eval=T... FedMF 0.00010 \n",
+ "66 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "69 cuda=2, seed=19, train=False, train_and_eval=T... MF 0.00003 \n",
+ "70 cuda=2, seed=19, train=False, train_and_eval=T... MF 0.00003 \n",
+ "71 cuda=3, seed=19, train=False, train_and_eval=T... MF 0.00003 \n",
+ "\n",
+ " l2_coef fair_group_feature fair_lambda fair_noise_sigma n_local_step \\\n",
+ "1 0.1 activity 0.5 NaN NaN \n",
+ "8 0.1 NaN NaN NaN 3 \n",
+ "15 0.1 Gender 1.0 NaN NaN \n",
+ "16 0.1 NaN NaN NaN 1 \n",
+ "19 0.1 NaN NaN NaN NaN \n",
+ "21 0.1 NaN NaN NaN NaN \n",
+ "23 0.1 NaN NaN NaN NaN \n",
+ "29 0.1 NaN NaN NaN 1 \n",
+ "30 0.1 NaN NaN NaN 3 \n",
+ "31 0.1 NaN NaN NaN 5 \n",
+ "32 1.0 NaN NaN NaN NaN \n",
+ "34 0.0 NaN NaN NaN NaN \n",
+ "38 0.1 NaN NaN NaN 1 \n",
+ "39 1.0 NaN NaN NaN NaN \n",
+ "41 0.1 activity 0.3 NaN NaN \n",
+ "44 0.1 activity 0.1 NaN NaN \n",
+ "45 0.1 NaN NaN NaN 3 \n",
+ "46 0.0 NaN NaN NaN NaN \n",
+ "47 0.0 NaN NaN NaN NaN \n",
+ "49 0.1 Age -0.1 NaN NaN \n",
+ "51 0.1 NaN NaN NaN 1 \n",
+ "55 0.1 Gender 0.0 NaN NaN \n",
+ "56 0.1 activity -0.1 NaN NaN \n",
+ "57 0.1 activity 1.0 NaN NaN \n",
+ "59 0.1 NaN NaN NaN 5 \n",
+ "66 0.1 activity 0.0 NaN NaN \n",
+ "69 0.1 Age 0.0 NaN NaN \n",
+ "70 0.1 Gender -0.1 NaN NaN \n",
+ "71 1.0 NaN NaN NaN NaN \n",
+ "\n",
+ " HR@1 P@1 ... F1@20 NDCG@20 HR@50 P@50 \\\n",
+ "1 0.068582 0.068582 ... 0.046166 0.071368 0.632846 0.039851 \n",
+ "8 0.066423 0.066423 ... 0.043330 0.067499 0.598306 0.037018 \n",
+ "15 0.070907 0.070907 ... 0.047562 0.075499 0.637662 0.040136 \n",
+ "16 0.064430 0.064430 ... 0.043431 0.066723 0.597310 0.036881 \n",
+ "19 0.066838 0.066838 ... 0.040208 0.063383 0.613417 0.038331 \n",
+ "21 0.048572 0.048572 ... 0.036301 0.055018 0.581368 0.034000 \n",
+ "23 0.072816 0.072816 ... 0.044626 0.070860 0.613168 0.038060 \n",
+ "29 0.056460 0.056460 ... 0.042102 0.063283 0.597144 0.036390 \n",
+ "30 0.058784 0.058784 ... 0.043660 0.066233 0.599469 0.036778 \n",
+ "31 0.067586 0.067586 ... 0.042064 0.065302 0.599801 0.036921 \n",
+ "32 0.048987 0.048987 ... 0.036854 0.055570 0.571156 0.034034 \n",
+ "34 0.038525 0.038525 ... 0.024759 0.041919 0.526403 0.031531 \n",
+ "38 0.067918 0.067918 ... 0.043169 0.067350 0.595898 0.036843 \n",
+ "39 0.065178 0.065178 ... 0.042057 0.064812 0.590418 0.037164 \n",
+ "41 0.073065 0.073065 ... 0.046049 0.071955 0.631020 0.039628 \n",
+ "44 0.075888 0.075888 ... 0.046232 0.072910 0.632680 0.039628 \n",
+ "45 0.060113 0.060113 ... 0.042778 0.065596 0.596480 0.036928 \n",
+ "46 0.013617 0.013617 ... 0.007669 0.015222 0.195948 0.012433 \n",
+ "47 0.041764 0.041764 ... 0.033527 0.050398 0.564098 0.032044 \n",
+ "49 0.074726 0.074726 ... 0.046312 0.073483 0.638160 0.039220 \n",
+ "51 0.067419 0.067419 ... 0.039983 0.063697 0.586848 0.032763 \n",
+ "55 0.054965 0.054965 ... 0.042423 0.065703 0.644138 0.037466 \n",
+ "56 0.075556 0.075556 ... 0.046070 0.072908 0.635005 0.039303 \n",
+ "57 0.058452 0.058452 ... 0.043155 0.065792 0.622551 0.038811 \n",
+ "59 0.068084 0.068084 ... 0.041640 0.064878 0.597310 0.036835 \n",
+ "66 0.075556 0.075556 ... 0.046104 0.072716 0.634009 0.039469 \n",
+ "69 0.054965 0.054965 ... 0.042423 0.065703 0.644138 0.037466 \n",
+ "70 0.069910 0.069910 ... 0.046319 0.072994 0.639156 0.039313 \n",
+ "71 0.057207 0.057207 ... 0.038632 0.059676 0.582946 0.035354 \n",
+ "\n",
+ " RECALL@50 F1@50 NDCG@50 MR MRR AUC \n",
+ "1 0.155009 0.052453 0.094718 76.159751 0.021771 0.826675 \n",
+ "8 0.141261 0.048423 0.088329 101.560559 0.020070 0.766201 \n",
+ "15 0.160273 0.053017 0.098994 78.587273 0.023570 0.819796 \n",
+ "16 0.140313 0.048246 0.087327 103.807928 0.019719 0.761074 \n",
+ "19 0.146105 0.050242 0.088579 88.060760 0.020043 0.810460 \n",
+ "21 0.120554 0.043783 0.074811 105.109896 0.016306 0.779343 \n",
+ "23 0.148177 0.050241 0.093307 85.632481 0.022509 0.813692 \n",
+ "29 0.138362 0.047650 0.084244 111.311681 0.018173 0.745807 \n",
+ "30 0.141029 0.048138 0.086796 101.439389 0.019163 0.766446 \n",
+ "31 0.141175 0.048308 0.087170 102.570915 0.019655 0.763850 \n",
+ "32 0.120417 0.043732 0.074782 102.073324 0.016043 0.785295 \n",
+ "34 0.110079 0.039852 0.065007 95.821704 0.014938 0.796111 \n",
+ "38 0.140132 0.048169 0.088002 102.666916 0.020191 0.763786 \n",
+ "39 0.138205 0.048377 0.086210 102.124333 0.019064 0.785940 \n",
+ "41 0.154345 0.052132 0.095170 76.568376 0.022294 0.825078 \n",
+ "44 0.153447 0.052088 0.095697 77.132306 0.022828 0.823499 \n",
+ "45 0.140450 0.048270 0.086677 101.905480 0.019148 0.765395 \n",
+ "46 0.038308 0.013953 0.022954 95.726770 0.007679 0.802866 \n",
+ "47 0.111659 0.041043 0.069065 107.054728 0.015015 0.776493 \n",
+ "49 0.155998 0.052003 0.096918 77.508152 0.023794 0.821338 \n",
+ "51 0.127363 0.043263 0.081222 142.006245 0.018861 0.688310 \n",
+ "55 0.151432 0.049559 0.089664 80.228796 0.020679 0.815622 \n",
+ "56 0.152160 0.051747 0.095368 77.756452 0.022846 0.821496 \n",
+ "57 0.145112 0.050664 0.088547 84.239693 0.019396 0.811036 \n",
+ "59 0.139636 0.048162 0.086652 105.918481 0.019377 0.756618 \n",
+ "66 0.152966 0.051890 0.095448 77.485304 0.022833 0.822568 \n",
+ "69 0.151432 0.049559 0.089664 80.228796 0.020679 0.815622 \n",
+ "70 0.156522 0.052165 0.096782 77.245593 0.023645 0.821809 \n",
+ "71 0.127351 0.045721 0.080073 101.548925 0.017884 0.786067 \n",
+ "\n",
+ "[29 rows x 36 columns]"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "22ce1d41",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/sl1471/anaconda3/envs/edgecdr/lib/python3.7/site-packages/ipykernel_launcher.py:3: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n",
+ " This is separate from the ipykernel package so we can avoid doing imports until\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " args | \n",
+ " model_name | \n",
+ " lr | \n",
+ " l2_coef | \n",
+ " fair_group_feature | \n",
+ " fair_lambda | \n",
+ " fair_noise_sigma | \n",
+ " n_local_step | \n",
+ " HR@1 | \n",
+ " P@1 | \n",
+ " ... | \n",
+ " F1@20 | \n",
+ " NDCG@20 | \n",
+ " HR@50 | \n",
+ " P@50 | \n",
+ " RECALL@50 | \n",
+ " F1@50 | \n",
+ " NDCG@50 | \n",
+ " MR | \n",
+ " MRR | \n",
+ " AUC | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " 0.5 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.068582 | \n",
+ " 0.068582 | \n",
+ " ... | \n",
+ " 0.046166 | \n",
+ " 0.071368 | \n",
+ " 0.632846 | \n",
+ " 0.039851 | \n",
+ " 0.155009 | \n",
+ " 0.052453 | \n",
+ " 0.094718 | \n",
+ " 76.159751 | \n",
+ " 0.021771 | \n",
+ " 0.826675 | \n",
+ "
\n",
+ " \n",
+ " 41 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " 0.3 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.073065 | \n",
+ " 0.073065 | \n",
+ " ... | \n",
+ " 0.046049 | \n",
+ " 0.071955 | \n",
+ " 0.631020 | \n",
+ " 0.039628 | \n",
+ " 0.154345 | \n",
+ " 0.052132 | \n",
+ " 0.095170 | \n",
+ " 76.568376 | \n",
+ " 0.022294 | \n",
+ " 0.825078 | \n",
+ "
\n",
+ " \n",
+ " 44 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " 0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.075888 | \n",
+ " 0.075888 | \n",
+ " ... | \n",
+ " 0.046232 | \n",
+ " 0.072910 | \n",
+ " 0.632680 | \n",
+ " 0.039628 | \n",
+ " 0.153447 | \n",
+ " 0.052088 | \n",
+ " 0.095697 | \n",
+ " 77.132306 | \n",
+ " 0.022828 | \n",
+ " 0.823499 | \n",
+ "
\n",
+ " \n",
+ " 56 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " -0.1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.075556 | \n",
+ " 0.075556 | \n",
+ " ... | \n",
+ " 0.046070 | \n",
+ " 0.072908 | \n",
+ " 0.635005 | \n",
+ " 0.039303 | \n",
+ " 0.152160 | \n",
+ " 0.051747 | \n",
+ " 0.095368 | \n",
+ " 77.756452 | \n",
+ " 0.022846 | \n",
+ " 0.821496 | \n",
+ "
\n",
+ " \n",
+ " 57 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " 1.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.058452 | \n",
+ " 0.058452 | \n",
+ " ... | \n",
+ " 0.043155 | \n",
+ " 0.065792 | \n",
+ " 0.622551 | \n",
+ " 0.038811 | \n",
+ " 0.145112 | \n",
+ " 0.050664 | \n",
+ " 0.088547 | \n",
+ " 84.239693 | \n",
+ " 0.019396 | \n",
+ " 0.811036 | \n",
+ "
\n",
+ " \n",
+ " 66 | \n",
+ " cuda=2, seed=29, train=False, train_and_eval=T... | \n",
+ " MF | \n",
+ " 0.00003 | \n",
+ " 0.1 | \n",
+ " activity | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.075556 | \n",
+ " 0.075556 | \n",
+ " ... | \n",
+ " 0.046104 | \n",
+ " 0.072716 | \n",
+ " 0.634009 | \n",
+ " 0.039469 | \n",
+ " 0.152966 | \n",
+ " 0.051890 | \n",
+ " 0.095448 | \n",
+ " 77.485304 | \n",
+ " 0.022833 | \n",
+ " 0.822568 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
6 rows × 36 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " args model_name lr \\\n",
+ "1 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "41 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "44 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "56 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "57 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "66 cuda=2, seed=29, train=False, train_and_eval=T... MF 0.00003 \n",
+ "\n",
+ " l2_coef fair_group_feature fair_lambda fair_noise_sigma n_local_step \\\n",
+ "1 0.1 activity 0.5 NaN NaN \n",
+ "41 0.1 activity 0.3 NaN NaN \n",
+ "44 0.1 activity 0.1 NaN NaN \n",
+ "56 0.1 activity -0.1 NaN NaN \n",
+ "57 0.1 activity 1.0 NaN NaN \n",
+ "66 0.1 activity 0.0 NaN NaN \n",
+ "\n",
+ " HR@1 P@1 ... F1@20 NDCG@20 HR@50 P@50 \\\n",
+ "1 0.068582 0.068582 ... 0.046166 0.071368 0.632846 0.039851 \n",
+ "41 0.073065 0.073065 ... 0.046049 0.071955 0.631020 0.039628 \n",
+ "44 0.075888 0.075888 ... 0.046232 0.072910 0.632680 0.039628 \n",
+ "56 0.075556 0.075556 ... 0.046070 0.072908 0.635005 0.039303 \n",
+ "57 0.058452 0.058452 ... 0.043155 0.065792 0.622551 0.038811 \n",
+ "66 0.075556 0.075556 ... 0.046104 0.072716 0.634009 0.039469 \n",
+ "\n",
+ " RECALL@50 F1@50 NDCG@50 MR MRR AUC \n",
+ "1 0.155009 0.052453 0.094718 76.159751 0.021771 0.826675 \n",
+ "41 0.154345 0.052132 0.095170 76.568376 0.022294 0.825078 \n",
+ "44 0.153447 0.052088 0.095697 77.132306 0.022828 0.823499 \n",
+ "56 0.152160 0.051747 0.095368 77.756452 0.022846 0.821496 \n",
+ "57 0.145112 0.050664 0.088547 84.239693 0.019396 0.811036 \n",
+ "66 0.152966 0.051890 0.095448 77.485304 0.022833 0.822568 \n",
+ "\n",
+ "[6 rows x 36 columns]"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sub_df = df[df['model_name']=='MF']\n",
+ "sub_df = sub_df[sub_df['fair_group_feature']=='activity']\n",
+ "sub_df = sub_df[df['l2_coef']==0.1]\n",
+ "sub_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "572552ac",
"metadata": {},
"outputs": [],
- "source": []
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "def plot_recommendation_over_lambda(df, metrics, ncol = 3):\n",
+ " '''\n",
+ " @input:\n",
+ " - stats: {field_name: {key: [values]}}\n",
+ " - features: [field_name]\n",
+ " - ncol: number of subplots in each row\n",
+ " '''\n",
+ " assert ncol > 0\n",
+ " N = len(metrics)\n",
+ " X,indices = np.array(df['fair_lambda']),np.argsort(df['fair_lambda'])\n",
+ " plt.figure(figsize = (16, 4*((N-1)//ncol+1)))\n",
+ " for i,field in enumerate(metrics):\n",
+ " plt.subplot((N-1)//ncol+1,ncol,i+1)\n",
+ " Y = np.array(df[field])\n",
+ " Y = [Y[i] for i in indices]\n",
+ " plt.plot(X,Y)\n",
+ " plt.title(field)\n",
+ " scale = 1e-7 + np.max(Y) - np.min(Y)\n",
+ " plt.ylim(np.min(Y) - scale * 0.05, np.max(Y) + scale * 0.05)\n",
+ " plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "1113794e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "