美赛C题纪实

提示:这篇是美赛结束发的!!!!!!!没有作弊,没有参考任何网上思路!!!!!仅为自己记录教训和为他人提供代码案例

文章目录

  • 前言
  • 一、LSTM神经网络预测
    • 1.1.超参数调优
  • 二、对单个单词的特征提取
    • 2.1.可能的提取方法
    • 2.2.字符编码特征
    • 2.3.word embedding
    • 2.4.用wordnet提取相似性的特征
    • 2.5.查sentiwordnet语料库提取情感的特征
    • 2.6.查阅wordnet语料库提取有几种词义
  • 三、难度分类
  • 总结


前言

2.18
这一题是博主从头开始学自然语言处理的杰作,中间用实验室服务器建环境建了半天都建不好,用kaggle立马奏效,心态大崩,特别是17号出六级成绩心态更崩,糟糕的最近…

2.21
美赛总算打完了,整理一下所犯的错误和教训,总结一下查到的库和方法,还是得踩着以前自己的肩膀慢慢向上,后面研究生阶段接触神经网络不会少。


一、LSTM神经网络预测

一开始想用pytorch来做,可是代码总是出问题,没打过代码很难受了,好在之前用过keras…keras简直就是神经网络建模的申请,除了它我还不知道怎么在GPU上跑其他一切都好。下面是我LSTM神经网络预测的核心代码示例:

# 创建并训练LSTM模型
model = Sequential()
# model.add(LSTM(units=50, return_sequences=True, input_shape=(trainX.shape[1], trainX.shape[2])))
# model.add(Dropout(0.2))
# model.add(LSTM(units=50, return_sequences=True))
# model.add(Dropout(0.2))
# model.add(LSTM(units=50))
# model.add(Dropout(0.2))
# model.add(Dense(units=1))
model.add(LSTM(64, return_sequences=True, input_shape=(trainX.shape[1], trainX.shape[2])))
# model.add(Dropout(0.3))
# model.add(LSTM(32, return_sequences=True))
# model.add(Dropout(0.35))
# model.add(LSTM(16))
model.add(Dense(1, kernel_regularizer=regularizers.l2(0.01)))
# model = get_model_deep((trainX.shape[1], trainX.shape[2]))
model.compile(loss='mse', optimizer='adam',metrics=['mse'])
model.fit(trainX, trainY, epochs=50, batch_size=1, verbose=1,)

可以说,你想要在神经网络上加一层什么,你就直接add

1.1.超参数调优

选择适合自己的LSTM模型超参数需要综合考虑多个方面,包括模型架构、损失函数、优化器、学习率、batch size、epoch 等参数。下面是一些常用的调参技巧和策略:

调整模型架构:包括 LSTM 层数、神经元个数、激活函数、Dropout 层的位置和参数等。
选择合适的损失函数:根据具体的问题选择适合的损失函数,比如 MSE、MAE、RMSE、交叉熵等。
选择合适的优化器:常用的优化器包括 SGD、Adam、RMSprop、Adagrad 等,需要根据具体的问题选择。
调整学习率:如果学习率设置过大,可能会导致训练不稳定;如果学习率设置过小,可能会导致收敛速度过慢。可以使用 learning rate scheduler 等技术来调整学习率。
调整 batch size:一般来说,batch size 越大,训练速度越快,但是内存消耗也会增加;batch size 越小,训练速度越慢,但是内存消耗也会减小。需要根据具体情况来选择合适的 batch size。
调整 epoch:epoch 越大,模型会更加充分地学习数据,但是也会增加过拟合的风险。需要根据验证集的表现和训练集的表现综合考虑选择合适的 epoch。
在进行调参时,可以使用交叉验证等技术来评估模型的性能,同时还可以使用一些自动化的调参工具,比如 Grid Search、Random Search、Bayesian Optimization 等。

二、对单个单词的特征提取

2.1.可能的提取方法

如果只有一个五个字符的单词,并且没有上下文信息可用,那么提取单词特征的方法将会受到限制。下面是一些可能的特征提取方法:

