2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析

news2024/12/26 21:09:02

2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析

在这里插入图片描述

相关链接

【2023 年第二届钉钉杯大学生大数据挑战赛初赛】 初赛 A:智能手机用户监测数据分析 问题一Python代码分析

【2023 年第二届钉钉杯大学生大数据挑战赛初赛】 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析

1 题目

2023 年第二届钉钉杯大学生大数据挑战赛初赛题目 初赛 A:智能手机用户监测数据分析

一、问题背景

近年来,随着智能手机的产生,发展到爆炸式的普及增长,不仅推动了中 国智能手机市场的发展和扩大,还快速的促进手机软件的开发。近年中国智能手 机市场品牌竞争进一步加剧,中国超越美国成为全球第一大智能手机市场。手机 软件日新月异,让人们更舒适的使用手机,为人们的生活带来很多乐趣,也产生 了新的群体“低头一族”。手机软件进入人们的生活,游戏、购物、社交、资讯、理财等等APP吸引着、方便着现代社会的人们,让手机成为人们出门的必备物 品。该数据来自某公司某年连续30天的4万多智能手机用户的监测数据,已经做 了脱敏和数据变换处理。每天的数据为1个txt文件,共10列,记录了每个用户(以uid为唯一标识)每天使用各款APP(以appid为唯一标识)的起始时间,使 用时长,上下流量等。具体说明见表1。此外,有一个辅助表格, app_class.csv,共两列。第一列是appid,给出4000多个常用APP所属类别(app_class),比如:社交类、影视类、教育类等,用英文字母a-t表示,共20个常 用得所属类别,其余APP不常用,所属类别未知。

表 1

变量编号变量名释义
1uid用户的id
2appidAPP的id(与app_class文件中的第一列对应)
3app_typeAPP类型:系统自带、用户安装
4start_day使用起始天,取值1-30(注:第一天数据的头两行的使用起始天取 值为0,说明是在这一天的前一天开始使用的)
5start_time使用起始时间
6end_day使用结束天
7end_time使用结束时间
8duration使用时长(秒)
9up_flow上行流量
10down_flow下行流量

二、解决问题

  1. 聚类分析

(一)根据用户常用所属的20类APP的数据对用户进行聚类,要求至少给出三种不同的聚 类算法进行比较,选择合理的聚类数量K值,并分析聚类结果。

(二)根据聚类结果对不同类别的用户画像,并且分析不同群体用户的特征。(用户画 像定义:根据用户的属性,偏好,行为习惯等信息对用户打标签,用以描述不同群体的用户 行为,从而针对不同群体的用户推荐不同所属类别的APP产品。)

  1. APP使用情况预测分析:要研究的问题是通过用户的APP使用记录预测用户未来是否使 用APP(分类问题)及使用时长(回归问题)

(一)对用户使用APP的情况进行预测,根据用户第111天的a类APP的使用情况,来预测用户在第1221天是否会使用该类APP。给出预测结果和真实结果相比的准确率。(注:测 试集不能参与到训练和验证中,否则作违规处理)

(二)对用户使用APP的情况进行预测,根据用户第1~11天的a类APP的使用情况,来预测 第12~21天用户使用a类APP的有效日均使用时长。评价指标选用MMSE。
M M S E = ∑ ( y i − y i ^ ) ∑ ( y i − y i ‾ ) MMSE = \sqrt{\frac{\sum(y_i-\hat{y_i})}{\sum(y_i-\overline{y_i})}} MMSE=(yiyi)(yiyi^)

式中, y i y_i yi表示使用时长的实际值; y i ^ \hat{y_i} yi^表示使用时长的预测值; y i ‾ \overline{y_i} yi表示所有用户的实际使用时长的平均值。给出预测结果和真实结果之间的NMSE。(注:测试集不能参与到训练和验证中, 否则作违规处理)

data.csv数据来自某公司某年连续30天的4万多智能手机用户的监测数据,表格式如下,请根据用户第1~11天的a类APP的使用情况,采用XGBoost模型预测 第12~21天用户使用a类APP的有效日均使用时长。评价指标选用MMSE。

变量编号变量名释义
1uid用户的id
2categoryAPP的类别(a到z类,共26类)
3app_typeAPP类型:系统自带、用户安装
4start_day使用起始天,取值1-30(注:第一天数据的头两行的使用起始天取 值为0,说明是在这一天的前一天开始使用的)
5start_time使用起始时间
6end_day使用结束天
7end_time使用结束时间
8duration使用时长(秒)
9up_flow上行流量
10down_flow下行流量

