1. 原始数据
- node_data: 节点数据,其中node_data[‘vroleid’]列为用户id,其他列包括node label和node feature。同一个用户id可能有多条样本,如果直接去重则会造成数据损失,随之带来的正负样本不平衡问题会进一步导致其与真是数据分布不符。
- edge_data: 节点关系数据,edge_data[‘vroleid’]和edge_data[‘friend_roleid’]分别为具有连边关系的源节点和目标节点,edge_data[‘friend_level’]为该条关系的edge feature。
2. 数据处理思路
为node_data中的每一个样本赋予一个独有的node_id,并更新edge关系。
- 合并多个node_data文件,并按需定义训练集和测试集,以test_mask列表示。
- 对于edge_data,只保留源节点和目标节点均在node_data中的条目。
- 对node_data的每一行样本赋予一个独有的node_id,因此每一个vroleid可能会对应多个不同的node_id,做一个key=vroleid,value=[node_id_1,…,node_id_n]的字典。
- 更新边关系,即更新edge_data
- 保存文件
2.1. 步1和步2
import numpy as np
import pandas as pd
from collections import Counter
from copy import deepcopy
from tqdm import tqdm
from itertools import product
def read_data(file = 'train.txt'):
node_data = pd.read_table(file).sample(frac = 1.0).reset_index(drop = True)
node_data['vroleid'] = node_data['vroleid'].astype('str')
print('node_data: shape = {}, # user = {}'.format(node_data.shape, len(set(node_data['vroleid']))))
return node_data
def concat_data(data): # 合并多个node_data文件,最后一个文件作为测试集,其他的为训练集,使用test_mask来定义
concat_data = data[0]
for temp in data[1:]:
print('Shape: Original = {} | New = {} | Concat = {}'.format(concat_data.shape, temp.shape, concat_data.shape[0] + tem