{"cells":[{"cell_type":"markdown","metadata":{},"source":["# Facebook Friend Recommender"]},{"cell_type":"markdown","metadata":{"id":"jDec9it1V4Hn"},"source":["First we will load our dataset from Kaggle and perform exploratory data analysis on our given data set such as number of followers and followees of each person. Then we will generate some datapoints which were not present in our given data-set, since we have only class label 1 data. Then we will do some feature engineering on dataset like finding shortest path, kartz centrality, jaccard distances, page rank, preferential attachements etc. After performing exploratory data analysis and feature engineering, we will split whole dataset into train and test and perform random forest and xgboost taking f1-score as our metric. At the end we will plot confusion matrix and pretty-table for both algorithm and finf best hyperparameters."]},{"cell_type":"markdown","metadata":{"id":"F3UNi-NOWjb5"},"source":["## Setup"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"j2QozaSUWg5b"},"outputs":[],"source":["import math\n","import random\n","import pickle\n","import os\n","import csv\n","import pandas as pd\n","import datetime\n","import time\n","import numpy as np\n","\n","import matplotlib\n","import matplotlib.pylab as plt\n","import seaborn as sns\n","from matplotlib import rcParams\n","from sklearn.cluster import MiniBatchKMeans, KMeans\n","from tqdm.notebook import tqdm\n","from sklearn.model_selection import train_test_split\n","\n","import xgboost as xgb\n","import networkx as nx\n","import pdb\n","import pickle\n","\n","import warnings\n","warnings.filterwarnings(\"ignore\")"]},{"cell_type":"markdown","metadata":{"id":"dfMsBJhGW6ld"},"source":["## Load dataset"]},{"cell_type":"markdown","metadata":{"id":"6ZCD5IvKXEwH"},"source":[""]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":12911,"status":"ok","timestamp":1627616227494,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"vWLoLTTQXIG0","outputId":"2803f5b6-ec3d-4b8d-a36c-0c998c3bd705"},"outputs":[{"name":"stdout","output_type":"stream","text":["Collecting kaggle\n"," Downloading kaggle-1.5.12.tar.gz (58 kB)\n","\u001b[?25l\r\u001b[K |█████▋ | 10 kB 30.5 MB/s eta 0:00:01\r\u001b[K |███████████▏ | 20 kB 38.2 MB/s eta 0:00:01\r\u001b[K |████████████████▊ | 30 kB 30.3 MB/s eta 0:00:01\r\u001b[K |██████████████████████▎ | 40 kB 22.6 MB/s eta 0:00:01\r\u001b[K |███████████████████████████▉ | 51 kB 16.8 MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 58 kB 4.5 MB/s \n","\u001b[?25hBuilding wheels for collected packages: kaggle\n"," Building wheel for kaggle (setup.py) ... \u001b[?25l\u001b[?25hdone\n"," Created wheel for kaggle: filename=kaggle-1.5.12-py3-none-any.whl size=73052 sha256=940b16c3e71a3ef30f3c537442dadc0e4ad95f67fd31f490151951ac308ec731\n"," Stored in directory: /root/.cache/pip/wheels/62/d6/58/5853130f941e75b2177d281eb7e44b4a98ed46dd155f556dc5\n","Successfully built kaggle\n","Installing collected packages: kaggle\n"," Attempting uninstall: kaggle\n"," Found existing installation: kaggle 1.5.12\n"," Uninstalling kaggle-1.5.12:\n"," Successfully uninstalled kaggle-1.5.12\n","Successfully installed kaggle-1.5.12\n","Downloading FacebookRecruiting.zip to /content\n"," 84% 161M/191M [00:04<00:01, 26.3MB/s]\n","100% 191M/191M [00:04<00:00, 42.8MB/s]\n"]}],"source":["!pip install -q -U kaggle\n","!pip install --upgrade --force-reinstall --no-deps kaggle\n","!mkdir ~/.kaggle\n","!cp /content/drive/MyDrive/kaggle.json ~/.kaggle/\n","!chmod 600 ~/.kaggle/kaggle.json\n","!kaggle competitions download -c FacebookRecruiting"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":2716,"status":"ok","timestamp":1627616230204,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"fxu9z1aJXJ5Y","outputId":"7b430be0-9ead-46cc-b510-19ff71d30fdd"},"outputs":[{"name":"stdout","output_type":"stream","text":["Archive: FacebookRecruiting.zip\n"," inflating: bfs_benchmark.csv \n"," inflating: random_benchmark.csv \n"," inflating: test.csv \n"," inflating: train.7z \n"," inflating: train.csv \n"," inflating: train.gz \n"," inflating: train.zip \n"]}],"source":["!unzip FacebookRecruiting.zip"]},{"cell_type":"markdown","metadata":{"id":"9ZMu-p1OXmCA"},"source":["## Reading graph"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":204},"executionInfo":{"elapsed":1312,"status":"ok","timestamp":1627616502547,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"R1hSHYa2gDQd","outputId":"f157932a-13b2-4db7-d977-781a33fe11a0"},"outputs":[{"data":{"text/html":["
"],"text/plain":[" source_node destination_node\n","count 9.437519e+06 9.437519e+06\n","mean 9.306740e+05 9.312252e+05\n","std 5.383368e+05 5.380682e+05\n","min 1.000000e+00 1.000000e+00\n","25% 4.638685e+05 4.647640e+05\n","50% 9.303910e+05 9.316830e+05\n","75% 1.397245e+06 1.397560e+06\n","max 1.862220e+06 1.862220e+06"]},"execution_count":11,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["traincsv.describe()"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":3437,"status":"ok","timestamp":1627616633907,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"t5lLT6BQX198","outputId":"22f3ac98-ce67-4acb-b396-8a8514f0defd"},"outputs":[{"name":"stdout","output_type":"stream","text":["Empty DataFrame\n","Columns: [source_node, destination_node]\n","Index: []\n","\n","RangeIndex: 9437519 entries, 0 to 9437518\n","Data columns (total 2 columns):\n"," # Column Dtype\n","--- ------ -----\n"," 0 source_node int64\n"," 1 destination_node int64\n","dtypes: int64(2)\n","memory usage: 144.0 MB\n","None\n","Number of diplicate entries: 0\n","saved the graph into file\n"]}],"source":["print(traincsv[traincsv.isna().any(1)])\n","print(traincsv.info())\n","print(\"Number of diplicate entries: \",sum(traincsv.duplicated()))\n","traincsv.to_csv('train_woheader.csv',header=False,index=False)\n","print(\"saved the graph into file\")"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":63716,"status":"ok","timestamp":1627616500002,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"cBvsnoX8XgRY","outputId":"45c0cb7b-17ac-4adb-ec09-15dd0ed6da7b"},"outputs":[{"name":"stdout","output_type":"stream","text":["Name: \n","Type: DiGraph\n","Number of nodes: 1862220\n","Number of edges: 9437519\n","Average in degree: 5.0679\n","Average out degree: 5.0679\n"]}],"source":["g = nx.read_edgelist('train_woheader.csv',delimiter=',',create_using=nx.DiGraph(),nodetype=int)\n","print(nx.info(g))"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":421},"executionInfo":{"elapsed":1927,"status":"ok","timestamp":1627616653158,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"ipmUsmU_YJ3c","outputId":"ecff532a-c664-480e-ba95-52b6e30bec6c"},"outputs":[{"name":"stdout","output_type":"stream","text":["Name: \n","Type: DiGraph\n","Number of nodes: 26\n","Number of edges: 20\n","Average in degree: 0.7692\n","Average out degree: 0.7692\n"]},{"data":{"image/png":"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","text/plain":[""]},"metadata":{"tags":[]},"output_type":"display_data"}],"source":["traincsv.head(20).to_csv('train_woheader_sample.csv',header=False,index=False)\n"," \n","subgraph=nx.read_edgelist('train_woheader_sample.csv',delimiter=',',create_using=nx.DiGraph(),nodetype=int)\n","# https://stackoverflow.com/questions/9402255/drawing-a-huge-graph-with-networkx-and-matplotlib\n","\n","pos=nx.spring_layout(subgraph)\n","nx.draw(subgraph,pos,node_color='#A0CBE2',edge_color='#00bb5e',width=1,edge_cmap=plt.cm.Blues,with_labels=True)\n","plt.savefig(\"graph_sample.pdf\")\n","print(nx.info(subgraph))"]},{"cell_type":"markdown","metadata":{"id":"K8N2vC3MZfSS"},"source":["## Exploratory data analysis"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":1166,"status":"ok","timestamp":1627463762173,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"QirVa7A4Y5Qu","outputId":"322e4f1b-0dd3-4b87-c4f7-3efbd523000c"},"outputs":[{"name":"stdout","output_type":"stream","text":["The number of unique persons 1862220\n"]}],"source":["# No of Unique persons \n","print(\"The number of unique persons\",len(g.nodes()))"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":388},"executionInfo":{"elapsed":2336,"status":"ok","timestamp":1627463789524,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"M77RkwjMZmVr","outputId":"718ce697-383b-460d-b0ad-12faae326b79"},"outputs":[{"data":{"image/png":"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","text/plain":[""]},"metadata":{"needs_background":"light","tags":[]},"output_type":"display_data"}],"source":["# No of followers of each person\n","indegree_dist = list(dict(g.in_degree()).values())\n","indegree_dist.sort()\n","plt.figure(figsize=(10,6))\n","plt.plot(indegree_dist)\n","plt.xlabel('Index No')\n","plt.ylabel('No Of Followers')\n","plt.show()"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":388},"executionInfo":{"elapsed":3253,"status":"ok","timestamp":1627463899564,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"O_ohVDNlZp9K","outputId":"016d4a29-8df9-4254-8e0b-f8fa5c887f4d"},"outputs":[{"data":{"image/png":"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","text/plain":[""]},"metadata":{"needs_background":"light","tags":[]},"output_type":"display_data"}],"source":["indegree_dist = list(dict(g.in_degree()).values())\n","indegree_dist.sort()\n","plt.figure(figsize=(10,6))\n","plt.plot(indegree_dist[0:1500000])\n","plt.xlabel('Index No')\n","plt.ylabel('No Of Followers')\n","plt.show()"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":388},"executionInfo":{"elapsed":2561,"status":"ok","timestamp":1627463912779,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"eg7CBHaoZ_UL","outputId":"8cb1deb6-12e2-4e04-a708-01a3587b1fbb"},"outputs":[{"data":{"image/png":"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","text/plain":[""]},"metadata":{"needs_background":"light","tags":[]},"output_type":"display_data"}],"source":["# No Of people each person is following\n","outdegree_dist = list(dict(g.out_degree()).values())\n","outdegree_dist.sort()\n","plt.figure(figsize=(10,6))\n","plt.plot(outdegree_dist)\n","plt.xlabel('Index No')\n","plt.ylabel('No Of people each person is following')\n","plt.show()"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9148,"status":"ok","timestamp":1627464104647,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"lwHxDmr3aIB7","outputId":"c2ffe1b0-d3ed-404a-9881-2170c90eeac3"},"outputs":[{"name":"stdout","output_type":"stream","text":["No of persons who are not following anyone are 274512 (14.74%)\n"]}],"source":["print('No of persons who are not following anyone are {} ({:.2%})'.format(sum(np.array(outdegree_dist)==0),\n"," sum(np.array(outdegree_dist)==0)/len(outdegree_dist)))"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9004,"status":"ok","timestamp":1627464172658,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"UDh4Y0rnaabu","outputId":"95c8c049-6677-4202-9a42-a0e6f4f9a335"},"outputs":[{"name":"stdout","output_type":"stream","text":["No of persons having zero followers are 188043 (10.10%)\n"]}],"source":["print('No of persons having zero followers are {} ({:.2%})'.format(sum(np.array(indegree_dist)==0),\n"," sum(np.array(indegree_dist)==0)/len(indegree_dist)))"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":3174,"status":"ok","timestamp":1627464207983,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"GWieGOF8bF2s","outputId":"48679a10-7704-414d-c3e6-94a92a15aa50"},"outputs":[{"name":"stdout","output_type":"stream","text":["No of persons those are not following anyone and also not having any followers are 0\n"]}],"source":["count=0\n","for i in g.nodes():\n"," if len(list(g.predecessors(i)))==0 :\n"," if len(list(g.successors(i)))==0:\n"," count+=1\n","print('No of persons those are not following anyone and also not having any followers are',count)"]},{"cell_type":"markdown","metadata":{"id":"ieCAEYAVcXNM"},"source":["## Negative sampling"]},{"cell_type":"markdown","metadata":{"id":"m2pnbqRnhWkA"},"source":["Generating some edges which are not present in graph for supervised learning. In other words, we are generating bad links from graph which are not in graph and whose shortest path is greater than 2."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":66,"referenced_widgets":["65b7914b52f04174ae774ba54a9d1599","2ff239b666964f0284572fd40ef24795","3d7ffa4d7cd44e22b8ab5bfacb9229fe","4916c564f3d5428d8858363e51f4d696","74eeaf34ffd945ef9f424037ef32f1af","a3dc4e4778f24197ab782d84ded7d189","dc70e7f348cb4e7ab107f6f4d79bb817","3ec2255273d844a18a0ebd5c6e7d9368"]},"executionInfo":{"elapsed":78359,"status":"ok","timestamp":1627617426296,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"U7nXVgfchj-9","outputId":"456d9c5d-0783-4543-89af-f83983c88d19"},"outputs":[{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"65b7914b52f04174ae774ba54a9d1599","version_major":2,"version_minor":0},"text/plain":["HBox(children=(FloatProgress(value=0.0, max=9437519.0), HTML(value='')))"]},"metadata":{"tags":[]},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["\n"]}],"source":["r = csv.reader(open('train_woheader.csv','r'))\n","edges = dict()\n","for edge in r:\n"," edges[(edge[0], edge[1])] = 1\n","missing_edges = set([])\n","\n","with tqdm(total=9437519) as pbar:\n"," while (len(missing_edges)<9437519):\n"," a=random.randint(1, 1862220) \n"," b=random.randint(1, 1862220)\n"," tmp = edges.get((a,b),-1)\n"," if tmp == -1 and a!=b:\n"," try:\n"," if nx.shortest_path_length(g,source=a,target=b) > 2: \n"," missing_edges.add((a,b))\n"," else:\n"," continue \n"," except: \n"," missing_edges.add((a,b)) \n"," else:\n"," continue\n"," pbar.update(1)\n","pickle.dump(missing_edges,open('missing_edges_final.p','wb'))"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":479,"status":"ok","timestamp":1627617581690,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"RANp2S96jzVJ","outputId":"b6a1bf31-53d2-4170-cbac-c96a6956ddec"},"outputs":[{"data":{"text/plain":["[(885577, 1583706),\n"," (1487373, 176918),\n"," (1796282, 916021),\n"," (167023, 569005),\n"," (1204330, 1443051),\n"," (823309, 780941),\n"," (731061, 1684320),\n"," (283674, 455265),\n"," (412300, 691150),\n"," (586754, 854524)]"]},"execution_count":11,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["list(missing_edges)[:10]"]},{"cell_type":"markdown","metadata":{"id":"vcIK4mX1bP8A"},"source":["## Train/test split"]},{"cell_type":"markdown","metadata":{"id":"Xm8UdKXzlpUx"},"source":["> Tip: We will split positive links and negative links seperatly because we need only positive training data for creating graph and for feature generation."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":45445,"status":"ok","timestamp":1627618042831,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"JXaSZnZLkX65","outputId":"6f37fdb2-e7ca-4156-b257-2471432fa0fe"},"outputs":[{"name":"stdout","output_type":"stream","text":["Number of nodes in the graph with edges 9437519\n","Number of nodes in the graph without edges 9437519\n","============================================================\n","Number of nodes in the train data graph with edges 7550015 = 7550015\n","Number of nodes in the train data graph without edges 7550015 = 7550015\n","============================================================\n","Number of nodes in the test data graph with edges 1887504 = 1887504\n","Number of nodes in the test data graph without edges 1887504 = 1887504\n"]}],"source":["#reading total data df\n","df_pos = pd.read_csv('train.csv')\n","df_neg = pd.DataFrame(list(missing_edges), columns=['source_node', 'destination_node'])\n","\n","print(\"Number of nodes in the graph with edges\", df_pos.shape[0])\n","print(\"Number of nodes in the graph without edges\", df_neg.shape[0])\n","\n","#Trian test split \n","#Spiltted data into 80-20\n","X_train_pos, X_test_pos, y_train_pos, y_test_pos = train_test_split(df_pos,np.ones(len(df_pos)),test_size=0.2, random_state=9)\n","X_train_neg, X_test_neg, y_train_neg, y_test_neg = train_test_split(df_neg,np.zeros(len(df_neg)),test_size=0.2, random_state=9)\n","\n","print('='*60)\n","print(\"Number of nodes in the train data graph with edges\", X_train_pos.shape[0],\"=\",y_train_pos.shape[0])\n","print(\"Number of nodes in the train data graph without edges\", X_train_neg.shape[0],\"=\", y_train_neg.shape[0])\n","print('='*60)\n","print(\"Number of nodes in the test data graph with edges\", X_test_pos.shape[0],\"=\",y_test_pos.shape[0])\n","print(\"Number of nodes in the test data graph without edges\", X_test_neg.shape[0],\"=\",y_test_neg.shape[0])\n","\n","#removing header and saving\n","X_train_pos.to_csv('train_pos_after_eda.csv',header=False, index=False)\n","X_test_pos.to_csv('test_pos_after_eda.csv',header=False, index=False)\n","X_train_neg.to_csv('train_neg_after_eda.csv',header=False, index=False)\n","X_test_neg.to_csv('test_neg_after_eda.csv',header=False, index=False)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":108628,"status":"ok","timestamp":1627618327578,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"2cltGHkzl7Uf","outputId":"f2633d6b-f40a-4bb5-c484-f83d70c6a98c"},"outputs":[{"name":"stdout","output_type":"stream","text":["Name: \n","Type: DiGraph\n","Number of nodes: 1780722\n","Number of edges: 7550015\n","Average in degree: 4.2399\n","Average out degree: 4.2399\n","Name: \n","Type: DiGraph\n","Number of nodes: 1144623\n","Number of edges: 1887504\n","Average in degree: 1.6490\n","Average out degree: 1.6490\n","no of people common in train and test -- 1063125\n","no of people present in train but not present in test -- 717597\n","no of people present in test but not present in train -- 81498\n"," % of people not there in Train but exist in Test in total Test data are 7.1200735962845405 %\n"]}],"source":["train_graph=nx.read_edgelist('train_pos_after_eda.csv',delimiter=',',create_using=nx.DiGraph(),nodetype=int)\n","test_graph=nx.read_edgelist('test_pos_after_eda.csv',delimiter=',',create_using=nx.DiGraph(),nodetype=int)\n","print(nx.info(train_graph))\n","print(nx.info(test_graph))\n","\n","# finding the unique nodes in both train and test graphs\n","train_nodes_pos = set(train_graph.nodes())\n","test_nodes_pos = set(test_graph.nodes())\n","\n","trY_teY = len(train_nodes_pos.intersection(test_nodes_pos))\n","trY_teN = len(train_nodes_pos - test_nodes_pos)\n","teY_trN = len(test_nodes_pos - train_nodes_pos)\n","\n","print('no of people common in train and test -- ',trY_teY)\n","print('no of people present in train but not present in test -- ',trY_teN)\n","print('no of people present in test but not present in train -- ',teY_trN)\n","print(' % of people not there in Train but exist in Test in total Test data are {} %'.format(teY_trN/len(test_nodes_pos)*100))"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Vtp_ZULhnJy6"},"outputs":[],"source":["X_train_pos = pd.read_csv('train_pos_after_eda.csv', names=['source_node', 'destination_node'])\n","X_test_pos = pd.read_csv('test_pos_after_eda.csv', names=['source_node', 'destination_node'])\n","X_train_neg = pd.read_csv('train_neg_after_eda.csv', names=['source_node', 'destination_node'])\n","X_test_neg = pd.read_csv('test_neg_after_eda.csv', names=['source_node', 'destination_node'])\n","\n","print('='*60)\n","print(\"Number of nodes in the train data graph with edges\", X_train_pos.shape[0])\n","print(\"Number of nodes in the train data graph without edges\", X_train_neg.shape[0])\n","print('='*60)\n","print(\"Number of nodes in the test data graph with edges\", X_test_pos.shape[0])\n","print(\"Number of nodes in the test data graph without edges\", X_test_neg.shape[0])\n","\n","X_train = X_train_pos.append(X_train_neg,ignore_index=True)\n","y_train = np.concatenate((y_train_pos,y_train_neg))\n","X_test = X_test_pos.append(X_test_neg,ignore_index=True)\n","y_test = np.concatenate((y_test_pos,y_test_neg)) \n","\n","X_train.to_csv('train_after_eda.csv',header=False,index=False)\n","X_test.to_csv('test_after_eda.csv',header=False,index=False)\n","pd.DataFrame(y_train.astype(int)).to_csv('train_y.csv',header=False,index=False)\n","pd.DataFrame(y_test.astype(int)).to_csv('test_y.csv',header=False,index=False)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":496,"status":"ok","timestamp":1627618515142,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"6Jfsu_BMnlx5","outputId":"a178a4db-8fe9-405f-e898-19ff21d713d6"},"outputs":[{"name":"stdout","output_type":"stream","text":["Data points in train data (15100030, 2)\n","Data points in test data (3775008, 2)\n","Shape of traget variable in train (15100030,)\n","Shape of traget variable in test (3775008,)\n"]}],"source":["print(\"Data points in train data\",X_train.shape)\n","print(\"Data points in test data\",X_test.shape)\n","print(\"Shape of traget variable in train\",y_train.shape)\n","print(\"Shape of traget variable in test\", y_test.shape)"]},{"cell_type":"markdown","metadata":{"id":"89vYHL5jc708"},"source":["## Feature engineering"]},{"cell_type":"markdown","metadata":{"id":"PiGpdEuwcfAA"},"source":["### Similarity measures"]},{"cell_type":"markdown","metadata":{"id":"bWYSZUYBcmk0"},"source":["#### Jaccard distance"]},{"cell_type":"markdown","metadata":{"id":"OpzpbwbsoYR1"},"source":["\\begin{equation}\n","j = \\frac{|X\\cap Y|}{|X \\cup Y|} \n","\\end{equation}"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"LXpgbkwGoZdG"},"outputs":[],"source":["def jaccard_for_followees(a,b):\n"," try:\n"," if len(set(train_graph.successors(a))) == 0 | len(set(train_graph.successors(b))) == 0:\n"," return 0\n"," sim = (len(set(train_graph.successors(a)).intersection(set(train_graph.successors(b)))))/\\\n"," (len(set(train_graph.successors(a)).union(set(train_graph.successors(b)))))\n"," except:\n"," return 0\n"," return sim"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"6x1xsEP0o48W"},"outputs":[],"source":["def jaccard_for_followers(a,b):\n"," try:\n"," if len(set(train_graph.predecessors(a))) == 0 | len(set(g.predecessors(b))) == 0:\n"," return 0\n"," sim = (len(set(train_graph.predecessors(a)).intersection(set(train_graph.predecessors(b)))))/\\\n"," (len(set(train_graph.predecessors(a)).union(set(train_graph.predecessors(b)))))\n"," return sim\n"," except:\n"," return 0"]},{"cell_type":"markdown","metadata":{"id":"Sfdkxae-coU2"},"source":["#### Cosine distance"]},{"cell_type":"markdown","metadata":{"id":"YKbzTnrto-Pv"},"source":["\\begin{equation}\n","CosineDistance = \\frac{|X\\cap Y|}{|X|\\cdot|Y|} \n","\\end{equation}"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"5RN3c0SKo_gn"},"outputs":[],"source":["def cosine_for_followees(a,b):\n"," try:\n"," if len(set(train_graph.successors(a))) == 0 | len(set(train_graph.successors(b))) == 0:\n"," return 0\n"," sim = (len(set(train_graph.successors(a)).intersection(set(train_graph.successors(b)))))/\\\n"," (math.sqrt(len(set(train_graph.successors(a)))*len((set(train_graph.successors(b))))))\n"," return sim\n"," except:\n"," return 0"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"-uN89BjupCPI"},"outputs":[],"source":["def cosine_for_followers(a,b):\n"," try:\n"," \n"," if len(set(train_graph.predecessors(a))) == 0 | len(set(train_graph.predecessors(b))) == 0:\n"," return 0\n"," sim = (len(set(train_graph.predecessors(a)).intersection(set(train_graph.predecessors(b)))))/\\\n"," (math.sqrt(len(set(train_graph.predecessors(a))))*(len(set(train_graph.predecessors(b)))))\n"," return sim\n"," except:\n"," return 0"]},{"cell_type":"markdown","metadata":{"id":"ciMlEw55cqqR"},"source":["### Ranking measures"]},{"cell_type":"markdown","metadata":{"id":"NOzL-Bxcc-sX"},"source":["#### Pagerank"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"lKGZ-7W-phGv"},"outputs":[],"source":["train_graph=nx.read_edgelist('train_pos_after_eda.csv',delimiter=',',create_using=nx.DiGraph(),nodetype=int)\n","pr = nx.pagerank(train_graph, alpha=0.85)\n","pickle.dump(pr,open('page_rank.p','wb'))"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":1237,"status":"ok","timestamp":1627620165703,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"ZCUWzRCeqm3V","outputId":"277d91f4-9a8a-4824-9967-a6a875d9d56d"},"outputs":[{"name":"stdout","output_type":"stream","text":["min 1.6556497245737814e-07\n","max 2.7098251341935827e-05\n","mean_pr 5.615699699389075e-07\n"]}],"source":["print('min',pr[min(pr, key=pr.get)])\n","print('max',pr[max(pr, key=pr.get)])\n","#for imputing to nodes which are not there in Train data\n","print('mean_pr',float(sum(pr.values())) / len(pr))"]},{"cell_type":"markdown","metadata":{"id":"XedCHTmBdBcc"},"source":["### Other graph features"]},{"cell_type":"markdown","metadata":{"id":"Jp2H0uA3dHv_"},"source":["#### Shortest path"]},{"cell_type":"markdown","metadata":{"id":"o5-0iQX6q4P8"},"source":["Getting Shortest path between two nodes, and if any 2 given nodes have a direct path i.e directly connected then we are removing that edge and calculating path."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"y3iWLy5Bqu2W"},"outputs":[],"source":["def compute_shortest_path_length(a,b):\n"," p=-1\n"," try:\n"," if train_graph.has_edge(a,b):\n"," train_graph.remove_edge(a,b)\n"," p= nx.shortest_path_length(train_graph,source=a,target=b)\n"," train_graph.add_edge(a,b)\n"," else:\n"," p= nx.shortest_path_length(train_graph,source=a,target=b)\n"," return p\n"," except:\n"," return -1"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":6,"status":"ok","timestamp":1627619545396,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"BzslYnz-rKW7","outputId":"fd6dac23-5858-481d-e886-668ed50e37b5"},"outputs":[{"data":{"text/plain":["10"]},"execution_count":12,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["# unit test 1\n","compute_shortest_path_length(77697, 826021)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4,"status":"ok","timestamp":1627619546006,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"9dgfHKwGrO27","outputId":"d96fadfb-65d9-4e70-b4c2-03525c0d9864"},"outputs":[{"data":{"text/plain":["-1"]},"execution_count":13,"metadata":{"tags":[]},"output_type":"execute_result"}],"source":["# unit test 2\n","compute_shortest_path_length(669354, 1635354)"]},{"cell_type":"markdown","metadata":{"id":"iv27JsDLdMQb"},"source":["#### Same community"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"_yU7WeJFsFyO"},"outputs":[],"source":["wcc = list(nx.weakly_connected_components(train_graph))"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"UlYshkkxsDPr"},"outputs":[],"source":["def belongs_to_same_wcc(a,b):\n"," index = []\n"," if train_graph.has_edge(b,a):\n"," return 1\n"," if train_graph.has_edge(a,b):\n"," for i in wcc:\n"," if a in i:\n"," index= i\n"," break\n"," if (b in index):\n"," train_graph.remove_edge(a,b)\n"," if compute_shortest_path_length(a,b)==-1:\n"," train_graph.add_edge(a,b)\n"," return 0\n"," else:\n"," train_graph.add_edge(a,b)\n"," return 1\n"," else:\n"," return 0\n"," else:\n"," for i in wcc:\n"," if a in i:\n"," index= i\n"," break\n"," if(b in index):\n"," return 1\n"," else:\n"," return 0"]},{"cell_type":"markdown","metadata":{"id":"sciSYrVZdNgy"},"source":["#### Admaic/Adar index"]},{"cell_type":"markdown","metadata":{"id":"m_rArhaKsNPd"},"source":["Adamic/Adar measures is defined as inverted sum of degrees of common neighbours for given two vertices: $A(x,y)=\\sum_{u \\in N(x) \\cap N(y)}\\frac{1}{log(|N(u)|)}$"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"hLsKWMNisi_l"},"outputs":[],"source":["def calc_adar_in(a,b):\n"," sum=0\n"," try:\n"," n=list(set(train_graph.successors(a)).intersection(set(train_graph.successors(b))))\n"," if len(n)!=0:\n"," for i in n:\n"," sum=sum+(1/np.log10(len(list(train_graph.predecessors(i)))))\n"," return sum\n"," else:\n"," return 0\n"," except:\n"," return 0"]},{"cell_type":"markdown","metadata":{"id":"9Seitdl9dVdP"},"source":["### Is person following back?"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"S7g-HZxHsnI8"},"outputs":[],"source":["def follows_back(a,b):\n"," if train_graph.has_edge(b,a):\n"," return 1\n"," else:\n"," return 0"]},{"cell_type":"markdown","metadata":{"id":"2XcRYb-idYfe"},"source":["#### Katz centrality"]},{"cell_type":"markdown","metadata":{"id":"1xEzVB5mssgc"},"source":["Katz centrality computes the centrality for a node based on the centrality of its neighbors. It is a generalization of the eigenvector centrality. The Katz centrality for node i is: $x_i = \\alpha \\sum_{j} A_{ij} x_j + \\beta$"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"3QWUUsvjs4nJ"},"outputs":[],"source":["katz = nx.katz.katz_centrality(train_graph,alpha=0.005,beta=1)\n","pickle.dump(katz,open('katz.p','wb'))"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9,"status":"ok","timestamp":1627620166647,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"},"user_tz":-330},"id":"4_73m3mds8A8","outputId":"555fa6c0-277d-40f9-eb6b-9339ccc21b87"},"outputs":[{"name":"stdout","output_type":"stream","text":["min 0.0007313532484065916\n","max 0.003394554981699122\n","mean 0.0007483800935562018\n"]}],"source":["print('min',katz[min(katz, key=katz.get)])\n","print('max',katz[max(katz, key=katz.get)])\n","print('mean',float(sum(katz.values())) / len(katz))"]},{"cell_type":"markdown","metadata":{"id":"UfIBDbxDuEch"},"source":["## Checkpointing"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"_Aofopy4uIA_"},"outputs":[],"source":["# !mkdir fbfndrec\n","# %cd fbfndrec\n","\n","# !mv ../train.csv .\n","# !mv ../test.csv .\n","\n","# !mv ../train_pos_after_eda.csv .\n","# !mv ../test_pos_after_eda.csv .\n","# !mv ../train_neg_after_eda.csv .\n","# !mv ../test_neg_after_eda.csv .\n","\n","# !mv ../train_after_eda.csv .\n","# !mv ../test_after_eda.csv .\n","# !mv ../train_y.csv .\n","# !mv ../test_y.csv .\n","\n","# !mv ../page_rank.p .\n","# !mv ../katz.p .\n","\n","# !zip fbfndrec.zip ./*\n","\n","# !mv fbfndrec.zip /content/drive/MyDrive/TempData"]}],"metadata":{"colab":{"authorship_tag":"ABX9TyMf/UhteHvHflgPnzr8XJA4","collapsed_sections":["K8N2vC3MZfSS","ieCAEYAVcXNM"],"mount_file_id":"1nrLhUvH4BS8wL3WRL9anNhVSjVxVwJFj","name":"facebook-friend-recommender.ipynb","provenance":[]},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"},"widgets":{"application/vnd.jupyter.widget-state+json":{"2ff239b666964f0284572fd40ef24795":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3d7ffa4d7cd44e22b8ab5bfacb9229fe":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a3dc4e4778f24197ab782d84ded7d189","max":9437519,"min":0,"orientation":"horizontal","style":"IPY_MODEL_74eeaf34ffd945ef9f424037ef32f1af","value":9437519}},"3ec2255273d844a18a0ebd5c6e7d9368":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4916c564f3d5428d8858363e51f4d696":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_3ec2255273d844a18a0ebd5c6e7d9368","placeholder":"","style":"IPY_MODEL_dc70e7f348cb4e7ab107f6f4d79bb817","value":" 9437528/? [00:59<00:00, 158391.86it/s]"}},"65b7914b52f04174ae774ba54a9d1599":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_3d7ffa4d7cd44e22b8ab5bfacb9229fe","IPY_MODEL_4916c564f3d5428d8858363e51f4d696"],"layout":"IPY_MODEL_2ff239b666964f0284572fd40ef24795"}},"74eeaf34ffd945ef9f424037ef32f1af":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":"initial"}},"a3dc4e4778f24197ab782d84ded7d189":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"dc70e7f348cb4e7ab107f6f4d79bb817":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"nbformat":4,"nbformat_minor":0}