目录
了解
浅梦大神的这个写的还是就我而言 我觉得非常好了,非常值得操作一下
DeepCTR:易用可扩展的深度学习点击率预测算法包
首先下面两个链接是你最先需要了解的
github这个是这个包的开源代码(附数据集和例子)
知乎这个是包的中文解释和主要用法
准备工作
1.下载包
打开上述链接 找到红圈标记位置 点击 选择download zip
下载完成,解压备用
2.导入pycharm
打开pycharm,选择file—>open…
选择所在文件夹,点击OK
导入后选择file -->setting
点击下图下图深蓝色部分,右半部分添加自己的解释器
3.导入所需包
pycharm导入包不用cdm的话 有两种方式(仅代表我知道的本地的方法 (我也不确定python console那个位置可不可以))
见上篇文章: 链接.
重点讲一下那个deepctr包的下载,他不能用第一种方法直接下,但可以第二种方法下
这里写完 pip install deepctr[cpu] 点击回车,等待下载
(我可是太小白了 这个位置我弄了两个点)
代码(例:run_classification_criteo.py)
里面有些自己的注解,我自己读着挺清晰,有问题欢迎一起探讨
导入所需包
import pandas as pd
from sklearn.metrics import log_loss, roc_auc_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, MinMaxScaler
from deepctr.models import DeepFM
from deepctr.feature_column import SparseFeat, DenseFeat, get_feature_names
数据预处理
if __name__ == "__main__":
data = pd.read_csv('./criteo_sample.txt')
# sparse-稀疏特征-c 稠密特征-i (列)
sparse_features = ['C' + str(i) for i in range(1, 27)]
dense_features = ['I' + str(i) for i in range(1, 14)]
# 含有缺失值时 稀疏部分用-1代替 fataframe.fillna()------读出空值用‘数字’代替
data[sparse_features] = data[sparse_features].fillna('-1', )
data[dense_features] = data[dense_features].fillna(0, )
target = ['label']
1.对稀疏特征进行标签编码,对稠密特征进行简单转换
# feat稀疏特征 lbe标签? 特征吧 sklearn--(文本标签转化为数字)---转换器LabelEncoder()
# .fit_transform() 训练转换后的文本会按照相同描述分到一个数字 (本方法只适合转换一列的文本数字,多列会报错,则用factorize())
# MinMaxScaler( ) 自动归一化 feature_range=(0, 1) 要映射的区间
# 对稀疏特征进行标签编码
for feat in sparse_features:
lbe = LabelEncoder()
data[feat] = lbe.fit_transform(data[feat])
# 对稠密特征进行简单转换
mms = MinMaxScaler(feature_range=(0, 1))
data[dense_features] = mms.fit_transform(data[dense_features])
2.计算每个稀疏字段的唯一特征数,并记录密集特征字段名称
# linear_feature_columns 模型线性部分使用的所有特征的列表
# dnn_feature_columns 模型深层部分使用的所有特征的列表
# 计算每个特征中的不同特征值的个数 一阶+二阶
fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(),embedding_dim=4 )
for i,feat in enumerate(sparse_features)] + [DenseFeat(feat, 1,)
for feat in dense_features]
dnn_feature_columns = fixlen_feature_columns
linear_feature_columns = fixlen_feature_columns
feature_names = get_feature_names(linear_feature_columns + dnn_feature_columns)
3.为模型生成输入数据
# 将数据集切分成训练集和测试集
train, test = train_test_split(data, test_size=0.2, random_state=2020)
train_model_input = {name:train[name] for name in feature_names}
test_model_input = {name:test[name] for name in feature_names}
4.定义模型、培训、预测和评估
#用deepfm进行训练
model = DeepFM(linear_feature_columns, dnn_feature_columns, task='binary')
model.compile("adam", "binary_crossentropy",
metrics=['binary_crossentropy'], )
history = model.fit(train_model_input, train[target].values,
batch_size=256, epochs=10, verbose=2, validation_split=0.2, )
# 使用deepfm进行预测
pred_ans = model.predict(test_model_input, batch_size=256)
输出
print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4))
print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4))