1.字符频率特征:将单词视为一个字符序列,并统计每个字符在单词中出现的频率。这种方法可以用于区分不同类型的单词,例如元音和辅音比例,或者特定字母的频率。

2.字符n-gram特征:将单词视为一个字符序列,提取不同长度的字符n-gram作为单词的特征。例如,提取所有长度为2或3的字符n-gram可以捕捉单词的部分语义信息,例如前缀和后缀。

3.字符编码特征:将单词中的每个字符编码为数字或二进制向量,作为单词的特征。这种方法可以保留单词的字符信息,但不太适合区分不同类型的单词。

4.字符形态特征:将单词视为由前缀、后缀和词干等构成的结构,并提取这些部分的特征。例如,提取单词的词干长度、前缀或后缀的形态特征等,可以帮助区分不同类型的单词。

2.2.字符编码特征

我们主要对字符编码特征进行了探究:
字符编码特征是指将英文单词转换成数字序列的一种特征表示方式。在这种表示方式下,每个单词中的每个字符都被映射成一个数字。这种特征表示方式可以用于文本分类、情感分析、机器翻译等自然语言处理任务中。

字符编码特征有多种实现方式,下面介绍两种常用的方式:

One-Hot Encoding
One-Hot Encoding是将每个字符映射到一个唯一的数字上,然后将这个数字转化为一个长度为字符集大小的0/1向量。例如,如果我们考虑的字符集只包括26个英文字母,则每个字母可以映射到一个数字,如a映射到0,b映射到1,以此类推。然后我们将每个字符编码成一个长度为26的0/1向量,表示当前字符是否是对应位置的字母。例如,单词"cat"可以表示为[1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0]。

Word Embeddings
Word Embeddings是一种将单词映射到向量空间的技术。在这种表示方式下,每个单词都被映射到一个固定大小的向量上,这个向量包含了单词的语义信息。这个映射可以通过训练神经网络来完成,也可以使用预训练的词向量模型,如Word2Vec、GloVe等。与One-Hot Encoding相比,Word Embeddings可以更好地捕捉单词之间的语义关系,并且可以通过向量计算来实现单词的语义推理。

这些字符编码特征可以作为输入来训练神经网络,例如使用卷积神经网络、循环神经网络等进行文本分类、情感分析等自然语言处理任务。

2.3.word embedding

在Word Embeddings中,每个单词被映射到一个固定大小的向量上,这个向量包含了单词的语义信息。这个映射是通过训练神经网络来完成的,训练过程中神经网络通过观察大量的文本语料库来学习每个单词的上下文信息,并将这些上下文信息编码为一个向量表示。

具体来说,Word Embeddings中的每个向量维度都代表着某个语义特征,例如上下文中出现的单词、词性、情感极性等。这些维度的权重是通过神经网络自动学习得到的,因此可以更好地捕捉单词之间的语义关系。例如,在训练过程中,如果两个单词经常在相似的上下文中出现,那么它们对应的向量会比较接近。

这样,使用Word Embeddings的好处是可以将单词表示成实数向量,使得它们可以参与到神经网络的计算中,而不必考虑每个单词的具体编码方式。这种方式不仅节省了内存和计算资源,还能更好地反映单词的语义信息,从而提高了自然语言处理任务的性能。

2.4.用wordnet提取相似性的特征

这是一个模型,里面记录了每个单词的语义,可以用它来分析每个单词之间的相关性。
我的代码如下:

import nltk
from nltk.corpus import wordnet
import numpy as npsimilarity=np.zeros((len(texts),1))
# 创建WordNet语料库的词汇关系工具
wn = nltk.corpus.wordnet
ind=0
for target_word in texts:word_list=texts# 为目标单词和每个单词计算相似度similarities = {}for word in word_list:target_synsets = wordnet.synsets(target_word)word_synsets = wordnet.synsets(word)scores = []for target_synset in target_synsets:for word_synset in word_synsets:score = target_synset.wup_similarity(word_synset)if score is not None:scores.append(score)if len(scores) > 0:similarities[word] = np.sum(scores) / len(scores)else:similarities[word] = 0sumary = 0for key in similarities:sumary += similarities[key]avg = sumary / len(similarities)similarity[ind]=avg
np.savetxt('/kaggle/working/similarity.csv', similarity, delimiter=',')

