deepFM模型pytorch实现

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值