用户新增预测挑战赛——打卡记录1

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

用户新增预测挑战赛
打卡笔记1


前言

赛题名称:用户新增预测挑战赛 赛题类型:数据挖掘、二分类 赛题链接👇: https://challenge.xfyun.cn/topic/info?type=subscriber-addition-prediction&ch=ymfk4uU

赛题背景¶
讯飞开放平台针对不同行业、不同场景提供相应的AI能力和解决方案,赋能开发者的产品和应用,帮助开发者通过AI解决相关实际问题,实现让产品能听会说、能看会认、能理解会思考。

用户新增预测是分析用户使用场景以及预测用户增长情况的关键步骤,有助于进行后续产品和应用的迭代升级。

赛事任务
本次大赛提供了讯飞开放平台海量的应用数据作为训练样本,参赛选手需要基于提供的样本构建模型,预测用户的新增情况。

赛题数据集
赛题数据由约62万条训练集、20万条测试集数据组成,共包含13个字段。

其中uuid为样本唯一标识,eid为访问行为ID,udmap为行为属性,其中的key1到key9表示不同的行为属性,如项目名、项目id等相关字段,common_ts为应用访问记录发生时间(毫秒时间戳),其余字段x1至x8为用户相关的属性,为匿名处理字段。target字段为预测目标,即是否为新增用户。

评价指标
本次竞赛的评价标准采用f1_score,分数越高,效果越好。

赛题思路
赛题是一个典型的数据挖掘的比赛,需要人工提取特征并构建模型,并且特征差异将会带来很大分数差异。

基础版本Baseline解析

# 导入相关工具包
import pandas as pd
import numpy as np
import lightgbm as lgb
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

# 读取训练集和测试集
train_data = pd.read_csv('E:/算法/1_AI夏令营第三期/打卡/1_baseline/train.csv')
test_data = pd.read_csv('E:/算法/1_AI夏令营第三期/打卡/1_baseline/test.csv')

# 访问DataFrame的common_ts列,并将其转换为时间格式,并用unit=‘ms’设置时间单位为毫秒
train_data['commom_ts'] = pd.to_datetime(train_data['common_ts'], unit='ms')    
test_data['commom_ts'] = pd.to_datetime(test_data['common_ts'], unit='ms')


def udmap_onethot(d):
    """将udmap列进行转化"""
    v = np.zeros(9)
    if d == 'unknown':   # 如果某个单元格的值为 unknown , 则返回全零数组v
        return v

    d = eval(d)  # 对每个单元格的参数进行解析,由于原数据列为字典格式,所以这里经过解析后成为真正的字典
    for i in range(1, 10):   # 遍历字典d的键
        if 'key' + str(i) in d:
            v[i-1] = d['key' + str(i)]  # 将键对应的值进行存储
    return v
    
"""对'udmap'列进行处理"""
train_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))  # 用apply()函数调用udmap_onethot函数将'udamp'列进行转换,再用np.vstack进行堆叠
test_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))

train_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]  # 更改列名为 key1到key9
test_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]

# 拼接
train_data = pd.concat([train_data, train_udmap_df], axis=1)
test_data = pd.concat([test_data, test_udmap_df], axis=1)

""'eid'列进行处理"""
train_data['eid_freq'] = train_data['eid'].map(train_data['eid'].value_counts)
# .value_counts用于计算'eid'列中每个值出现的次数,并返回series类型,其中键为'eid'中的参数值,而值为计算的次数;而.map则查找'eid'中每个值在series中出现的次数,并且其返回到'eid_freq'中
test_data['eid_freq'] = test_data['eid'].map(test_data['eid'].values_counts)

train_data['eid_mean'] = train_data['eid'].map(train_data.groupby('eid')['target'].mean())
# 其中train_data.groupby('eid')['target'].mean()是将'eid'列中按照唯一值进行分组,并对每组的target值进行平均
test_data['eid_mean'] = test_data['eid'].map(test_data.groupby('eid')['target'].mean())

train_data['common_ts_day'] = train_data['common_ts'].dt.day
test_data['common_ts_day'] = test_data['common_ts'].dt.day

train_data['common_ts_day_freq'] = train_data['common_ts_day'].map(train_data['common_ts_day'].value_counts())
test_data['common_ts_day_freq'] = test_data['common_ts_day'].map(test_data['common_ts_day'].value_counts())

train_data['common_ts_day_mean'] = train_data['common_ts_day'].map(train_data.groupby('common_ts_day')['target'].mean())
test_data['common_ts_day_mean'] = test_data['common_ts_day'].map(train_data.groupby('common_ts_day')['target'].mean())

"""处理'udmap'中的有用信息"""
train_data['udmap_isunknown'] = (train_data['udmap'] == 'unknown').astype(int)

# 将'udmap'列为'unknown'值的置为1,其他值的单元格置为0,并将结果整理到新列'udmap_isunknown'中
test_data['udmap_isunknown'] = (test_data['udmap'] == 'unknown').astype(int)


"""提取 小时 特征"""
train_data['common_ts_hours'] = train_data['commom_ts'].dt.hour
test_data['common_ts_hours'] = test_data['commom_ts'].dt.hour


# 训练模型
clf = DecisionTreeClassifier()  # 实例化
clf.fit(
    train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),
    train_data['target']
)

# 预测并导出数据
pd.DataFrame(
    {
        'uuid': test_data['uuid'],
        'target': clf.predict(test_data.drop['udamp', 'common_ts', 'uuid'], axis=1)
    }
).to_csv('submit_initial1.csv')

总结

这是官方给出的最初的模型Baseline的相关代码,该代码的f1_score分数能达到0.6+。
后续可以对数据集的特征进一步分析,观察不同的特征和目标之间的关系,进一步优化模型的特征结构,尝试提高模型得分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值