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 = 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.mfbz.cn/a/256143.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode如何开发微信小程序?(保姆级教学)

1.安装“微信小程序开发工具”扩展 2.安装“vscode weapp api”扩展 3.安装“vscode wxml”扩展 4.安装“vscode-wechat”扩展 5.在终端执行命令: vue create -p dcloudio/uni-preset-vue uniapp-test uniapp-test就是我这里的项目名称了 6.如果遇到了这个错误&a…

云渲染插件怎么设置?云渲染插件设置教程

云渲染技术以其高效、便捷的特性正改变着3D设计和视频制作行业。为了进一步简化渲染过程,云渲染插件应运而生。云渲染插件可以让用户在熟悉的3D软件环境中直接完成渲染任务,大幅提高工作的连贯性与效率。那么如何在3D软件中安装和设定这些神奇的云渲染插…

【为数据之道学习笔记】5-7五类数据主题联接的应用场景

在数字化转型的背景下,华为的数据消费已经不再局限于传统的报表分析,还要支持用户的自助分析、实时分析,通过数据的关联,支持业务的关联影响分析以及对目标对象做特征识别,进行特定业务范围圈定、差异化管理与决策等。…

传奇的GEE、翎风、V8引擎之间的区别,哪个引擎更好用?

我们在选择传奇版本时可以看到有很多GEE引擎的版本,同时也有少数的翎风和V8引擎版本,当我们选择的版本是翎风或是v8引擎,之前没有架设过怎么办呢?不要着急,往下看! 这还得从GEE引擎说起,GEE引擎…

「数据结构」二叉树1

🎇个人主页:Ice_Sugar_7 🎇所属专栏:C启航 🎇欢迎点赞收藏加关注哦! 文章目录 🍉树🍉二叉树🍌特殊二叉树🍌二叉树的性质🍌存储结构 🍉…

【具身智能评估9】Open X-Embodiment: Robotic Learning Datasets and RT-X Models

论文标题:Open X-Embodiment: Robotic Learning Datasets and RT-X Models 论文作者:– 论文原文:https://arxiv.org/abs/2310.08864 论文出处:– 论文被引:–(12/18/2023) 论文代码&#xff1a…

Antd Select 添加中框

默认antd 的 Select中间并没有竖框,但是ui design设计了,所以记录一下如何添加 默认: CSS: .custom-select-suffix-icon {display: flex;align-items: center; }.custom-select-suffix-icon::before {content: ;height: 31px; …

使用cdn加速导致Vue.js devtools 工具不能使用

打包分析 npm run preview -- --report发现 element-ui mock.js(模拟数据) cos-js-sdk-v5.js(腾讯云上传)过大使用cdn加速 2. cdn 加速 webpack排除打包 vue.config.js configureWebpack: {name: name,resolve: {alias: {: reso…

Mybatis-Plus之内置接口(一起了解Mybatis-Plus的内置接口)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《SpringBoot开发之Mybatis-Plus系列》。&#x1…

Python使用HTTP库发送GET请求的示例——轻松探索网络世界

大家好,今天我要给大家介绍一个非常实用的Python库——HTTP库,它可以帮助我们轻松地发送HTTP请求。今天,我们就来学习一下如何使用HTTP库发送GET请求。 首先,我们需要安装HTTP库。如果你还没有安装,可以通过pip命令进…

补题与总结:AtCoder Beginner Contest 333 D、E

文章目录 写在最前面的复盘D - Erase LeavesE - Takahashi Quest 写在最前面的复盘 前三题属于是凑数题,下次争取快点a掉,这次wa了一次 C题写了个三指针,从小到大枚举出满足题意的数,其实可以直接暴力枚举满足题意的数&#xff0c…

Vue框架入门(项目搭建)

VUE文档 https://cn.vuejs.org/guide/introduction.html SFC名词介绍 SFC即 *.vue 文件&#xff0c;英文 Single-File Component&#xff0c;简称 SFC 每一个 *.vue 文件都由三种顶层语言块构成&#xff1a;<template>、<script> 和 <style> template​ 每个…

【git学习笔记 01】打标签学习

文章目录 一、声明二、对标签的基本认知什么是标签&#xff1f;为什么要打标签&#xff1f;如何生成类似github中readme的图标 三、标签相关命令四、示例操作 一、声明 本帖持续更新中如有纰漏&#xff0c;望批评指正&#xff01;参考视频链接&#xff0c;非常感谢原作者&…

houdini 神经网络

实现个神经网络的3D可视化&#xff0c;美爆了&#xff01;-腾讯云开发者社区-腾讯云 https://vimeo.com/stefsietz GitHub - julrog/nn_vis: A project for processing neural networks and rendering to gain insights on the architecture and parameters of a model throu…

天锐绿盾透明加密防泄密系统的功能有哪些

PC端访问地址&#xff1a;www.drhchina.com 天锐绿盾透明加密防泄密系统的功能主要包括以下几点&#xff1a; 透明加解密&#xff1a;该系统采用文件过滤驱动实现透明加解密&#xff0c;这意味着用户在使用过程中完全感觉不到加密和解密的过程&#xff0c;不会影响用户的操作习…

xcode无线真机调试详细图文步骤

步骤一、 步骤二&#xff1a; 步骤三&#xff1a; 配置完到这里&#xff0c;点击真机右键&#xff0c;菜单栏并未出现connect via ip address 选项&#xff0c;也没出现无线连接的小地球图标&#xff0c;别慌&#xff0c;接着进行下一步操作即可。 步骤四&#xff1a; 1.打开…

单片机计数功能

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、计数器是什么&#xff1f;1.1 应用 二、计数器原理框图及对输入信号的要求2.1 原理框图2.2对输入信号的要求 三、使用步骤3.1 配置为计数模式3.2 装初值3.3…

进制转换(二进制、八进制、十进制、十六进制)

目录 进制转换进制有哪些&#xff1f;二进制八进制&#xff1a;十进制&#xff1a;十六进制&#xff1a; 进制转换 随便记录下&#xff0c;仅供参考。 进制有哪些&#xff1f; 进制一般就只包括&#xff1a;二进制、八进制、十进制 和 十六进制 二进制&#xff1a;逢 二 进…

力扣题:数字与字符串间转换-12.19

力扣题-12.19 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;443. 压缩字符串 解题思想&#xff1a;通过双指针进行遍历即可 class Solution(object):def compress(self, chars):""":type chars: List[str]:rtype: int"&quo…

Springboot+Mybatis入门案例

一、项目结构 1.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apach…
最新文章