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.mzph.cn/news/231884.shtml

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

相关文章

MongoDB的数据库引用

本文主要介绍MongoDB的数据库引用。 目录 MongoDB的数据库引用 MongoDB的数据库引用 MongoDB是一种面向文档的NoSQL数据库,它使用BSON(Binary JSON)格式存储和查询数据。在MongoDB中,数据库引用是一种特殊的数据类型,…

利用gradio快速搭建AI应用

引言 Gradio 是一个用于快速创建交互式界面的Python库,这些界面可以用于演示和测试机器学习模型。使用Gradio,开发者可以非常轻松地为他们的模型构建一个前端界面,而不需要任何Web开发经验。 与类似产品的对比 TensorBoard:主…

【Python从入门到进阶】44、Scrapy的基本介绍和安装

接上篇《43.验证码识别工具结合requests的使用》 上一篇我们学习了如何使用验证码识别工具进行登录验证的自动识别。本篇我们开启一个新的章节,来学习一下快速、高层次的屏幕抓取和web抓取框架Scrapy。 一、Scrapy框架的背景和特点 Scrapy框架是一个为了爬取网站数…

C++内存布局

温故而知新,本文浅聊和回顾下C内存布局的知识。 一、c内存布局 C的内存布局主要包括以下几个部分: 代码段:存储程序的机器代码。.数据段:存储全局变量和静态变量。数据段又分为初始化数据段(存储初始化的全局变量和…

python与机器学习2,激活函数

目录 1 什么是激活函数? activation function 1.1 阈值 1.2 激活函数a(x) ,包含偏置值θ 1.3 激活函数a(x) ,包含偏置值b 2 激活函数1: 单位阶跃函数 2.1 函数形式 2.2 函数图形 2.3 函数特点 2.4 代码实现这个 单位阶跃函数 3 激活…

Convolutional Neural Network(CNN)——卷积神经网络

1.NN的局限性 拓展性差 NN的计算量大性能差,不利于在不同规模的数据集上有效运行若输入维度发生变化,需要修改并重新训练网络容易过拟合 全连接导致参数量特别多,容易过拟合如果增加更多层,参数量会翻倍无法有效利用局部特征 输入…

结构型设计模式(三)享元模式 代理模式 桥接模式

享元模式 Flyweight 1、什么是享元模式 享元模式的核心思想是共享对象,即通过尽可能多地共享相似对象来减少内存占用或计算开销。这意味着相同或相似的对象在内存中只存在一个共享实例。 2、为什么使用享元模式 减少内存使用:通过共享相似对象&#…

汽车UDS诊断——SecureDataTransmission 加密数据传输(0x84)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍诊断和通讯管理功能单元下的84服务SecureDataTransmission,在常规诊断通信中,数据极易被第三方获取,所以在一些特殊的数据传输时,标准定义了加密数据传输的服务。 简而言之,就是在发送诊断数据时,发送方先把数…

fragstats:景观指数的时间序列分析框架

作者:CSDN _养乐多_ 本文将介绍景观指数的时间序列分析计算的软件使用方法和 python 代码,该框架可用于分析景观指数时间序列图像的趋势分析、突变分析、机器学习(分类/聚类/回归)、相关性分析、周期分析等方面。 文章目录 一、…

智能优化算法应用:基于人工电场算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于人工电场算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工电场算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工电场算法4.实验参数设定5.算法结果6.…

04-Revision和流量管理

1 Revision 关于Revision 应用程序代码及相关容器配置某个版本的不可变快照KService上的spec.template的每次变动,都会自动生成一个新的Revision通常不需要手动创建及维护 Revision的使用场景 将流量切分至不同版本的应用程序间(Canary Deployment、Blu…

静态路由及动态路由

文章目录 静态路由及动态路由一、静态路由基础1. 静态路由配置2. 负载分担3. 路由备份4. 缺省路由5. 静态路由实操 二、RIP 动态路由协议1. RIP 协议概述2. RIP 协议版本对比2.1 有类路由及无类路由 3. RIP 路由协议原理4. RIP 计时器5. 度量值6. 收敛7. 示例 静态路由及动态路…

Kafka基本原理及使用

目录 基本概念 单机版 环境准备 基本命令使用 集群版 消息模型 成员组成 1. Topic(主题): 2. Partition(分区): 3. Producer(生产者): 4. Consumer(…

使用TensorRT对Yolov5进行部署【基于Python】

如果还未配置TensorRT,请看这篇博文:Win11下TensorRT环境部署 这里使用TensorRT对Yolov5进行部署流程比较固定:先将pt模型转换为onnx,再将onnx模型转为engine,所以在执行export.py时要将onnx、engine给到include。 P…

Linear Regression线性回归(一元、多元)

目录 介绍: 一、一元线性回归 1.1数据处理 1.2建模 二、多元线性回归 2.1数据处理 2.2数据分为训练集和测试集 2.3建模 介绍: 线性回归是一种用于预测数值输出的统计分析方法。它通过建立自变量(也称为特征变量)和因变…

【Redis】五、Redis持久化、RDB和AOF

文章目录 Redis持久化一、RDB(Redis DataBase)触发机制如何恢复rdb文件 二、AOF(Append Only File)三、扩展 Redis持久化 面试和工作,持久化都是重点! Redis 是内存数据库,如果不将内存中的数据…

微服务实战系列之ZooKeeper(实践篇)

前言 关于ZooKeeper,博主已完整的通过庖丁解牛式的“解法”,完成了概述。我想掌握了这些基础原理和概念后,工作的问题自然迎刃而解,甚至offer也可能手到擒来,真实一举两得,美极了。 为了更有直观的体验&a…

uniapp 预览图片

preImg(index){let urls []this.images.map((item,i) > {if(indexi){urls.unshift(item.file_path)}else{urls.push(item.file_path)}})uni.previewImage({urls})}

linux之Samba服务器

环境:虚拟机CENTOS 7和 测试机相通 一、Samba服务器_光盘共享(匿名访问) 1.在虚拟机CENTOS 7安装smb服务,并在防火墙上允许samba流量通过 2. 挂载光盘 3.修改smb.conf配置文件,实现光盘匿名共享 4. 启动smb服务 5.在…

JVM基础扫盲

什么是JVM JVM是Java设计者用于屏蔽多平台差异,基于操作系统之上的一个"小型虚拟机",正是因为JVM的存在,使得Java应用程序运行时不需要关注底层操作系统的差异。使得Java程序编译只需编译一次,在任何操作系统都可以以相…