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