pytorch——豆瓣读书评价分析

任务目标

基于给定数据集,采用三层bp神经网络方法,编写程序并构建分类模型,通过给定特征实现预测的书籍评分的模型。

选取数据

file 在各项指标中,我认为书籍的评分和出版社、评论数量还有作者相关,和其他属性的关系并大。所以,对于出版社,我选取了出版社的平均评分和出版社在这个表格中出现的频率作为出版社的评价指标。对于作者选择了平均评分作为指标。此外,选择了前40000条数据作为训练集,考虑到运算的时间成本,后续只选择了剩下20000条数据中的五千条作为测试集。

数据处理

file 首先将数据转为tensor格式,然后进行归一化操作,既Xnormalized​=max(X)−min(X)X−min(X) 这样处理便于训练过程的稳定。

模型构建

file 这里构建三层神经网络,中间层设置了64个结点,激活函数采用的是ReLu函数。由于数据规模庞大,选择在一批数据进行训练得到损失值后,再进行一次参数更新,每批次选择32个数据。损失函数选择选择均方误差函数,并且选择随机梯度下降法进行优化。 绘制出损失值变化的折线图 file

结果评估

file 选择5000个数据,将他们放入模型中,计算出他们与真实结果的偏差的和,并求出平均偏差。得到平均的偏差为0.165,说明模型可以正确预测出书本评分

完整代码

