Datawhale AI夏令营学习笔记:用户新增预测模型

Datawhale AI夏令营学习笔记:用户新增预测模型

用户新增预测模型

赛题任务

赛题背景用户新增预测是分析用户使用场景以及预测用户增长情况的关键步骤,有助于进行后续产品和应用的迭代升级
赛题目标基于提供的样本构建模型,预测用户的新增情况
评估标准F1-score
数据集用户行为事件记录,15个原始特征字段
挑战与难点用户行为事件数据到用户级别预测,高维稀疏特征

数据探索(EDA)

  1. 总体了解:
train_df.info()
train_df.describe()
  1. 测试集与用户重合情况分析:
train_did = set(train_df['did'].unique())
test_did = set(test_df['did'].unique())
overlap_dids = train_did & test_did
ratio_in_train = len(overlap_dids)/len(train_did)
ratio_in_test = len(overlap_dids)/len(test_did)
print(f'重叠did数量:',len(overlap_dids))
print(f'重叠用户占train比例:{ratio_in_train:.4f}({len(overlap_dids)}/{len(train_did)})')
print(f'重叠用户占test比例:{ratio_in_test:.4f}({len(overlap_dids)}/{len(test_did)})')
- 重叠did数量: 192393
- 重叠用户占train比例:0.7104(192393/270837)
- 重叠用户占test比例:0.9324(192393/206342)
  1. 缺失值与唯一值分析
# 数据集中特征缺失值、缺失率、唯一值
print(train_df.isnull().any().sum()) #0: 没有缺失值
one_value_fea = [col for col in train_df.columns if train_df[col].nunique()<=1]
one_value_fea_test = [col for col in test_df.columns if test_df[col].nunique()<=1]
one_value_fea,one_value_fea_test # [] []:没有唯一值
  1. 使用 pandas_profiling 生成数据报告
!pip install ydata-profiling
from ydata_profiling import ProfileReport
pfr = ProfileReport(train_df)
pfr.to_file("EDA.html")

特征工程

首先将训练数据与测试数据整合到一起,用于统一的数据预处理或特征工程

full_df = pd.concat([train_df, test_df], axis=0)
full_df = full_df.reset_index()
  1. 时间特征工程:通过数据查看,对于每个客户最刚开始那一天是1(新客户),其他是0
# 转换为时间格式
full_df['ts'] = pd.to_datetime(full_df['common_ts'], unit='ms')
# 提取时间特征
full_df['day'] = full_df['ts'].dt.day
full_df['dayofweek'] = full_df['ts'].dt.dayofweek
full_df['hour'] = full_df['ts'].dt.hour
# 记录每个用户的第一次记录时间与行为之间的间隔
full_df['days_since_first']=(full_df['ts']-full_df.groupby('mid')['ts'].transform('min')).dt.days
# 用户行为特征--时间序列特征:计算用户历史行为频次(滑动窗口)
full_df.sort_values(['did', 'common_ts'], inplace=True)
full_df['user_event_count'] = full_df.groupby('did')['eid'].transform('cumcount') + 1 #用户第几次行为
full_df.sort_index(inplace=True)
  1. 挖掘udmap 字段中的JSON信息(如 botId 、 pluginId )
full_df['botId'] = full_df['udmap_dict'].apply(lambda x: x.get('botId', 'unknown'))
full_df['pluginId'] = full_df['udmap_dict'].apply(lambda x: x.get('pluginId', 'unknown'))
  1. 计算FRM特征:从用户行为的 “时效性、频率、价值” 三个维度量化用户活跃度与重要性,广泛用于用户分层与行为预测。
rfm = full_df.groupby('did').agg(
    recency=('common_ts', 'max'), 
    frequency=('eid', 'count'), # 一共多少次行为
    monetary=('eid', 'nunique')  # 假设不同事件eid类型代表不同价值,一共触发了多少种事件
).reset_index()
full_df = full_df.merge(rfm, on='did', how='left')
  1. 特征组合与高阶交互
full_df['bot_plugin'] = full_df['botId'].astype(str) + '_' + full_df['pluginId'].astype(str) 
full_df['device_os'] = full_df['device_brand'].astype(str) + '_' + full_df['os_type'].astype(str)
full_df['time_bucket'] = pd.cut(full_df['hour'], bins=[0,6,12,18,24], labels=[0,1,2,3]) # 数据分桶:深夜、上午、下午、晚上
full_df['time_eid'] = full_df['time_bucket'].astype(str) + '_' + full_df['eid'].astype(str)
  1. 特征编码

模型训练

  1. LightGBM:作为基模型,适合高维稀疏数据,且对类别特征处理友好
  2. 阈值优化:通过动态调整分类阈值( find_optimal_threshold )最大化F1分数,适应类别不平衡问题
  3. 贝叶斯参数调优
# 定义超参数搜索空间
    params = {
        'objective': 'binary',
        'metric': 'binary_logloss',
        'max_depth': trial.suggest_int('max_depth', 3, 15),
        'num_leaves': trial.suggest_int('num_leaves', 15, 255),
        'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3, log=True),
        'feature_fraction': trial.suggest_float('feature_fraction', 0.5, 0.95),
        'bagging_fraction': trial.suggest_float('bagging_fraction', 0.5, 0.95),
        'bagging_freq': trial.suggest_int('bagging_freq', 1, 10),
        'min_child_samples': trial.suggest_int('min_child_samples', 5, 100),
        'lambda_l1': trial.suggest_float('lambda_l1', 1e-8, 10.0, log=True),
        'lambda_l2': trial.suggest_float('lambda_l2', 1e-8, 10.0, log=True),
        'verbose': -1,
        'n_jobs': 8,
        'seed': seed
    }
  1. 模型融合:将LightGBM、XGBoost、Catboost模型进行融合,但是代码运行总是报错,所以这里没有进行模型融合

总结

这是算是机器学习项目的一个初步尝试,对于新手来说还是挺难的,代码还在运行当中,分数还没出来,先打个卡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值