deepFM
deepfm包含两个部分:因子分解机FM和神经网络DNN,分别负责低阶特征和高阶特征的提取。可以处理全是分类特征的数据,或者分类与数值型结合的数据。
FM部分是对一阶特征和二阶特征(一阶特征之间的交互)的处理。
DNN部分是对高阶特征进行交叉处理。
思考🤔:为什么要做特征与特征之间的交互呢?
文献中写到男性青少年喜欢射击游戏和RPG游戏,这意味着app类别、用户性别和年龄的之间是存在相互影响的。一般来说,用户点击行为背后的这种特征交互可以是高度复杂的,其中低阶和高阶特征交互都应该起重要作用。
所以FM考虑低阶特征交互,DNN考虑高阶特征交互。
(一)数据处理
将数据的特征主要分为类别型特征和数值型特征两种,还有其他类(label、userid等)标记为igore feature。
类别类特征:离散、稀疏的,标记为sparse feature;
数值型特征:连续、稠密的,标记为dense feature。
数据预处理代码,需要对sparse feature进行编码处理,对dense feature进行归一化化处理,对于自己的数据集,需要自行分好sparse feature和dense feature。
#CATEGORICAL_COLS=['性别',‘职业’]等类别特征名称
#NUMERIC_COLS=['时间','次数']等连续性数类特征名称
#IGNORE_COLS=['','']#不参与训练的特征名称
import pandas as pd
data=pd.read_cav("datasets.scv")
sparse_data=data[CATEGORICAL_COLS]
dense_data=train[NUMERIC_COLS]
ignore_data=train[IGNORE_COLS]
对dense fea进行编码处理
from sklearn.preprocessing import LabelEncoder
from tqdm import tqdm
#训练数据集
## 类别特征labelencoder
for feat in tqdm(CATEGORICAL_COLS):
lbe = LabelEncoder()
sparse_data[feat] = lbe.fit_transform(sparse_data[feat])
对sparse fea进行标准化处理
for feat in tqdm(NUMERIC_COLS): #将每一个特征下的数据进行标准化
mean = dense_data[feat].mean()
std = dense_data[feat].std()
dense_data[feat] = (dense_data[feat] - mean) / (std + 1e-12) # 防止除零
将数据转为模型可处理的tensor类型,划分训练测试集
from sklearn.model_selection import train_test_split
import torch
import torch.utils.data as Data
data=pd.concat([sparse_data, dense_data,data['label']], axis=1)
train, valid = train_test_split(data, test_size=0.2, random_state=42)
train_dataset = Data.TensorDataset(torch.LongTensor(train[CATEGORICAL_COLS].values