import torch
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch.optim as optim
import warnings
warnings.filterwarnings("ignore")# In[30]:features = pd.read_csv('book.csv')features['作者'][54101]# In[31]:average_ratings_by_author = features.groupby('作者')['评分'].mean().reset_index()
average_ratings_by_publisher = features.groupby('出版社')['评分'].mean().reset_index()
# 打印每位作者的平均评分
print(average_ratings_by_publisher)# In[32]:# specific_author_rating = average_ratings_by_author[average_ratings_by_author['作者'] == name]['评分']
# a = specific_author_rating.tolist()# In[33]:publishers_frequency = features['出版社'].str.lower().value_counts(normalize=True)
publishers_frequency# In[34]:# 输入你想要查找频率的出版社名字(这里以示例出版社名 '某某出版社' 为例)
publisher_name = 'Harper Collins Publishers '  # 替换为你要查找频率的出版社名字# 对出版社名字进行预处理,删除额外的空格或特殊字符,并转换为小写
cleaned_publisher_name = publisher_name.strip().lower()# 获取指定出版社的出现频率
cleaned_publishers = publishers_frequency.index.str.strip().str.lower()if cleaned_publisher_name in cleaned_publishers:index_of_publisher = cleaned_publishers.get_loc(cleaned_publisher_name)frequency = publishers_frequency.iloc[index_of_publisher]print(frequency)
else:print(f"找不到 {publisher_name} 的频率数据")# In[115]:x = []
y = []
data = []
for i in range(0,40000):print(i)data = []author_ratings = average_ratings_by_author[average_ratings_by_author['作者'] == features['作者'][i]]['评分'].tolist()if author_ratings:data.append(author_ratings[0])else:# 在未找到匹配项时处理方式(例如,可以添加默认值或者设置为 None)data.append(None)  # 或者添加适当的默认值publisher_ratings = average_ratings_by_publisher[average_ratings_by_publisher['出版社'] == features['出版社'][i]]['评分'].tolist()if publisher_ratings:data.append(publisher_ratings[0])else:# 在未找到匹配项时处理方式(例如,可以添加默认值或者设置为 None)data.append(None)  # 或者添加适当的默认值publisher_name = features['出版社'][i]  # 替换为你要查找频率的出版社名字# 对出版社名字进行预处理,删除额外的空格或特殊字符,并转换为小写cleaned_publisher_name = publisher_name.strip().lower()# 获取指定出版社的出现频率cleaned_publishers = publishers_frequency.index.str.strip().str.lower()if cleaned_publisher_name in cleaned_publishers:index_of_publisher = cleaned_publishers.get_loc(cleaned_publisher_name)frequency = publishers_frequency.iloc[index_of_publisher]else:print(f"找不到 {publisher_name} 的频率数据")data.append(frequency*1000)if features['评论数量'][i]=='None':data.append(0)else:data.append(float(features['评论数量'][i]))print(data)print(float(features['评分'][i]))x.append(data)y.append(float(features['评分'][i]))# In[123]:# 转换格式
datas = np.array(x).astype(float)scores = np.array(y).astype(float)
scores[-1]# In[127]:from sklearn.preprocessing import MinMaxScaler# 创建MinMaxScaler对象
scaler = MinMaxScaler()# 将数据进行归一化处理
input_datas = scaler.fit_transform(datas)
input_datas# In[146]:###### 定义批次大小
batch_size = 32# 将数据转换为 Tensor 格式
x = torch.tensor(input_datas, dtype=torch.float)
y = torch.tensor(scores, dtype=torch.float)# 数据总数
total_data = x.shape[0]# 定义神经网络结构
input_size = x.shape[1]  # 输入大小,根据你的数据确定
hidden_size = 64  # 隐藏层大小
output_size = 1  # 输出大小,根据你的数据确定
learning_rate = 0.01  # 学习率# 初始化权重和偏差
weights1 = torch.randn((input_size, hidden_size), dtype=torch.float, requires_grad=True)
bias1 = torch.randn(hidden_size, dtype=torch.float, requires_grad=True)
weights2 = torch.randn((hidden_size, output_size), dtype=torch.float, requires_grad=True)
bias2 = torch.randn(output_size, dtype=torch.float, requires_grad=True)losses = []# 定义优化器
optimizer = torch.optim.RMSprop([weights1, bias1, weights2, bias2], lr=learning_rate)for i in range(0, total_data, batch_size):loss = 0# 获取当前批次的数据x_batch = x[i:i + batch_size]y_batch = y[i:i + batch_size]# 隐层计算hidden = x_batch.mm(weights1) + bias1# 加入激活函数hidden = torch.relu(hidden)# 预测predictions = hidden.mm(weights2) + bias2# 计算损失criterion = torch.nn.MSELoss()  # 使用适当的损失函数loss = criterion(predictions, y_batch)losses.append(loss.item())  # 保存损失值if i % 100 == 0:print(f'Loss: {loss.item()},Epoch: {i}')# 梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 梯度裁剪
#     torch.nn.utils.clip_grad_norm_([weights1, bias1, weights2, bias2], max_grad_norm)# 参数更新optimizer.step()# In[147]:import matplotlib.pyplot as plt
# 定义可视化函数
def plot_losses(losses):plt.plot(losses, label='Training Loss')plt.xlabel('Iterations')plt.ylabel('Loss')plt.title('Training Loss over Iterations')plt.legend()plt.show()# 训练过程中损失的记录
plot_losses(losses)# In[149]:x_1 = []
y_1 = []
data_1 = []
for i in range(40000,45000):print(i)data_1 = []author_ratings = average_ratings_by_author[average_ratings_by_author['作者'] == features['作者'][i]]['评分'].tolist()if author_ratings:data_1.append(author_ratings[0])else:# 在未找到匹配项时处理方式(例如,可以添加默认值或者设置为 None)data_1.append(None)  # 或者添加适当的默认值publisher_ratings = average_ratings_by_publisher[average_ratings_by_publisher['出版社'] == features['出版社'][i]]['评分'].tolist()if publisher_ratings:data_1.append(publisher_ratings[0])else:# 在未找到匹配项时处理方式(例如,可以添加默认值或者设置为 None)data_1.append(None)  # 或者添加适当的默认值publisher_name = features['出版社'][i]  # 替换为你要查找频率的出版社名字# 对出版社名字进行预处理,删除额外的空格或特殊字符,并转换为小写cleaned_publisher_name = publisher_name.strip().lower()# 获取指定出版社的出现频率cleaned_publishers = publishers_frequency.index.str.strip().str.lower()if cleaned_publisher_name in cleaned_publishers:index_of_publisher = cleaned_publishers.get_loc(cleaned_publisher_name)frequency = publishers_frequency.iloc[index_of_publisher]else:print(f"找不到 {publisher_name} 的频率数据")data_1.append(frequency*1000)if features['评论数量'][i]=='None':data_1.append(0)else:data_1.append(float(features['评论数量'][i]))print(data_1)x_1.append(data_1)y_1.append(float(features['评分'][i]))x_1,y_1# In[150]:# 转换格式
datas = np.array(x_1).astype(float)scores = np.array(y_1).astype(float)from sklearn import preprocessing# 特征标准化处理
input_datas = preprocessing.StandardScaler().fit_transform(datas)
scores# In[152]:import torch
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score# 将预处理后的特征数据和标签数据转换为 PyTorch 的 Tensor 格式
x_test = torch.tensor(input_datas, dtype=torch.float)
y_test = torch.tensor(scores, dtype=torch.float)
total_loss = 0for i in range(0, total_data, batch_size):# 获取当前批次的数据x_batch = x_test[i:i + 1]y_batch = y_test[i:i + 1]# 隐层计算hidden = x_batch.mm(weights1) + bias1# 加入激活函数hidden = torch.relu(hidden)# 预测predictions = hidden.mm(weights2) + bias2# 计算损失criterion = torch.nn.MSELoss()  # 使用适当的损失函数loss = criterion(predictions, y_test)  # 这里的 predictions 和 labels 是每个批次的预测值和真实标签# 将损失值累积到 total_loss 变量中total_loss += loss.item()
print(total_loss/5000)

