2025五一杯数学建模竞赛C题 社交媒体用户分析 保姆级教程讲解|模型讲解

完整内容请看文章最下面的推广群

2025五一杯数学建模竞赛(五一赛)C题保姆级分析完整思路+代码+数据教学

1. 题目分析

属于数据分析与预测类的数学建模问题。主要围绕社交媒体平台用户与博主之间的互动行为数据,运用统计分析和预测模型,解决博主新增关注数、用户新关注行为、用户在线情况及互动关系等预测问题。

2. 核心要点

(1)数据预处理

将附件1中“用户行为”合并成不同交互维度(观看、点赞、评论、关注),并按照博主和日期汇总。

考虑点赞、评论、关注均包含观看,所以可设计“去重观看”与“交互强度”指标。

将时间戳拆分成日期、小时段等多种时间特征。

(2)特征工程

宏观特征:每日全平台各博主的总互动数、历史平均新增关注数、上升/下降趋势(如近3日变化率)。

博主侧特征:粉丝基数、历史高峰期、内容活跃度(当日发帖数或互动率)。

用户侧特征(问题2–4):用户历史活跃天数、长尾偏好(偏好哪些博主)、时间段活跃分布、交互偏好(观看→点赞→关注转化率)。

(3)模型选择与验证

对于问题1:可选用时间序列模型(如ARIMA、指数平滑)或回归模型(如Poisson回归、随机森林回归)来预测每日新增关注量。

对于问题2–4:可构建分类模型(逻辑回归、XGBoost等)判断是否会关注,并用多标签预测或排序模型(如learning to rank)来给出可能关注的博主列表。

交叉验证:对历史数据按滚动时间窗口进行训练/验证,评估预测准确度(MAE、RMSE、AUC等)。

3. 求解思路

(1)数据处理

1)数据清洗:

检查数据中是否存在缺失值,对于缺失值可以采用删除、填充(如均值填充、中位数填充)等方法进行处理。

去除重复记录,确保数据的唯一性。

检查数据中的异常值,对于异常值可以采用基于统计方法(如Z-score)或基于机器学习方法(如孤立森林)进行识别和处理。

2)数据转换:

将时间列转换为合适的日期时间格式,方便后续按时间进行数据筛选和分析。

将用户行为列中的数字编码转换为对应的行为名称(观看、点赞、评论、关注),提高数据的可读性。

3)特征提取:根据不同问题的需求,从原始数据中提取相关特征,如上述各问题中提到的观看数、点赞数、评论数、关注数、在线天数、在线时段分布等。

4)数据划分:将数据划分为训练集和测试集,一般采用随机划分或按时间顺序划分的方法,确保训练集和测试集的数据分布具有代表性。在Python中可以使用 sklearn 库的 train_test_split 函数实现:

(2)问题1

1)对附件1中各博主的历史关注数据进行统计分析,提取与关注数相关的特征,如观看数、点赞数、评论数等。

2)选择合适的时间序列分析模型或机器学习回归模型,以历史关注数据和相关特征为输入,建立预测模型。

3)使用训练好的模型预测各博主在2024.7.21当天的新增关注数,并筛选出新增关注数最多的5位博主。

(3)问题2

1)结合附件1中用户的历史行为数据和附件2中2024.7.22当天的观看、点赞、评论行为数据,提取用户与博主之间的互动特征。

2)构建机器学习分类模型,以用户的历史行为和当天的互动特征为输入,预测用户在2024.7.22产生的新关注行为。

3)将指定用户在2024.7.22新关注的博主ID填入表2。

(4)问题3

1)基于附件1数据,分析用户的历史在线时间和互动行为模式,提取与用户在线情况和互动关系相关的特征。

2)建立机器学习分类模型预测指定用户在2024.7.21当天是否在线。

3)若用户在线,使用回归模型预测该用户与各博主的互动数,并找出互动数最高的3名博主。

(5)问题4

1)在问题3的基础上,进一步分析用户使用社交媒体的时间习惯,将时间划分为24个时段。

2)建立时间序列模型或机器学习模型,预测指定用户在2024.7.23是否在线以及每个在线时段与各博主的互动数。

3)找出每个用户在每个在线时段互动数最高的3名博主ID以及对应的时段,并填入表4。

4.详细思路

1)目标定义

目标变量:对于每个博主Bi,预测2024年7月21日的“新增关注数”yi(t)。

2)数据处理

  1. 筛选出附件1中2024年7月11日-20日的所有关注行为(用户行为=4); 2) 按博主和日期汇总,得到时间序 {y_i(t)},其中 t=1 对应7月11日,…,t=10 对应7月20日; 3) 统计同日的观看(去重)、点赞、评论总数,作为额外解释变量。

3)特征构建

① 滑动窗口均值(过去 k 天的平均关注数):

 

 

② 关注数一阶差分及增长率:

 

 

③ 交互强度特征:当日观看wi(t)、点赞li(t)、评论 ci(t),以及点赞率、评论率:

 

④ 周期性特征:是否工作日/周末,节假日标记。

4)模型选择

针对非负整数的关注量,可选用:

• Poisson 回归:

 

