背景介绍

本次大作业提供抽样用户过去一段时间内在一点资讯APP上的真实曝光和点击记录,以及所涉及用户和文章的基础属性,需要基于这些数据进行分析和建模。
所给数据格式:

  1. 用户信息user_info.txt,“\t”分割,各列字段为:用户id、设备名称、操作系统、所在省、所在市、年龄、性别;
  2. 文章信息doc_info.txt,“\t”分割,各列字段为:文章id、标题、发文时间、图片数量、一级分类、二级分类、关键词;
  3. 训练数据train.csv,“\t”分割,各列字段为:用户id、文章id、展现时间、网路环境、刷新次数、展现位置、是否点击、消费时长(秒);
  4. 测试数据test_data.txt,“\t”分割,各列字段为:编号、用户id、文章id、展现时间、网路环境、刷新次数;

题目中有需要改正的一点是,训练数据train.csv实际是用“,”逗号作为分隔符,而不是“\t " 。

处理思路

做题思路

  1. 读取数据:从不同文件中读取用户信息、文章信息、训练数据和测试数据,并为每个数据集指定中文列名。
  2. 数据合并:将用户信息和文章信息合并到训练数据和测试数据中,以便将所有相关特征整合在一起。
  3. 特征选择:选取相关的特征作为模型的输入,并指定目标变量。
  4. 数据预处理:处理缺失值、转换数据类型等,使数据适合模型训练。
  5. 模型训练:使用训练数据训练一个随机森林分类模型。
  6. 模型评估:在验证集上评估模型性能,计算AUC得分。
  7. 预测测试数据:使用训练好的模型对测试数据进行预测,并确保预测值在合理范围内。
  8. 保存结果:将预测结果保存到指定格式的文件中。

数据预处理细节

  1. 读取数据
    • 使用 pd.read_csv 读取用户信息、文章信息、训练数据和测试数据。
    • 为每个数据集指定合适的列名,确保数据的可读性和一致性。
  2. 数据合并
    • 使用 pd.merge 方法将用户信息和文章信息合并到训练数据和测试数据中。
    • 确保合并操作使用左连接 (how='left'),以防止数据丢失。
  3. 特征选择
    • 根据任务要求选择相关特征。
    • 目标变量(点击率)由训练数据中的是否点击 列派生。
  4. 处理缺失值
    • 使用 SimpleImputer 填充缺失值。填充策略为 median,即用每列的中位数填充缺失值。
    • 对所有数值特征进行填充,以确保模型不会因为缺失值而报错。
  5. 数据类型转换
    • 将所有特征和目标变量转换为 float 类型,以便模型能够处理。
    • 这一转换通过 astype(float) 方法实现。
  6. 分割数据集
    • 使用 train_test_split 将数据分割为训练集和验证集,确保模型能够进行性能评估。
    • 分割比例为 80% 训练集和 20% 验证集,设置 random_state=42 以保证结果可重复。
  7. 模型训练
    • 使用 RandomForestClassifier 训练模型,设定随机种子以保证结果可重复。
    • 使用训练集 (X_train, y_train) 进行模型训练。
  8. 模型评估
    • 在验证集上进行预测,并使用 roc_auc_score 评估模型性能。
    • 输出 AUC 得分以评估模型效果。
  9. 预测测试数据
    • 使用训练好的模型对测试数据进行预测。
    • 确保预测值在0到1的范围内,使用 np.clip 进行后处理。
  10. 保存结果
    • 将预测结果添加到测试数据中,并生成包含编号和点击率预估值的结果数据框。
    • 使用 to_csv 方法将结果保存到指定格式的文件中,文件名为“项目一+submit+姓名.csv”。

使用算法-随机森林

算法简介

随机森林(Random Forest)是一种集成学习算法,由Leo Breiman在2001年提出。它通过集成多棵决策树来提高模型的准确性和鲁棒性。

核心思想

随机森林的核心思想是通过构建多个决策树,并结合这些树的预测结果,从而达到比单棵决策树更好的性能。它在训练过程中引入了随机性,通过“袋装法”(Bagging)和“特征随机选择”来生成不同的决策树。

主要步骤

  1. 数据集的子采样:通过自助采样法(Bootstrap Sampling)从原始训练数据集中随机采样,生成多个包含部分数据的子集。每个子集用于训练一棵决策树。
  2. 特征的子集选择:在每棵树的每个节点分裂时,随机选择部分特征进行分裂,而不是使用所有特征。这种方法可以增加模型的多样性,降低过拟合的风险。
  3. 决策树的构建:对每个子采样数据集,构建一棵决策树,树的深度可以根据具体需求进行设置,通常会让树完全生长,不进行剪枝。
  4. 集成预测:在预测阶段,随机森林会结合所有树的预测结果。对于回归问题,通常是对所有树的预测结果取平均值;对于分类问题,通常是对所有树的预测结果进行投票,选择出现次数最多的类别。

优点

  1. 高准确性:通过集成多棵决策树,随机森林在多数情况下比单棵决策树具有更高的预测准确性。
  2. 抗过拟合:由于引入了随机性,随机森林能有效地防止模型过拟合。
  3. 处理高维数据:能够处理高维特征的数据,并提供特征重要性评价。
  4. 稳定性:对数据中的噪声不敏感,具有较好的鲁棒性。

缺点

  1. 计算资源消耗大:由于需要训练大量的决策树,随机森林在训练和预测时需要较多的计算资源。
  2. 模型可解释性差:相较于单棵决策树,随机森林的复杂性使其难以解释。

适用场景

随机森林适用于分类和回归任务,尤其在以下情况下效果显著:

  • 数据噪声较大且样本量充足
  • 特征数量多且存在较强的相关性
  • 需要较高的预测准确性且对计算资源要求不敏感

常用参数

  • 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' 文件中")

总结与收获

这个点击率预测大作业是一个典型的推荐系统中的重要任务,涉及到用户行为数据的分析和建模。通过这个大作业,我总结了以下几点收获:

  1. 首先,我更深刻地理解了推荐系统中点击率预测的重要性。想象一下,你在网上购物时,网站上的商品推荐会直接影响你的购买决策,而这种推荐的排序往往就是基于点击率预测的结果。
  2. 在实际操作中,我学会了如何处理各种各样的数据,比如合并数据、填补缺失值、选择合适的特征等等。而特别是在特征工程这一块,我深刻感受到了特征对于模型的重要性,只有选取合适的特征,模型才能发挥最佳的效果。
  3. 至于模型的选择和调参,我学会了根据数据的特点来选择适合的模型,并通过调整参数来提高模型的性能。在这个大作业中,我用到了随机森林算法,而且经过调参后,模型的预测性能得到了很大的提升。
  4. 最后,通过对模型结果的评估和分析,我不仅更深入地理解了模型的优缺点,还学会了如何从中得出有价值的信息,为后续的优化和改进提供了很好的参考。而且,通过与同学们的合作和交流,我还提升了团队合作和沟通的能力。这一切都为我今后从事相关工作打下了很好的基础

总的来说,通过这个点击率预测大作业,我不仅深入了解了推荐系统中的核心任务,还提升了数据处理、特征工程、模型建立与优化、结果分析等方面的能力,为我今后从事相关数据分析工作打下了良好的基础。

分类: 算法

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注