pytorch——豆瓣读书评价分析

news2024/11/25 10:55:46

任务目标

基于给定数据集,采用三层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 = 0

for 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.coloradmin.cn/o/1321311.html

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

相关文章

泛型深入理解

泛型的概述 泛型&#xff1a;是JDK5中引入的特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 泛型的格式&#xff1a;<数据类型>; 注意&#xff1a;泛型只能支持引用数据类型。 集合体系的全部接口和实现类都是支持泛型的使用的。 泛型的…

鹿目标检测数据集VOC+YOLO格式3400+张

鹿是一种优美、高贵的动物&#xff0c;常见于欧亚大陆和北美洲的森林、草原和山地。它们属于哺乳动物&#xff0c;是偶蹄目牛科的动物&#xff0c;通常被称为鹿科动物。鹿的身体修长&#xff0c;腿长而纤细&#xff0c;四肢支撑着一副优美的身躯&#xff0c;让人不禁为之倾倒。…

基于JAVA+SpringBoot的线上智能问诊就医平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 智慧医药系统&#xf…

【设计模式--行为型--访问者模式】

设计模式--行为型--访问者模式 访问者模式定义结构案例优缺点使用场景扩展分派动态分派静态分派双分派 访问者模式 定义 封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变这个数据结构的前提下定义作用于这些元素的新操作。 结构 抽象访问者角色&…

故障排除: Vcenter Root user password expires in 0 days.

故障排除: Vcenter Root user password expires in 0 days. 1. 故障现象 登录Vsphere Client显示报错信息如下: Vcenter Root user password expires in 0 days.2. 故障排除 2.1 打开Vcenter ssh 访问VMware vCenter Server 管理,即5480端口,比如VMware vSphere地址是https…

RAG(检索增强生成)技术

1.基本概念 检索增强 LLM ( Retrieval Augmented LLM )&#xff0c;简单来说&#xff0c;就是给 LLM 提供外部数据库&#xff0c;对于用户问题 ( Query )&#xff0c;通过一些信息检索 ( Information Retrieval, IR ) 的技术&#xff0c;先从外部数据库中检索出和用户问题相关…

【个人版】SpringBoot下Spring-Security自定义落地篇【四】

SpringBoot Spring-Security 背景&#xff1a; 上篇文章在源码读取的基础上&#xff0c;根据自身代码习惯及需求&#xff0c;总结了一个自定义简单落地版本。后来在看到松哥写的博文&#xff08;不太爱看官网&#xff09;&#xff0c;发现还有新的变种模式&#xff0c;虽然整…

机器学习---决策树

介绍 决策树和随机森林都是非线性有监督的分类模型。 决策树是一种树形结构,树内部每个节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶子节点代表一个分类类别。通过训练数据构建决策树,可以对未知数据进行分类, 随机森林是由多个决策树组成,随机森林中每…

【参天引擎】华为参天引擎内核架构源码架构,多线程服务,数据节点管理,多节点间元数据管理

cantian引擎源码结构 ​专栏内容&#xff1a; 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构&#xff0c;以及如何实现多机的数据库节点的多读多写&#xff0c;与传统主备&#xff0c;MPP的区别&#xff0c;技术难点的分析&#xff0c;数据元数据同步&#xff0c;多主节点…

极智AI | 算子融合、矩阵分块 一图看懂大模型优化技术FlashAttention

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 算子融合、矩阵分块 一图看懂大模型优化技术FlashAttention。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 没错…

RabbitMQ入门指南(二):架构和管理控制台的使用

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、RabbitMQ架构 二、RabbitMQ管理控制台的使用 1.Exchange交换机 2.Queue队列 3.绑定Exchange交换机和Queue队列 4.发送消息 5.数据隔离 总结 前言 RabbitMQ是一个高效、可靠的开源消息队列系统…

HTML_CSS的基本选择器的使用及其作用范围和优先级

目录 ✨CSS的使用&#xff1a;行内样式内部样式外部样式 ✨CSS基本选择器&#xff1a;id选择器class选择器标签选择器 ✨优先级&#xff1a;选择器的优先级样式表的优先级 ✨CSS的使用&#xff1a; 根据定义CSS的位置不同&#xff0c;分为行内样式、内部样式和外部样式 行内样…

java配置+J_IDEA配置+git配置+maven配置+基本语句

当前目录文件夹dir 进入文件夹cd 返回上一级cd.. 创建文件夹&#xff1a;mkdir 文件名删除文件夹&#xff1a;rd 文件夹名&#xff0c; 目录不为空不能直接删 rd /s 带子文件夹一起删 清屏cls 切换d盘才能进入 下载git地址&#xff1a; Git - Downloading Package (g…

隐私计算介绍

这里只对隐私计算做一些概念性的浅显介绍&#xff0c;作为入门了解即可 目录 隐私计算概述隐私计算概念隐私计算背景国外各个国家和地区纷纷出台了围绕数据使用和保护的公共政策国内近年来也出台了数据安全、隐私和使用相关的政策法规 隐私计算技术发展 隐私计算技术安全多方计…

JDBC 数据库连接池

目录 一、什么是数据库连接池二、为什么需要数据库连接池&#xff1f;三、JDBC 数据库连接池的实现四、C3P0的使用1、加入c3p0 jar包2、配置xml文件3、c3p0-config.xml模板4、C3P0的使用 五、Druid的使用1、加入Druid jar包2、定义配置文件:3、Druid连接池的使用 六、HikariCP的…

【最新】2023年30米分辨率土地利用遥感监测数据

改革开放以来&#xff0c;中国经济的快速发展对土地利用模式产生了深刻的影响。同时&#xff0c;中国又具有复杂的自然环境背景和广阔的陆地面积&#xff0c;其土地利用变化不仅对国家发展&#xff0c;也对全球环境变化产生了深刻的影响。为了恢复和重建我国土地利用变化的现代…

硬件基础-二极管

3.二极管 正偏时是多数载流子载流导电&#xff0c;反偏时是少数载流子载流导电。所以&#xff0c;正偏电流大&#xff0c;反偏电流小&#xff0c;PN 结显示出单向电性。多数载流子正向通过 PN 结时就需要克服内电场的作用&#xff0c;需要约 0.7 伏的外加电压&#xff0c;这是…

windows10录屏快捷键,让你效率翻倍!

“大家知道&#xff0c;windows 10系统有录屏快捷键吗&#xff1f;每次都要通过搜索才能打开&#xff0c;感觉花费的时间太多了&#xff0c;要是可以快速打开就方便多了&#xff0c;所以有人知道windows10系统的录屏快捷键是什么吗&#xff1f;” 在windows 10系统中&#xff…

OpenCV-8RGB和BGR颜色空间

一. RGB和BGR 最常见的色彩空间就是RGB&#xff0c;人眼也是基于RGB的色彩空间去分辨颜色。 OpenCV默认使用的是BGR. BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同。 二.HSV, HSL和YUV 1.HSV(HSB) OpenCV用的最多的色彩空间是HSV. Hue&#xff1a;色相&…

【玩转 TableAgent 数据智能分析】股票交易数据分析+预测

文章目录 一、什么是TableAgent二、TableAgent 的特点三、实践前言四、实践准备4.1 打开官网4.2 注册账号4.3 界面介绍4.4 数据准备 五、确认分析需求六、TableAgent体验七、分析结果解读八、总结&展望 一、什么是TableAgent TableAgent是一款面向企业用户的智能数据分析工…