2 建模思路

第一题:

  1. 数据预处理:对用户常用的20类APP数据,进行数据清洗和特征提取。可以使用PCA、LDA算法进行降维,减小计算复杂度。

  2. 聚类算法:
    a. K-means: 进行数据聚类时,选择不同的K值进行多次试验,选取最优的聚类结果。可以使用轮廓系数、Calinski-Harabaz指数等评价指标进行比较和选择。
    b. DBSCAN: 利用密度对数据点进行聚类,不需要预先指定聚类的数量。使用基于密度的聚类算法时,可以通过调整半径参数和密度参数来得到不同聚类效果。
    c. 层次聚类:可分为自顶向下和自底向上两种方式。通过迭代计算每个数据点之间的相似度,将数据点逐渐合并,最后得到聚类结果。

    d.改进的聚类算法

    e. 深度聚类算法

  3. 聚类结果分析:选择最优的聚类结果后,对不同类别用户进行画像。分析每个类别的用户行为特征(如使用时段、使用频率、使用时长、使用偏好等),根据用户画像为用户打标签。根据用户标签,推荐不同所属类别的APP产品。

第二题:

  1. 数据预处理:对用户APP使用记录数据,进行数据清洗和特征提取,例如统计用户每种APP的使用次数、时长等特征量。
  2. 分类问题预测:建立分类模型,利用用户1~11天的APP使用记录,采用特征工程对数据进行处理,并选择合适的分类算法进行训练和测试,如决策树、随机森林、支持向量机、改进的机器学习分类算法。最后使用测试集进行模型验证,评价模型的准确率。
  3. 回归问题预测:建立回归模型,利用用户1~11天的APP使用记录,采用特征工程对数据进行处理,并选择合适的回归算法进行训练和测试,如线性回归、决策树回归、神经网络回归。使用测试集进行模型验证,评价模型的准确性,可以使用NMSE评价指标。

3 问题一实现代码

【2023 年第二届钉钉杯大学生大数据挑战赛初赛】 初赛 A:智能手机用户监测数据分析 问题一Python代码分析

4 问题二实现代码

4.1 分类问题:预测是否会使用a类APP

(1)特征工程部分,见问题一博客

【2023 年第二届钉钉杯大学生大数据挑战赛初赛】 初赛 A:智能手机用户监测数据分析 问题一Python代码分析

(2)数据读取

1-11天的数据作为训练集,12-21天的数据作为测试集

建立分类,注意,一个用户有多次使用记录,在测试集中,需要根据用户id进行去重后,再预测

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import warnings
warnings.filterwarnings("ignore")

# 读取全部数据集
# 读取训练集
train_folder_path = '初赛数据集/训练集'
train_dfs = []
for filename in os.listdir(train_folder_path):
    if filename.endswith('.txt'):
        csv_path = os.path.join(train_folder_path, filename)
        tempdf = pd.read_csv(csv_path)
        train_dfs.append(tempdf)
train_df = pd.concat(train_dfs,axis=0)
# 读取测试集
test_folder_path = '初赛数据集/测试集'
test_dfs = []
for filename in os.listdir(test_folder_path):
    if filename.endswith('.txt'):
        csv_path = os.path.join(test_folder_path, filename)
        tempdf = pd.read_csv(csv_path)
        test_dfs.append(tempdf)
test_df = pd.concat(test_dfs,axis=0)
# 提取特征和标签
X_train = train_df.drop(['category','uid','appid'], axis=1)
y_train = train_df['category']

X_test = test_df.drop(['category','uid','appid'], axis=1)
y_test = test_df['category']

(3)模型训练

# 训练决策树模型
dt_model = DecisionTreeClassifier(random_state=42)
dt_model.fit(X_train, y_train)
dt_y_pred = dt_model.predict(X_test)
dt_accuracy = accuracy_score(y_test, dt_y_pred)
print('决策树模型的准确率:', dt_accuracy)

决策树模型的准确率: 0.8853211009174312


# 训练随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
rf_y_pred = rf_model.predict(X_test)
rf_accuracy = accuracy_score(y_test, rf_y_pred)
print('随机森林模型的准确率:', rf_accuracy)

随机森林模型的准确率: 0.9724770642201835