2.5.查sentiwordnet语料库提取情感的特征

这个情感库是基于wordnet的,主要用于分析情绪

# 定义一个提取单个单词的情感分值的子函数
from nltk.corpus import wordnet as wn
from nltk.corpus import sentiwordnet as swndef get_sentiment(word):synsets = list(swn.senti_synsets(word))pos_score = neg_score = obj_score = 0# 将每个词义的情感分值进行累加for syn in synsets:pos_score += syn.pos_score()neg_score += syn.neg_score()obj_score += syn.obj_score()# 将积极和消极得分输出return pos_score, neg_score,obj_score
在这里插入代码片

2.6.查阅wordnet语料库提取有几种词义

这是chatGPT给我生成的代码案例,wordnet更像是一种强大的神经网络字典,而且预训练好了,何乐而不为。

from nltk.corpus import wordnet
import nltk
nltk.download('wordnet')
word = 'dog'
synsets = wordnet.synsets(word)
num_senses = len(synsets)print(f'The word "{word}" has {num_senses} senses.')

改进成批量:

# 输入单词数据
import csv
texts = []
with open('/kaggle/input/word-input/word_input.csv', newline='') as csvfile:reader = csv.reader(csvfile)for row in reader:texts.append(row[0])
import numpy as np
num_senses=np.zeros((len(texts),1))
ind=0
for word in texts:synsets = wordnet.synsets(word)num_senses[ind] = len(synsets)ind=ind+1
np.savetxt('/kaggle/working/ciyishu_output.csv', num_senses, delimiter=',')

三、难度分类

这里我已题目给的数据集中的每个单词每轮被猜中的概率作为特征,用k-means++进行聚类,分了四类下面是一张t-SNE降维后的散点图,可以发现轮廓比较均匀,并且输出每个簇的中心点,也是分的比较开的。
降维后的散点图
核心代码如下:

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans,AffinityPropagation
from sklearn.metrics import silhouette_score
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt# 读入数据
percentage_df = pd.read_csv('/kaggle/input/cluster-data/cluster_data.csv',index_col=0)# 定义聚类数和KMeans模型
n_clusters = 4
kmeans = KMeans(n_clusters=n_clusters, init='k-means++')
# kmeans = AffinityPropagation(damping=0.5, max_iter=200, preference=None)# 对数据进行聚类
kmeans.fit(percentage_df)# 读入 CSV 数据文件
attribute_df = pd.read_csv('/kaggle/input/attribute/attribute_output.csv',index_col=0)# 获取每一行的聚类结果并将其存储到DataFrame中
labels = kmeans.labels_
attribute_df = attribute_df.assign(label=labels)
clustered_data = percentage_df.assign(label=labels)
print(clustered_data)
# clustered_data['word'] = cluster_data['Word']
# 输出聚类结果
# 获取每个聚类的中心点
centroids = kmeans.cluster_centers_
print(centroids)
clustered_data.to_csv('clustered_data.csv', index=True)# 输出标签数对应的饼状图
# 假设labels是你的聚类结果标签
labels=list(labels)
n_clusters = len(set(labels))# 计算每个标签数目
sizes = [labels.count(i) for i in range(n_clusters)]# 绘制饼图
plt.pie(sizes, labels=range(n_clusters), autopct='%1.1f%%', startangle=90)
plt.axis('equal')
plt.title('Cluster Distribution')
plt.legend(title='Cluster', loc='best')
plt.show()

