首页 > 其他分享 >机器学习实践:用户新增预测

机器学习实践:用户新增预测

时间:2023-08-18 23:00:51浏览次数:35  
标签:机器 ts udmap 用户 实践 train eid test data

开始分析

根据海量的应用数据作为训练样本,基于提供的样本构建模型,预测用户的新增情况。

赛题数据由约62万条训练集、20万条测试集数据组成,共包含13个字段。其中uuid为样本唯一标识,eid为访问行为ID,udmap为行为属性,其中的key1到key9表示不同的行为属性,如项目名、项目id等相关字段,common_ts为应用访问记录发生时间(毫秒时间戳),其余字段x1至x8为用户相关的属性,为匿名处理字段。target字段为预测目标,即是否为新增用户。

基于训练集的样本数据,构建一个模型来预测测试集中用户的新增情况。这是一个二分类任务,其中目标是根据用户的行为、属性以及访问时间等特征,预测该用户是否属于新增用户。具体来说,选手需要利用给定的数据集进行特征工程、模型选择和训练,然后使用训练好的模型对测试集中的用户进行预测,并生成相应的预测结果。

Baseline选择使用机器学习方法,在解决机器学习问题时,一般会遵循以下流程:

机器学习实践:用户新增预测_时间戳


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

下面是基础版本的Baseline.

import pandas as pd
import numpy as np

train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
test_data = pd.read_csv('用户新增预测挑战赛公开数据/test.csv')

train_data['common_ts'] = pd.to_datetime(train_data['common_ts'], unit='ms')
test_data['common_ts'] = pd.to_datetime(test_data['common_ts'], unit='ms')

机器学习实践:用户新增预测_数据_02

def udmap_onethot(d):
    v = np.zeros(9)
    if d == 'unknown':
        return v
    
    d = eval(d)
    for i in range(1, 10):
        if 'key' + str(i) in d:
            v[i-1] = d['key' + str(i)]
            
    return v

train_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))
test_udmap_df = pd.DataFrame(np.vstack(test_data['udmap'].apply(udmap_onethot)))

train_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
test_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]

机器学习实践:用户新增预测_决策树_03

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

机器学习实践:用户新增预测_时间戳_04

train_data['eid_freq'] = train_data['eid'].map(train_data['eid'].value_counts())
test_data['eid_freq'] = test_data['eid'].map(train_data['eid'].value_counts())

train_data['eid_mean'] = train_data['eid'].map(train_data.groupby('eid')['target'].mean())
test_data['eid_mean'] = test_data['eid'].map(train_data.groupby('eid')['target'].mean())

机器学习实践:用户新增预测_决策树_05

train_data['udmap_isunknown'] = (train_data['udmap'] == 'unknown').astype(int)
test_data['udmap_isunknown'] = (test_data['udmap'] == 'unknown').astype(int)

机器学习实践:用户新增预测_时间戳_06

train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
test_data['common_ts_hour'] = test_data['common_ts'].dt.hour

机器学习实践:用户新增预测_时间戳_07

import lightgbm as lgb
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier()
clf.fit(
    train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),
    train_data['target']
)

机器学习实践:用户新增预测_决策树_08

pd.DataFrame({
    'uuid': test_data['uuid'],
    'target': clf.predict(test_data.drop(['udmap', 'common_ts', 'uuid'], axis=1))
}).to_csv('submit.csv', index=None)

实践步骤

  1. 导入库:首先,代码导入了需要用到的库,包括 pandas(用于数据处理和分析)和 DecisionTreeClassifier(决策树分类器)等。
  2. 读取数据:代码通过使用 pd.read_csv 函数从文件中读取训练集和测试集数据,并将其存储在 train_datatest_data 两个数据框中。
  3. 特征工程

- udmap_onethot 函数将原始的 udmap 特征进行了预处理,将其转换为一个长度为9的向量,表示每个key是否存在。

- 对 udmap 特征进行编码,生成 udmap_isunknown 特征,表示该特征是否为空。