• 若数据非线性,可尝试随机森林回归、XGBoost回归等。

5)模型训练与调优

① 训练集:7月11–19日,验证集:7月20日; ② 时间序列交叉验证; ③ 评估指标:MAE、RMSE; ④ 特征重要性分析。

6)结果输出与排序

使用训练好的模型对每个博主预测7月21日关注量 \hat y_i(21),按预测值降序,取前5名,输出博主ID及预测关注数。

代码:

import pandas as pd

import numpy as np

from sklearn.ensemble import RandomForestRegressor

from sklearn.model_selection import TimeSeriesSplit, GridSearchCV

from sklearn.metrics import mean_absolute_error, mean_squared_error

import warnings

warnings.filterwarnings('ignore')

# 1. 数据读取

# 假设附件1已保存为 'attachment1.csv',包含列: UserID, Behavior, BloggerID, Time

df = pd.read_csv('attachment1.csv', parse_dates=['Time'])

# 2. 数据预处理

# 筛选关注行为(Behavior==4)

df_follow = df[df['Behavior'] == 4].copy()

# 提取日期

df_follow['Date'] = df_follow['Time'].dt.date

# 统计每个博主每日关注数

daily_follow = (

df_follow

.groupby(['BloggerID', 'Date'])

.size()

.reset_index(name='follow_count')

)

# 生成完整时间序列 (2024-07-11 至 2024-07-20)

blogger_ids = daily_follow['BloggerID'].unique()

dates = pd.date_range('2024-07-11', '2024-07-20').date

tpl = pd.MultiIndex.from_product([blogger_ids, dates], names=['BloggerID','Date'])

full = pd.DataFrame(index=tpl).reset_index()

daily = full.merge(daily_follow, on=['BloggerID','Date'], how='left').fillna(0)

# 3. 特征工程

daily = daily.sort_values(['BloggerID','Date'])

# 滑动窗口特征

def rolling_feat(group):

group = group.copy()

group['roll3_mean'] = group['follow_count'].rolling(3, min_periods=1).mean()

group['roll5_mean'] = group['follow_count'].rolling(5, min_periods=1).mean()

group['diff1'] = group['follow_count'].diff(1).fillna(0)

group['rate1'] = group['diff1'] / (group['follow_count'].shift(1).replace(0, np.nan))

group['rate1'] = group['rate1'].fillna(0)

return group

daily = daily.groupby('BloggerID').apply(rolling_feat).reset_index(drop=True)

# 可以加入当日其他交互特征(观看、点赞、评论)

# 假设已提前统计好 daily_views, daily_likes, daily_comments 类似 daily_follow

# 这里以0填充示例

daily['views'] = 0

daily['likes'] = 0

daily['comments'] = 0

# 交互率

daily['like_rate'] = daily['likes'] / daily['views'].replace(0, np.nan)

daily['comment_rate'] = daily['comments'] / daily['views'].replace(0, np.nan)

daily[['like_rate','comment_rate']] = daily[['like_rate','comment_rate']].fillna(0)

# 4. 构建训练、验证集

daily['day_index'] = (pd.to_datetime(daily['Date']) - pd.to_datetime('2024-07-11')).dt.days + 1

daily = daily.sort_values(['BloggerID','day_index'])

# 训练: day_index 1-9, 验证: day_index 10

d_train = daily[daily['day_index'] <= 9]

d_val = daily[daily['day_index'] == 10]

features = ['roll3_mean', 'roll5_mean', 'diff1', 'rate1', 'views', 'likes', 'comments', 'like_rate', 'comment_rate']

target = 'follow_count'

# 5. 模型训练 (随机森林示例)

X_train = d_train[features]

y_train = d_train[target]

X_val = d_val[features]

y_val = d_val[target]

model = RandomForestRegressor(n_estimators=100, random_state=42)

model.fit(X_train, y_train)

# 验证集评估

y_pred_val = model.predict(X_val)

print('Validation MAE:', mean_absolute_error(y_val, y_pred_val))

print('Validation RMSE:', np.sqrt(mean_squared_error(y_val, y_pred_val)))

# 6. 预测2024-07-21

day21 = daily[daily['day_index'] == 10].copy()

# 更新Date和day_index到21日

day21['Date'] = pd.to_datetime('2024-07-21').date()

day21['day_index'] = 11

# 计算特征(滚动窗口在group中自动扩展)

day21 = pd.concat([daily, day21]).groupby('BloggerID').apply(rolling_feat).reset_index(drop=True)

day21 = day21[day21['Date'] == pd.to_datetime('2024-07-21').date()]

X21 = day21[features]

day21['pred_follow'] = model.predict(X21)

# 7. 输出前5名结果

top5 = day21[['BloggerID','pred_follow']].sort_values('pred_follow', ascending=False).head(5)

print(top5)

5. 获奖技巧

(1)换位思考,从评委的角度思考问题

(2)打磨摘要,给评委“方便”,突出核心亮点

 

(3)图文并茂,排版精美,力争结果准确

 

(4)适当拔高,不谦虚也不过分

其中更详细的思路,各题目思路、代码、讲解视频、成品论文及其他相关内容,可以点击下方群名片哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值