# 训练支持向量机模型
svc_model = SVC(kernel='linear')
svc_model.fit(X_train, y_train)
svc_y_pred = svc_model.predict(X_test)
svc_accuracy = accuracy_score(y_test, svc_y_pred)

print('支持向量机模型的准确率:', svc_accuracy)

支持向量机模型的准确率: 0.9513251783893986

4.2 回归问题

(1)特征提取部分

  • 过去11天的每天时间特征,day、hour、minute,还可以增加节假日和周末和工作日等时间特征
  • 过去11天用户对a类APP的总使用时长
  • 过去11天用户对a类APP的使用次数
  • 过去11天用户对a类APP的曲线趋势
  • 其他与a类APP相关的特征

读取数据


import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
import holidays
import os

# 加载 APP 类别文件
app_class = pd.read_csv('初赛数据集/app_class.csv',names=['appid','app_type'])
app_type_dict = dict(zip(app_class['appid'], app_class['app_type']))

# 读取训练集,该文件夹下面包括day01.txt到day21.txt,总共21个文件
train_folder_path = '初赛数据集/问题2数据集'
train_dfs = []
cols = ['uid','appid','app_type','start_day','start_time','end_day','end_time','duration','up_flow','down_flow']
for filename in os.listdir(train_folder_path):
    if filename.endswith('.txt'):
        csv_path = os.path.join(train_folder_path, filename)
        tempdf = pd.read_csv(csv_path,names=cols)
        train_dfs.append(tempdf)
data = pd.concat(train_dfs,axis=0)
data.shape

数据预处理

# 处理app类别
data['category'] = data['appid'].map(app_type_dict)
# 处理时间格式
data['start_time'] = pd.to_datetime(data['start_time'])
data['end_time'] = pd.to_datetime(data['end_time'])

# 构建"使用时长(小时)"特征
data['duration_hour'] = (data['end_time'] - data['start_time']).dt.seconds / 3600
# 缺失值处理
data = data.dropna()

# 提取时间特征
data['start_time_day'] = data.start_time.dt.day
data['start_time_hour'] = data.start_time.dt.hour
data['start_time_minute'] = data.start_time.dt.minute


# 异常值处理(例如使用时长小于0或大于24小时的数据)
data = data[(data['duration_hour'] >= 0) & (data['duration_hour'] <= 24)]

# 构建训练集和测试集
train = data[data['start_day'] <= 11]
test = data[(data['start_day'] >= 12) & (data['start_day'] <= 21)]

特征工程

# 提取过去11天用户对a类APP的总使用时长
。。。略
# 提取过去11天用户对a类APP的使用次数
。。。略


# 将特征合并到训练集和测试集中
train = pd.merge(train, total_duration, on='uid', how='left')
train = pd.merge(train, count, on='uid', how='left')

test = pd.merge(test, total_duration, on='uid', how='left')
test = pd.merge(test, count, on='uid', how='left')


# 缺失值处理
train = train.fillna(0)
test = test.fillna(0)

# 选择必要的特征
features = ['a_total_duration', 'a_count','start_time_day','start_time_hour','start_time_minute']
# 构建训练集和测试集的特征矩阵和目标变量
。。。略


X_test = test[features].values
mean_test_duration = test.groupby('uid')['duration_hour'].mean()
y_test = test['uid'].map(dict(mean_test_duration))

(2)模型训练部分

使用XGB回归模型,还可以使用LGB、线性回归、决策树回归、神经网络回归等模型,此外还要调参,机器学习方法可以考虑网格寻优的方法。


import xgboost as xgb
from sklearn.model_selection import GridSearchCV


# 特征归一化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.fit_transform(X_test)

# XGBoost回归模型,还可以使用线性回归、决策树回归、神经网络回归
xgbmodel = xgb.XGBRegressor(
            objective='reg:squarederror',
            n_jobs=-1,
            n_estimators=1000,
            max_depth=7,
            subsample=0.8,
            learning_rate=0.05,
            gamma=0,
            colsample_bytree=0.9,
            random_state=2021, max_features=None, alpha=0.3)

# 训练模型
xgbmodel.fit(X_train, y_train)

在这里插入图片描述

(3)模型评价
根据题目给的公式实现,公式如下
M M S E = ∑ ( y i − y i ^ ) ∑ ( y i − y i ‾ ) MMSE = \sqrt{\frac{\sum(y_i-\hat{y_i})}{\sum(y_i-\overline{y_i})}} MMSE=(yiyi)(yiyi^)


