赞
踩
一、问题背景
近年来,随着智能手机的产生,发展到爆炸式的普及增长,不仅推动了中 国智能手机市场的发展和扩大,还快速的促进手机软件的开发。近年中国智能手 机市场品牌竞争进一步加剧,中国超越美国成为全球第一大智能手机市场。手机 软件日新月异,让人们更舒适的使用手机,为人们的生活带来很多乐趣,也产生 了新的群体“低头一族”。手机软件进入人们的生活,游戏、购物、社交、资讯、理财等等APP吸引着、方便着现代社会的人们,让手机成为人们出门的必备物 品。
该数据来自某公司某年连续30天的4万多智能手机用户的监测数据,已经做 了脱敏和数据变换处理。每天的数据为1个txt文件,共10列,记录了每个用户(以uid为唯一标识)每天使用各款APP(以appid为唯一标识)的起始时间,使 用时长,上下流量等。具体说明见表1。此外,有一个辅助表格app_class.csv,共两列。第一列是appid,给出4000多个常用APP所属类别(app_class),比如:社交类、影视类、教育类等,用英文字母a-t表示,共20个常用得所属类别,其余APP不常用,所属类别未知。
表 1
变量编号 | 变量名 | 释义 |
---|---|---|
1 | uid | 用户的id |
2 | appid | APP的id(与app_class文件中的第一列对应) |
3 | app_type | APP类型:系统自带、用户安装 |
4 | start_day | 使用起始天,取值1-30(注:第一天数据的头两行的使用起始天取 值为0,说明是在这一天的前一天开始使用的) |
5 | start_time | 使用起始时间 |
6 | end_day | 使用结束天 |
7 | end_time | 使用结束时间 |
8 | duration | 使用时长(秒) |
9 | up_flow | 上行流量 |
10 | down_flow | 下行流量 |
二、解决问题
(一)对用户使用APP的情况进行预测,根据用户第1~15天的常用所属20 类APP的使用情况,建立一个模型来预测用户在16~30天会使用哪些类的APP, 给出预测结果和真实结果相比的准确率。(注:测试集不能参与到训练和验证中,否则作违规处理)
(二)对用户使用APP的使用时长进行预测,根据用户第115天的常用所属20类APP的使用情况,建立一个模型来预测用户在1630天对于每一类APP的有效日均使用时长。评价指标选用NMSE. (注:测试集不能参与到训练和验证中,否则作违规处理)
在初赛的基础上,重新训练模型,重新预测一遍就行。
这是一个推荐系统开发的问题。
我们可以考虑使用协同过滤推荐模型,模型参数包括用户偏好矩阵和物品偏好矩阵,参数量取决于用户和物品的数量。对于推荐系统的预测结果进行评价,可以使用交叉验证或者留出法等方法进行评估。
import pandas as pd
import os
from tqdm import tqdm
import warnings
warnings.filterwarnings("ignore")
tqdm.pandas()
# 合并数据1-30天的数据
folder_path = '初赛数据集/'
dfs = []
for filename in os.listdir(folder_path):
if filename.endswith('.txt'):
csv_path = os.path.join(folder_path, filename)
tempdf = pd.read_csv(csv_path)
dfs.append(tempdf)
folder_path = '复赛数据集/'
for filename in os.listdir(folder_path):
if filename.endswith('.txt'):
csv_path = os.path.join(folder_path, filename)
tempdf = pd.read_csv(csv_path)
dfs.append(tempdf)
df = pd.concat(dfs,axis=0)
df.shape
import pandas as pd
import matplotlib.pyplot as plt
# 数据清洗
df.loc[df['start_day'] == 0, 'start_day'] = 1 # 将使用起始天为0的行,修改为1
df['start_time'] = pd.to_datetime(df['start_time']) # 转换为datetime类型
df['end_time'] = pd.to_datetime(df['end_time']) # 转换为datetime类型
df['usage_time'] = (df['end_time'] - df['start_time']) / pd.Timedelta(minutes=1) # 使用时长(分钟)
df['up_flow_mb'] = df['up_flow'] / 1024 / 1024 # 上行流量(MB)
df['down_flow_mb'] = df['down_flow'] / 1024 / 1024 # 下行流量(MB)
df = df[df['duration'] != 0] # 剔除使用时长为0的行
df = df[df['up_flow'] != 0] # 剔除上行流量为0的行
df = df[df['down_flow'] != 0] # 剔除下行流量为0的行
df
# 剔除使用时长和流量明显异常的行
# 剔除使用时长小于10秒的行
df = df[df['usage_time'] >= 10]
fig, axs = plt.subplots(1, 3, figsize=(10, 5))
axs[0].hist(df['usage_time'])
axs[0].set_title('Usage Time')
axs[0].set_xlabel('Time (minutes)')
axs[1].hist(df['up_flow_mb'])
axs[1].set_title('Up Flow')
axs[1].set_xlabel('Up Flow (MB)')
axs[2].hist(df['down_flow_mb'])
axs[2].set_title('Down Flow')
axs[2].set_xlabel('Down Flow (MB)')
plt.show()
# APP分类信息(可根据app_id和app_class文件进行关联)
cate_df_1 = pd.read_csv('初赛数据集/app_class.csv',header=None)
cate_df_2 = pd.read_csv('复赛数据集/app_class.csv',header=None)
cate_df = pd.concat([cate_df_1,cate_df_2],axis=0)
cate_df.columns = ['appid','letter']
# 定义字母编码映射字典
char_map = {chr(i + 96): i for i in range(1, 27)}
# 将'letter'列中的字母进行编码
cate_df['letter'] = cate_df['letter'].map(char_map)
cate_dict = dict(zip(cate_df['appid'],cate_df['letter']))
df['category'] = df['appid'].map(cate_dict)
df.to_excel('data/复赛数据集1-30day.xlsx',index=False)
加我扣扣
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。