在此之后,我们可以建立神经网络模型,下面是用keras库的源代码。

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.utils import to_categorical
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt# 假设训练数据存储在data中,其中最后一列为目标列
X = attribute_df.iloc[:, :10]  # 提取特征列
y = attribute_df['label']   # 提取目标列# 对特征进行标准化处理
scaler = StandardScaler()
X = scaler.fit_transform(X)# 将标记进行one-hot编码
y = to_categorical(y)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=42)# 初始化一个神经网络模型
model = Sequential()# 添加输入层和隐藏层
model.add(Dense(128, activation='relu', input_dim=X.shape[1]))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
# model.add(Dropout(0.1))
model.add(Dense(4, activation='softmax'))# 添加输出层
model.add(Dense(4, activation='softmax'))# 编译模型,指定损失函数、优化器和评估指标
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])# 训练模型
history=model.fit(X, y, batch_size=32, epochs=100, validation_split=0.2)from keras.utils import to_categorical# 使用模型进行测试集预测,得到分类结果
y_pred = model.predict(X_test)# 将分类结果转化为one-hot向量
y_pred_one_hot = to_categorical(y_pred.argmax(axis=1), num_classes=4)# 计算测试集准确率
accuracy = (y_pred_one_hot == y_test).mean()
print('Testing accuracy: %.2f' % accuracy)
# 绘制训练过程中的loss曲线
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.legend()
plt.show()

最后我们验证集上的准确率也能达到


总结

简要写一下,等我考完雅思之后好好整理一下。

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

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

相关文章

让ChatGPT做我的Java老师,他会怎么教我学习Java呢?

最近ChatGPT挺火的,突然想到一个有趣的玩法,ChatGPT如果来当老师,他会怎么教我学习java语言呢? 首先来看看ChatGPT认为熟练掌握java语言需要多长时间呢? ChatGPT认为熟练掌握java语言需要3-6个月。那我们就让他给我一份…

基于Android的应用市场软件的设计

基于Android的应用市场软件的设计 摘  要 随着智能手机的普及,人们越来越依赖手机进行一系列操作。 由于Android系统是一款免费的操作系统,导致了使用Android系统的手机占到7成左右。为了让Android手机用户体验更好,就需要让Android手机用户…

实际案例演示:从理论到实践,如何落地应用设计模式

大家在学习设计模式应该都会有个疑问,学完了。到底项目上怎么来用呢,好像没有思路。如果你也有这个疑问可以试试用chatgpt辅助你。不仅给了说明,还会给你提供代码demo,可以打开自己的思路。 以下就是详细的结果: 在开发Java版电子…

清华ACL 2023最新长文 | WebCPM:首个联网支持中文问答开源模型

2021年12月 WebGPT 的横空出世标志了基于网页搜索的问答新范式的诞生,在此之后,New Bing 首先将网页搜索功能整合发布,随后 OpenAI 也发布了支持联网的插件 ChatGPT Plugins。大模型在联网功能的加持下,回答问题的实时性和准确性都…

忆享聚焦|人工智能、元宇宙、云计算、5G基站…近期热点资讯一览

“忆享聚焦”栏目第十二期来啦!本栏目汇集近期互联网最新资讯,聚焦前沿科技,关注行业发展动态,筛选高质量讯息,拓宽用户视野,让您以最低的时间成本获取最有价值的行业资讯。 目录 行业资讯 1.ChatGPT火爆全…

中国开源项目迈向全球化!

整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 中国开源正在登上全球化舞台,成为一股不容忽视的中坚力量。在国际开源领域,ant-design、vue-element-admin 等热门开源跻身前列;阿里巴巴、腾讯、华为、字节跳动、百…

大模型狂潮:各大厂纷纷亮剑,谁能笑傲江湖?

引言:四月AI大模型潮流来袭 假如我们站在未来回首往事,或许会惊讶地发现,这个春意融融的四月,竟是中国AI史上的一个重要节点。百度、阿里、腾讯、字节、商汤、京东、华为、360等科技巨头纷纷亮出底牌,推出各自的AI大语…

数据库领域3月大事件

本文整理2023年3月份最新数据库厂商、数据库领域的行业动态、以及各家云数据库厂商的产品动态。 本文主要整理了数据库领域的最新动态: 数据库厂商的重磅事件; 各数据库的产品更新。 一、重磅事件 ▋《数字中国建设整体布局规划》发布 近日,中…

GPT生成精美Echarts图表