from sklearn.metrics import mean_squared_error, mean_absolute_error

def MMSE(y_test, y_pred):
    # 计算实际值与预测值之间的平均误差
    error = y_test - y_pred
    # 计算分子和分母
    numerator = np.sum(np.square(error))
    denominator = np.sum(np.square(y_test - np.mean(y_test)))
    # 计算 MMSE
    mmse = np.sqrt(numerator / denominator)
    return mmse
# 对测试集进行预测
y_pred = xgbmodel.predict(X_test)

# 计算评价指标
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
mmse = MMSE(y_test, y_pred)
print("MMSE: {:.4f},MSE: {:.4f}, MAE: {:.4f}".format(mmse,mse, mae))

MMSE: 1.0709,MSE: 0.0432, MAE: 0.1181

4 下载

见知乎文章底部,下载后包括所有问题的完整代码

zhuanlan.zhihu.com/p/643785015

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ 5.0 无状态实时性消费详解

作者&#xff1a;绍舒 背景 RocketMQ 5.0 版本引入了 Proxy 模块、无状态 pop 消费机制和 gRPC 协议等创新功能&#xff0c;同时还推出了一种全新的客户端类型&#xff1a;SimpleConsumer。 SimpleConsumer 客户端采用了无状态的 pop 机制&#xff0c;彻底解决了在客户端发布…

SpringBoot原理分析 | Redis集成

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Springboot集成Redis 依赖导入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis<…

九、数据结构——顺序队列中的循环队列

目录 一、循环队列的定义 二、循环队列的实现 三、循环队列的基本操作 ①初始化 ②判空 ③判满 ④入队 ⑤出队 ⑥获取长度 ⑦打印 四、循环队列的应用 五、全部代码 数据结构中的循环队列 在数据结构中&#xff0c;队列&#xff08;Queue&#xff09;是一种常见的线性数据结…

防火墙NAT地址转换的四种应用实验与防火墙的双机热备实验

一、NAT实验 一、源地址转换 1、首先搭建NAT实验环境的拓扑&#xff1a; 这里需要配置各个设备的ip、掩码、网关&#xff1b;省略 2、登录防火墙设备并且为防火墙设备的0/0/0接口配置与虚拟网卡一个网段的ip&#xff0c;并且开启该接口的全部服务 [USG6000V1]int gi 0/0/0…

Keil系列教程11_工程窗口图标说明

1写在前面 很多朋友看到如下工程窗口的图标&#xff08;如&#xff1a;带有“叹号”、“星号”、“钥匙”、“禁止驶入”标志&#xff09;&#xff0c;就会产生疑问&#xff1a;这些图标到底是啥意思呢&#xff1f; 其实&#xff0c;这些不同标志的图标是代表着不同的含义&…

AWVS 15.6 使用教程

目录 介绍 版本 AWVS具有以下特点和功能&#xff1a; 功能介绍&#xff1a; Dashboard功能&#xff1a; Targets功能&#xff1a; Scans功能&#xff1a; Vulnerabilities功能&#xff1a; Reports功能&#xff1a; Users功能&#xff1a; Scan Profiles功能&#x…

MyBatis查询数据库(2)

目录 前言&#x1f36d; 一、增删查改操作 1、查 Ⅰ、mapper接口&#xff1a; Ⅱ、UserMapper.xml 查询所有用户的具体实现 SQL&#xff1a; Ⅲ、进行单元测试 2、增、删、改操作 Ⅰ、增 添加用户 添加用户并且返回自增 id Ⅱ、改 根据id修改用户名 开启 MyBatis …

leetcode每日一练-第141题-环形链表

一、思路 双指针 二、解题方法 使用了正确的快慢环指针方法来判断链表。快指针每次向前移动两步&#xff0c;慢指针每次移动一步&#xff0c;如果链表中向前移动一步&#xff0c;它们最终会相遇。如果链表不存在环&#xff0c;快指针会先到达链表是否存在&#xff0c;此时存在…

【C#】using

文章目录 global 修饰符using 别名结合“global 修饰符”和“using 别名”static 修饰符来源 global 修饰符 向 using 指令添加 global 修饰符意味着 using 将应用于编译中的所有文件&#xff08;通常是一个项目&#xff09;。 global using 指令被添加到 C# 10 中。 其语法为…

怎么快速定位bug?怎么编写测试用例?

