推荐算法
我是下载了这两个库的内容
https://github.com/wubinzzu/NeuRec
https://github.com/microsoft/recommenders
我的数据集只有users和items!
第一次尝试MF和LightGCN
熟悉https://github.com/wubinzzu/NeuRec这个代码,我只有users和items的数据集,咨询过用这两个算法比较好,应该是LightGCN的效果好些。
项目目录
导入配置文件
NeuRec.properties和文件夹conf里面的文件是对应模型的配置文件是我们使用需要导入的配置文件。
用jupyter notebook打开tutorial.ipynb,已经写好了实现整个推荐流程的代码。
from util import Configurator
conf = Configurator("NeuRec.properties", default_section="hyperparameters")
它是调用了Configurator导入了配置参数。具体实现函数在文件夹util下的configurator.py。
class Configurator(object):
# 类的初始化
def __init__(self, config_file, default_section="default"):
if not os.path.isfile(config_file):
raise FileNotFoundError("There is not config file named '%s'!" % config_file)
# 这个获得就是NeuRec.properties的[default],以这个为开头是一个配置项
self._default_section = default_section
# 读取命令行的信息 比如python main.py --batch_size=32就可以获取--batch_size=32 已验证
self.cmd_arg = self._read_cmd_arg()
# 读取配置文件的信息
self.lib_arg = self._read_config_file(config_file)
config_dir = self.lib_arg["config_dir"]
model_name = self.lib_arg["recommender"]
arg_file = os.path.join(config_dir, model_name+'.properties')
self.alg_arg = self._read_config_file(arg_file)
def _read_cmd_arg(self):
def _read_config_file(self, filename):
#Python __repr__()方法:显示属性
def __repr__(self):
导入数据
使用data文件夹下面的dataset.py文件,主要是_load_data这个函数,首先先选择它的数据形式:UIRT,UI,UIR,UIT。splitter是选择它中间是什么分隔符,是空格还是’,‘等等。之后查看数据,如果是第一次处理数据集,应该是走到print(“split and save data…”)这里。
if self._check_saved_data(splitter, ori_prefix, saved_prefix):
print("load saved data...")
# load saved data
train_data = pd.read_csv(train_file, sep=sep, header=None, names=columns)
print(len(train_data))
test_data = pd.read_csv(test_file, sep=sep, header=None, names=columns)
user_map = pd.read_csv(user_map_file, sep=sep, header=None, names=["user", "id"])
item_map = pd.read_csv(item_map_file, sep=sep, header=None, names=["item", "id"])
self.userids = {user: uid for user, uid in zip(user_map["user"], user_map["id"])}
self.itemids = {item: iid for item, iid in zip(item_map["item"], item_map["id"])}
else: # split and save data
print("split and save data...")
by_time = config["by_time"] if file_format in {"UIRT", "UIT"} else False
train_data, test_data = self._split_data(ori_prefix, saved_prefix, columns, by_time, config)
之后就是_split_data函数来处理数据集。
它把测试集和训练集的数据合并在一起,因为我的数据集只有user和item,unique_user = all_data[“user”].unique()得到user,去掉相同的user_id,这样可以得到我们有多少个用户。同理,可以得到我们有多少个物体。然后重映射,把user和item分别重映射
上图是举个例子。
把user_id换成重映射的。
self.userids = pd.Series(data=range(len(unique_user)), index=unique_user).to_dict()
train_data["user"] = train_data["user"].map(self.userids)
之后再创建user-item矩阵表,数据集没有ratings,就设置rating是1。
使用的算法
MF
LightGCN
下一次再写吧。