背景介绍
本次大作业提供抽样用户过去一段时间内在一点资讯APP上的真实曝光和点击记录,以及所涉及用户和文章的基础属性,需要基于这些数据进行分析和建模。
所给数据格式:
- 用户信息user_info.txt,“\t”分割,各列字段为:用户id、设备名称、操作系统、所在省、所在市、年龄、性别;
- 文章信息doc_info.txt,“\t”分割,各列字段为:文章id、标题、发文时间、图片数量、一级分类、二级分类、关键词;
- 训练数据train.csv,“\t”分割,各列字段为:用户id、文章id、展现时间、网路环境、刷新次数、展现位置、是否点击、消费时长(秒);
- 测试数据test_data.txt,“\t”分割,各列字段为:编号、用户id、文章id、展现时间、网路环境、刷新次数;
题目中有需要改正的一点是,训练数据train.csv实际是用“,”逗号作为分隔符,而不是“\t " 。
处理思路
做题思路
- 读取数据:从不同文件中读取用户信息、文章信息、训练数据和测试数据,并为每个数据集指定中文列名。
- 数据合并:将用户信息和文章信息合并到训练数据和测试数据中,以便将所有相关特征整合在一起。
- 特征选择:选取相关的特征作为模型的输入,并指定目标变量。
- 数据预处理:处理缺失值、转换数据类型等,使数据适合模型训练。
- 模型训练:使用训练数据训练一个随机森林分类模型。
- 模型评估:在验证集上评估模型性能,计算AUC得分。
- 预测测试数据:使用训练好的模型对测试数据进行预测,并确保预测值在合理范围内。
- 保存结果:将预测结果保存到指定格式的文件中。
数据预处理细节
- 读取数据:
- 使用 pd.read_csv 读取用户信息、文章信息、训练数据和测试数据。
- 为每个数据集指定合适的列名,确保数据的可读性和一致性。
- 数据合并:
- 使用 pd.merge 方法将用户信息和文章信息合并到训练数据和测试数据中。
- 确保合并操作使用左连接 (how='left'),以防止数据丢失。
- 特征选择:
- 根据任务要求选择相关特征。
- 目标变量(点击率)由训练数据中的是否点击 列派生。
- 处理缺失值:
- 使用 SimpleImputer 填充缺失值。填充策略为 median,即用每列的中位数填充缺失值。
- 对所有数值特征进行填充,以确保模型不会因为缺失值而报错。
- 数据类型转换:
- 将所有特征和目标变量转换为 float 类型,以便模型能够处理。
- 这一转换通过 astype(float) 方法实现。
- 分割数据集:
- 使用 train_test_split 将数据分割为训练集和验证集,确保模型能够进行性能评估。
- 分割比例为 80% 训练集和 20% 验证集,设置 random_state=42 以保证结果可重复。
- 模型训练:
- 使用 RandomForestClassifier 训练模型,设定随机种子以保证结果可重复。
- 使用训练集 (X_train, y_train) 进行模型训练。
- 模型评估:
- 在验证集上进行预测,并使用 roc_auc_score 评估模型性能。
- 输出 AUC 得分以评估模型效果。
- 预测测试数据:
- 使用训练好的模型对测试数据进行预测。
- 确保预测值在0到1的范围内,使用 np.clip 进行后处理。
- 保存结果:
- 将预测结果添加到测试数据中,并生成包含编号和点击率预估值的结果数据框。
- 使用 to_csv 方法将结果保存到指定格式的文件中,文件名为“项目一+submit+姓名.csv”。
使用算法-随机森林
算法简介
随机森林(Random Forest)是一种集成学习算法,由Leo Breiman在2001年提出。它通过集成多棵决策树来提高模型的准确性和鲁棒性。
核心思想
随机森林的核心思想是通过构建多个决策树,并结合这些树的预测结果,从而达到比单棵决策树更好的性能。它在训练过程中引入了随机性,通过“袋装法”(Bagging)和“特征随机选择”来生成不同的决策树。
主要步骤
- 数据集的子采样:通过自助采样法(Bootstrap Sampling)从原始训练数据集中随机采样,生成多个包含部分数据的子集。每个子集用于训练一棵决策树。
- 特征的子集选择:在每棵树的每个节点分裂时,随机选择部分特征进行分裂,而不是使用所有特征。这种方法可以增加模型的多样性,降低过拟合的风险。
- 决策树的构建:对每个子采样数据集,构建一棵决策树,树的深度可以根据具体需求进行设置,通常会让树完全生长,不进行剪枝。
- 集成预测:在预测阶段,随机森林会结合所有树的预测结果。对于回归问题,通常是对所有树的预测结果取平均值;对于分类问题,通常是对所有树的预测结果进行投票,选择出现次数最多的类别。
优点
- 高准确性:通过集成多棵决策树,随机森林在多数情况下比单棵决策树具有更高的预测准确性。
- 抗过拟合:由于引入了随机性,随机森林能有效地防止模型过拟合。
- 处理高维数据:能够处理高维特征的数据,并提供特征重要性评价。
- 稳定性:对数据中的噪声不敏感,具有较好的鲁棒性。
缺点
- 计算资源消耗大:由于需要训练大量的决策树,随机森林在训练和预测时需要较多的计算资源。
- 模型可解释性差:相较于单棵决策树,随机森林的复杂性使其难以解释。
适用场景
随机森林适用于分类和回归任务,尤其在以下情况下效果显著:
- 数据噪声较大且样本量充足
- 特征数量多且存在较强的相关性
- 需要较高的预测准确性且对计算资源要求不敏感
常用参数
- n_estimators:决策树的数量
- max_depth:决策树的最大深度
- min_samples_split:节点分裂所需的最小样本数
- min_samples_leaf:叶节点的最小样本数
- max_features:分裂时考虑的最大特征数
模型改进思路
增加树的数量:
-
当前代码中 n_estimators=5,这个值相对较小,可以增加树的数量(如100或更多),以提高模型的稳定性和准确性。
model = RandomForestClassifier(n_estimators=100, random_state=42)调整最大树深度:
-
可以通过调整 max_depth 参数来控制树的最大深度,从而防止过拟合。
model = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42)使用交叉验证:
-
使用K折交叉验证来评估模型性能。目前使用的是5折交叉检验,后续可考虑更多
from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X, y, cv=5, scoring='roc_auc') print(f'Cross-Validation AUC Scores: {scores}')特征工程:
-
增加或改进特征工程,例如生成新的特征、处理类别特征、标准化或归一化数值特征等。
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X)调参:
-
使用网格搜索或随机搜索来调参,以找到最佳的超参数组合。
from sklearn.model_selection import GridSearchCV param_grid = { 'n_estimators': [100, 200], 'max_depth': [10, 20], 'min_samples_split': [2, 5], 'min_samples_leaf': [1, 2] } grid_search = GridSearchCV(model, param_grid, cv=5, scoring='roc_auc') grid_search.fit(X_train, y_train) best_model = grid_search.best_estimator_ print(f'Best Parameters: {grid_search.best_params_}')
模型输出结果
AUC Score
经过多次训练后,AUC Score的平均值稳定在72%-75%之间。
预测点击率
# 创建预测结果数据框,只保留编号和点击率预估值
submission = test_data[['编号', '点击率预估值']]
# 保存预测结果到新文件
submission.to_csv('项目一+submit+姓名.csv', index=False, sep=',')
print("预测完成,结果已保存到 '项目一+submit+姓名.csv' 文件中")
总结与收获
这个点击率预测大作业是一个典型的推荐系统中的重要任务,涉及到用户行为数据的分析和建模。通过这个大作业,我总结了以下几点收获:
- 首先,我更深刻地理解了推荐系统中点击率预测的重要性。想象一下,你在网上购物时,网站上的商品推荐会直接影响你的购买决策,而这种推荐的排序往往就是基于点击率预测的结果。
- 在实际操作中,我学会了如何处理各种各样的数据,比如合并数据、填补缺失值、选择合适的特征等等。而特别是在特征工程这一块,我深刻感受到了特征对于模型的重要性,只有选取合适的特征,模型才能发挥最佳的效果。
- 至于模型的选择和调参,我学会了根据数据的特点来选择适合的模型,并通过调整参数来提高模型的性能。在这个大作业中,我用到了随机森林算法,而且经过调参后,模型的预测性能得到了很大的提升。
- 最后,通过对模型结果的评估和分析,我不仅更深入地理解了模型的优缺点,还学会了如何从中得出有价值的信息,为后续的优化和改进提供了很好的参考。而且,通过与同学们的合作和交流,我还提升了团队合作和沟通的能力。这一切都为我今后从事相关工作打下了很好的基础
总的来说,通过这个点击率预测大作业,我不仅深入了解了推荐系统中的核心任务,还提升了数据处理、特征工程、模型建立与优化、结果分析等方面的能力,为我今后从事相关数据分析工作打下了良好的基础。
0 条评论