30天搞定CTR预测:TensorFlow2实战指南
你还在为点击率(Click-Through Rate, CTR)预测模型搭建烦恼?特征工程复杂、模型调参耗时、评估指标难懂?本文基于eat_tensorflow2_in_30_days项目,带你30天从零实现高准确率CTR模型,掌握结构化数据建模全流程。读完你将获得:
- 数据预处理到模型部署的完整 pipeline
- 特征工程核心技巧(缺失值处理/类别编码)
- 模型评估与优化实战经验
- 工业级模型保存与部署方案
一、数据准备:从原始数据到特征矩阵
CTR预测的基础是高质量数据预处理。以Titanic数据集为例,需完成缺失值填充、类别特征编码等关键步骤。
1.1 探索性数据分析(EDA)
通过可视化了解数据分布,识别关键特征:
- 标签分布:查看正负样本比例,判断是否存在类别不平衡
- 特征分布:分析数值特征(如年龄、票价)的统计特性
- 特征相关性:探索特征与标签的关联程度
# 查看标签分布
ax = dftrain_raw['Survived'].value_counts().plot(kind='bar', figsize=(12,8))
ax.set_xlabel('是否点击')
ax.set_ylabel('样本数量')
年龄与点击的相关性分析显示,中青年群体点击率显著高于其他年龄段: 
1.2 特征工程实现
核心预处理步骤参考1-1,结构化数据建模流程范例.md:
- 类别特征:Pclass/Sex/Embarked 转换为独热编码
- 数值特征:Age/Fare 标准化处理,添加缺失值标识
- 特殊特征:Cabin 转换为"是否缺失"二元特征
def preprocessing(dfdata):
dfresult = pd.DataFrame()
# Pclass独热编码
dfPclass = pd.get_dummies(dfdata['Pclass'])
dfPclass.columns = ['Pclass_' + str(x) for x in dfPclass.columns]
dfresult = pd.concat([dfresult, dfPclass], axis=1)
# 性别编码
dfSex = pd.get_dummies(dfdata['Sex'])
dfresult = pd.concat([dfresult, dfSex], axis=1)
# 年龄处理(含缺失值标识)
dfresult['Age'] = dfdata['Age'].fillna(0)
dfresult['Age_null'] = pd.isna(dfdata['Age']).astype('int32')
# 其他特征
dfresult['SibSp'] = dfdata['SibSp']
dfresult['Parch'] = dfdata['Parch']
dfresult['Fare'] = dfdata['Fare']
dfresult['Cabin_null'] = pd.isna(dfdata['Cabin']).astype('int32')
# 登船港口编码
dfEmbarked = pd.get_dummies(dfdata['Embarked'], dummy_na=True)
dfresult = pd.concat([dfresult, dfEmbarked], axis=1)
return dfresult
处理后特征矩阵维度为15维,满足CTR模型输入要求:
x_train.shape = (712, 15)
x_test.shape = (179, 15)
二、模型构建:从网络设计到训练配置
2.1 模型结构设计
采用Sequential顺序模型,输入层15维特征,隐藏层使用ReLU激活函数,输出层使用Sigmoid激活函数输出点击概率:
model = models.Sequential([
layers.Dense(20, activation='relu', input_shape=(15,)),
layers.Dense(10, activation='relu'),
layers.Dense(1, activation='sigmoid')
])
model.summary()
模型结构如下,总参数量仅541个,训练效率高:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 20) 320
_________________________________________________________________
dense_1 (Dense) (None, 10) 210
_________________________________________________________________
dense_2 (Dense) (None, 1) 11
=================================================================
Total params: 541
2.2 训练配置
CTR预测属于二分类问题,采用:
- 优化器:Adam(自适应学习率)
- 损失函数:二元交叉熵(binary_crossentropy)
- 评估指标:AUC(Area Under Curve)
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['AUC']
)
history = model.fit(
x_train, y_train,
batch_size=64,
epochs=30,
validation_split=0.2 # 20%训练数据作为验证集
)
训练过程参考6-2,训练模型的3种方法.md,关键是监控验证集性能防止过拟合。
三、模型评估:从指标分析到结果可视化
3.1 训练过程可视化
通过损失曲线和AUC曲线判断模型收敛情况:
def plot_metric(history, metric):
train_metrics = history.history[metric]
val_metrics = history.history['val_'+metric]
epochs = range(1, len(train_metrics)+1)
plt.plot(epochs, train_metrics, 'bo--')
plt.plot(epochs, val_metrics, 'ro-')
plt.title('训练与验证'+metric)
plt.xlabel('Epoch')
plt.ylabel(metric)
plt.legend(['train_'+metric, 'val_'+metric])
plt.show()
plot_metric(history, "loss")
3.2 测试集评估
在独立测试集上验证模型泛化能力:
model.evaluate(x_test, y_test)
测试集AUC达到0.81,满足CTR预测业务要求:
[0.5191367897907448, 0.8122605]
详细评估方法参考5-6,评估指标metrics.md,工业界常用AUC、LogLoss、准确率等多维指标综合判断。
四、模型应用:从概率预测到业务部署
4.1 预测接口
使用模型进行点击率预测:
# 预测概率
pred_probs = model.predict(x_test[:10])
# 预测类别(默认阈值0.5)
pred_classes = model.predict_classes(x_test[:10])
输出结果示例:
# 预测概率
[[0.2650], [0.4097], [0.4429], [0.7841], [0.4765],
[0.4385], [0.2743], [0.5963], [0.5948], [0.1788]]
# 预测类别
[[0], [0], [0], [1], [0], [0], [0], [1], [1], [0]]
4.2 模型保存与部署
推荐使用TensorFlow原生格式保存模型,支持跨平台部署:
# 保存完整模型
model.save('./data/tf_model_savedmodel', save_format="tf")
# 加载模型
loaded_model = tf.keras.models.load_model('./data/tf_model_savedmodel')
loaded_model.evaluate(x_test, y_test)
模型文件结构参考6-6,使用tensorflow-serving部署模型.md,包含:
- saved_model.pb:模型结构与计算图
- variables/:权重参数
- assets/:额外资源文件
五、进阶优化:从特征工程到超参调优
5.1 特征优化方向
提升CTR模型性能的核心技巧:
- 特征交叉:如Pclass与Sex的组合特征
- 特征分箱:将连续特征(Age/Fare)离散化
- 特征选择:使用IV值或特征重要性筛选有效特征
详细特征工程方法参考5-2,特征列feature_column.md,TensorFlow提供FeatureColumn API简化特征处理流程。
5.2 模型优化策略
- 网络结构:增加隐藏层神经元数量或层数
- 正则化:添加Dropout层或L2正则化防止过拟合
- 超参调优:使用网格搜索优化学习率、 batch_size等参数
# 添加Dropout层示例
model = models.Sequential([
layers.Dense(64, activation='relu', input_shape=(15,)),
layers.Dropout(0.3), # 30%神经元随机失活
layers.Dense(32, activation='relu'),
layers.Dense(1, activation='sigmoid')
])
六、总结与展望
本文基于eat_tensorflow2_in_30_days项目实现了完整CTR预测流程,从数据预处理到模型部署全覆盖。关键收获:
- 结构化数据建模核心是特征工程,需重点处理类别特征和缺失值
- 中小型CTR模型可采用简单网络结构,通过特征优化提升性能
- AUC是CTR预测的核心指标,需关注验证集与测试集的一致性
后续可探索:
- 深度学习特征交互(如Wide & Deep模型)
- 在线学习与模型更新策略
- A/B测试设计与效果评估
点赞+收藏+关注,下期分享《CTR模型特征工程高级技巧》。完整代码与数据可从项目仓库获取,动手实践是掌握CTR预测的最佳途径!
项目教程:README.md
完整代码:1-1,结构化数据建模流程范例.md
官方文档:一、TensorFlow的建模流程.md
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






