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

本文涉及的产品
云原生网关 MSE Higress,422元/月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 本文介绍了2023年第二届钉钉杯大学生大数据挑战赛初赛A题的Python代码分析,涉及智能手机用户监测数据分析中的聚类分析和APP使用情况的分类与回归问题。

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

变量编号 变量名 释义
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 下行流量

二、解决问题

  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。
$$MMSE = \sqrt{\frac{\sum(y_i-\hat{y_i})}{\sum(y_i-\overline{y_i})}}$$

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

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

变量编号 变量名 释义
1 uid 用户的id
2 category APP的类别(a到z类,共26类)
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 下行流量

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)模型评价
根据题目给的公式实现,公式如下
$$MMSE = \sqrt{\frac{\sum(y_i-\hat{y_i})}{\sum(y_i-\overline{y_i})}}$$


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

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
57 4
|
2月前
|
Python
Python办公自动化:xlwings对Excel进行分类汇总
Python办公自动化:xlwings对Excel进行分类汇总
76 1
|
8天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
27 3
|
7天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
90 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1月前
|
机器学习/深度学习 数据可视化 大数据
驾驭股市大数据:Python实战指南
【10月更文挑战第1天】随着信息技术的发展,投资者现在能够访问到前所未有的海量金融数据。本文将指导您如何利用Python来抓取当前股市行情的大数据,并通过分析这些数据为自己提供决策支持。我们将介绍从数据获取到处理、分析以及可视化整个流程的技术方法。
87 2
|
1月前
|
安全 Python
Python脚本实现IP按段分类
【10月更文挑战第04天】
26 7
|
1月前
|
存储 Python 容器
Python 对象有哪几种,我们可以从哪些角度进行分类呢?
Python 对象有哪几种,我们可以从哪些角度进行分类呢?
15 1
|
2月前
|
存储 大数据 索引
解锁Python隐藏技能:构建高效后缀树Suffix Tree,处理大数据游刃有余!
通过构建高效的后缀树,Python程序在处理大规模字符串数据时能够游刃有余,显著提升性能和效率。无论是学术研究还是工业应用,Suffix Tree都是不可或缺的强大工具。
48 6
|
2月前
|
机器学习/深度学习 数据挖掘 大数据
大数据时代的“淘金术”:Python数据分析+深度学习框架实战指南
在大数据时代,数据被视为新财富源泉,而从海量信息中提取价值成为企业竞争的核心。本文通过对比方式探讨如何运用Python数据分析与深度学习框架实现这一目标。Python凭借其强大的数据处理能力及丰富库支持,已成为数据科学家首选工具;而TensorFlow和PyTorch等深度学习框架则为复杂模型构建提供强有力的技术支撑。通过融合Python数据分析与深度学习技术,我们能在各领域中发掘数据的无限潜力。无论是商业分析还是医疗健康,掌握这些技能都将为企业和社会带来巨大价值。
89 6