- 将处理后的 udmap 特征与原始数据拼接起来,形成新的数据框。

- 提取 eid 特征的频次(出现次数)和均值,并添加为新的特征。

- 使用时间戳 common_ts 提取小时部分,生成 common_ts_hour 特征。

  1. 决策树模型训练和预测

- 创建了一个 DecisionTreeClassifier 的实例,即决策树分类器。

- 使用 fit 函数对训练集中的特征和目标进行拟合,训练了决策树模型。

- 对测试集使用已训练的模型进行预测,得到预测结果。

- 将预测结果和相应的 uuid 组成一个DataFrame,并将其保存到 submit.csv 文件中。

实践代码:

# 1. 导入需要用到的相关库
# 导入 pandas 库,用于数据处理和分析
import pandas as pd
# 导入 numpy 库,用于科学计算和多维数组操作
import numpy as np
# 从 sklearn.tree 模块中导入 DecisionTreeClassifier 类
# DecisionTreeClassifier 用于构建决策树分类模型
from sklearn.tree import DecisionTreeClassifier


# 2. 读取训练集和测试集
# 使用 read_csv() 函数从文件中读取训练集数据,文件名为 'train.csv'
train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
# 使用 read_csv() 函数从文件中读取测试集数据,文件名为 'test.csv'
test_data = pd.read_csv('用户新增预测挑战赛公开数据/test.csv')


# 3. 将 'udmap' 列进行 One-Hot 编码 
# 数据样例:
#                    udmap  key1  key2  key3  key4  key5  key6  key7  key8  key9
# 0           {'key1': 2}     2     0     0     0     0     0     0     0     0
# 1           {'key2': 1}     0     1     0     0     0     0     0     0     0
# 2  {'key1': 3, 'key2': 2}   3     2     0     0     0     0     0     0     0

# 在 python 中, 形如 {'key1': 3, 'key2': 2} 格式的为字典类型对象, 通过key-value键值对的方式存储
# 而在本数据集中, udmap实际是以字符的形式存储, 所以处理时需要先用eval 函数将'udmap' 解析为字典

# 具体实现代码:
# 定义函数 udmap_onethot,用于将 'udmap' 列进行 One-Hot 编码
def udmap_onethot(d):
    v = np.zeros(9)  # 创建一个长度为 9 的零数组
    if d == 'unknown':  # 如果 'udmap' 的值是 'unknown'
        return v  # 返回零数组
    d = eval(d)  # 将 'udmap' 的值解析为一个字典
    for i in range(1, 10):  # 遍历 'key1' 到 'key9', 注意, 这里不包括10本身
        if 'key' + str(i) in d:  # 如果当前键存在于字典中
            v[i-1] = d['key' + str(i)]  # 将字典中的值存储在对应的索引位置上
            
    return v  # 返回 One-Hot 编码后的数组

# 注: 对于不理解的步骤, 可以逐行 print 内容查看
# 使用 apply() 方法将 udmap_onethot 函数应用于每个样本的 'udmap' 列
# np.vstack() 用于将结果堆叠成一个数组
train_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))
test_udmap_df = pd.DataFrame(np.vstack(test_data['udmap'].apply(udmap_onethot)))
# 为新的特征 DataFrame 命名列名
train_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
test_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
# 将编码后的 udmap 特征与原始数据进行拼接,沿着列方向拼接
train_data = pd.concat([train_data, train_udmap_df], axis=1)
test_data = pd.concat([test_data, test_udmap_df], axis=1)


# 4. 编码 udmap 是否为空
# 使用比较运算符将每个样本的 'udmap' 列与字符串 'unknown' 进行比较,返回一个布尔值的 Series
# 使用 astype(int) 将布尔值转换为整数(0 或 1),以便进行后续的数值计算和分析
train_data['udmap_isunknown'] = (train_data['udmap'] == 'unknown').astype(int)
test_data['udmap_isunknown'] = (test_data['udmap'] == 'unknown').astype(int)