本文由博客一文多发平台 OpenWrite 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全】-Linux操作系统基础

文章目录 Linux操作系统目录结构Linux命令格式Linux文件和目录操作命令Linux用户和用户组操作命令Linux查看和操作文件内容命令Linux文件压缩和解压缩命令Linux网络管理命令Linux磁盘管理和系统状态命令Linux安全加固总结 Linux是一个强大的操作系统,广泛用于服务器…

配置OSPF与BFD联动

组网需求 如图1所示,SwitchA、SwitchB和SwitchC之间运行OSPF,SwitchA和SwitchB之间的交换仅作透传功能。现在需要SwitchA和SwitchB能快速感应它们之间的链路状态,当链路SwitchA-SwitchB发生故障时,业务能快速切换到备份链路Switch…

【CSDN】CSDN 的简单使用与常用快捷键

【CSDN】CSDN 的简单使用与常用快捷键 1)目录2)标题3)代码块4)黑点标题5)字体5.1.加粗5.2.标记5.3.颜色 6)图片6.1.居中6.2.左对齐6.3.右对齐6.5.图片大小调整 1)目录 创建标题目录快捷键&…

结构体基础例题

这里写目录标题 例题一例题解析答案 例题二例题解析答案 例题三例题解析答案 例题四例题解析答案 例题五例题解析及答案 例题六例题解析及答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 &#x1f978…

掌握实时数据流:使用Apache Flink消费Kafka数据

导读:使用Flink实时消费Kafka数据的案例是探索实时数据处理领域的绝佳方式。不仅非常实用,而且对于理解现代数据架构和流处理技术具有重要意义。 理解Flink和Kafka Apache Flink Apache Flink 是一个在有界数据流和无界数据流上进行有状态计算分布式处理…

Java智慧工地数字化云平台源码(SaaS模式)

智慧工地是智慧城市理念在建筑工程行业的具体体现,智慧工地解决方案是建立在高度信息化基础上一种支持人事物全面感知、施工技术全面智能、工作互通互联、信息协同共享、决策科学分析、风险智慧预控的新型信息化手段。围绕人、机、料、法、环等关键要素,…

ansible远程操作主机功能和自动化运维

ansible 两个功能:1、远程操作主机功能 2、自动化运维(play 剧本 yaml) 简述: 是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起。 Asible能批量配置,部署,管理上千…

MATLAB - 使用 MPC Designer 线性化 Simulink 模型

系列文章目录 前言 本主题介绍如何使用 MPC Designer 对 Simulink 模型进行线性化。为此,请从包含 MPC 控制器块的 Simulink 模型打开该应用程序。本例中使用 CSTR_ClosedLoop 模型。 open_system(CSTR_ClosedLoop) 在模型窗口中,双击 MPC 控制器模块。…

服务器数据恢复-raid5故障导致上层分区无法访问的数据恢复案例

服务器数据恢复环境&故障: 一台服务器上3块硬盘组建了一组raid5磁盘阵列。服务器运行过程中有一块硬盘的指示灯变为红色,raid5磁盘阵列出现故障,服务器上层操作系统的分区无法识别。 服务器数据恢复过程: 1、将故障服务器上磁…

15、ble_mesh_sensor_model 客户端 传感器

1、初始化流程,存储初始化,nvs擦除, board_init();初始化LED。 2、bluetooth_init();ble协议栈初始化 3、ble_mesh_get_dev_uuid(dev_uuid);//获取16长度设备uuid加载到mac,后两位dev uuid 4、ble_mesh_init();//ble mesh协议栈初…

OpenHarmony - 应用开发入门指南

一、了解OpenHarmony OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代, 搭建一个智能终端设备操作系统的框架和平台, 促进万物互联产业的繁荣发展。 开放原子开源基金会: 由阿里巴巴、百度、华…

VS Code配置Go语言开发环境

提示:首先这是一个新型语言,最好把vscode更新到最新版。 1:去官网下载Go语言编译器,之后配置到系统环境中,能看到版本就行。 2:创建一个文件夹,存放go的工具文件,我的在D:\GoFile\G…