目录 01定位问题的重要性 02问题定位技巧 03初次怎么写用例 作为一名测试人员如果连常见的系统问题都不知道如何分析&#xff0c;频繁将前端人员问题指派给后端人员&#xff0c;后端人员问题指派给前端人员&#xff0c;那么在团队里你在开发中的地位显而易见 &#xff0c;口碑…

什么?按Home键SingleInstance Activity销毁了???

前段时间&#xff0c;突然有朋友询问&#xff0c;自己写的SingleInstance Activity在按home键的时候被销毁了&#xff0c;刚听到这个问题的时候&#xff0c;我直觉怀疑是Activity在onPause或者onStop中发生了Crash导致闪退了&#xff0c;但是安装apk查看现象&#xff0c;没有发…

摸索graphQL在前端vue中使用过程(四)

请求网址https://hasura.io/learn/graphql&#xff0c;他这个Authorization好像每天就会一次变化&#xff0c;需要注意。 之前用到了一种类型ID&#xff0c;也就是说&#xff0c;在GraphQL的查询标量的过程中。 标量:就是被查询的字段名称。 这里再补充一点知识&#xff0c;统…

Android 包体积资源优化实践

1 插件优化 插件优化资源在得物App最新版本上收益12MB。插件优化的日志在包体积平台有具体的展示&#xff0c;也是为了提供一个资源问题追溯的能力。 1.1 插件环境配置 插件首先会初始化环境配置&#xff0c;如果机器上未安装运行环境则会去oss下载对应的可执行文件。 1.2 图…

Windows 在VMware16.x安装Win11系统详细教程

文章目录 一、准备二、创建虚拟机1. 创建新的虚拟机2. 选择虚拟机硬件兼容性3. 安装客户机操作系统4. 选择客户机操作系统5. 命名虚拟机6. 固件类型7. 处理器配置8. 此虚拟机内存9. 网络类型10. 选择I/O控制器类型11. 选择磁盘类型12. 选择磁盘13. 指定磁盘容量14. 指定磁盘文件…

【深度学习】日常笔记15

训练集和测试集并不来⾃同⼀个分布。这就是所谓的分布偏移。 真实⻛险是从真实分布中抽取的所有数据的总体损失的预期&#xff0c;然⽽&#xff0c;这个数据总体通常是⽆法获得的。计算真实风险公式如下&#xff1a; 为概率密度函数 经验⻛险是训练数据的平均损失&#xff0c;⽤…

python机器学习(四)线性代数回顾、多元线性回归、多项式回归、标准方程法求解、线性回归案例

回顾线性代数 矩阵 矩阵可以理解为二维数组的另一种表现形式。A矩阵为三行两列的矩阵&#xff0c;B矩阵为两行三列的矩阵&#xff0c;可以通过下标来获取矩阵的元素&#xff0c;下标默认都是从0开始的。 A i j : A_{ij}: Aij​:表示第 i i i行&#xff0c;第 j j j列的元素。…

N位分频器的实现

N位分频器的实现 一、 目的 使用verilog实现n位的分频器&#xff0c;可以是偶数&#xff0c;也可以是奇数 二、 原理 FPGA中n位分频器的工作原理可以简要概括为: 分频器的作用是将输入时钟频率分频,输出低于输入时钟频率的时钟信号。n位分频器可以将输入时钟频率分频2^n倍…

linux进阶-I.MX 6ULL

目录 启动模式&#xff08;8引脚设置启动模式&#xff09; 对应原理图 boot ROM程序 空偏移 映像向量表&#xff08;Image vector table&#xff0c;IVT&#xff09; IVT结构体 Boot data DCD&#xff08;外设寄存器配置信息&#xff0c;初始化关键外设&#xff09; NXP…

如何使用 After Effects 导出摄像机跟踪数据到 3ds Max

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在本教程中&#xff0c;我将展示如何在After Effects中跟踪实景场景&#xff0c;然后将相机数据导出到3ds Max。 1. 项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 转到合成>新合成以创建新合…

Docker Compose(九)

一、背景&#xff1a; 对于现代应用来说&#xff0c;大多数都是通过很多的微服务互相协同组成一个完整的应用。例如&#xff0c;订单管理、用户管理、品类管理、缓存服务、数据库服务等&#xff0c;他们构成了一个电商平台的应用。而部署和管理大量的服务容器是一件非常繁琐的事…