# 5. 提取 eid 的频次特征
# 使用 map() 方法将每个样本的 eid 映射到训练数据中 eid 的频次计数
# train_data['eid'].value_counts() 返回每个 eid 出现的频次计数
train_data['eid_freq'] = train_data['eid'].map(train_data['eid'].value_counts())
test_data['eid_freq'] = test_data['eid'].map(train_data['eid'].value_counts())


# 6. 提取 eid 的标签特征
# 使用 groupby() 方法按照 eid 进行分组,然后计算每个 eid 分组的目标值均值
# train_data.groupby('eid')['target'].mean() 返回每个 eid 分组的目标值均值
train_data['eid_mean'] = train_data['eid'].map(train_data.groupby('eid')['target'].mean())
test_data['eid_mean'] = test_data['eid'].map(train_data.groupby('eid')['target'].mean())


# 7. 提取时间戳
# 使用 pd.to_datetime() 函数将时间戳列转换为 datetime 类型
# 样例:1678932546000->2023-03-15 15:14:16
# 注: 需要注意时间戳的长度, 如果是13位则unit 为 毫秒, 如果是10位则为 秒, 这是转时间戳时容易踩的坑
# 具体实现代码:
train_data['common_ts'] = pd.to_datetime(train_data['common_ts'], unit='ms')
test_data['common_ts'] = pd.to_datetime(test_data['common_ts'], unit='ms')

# 使用 dt.hour 属性从 datetime 列中提取小时信息,并将提取的小时信息存储在新的列 'common_ts_hour'
train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
test_data['common_ts_hour'] = test_data['common_ts'].dt.hour


# 8. 加载决策树模型进行训练(直接使用sklearn中导入的包进行模型建立)
clf = DecisionTreeClassifier()
# 使用 fit 方法训练模型
# train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1) 从训练数据集中移除列 'udmap', 'common_ts', 'uuid', 'target'
# 这些列可能是特征或标签,取决于数据集的设置
# train_data['target'] 是训练数据集中的标签列,它包含了每个样本的目标值
clf.fit(
    train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),  # 特征数据:移除指定的列作为特征
    train_data['target']  # 目标数据:将 'target' 列作为模型的目标进行训练
)


# 9. 对测试集进行预测,并保存结果到result_df中
# 创建一个DataFrame来存储预测结果,其中包括两列:'uuid' 和 'target'
# 'uuid' 列来自测试数据集中的 'uuid' 列,'target' 列将用来存储模型的预测结果
result_df = pd.DataFrame({
    'uuid': test_data['uuid'],  # 使用测试数据集中的 'uuid' 列作为 'uuid' 列的值
    'target': clf.predict(test_data.drop(['udmap', 'common_ts', 'uuid'], axis=1))  # 使用模型 clf 对测试数据集进行预测,并将预测结果存储在 'target' 列中
})


# 10. 保存结果文件到本地
# 将结果DataFrame保存为一个CSV文件,文件名为 'submit.csv'
# 参数 index=None 表示不将DataFrame的索引写入文件中
result_df.to_csv('submit.csv', index=None)


运行流程

这里在百度飞桨AI Studio上面来运行:

机器学习实践:用户新增预测_时间戳_09

启动环境,下面是初始界面,开始运行:

机器学习实践:用户新增预测_决策树_10

开始运行,等待结束后生成submit.csv文件:

机器学习实践:用户新增预测_决策树_11

在提交界面去提交结果得到分数:

机器学习实践:用户新增预测_决策树_12


标签:机器,ts,udmap,用户,实践,train,eid,test,data
From: https://blog.51cto.com/u_16069833/7142532

