新浪微博互动预测-挑战Baseline


竞赛题目


对于一条原创博文而言,转发、评论、赞等互动行为能够体现出用户对于博文内容的兴趣程度,也是对博文进行分发控制的重要参考指标。本届赛题的任务就是根据抽样用户的原创博文在发表一天后的转发、评论、赞总数,建立博文的互动模型,并预测用户后续博文在发表一天后的互动情况。

赛题链接

新浪微博互动预测-挑战Baseline_学习赛_天池大赛-阿里云天池的提交

解题思路

读取数据部分

  • 从两个文本文件中逐行读取数据,并将每行数据分割后添加到相应的列表中,然后转换为数据框。
  • 它使用两个 with 语句分别打开训练数据文件(weibo_train_data.txt)和预测数据文件(weibo_predict_data.txt)。
  • 在每个文件的读取过程中,通过循环逐行读取。
  • 对于每一行,使用 strip() 函数去除行两端的空白,然后使用 split('\t') 将行按照制表符分割成一个列表(即一行数据的各个字段)。
  • 尝试将分割后的列表添加到对应的训练数据列表(traindata)或预测数据列表(predictdata)中。
  • 如果在处理某一行时出现异常(比如分割失败等),则打印出出错的行信息。

添加列名

对于 traindata,定义了以下列名:

  • "uid":可能表示用户 ID。
  • "mid":可能是某种特定的 ID。
  • "time":表示时间相关信息。
  • "forward_count":转发数量。
  • "comment_count":评论数量。
  • "like_count":点赞数量。
  • "content":内容相关信息。

数据预处理

  • traindata['content'] 和 predictdata['content'] 分别获取训练数据和预测数据中的“content”列。
  • apply(lambda x: len(x) if x is not None else 0) 这部分是对该列的每个元素应用一个函数。这个函数的作用是:如果元素 x 不为空(即存在),则返回该元素的长度;如果元素为空,则返回 0。这样就将内容列的值转换为了其长度(如果有内容)或 0(如果为空),相当于对内容进行了一种简单的量化处理,以便后续模型能够更好地利用这一特征。这种处理方式在某些情况下可以帮助提取关于内容的一些基本信息并将其转化为数值形式供模型使用。

特征工程

  • 使用 TfidfVectorizer 进行向量化处理,得到训练集和预测集的文本特征向量。
  • 将文本特征向量与其他特征(如 uid 和 time)进行结合。
  • 这里定义了训练集和测试集的特征(X_train 和 X_test)都为“content”列,而训练集的目标变量(y_train)为“forward_count”(转发数)、“comment_count”(评论数)和“like_count”(点赞数)。

     

    这样的划分是为了后续使用这些数据进行机器学习或其他数据分析任务,通过“content”的特征来预测相关的统计数据(如转发数、评论数、点赞数等)。

分割数据

# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)

这样划分之后,就可以在训练模型时使用训练集进行训练,然后用验证集来评估模型在不同数据上的性能表现,以便进行模型的选择和调整等操作。

  • 将训练数据分割为训练集和验证集。
  • 这段代码使用了 sklearn 库中的 train_test_split 函数来将训练数据进一步划分为训练集(X_train)和验证集(X_val),同时也对目标变量进行相应的划分(y_train 和 y_val)。

    具体参数含义如下:

  • X_train 和 y_train:原始的训练特征数据和目标变量数据。
  • test_size=0.2:表示将训练数据的 20% 划分出来作为验证集。
  • random_state=42:设置随机数种子,以确保每次运行结果的可重复性。

模型训练

  • 使用 MultiTaskLinearRegression 模型进行训练。
  • 创建了一个随机森林回归器模型(RandomForestRegressor),然后使用划分好的训练集特征 X_train 和目标变量 y_train 对模型进行训练。

     

    通过 fit 方法,模型学习训练数据中的特征与目标变量之间的关系,以便后续可以对新的数据进行预测。随机森林是一种集成学习方法,它通过组合多个决策树来提高预测性能和泛化能力。

预测

  • 用训练好的模型对预测集进行预测。
  • 在验证集 X_val 上使用训练好的随机森林模型进行预测,得到预测结果 y_pred_val

  • 计算验证集上真实值 y_val 与预测值 y_pred_val 之间的均方误差(MSE),并打印出来,这可以用来评估模型在验证集上的预测效果。

  • 又对测试集 X_test 使用模型进行预测,得到测试集的预测结果 y_pred_test。这一步通常是为了在未用于训练和验证的数据上查看模型的最终预测表现。

结果提交

应用训练好的模型对预测数据集的每个样本进行预测,确保预测值为整数。 格式化输出结果,确保遵循比赛规定的.txt文件格式,即uid\tmid\tforward_count,comment_count,like_count

 源码 

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

# 读取数据
traindata = []  # 训练数据
predictdata = []  # 预测数据

with open('wei bo/Weibo Data/weibo_train_data(new)/weibo_train_data.txt', 'r', encoding='utf-8') as file:
    for line in file:
        try:
            row = line.strip().split('\t')
            traindata.append(row)
        except Exception as e:
            print(f"Error parsing line: {line}")

with open('wei bo/Weibo Data/weibo_predict_data(new)/weibo_predict_data.txt', 'r', encoding='utf-8') as file:
    for line in file:
        try:
            row = line.strip().split('\t')
            predictdata.append(row)
        except Exception as e:
            print(f"Error parsing line: {line}")

traindata = pd.DataFrame(traindata)
predictdata = pd.DataFrame(predictdata)

# 手动添加列名
traindata.columns = ["uid", "mid", "time", "forward_count", "comment_count", "like_count", "content"]
predictdata.columns = ["uid", "mid", "time", "content"]

# 对内容列进行简单处理(示例,可根据实际需求修改)
traindata['content'] = traindata['content'].apply(lambda x: len(x) if x is not None else 0)
predictdata['content'] = predictdata['content'].apply(lambda x: len(x) if x is not None else 0)

# 选择特征和目标变量
X_train = traindata[["content"]]
y_train = traindata[["forward_count", "comment_count", "like_count"]]

X_test = predictdata[["content"]]

# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)

# 训练随机森林模型
model = RandomForestRegressor()
model.fit(X_train, y_train)

# 在验证集上进行预测
y_pred_val = model.predict(X_val)

# 计算均方误差
mse = mean_squared_error(y_val, y_pred_val)
print("验证集均方误差:", mse)

# 对测试集进行预测
y_pred_test = model.predict(X_test)

# 输出预测结果
for i, pred in enumerate(y_pred_test):
    print(f"forward_count: {int(pred[0])}, comment_count: {int(pred[1])},like_count: {int(pred[2])}")
    
# 将预测结果与 predictdata 的相关列组合成新的数据框
result_df = pd.DataFrame({
    'uid': predictdata['uid'],
   'id': predictdata['mid'],
    'forward_count_pred': [int(pred[0]) for pred in y_pred_test],
    'comment_count_pred': [int(pred[1]) for pred in y_pred_test],
    'like_count_pred': [int(pred[2]) for pred in y_pred_test]
})

# 将新数据框保存为 txt 文件
result_df.to_csv(r'E:\lailailai\weibo_result_data.txt', sep='\t', index=False)

得分 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值