【需求】:我想要用 echarts V5 来开发一个【柱状图表】 【输入文本】:我想用echarts开发一个【条形图】,目标帮我分析1-3天内每天访问我网站的用户数趋势,1-3天的用户数分别为20,50,60,请帮我生…

【花雕学AI】ChatGPT的50种神奇用法:让你的聊天更有趣,更有用,更有创意

【花雕学AI】是一个普通人学习AI的专栏(于2023年3月29日开始),由驴友花雕撰写,主要介绍了人工智能领域的多维度学习和广泛尝试,目前已包含七十多篇文章,分别介绍了ChatGPT、New Bing和Leonardo AI等人工智能…

AI 大战高考作文!实测 ChatGPT、文心一言、通义千问等 8 款“神器”

整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 今天中午十一点半,2023 年高考作文题目火热出炉,其中全国甲卷作文题引人深思: 人们因技术发展得以更好地掌控时间,但也有人因此成了时间的仆人。 身处技…

chatgpt最强平替国内可用免费开源llama2模型下载使用

1,github下载llama2项目 打开下面的项目地址: GitHub - facebookresearch/llama: Inference code for LLaMA models 下载项目代码: GitHub - facebookresearch/llama: Inference code for LLaMA models 2,填写申请信息申请授权 https://…

探究 ChatGPT 4 的优势:基于 GPT-3.5 架构的大型语言模型

随着人工智能技术的不断发展,自然语言处理领域也取得了巨大的进展。其中,GPT(Generative Pre-trained Transformer)模型系列是自然语言处理领域的重要里程碑之一。而 ChatGPT 4 则是基于 GPT-3.5 架构的大型语言模型,相…

60行NumPy手搓GPT

本文约24000字,建议阅读30分钟 本文我们将仅仅使用60行Numpy[6],从0-1实现一个GPT。 本文原载于尹志老师博客:https://jiqihumanr.github.io/2023/04/13/gpt-from-scratch/[1]。 本文还是来自Jay Mody[2],那篇被Andrej Karpathy手…

GPT4.0一句话实现各类图表制作,让数据可视化变得更简单!类图、流程图、ER图.....

不知道大家有没有被ER建模工具复杂的操作按钮给困扰过。在作者学习ER建模时,曾希望能直接画出类图,但最终还是不得不学习繁琐的操作流程。然而,随着GPT的出现,AI现在也可以绘制UML图了!今天要向大家分享一个AI工具&…

当ChatGPT遇到网络安全】

ChatGPT:是人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代码等任务。GPT 是 …

重塑底层逻辑,涅槃重生继续远航

背景介绍 从贫困县爬出来本硕均为211学校,在机械专业学习7年,有4年的时间热衷于编程学习。因此一路跨行到IT行业。 履历介绍 从毕业后一直在AI算法行业研究,呆过初创公司,目前在上市公司上班。尝尽IT的苦也吃过IT的甜。从毕业一…

如何为 Kubernetes 集群快速部署一个 ChatGPT 人工智能聊天机器人

公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 今天我想分享一个有趣的项目叫做 “K8s ChatGPT Bot[1]”。该项目的目的是为 K8s 集群部署一个 ChatGPT 机器人。我们可以询问 ChatGPT 帮助我们解决 Prometheus 的警报&#xff0c…

ChatGPT进一步联网,距离成为超级流量入口还有多远?

备受瞩目的ChatGPT联网功能又更进一步。 继三月首次推出插件功能(Plugin)后,本周ChatGPT再次更新,将向Plus用户开放约70个第三方插件,覆盖购物、餐饮、旅行、天气、运算、翻译、分析数据等多种功能。 一个多月前&…

新闻 | 华院计算入选中国科技产业智库AIGC产业图谱

4月,中国科技产业智库甲子光年发布《AIGC应用与实践研究展望报告》及AIGC产业图谱,面向AIGC技术创新者、产业参与者、资本机构和政府等各方展现AIGC产业的整体生态环境和行业发展。华院数智人凭借其在生成式AI技术、人机交互能力和市场应用优势入选该图谱…