相关文章

  • 现代CSS布局技术:Flexbox和Grid的使用指南和最佳实践
    在现代Web开发中,CSS布局技术变得越来越重要。Flexbox和Grid是两种常用的CSS布局技术,它们可以帮助我们创建灵活、可维护的布局。Flexbox布局Flexbox是一种基于弹性盒子模型的布局技术,它可以让我们更加容易地创建水平或垂直方向上的布局。以下是Flexbox的常见属性:容器属性disp......
  • 使用Canvas API实现交互式绘图和动画:基础知识和实践经验
    CanvasAPI是HTML5中的一个重要特性,它允许开发者在网页上直接绘制图形、图像、文本等内容,并且可以通过JavaScript进行控制和交互。在本文中,我们将介绍CanvasAPI的基础知识,包括如何创建Canvas元素、设置Canvas的属性、绘制基本形状和路径、以及使用图片和文字等高级功能。创建Can......
  • 如何用CSS实现响应式设计并优化用户体验
    在移动设备的时代,网站的响应式设计变得越来越重要。响应式设计的目标是使网站适应不同尺寸和分辨率的设备,并提供最佳的用户体验。本文将介绍如何使用CSS实现响应式设计并优化用户体验。使用媒体查询设置CSS样式媒体查询是CSS3中的一个强大的特性,可以根据不同的媒体类型和设备特......
  • 基于机器学习的基因组预测
    目录机器学习与GP基因型数据编码高通量表型数据驱动的育种需要结构化数据集可解释机器学习机器学习与GP与动物育种相比,植物的基因组选择必须通过环境相互作用来考虑更大的基因型,并且需要添加适当的多环境试验数据。机器学习(ML)和深度学习(DL)算法比线性预测模型更复杂,可以发现......
  • 敏捷项目管理实践管理方法
    ​Leangoo领歌是一款永久免费的专业敏捷研发管理工具,提供敏捷研发解决方案,解决研发痛点,打造成功产品。帮助团队实现需求、迭代、缺陷、任务、测试、发布等全方位研发管理。敏捷产品路线图管理:产品路线图是一个高层次的战略计划,它描述了产品在未来一段时间可能会如何发展和壮大......
  • 管理员必看!Salesforce用户管理的7个最佳实践
    用户对象是在Salesforce中经常使用到的关键标准对象之一,熟悉用户管理以及对象的特殊性至关重要。本篇文章将探讨作为管理员可以做些什么,不仅可以保持对Salesforce及其相关数据的受控访问,还可以为你的用户充分利用功能。01Salesforce中的用户类型根据你在组织内使用的Salesfor......
  • 某电商平台电子产品用户购买行为研究-计算机毕业设计源码+LW文档
    摘要随着计算机和互联网的普及,搜索引擎成了人们常用的工具。通过搜索引擎来查询电商网站销售信息,搜索引擎首先对关键词进行分析,然后返回查询的结果。但是随着网络信息量的急速增长,产生了大量的垃圾信息和网络广告,使得查询结果越来越困难。针对这一问题,本系统通过对网络爬虫的分析......
  • 智安网络|零信任安全框架:保障数字化时代网络安全的最佳实践
    随着数字化时代的快速发展,网络安全问题变得越来越突出。传统的安全防御模式已经不再适用于现代复杂的网络环境中。为了应对日益增长的网络威胁,零信任安全模式应运而生。一、什么是零信任?零信任是一种安全框架和哲学,它基于一个简单的原则:不信任任何用户或设备,即使它们已经位于网络内......
  • AI聊天机器人原来有这么多作用
    AI聊天机器人是一种能够模拟人类对话并利用人工智能技术进行自主学习和适应的计算机程序。它们能够根据用户的输入内容来分析用户的需求,并提供相应的回答和建议。今天looklook就来和大家详细讲一下AI聊天机器人到底有什么作用吧。AI聊天机器人的作用1、客户服务:AI聊天机器人可以作......
  • Oracle 查看用户下所有表注释行数,查看所有索引,组合索引
    --当前用户所有表注释行数selectutc.table_name,utc.COMMENTS,ut.num_rowsfromuser_tab_commentsutc,user_tablesutwhereutc.table_name=ut.table_name--当前用户所有索引组合索引selectdistinctt.table_name,t.index_name,listagg(t.column_name,',......