技术标签: NLP学习
与传统机器学习不同,深度学习即提供特征提取功能,也可以完成分类的功能。
1.学习FastText的使用和基础原理
2.学会使用验证集进行调参
上一章节介绍了几种文本表示方法:
1.One-hot
2.Bag of Words
3.N-gram
4.TF-IDF
上述方法或多或少都存在一定的问题:转换得到的向量维度很高,需要较长的训练时间;没有考虑单词与单词之间的关系,只是进行了统计。
与上述方法不同,深度学习也可以用于文本表示,还可以将其映射到一个低维空间,比如:FastText,Word2Vec和Bert。本章先介绍FastText。
fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。
FastText是一个三层的神经网络,包含输入层,隐含层,输出层:
使用keras可以实现FastText网络结构:
FastText在文本分类上相较于TF-IDF的优点:
1.FastText使用单词的Embedding叠加获得的文档向量,将相似的句子分为一类。
2.FastText学习到的Embedding空间维度较低,可以快速进行训练。
关于Embedding的含义:
Embedding在数学上表示一个maping, f: X -> Y, 也就是一个function,其中该函数是injective(就是我们所说的单射函数,每个Y只有唯一的X对应,反之亦然)和structure-preserving (结构保存,比如在X所属的空间上X1 < X2,那么映射后在Y所属空间上同理 Y1 < Y2)。那么对于word embedding,就是将单词word映射到另外一个空间,其中这个映射具有injective和structure-preserving的特点。
通俗的翻译可以认为是单词嵌入,就是把X所属空间的单词映射为到Y空间的多维向量。相似词映射到相似方向。
FastText可以快速的在CPU上进行训练,最好的实践方法就是官方开源的 版本.
安装FastText可以使用pip install fasttext直接安装,也可以在 这里.找到适合自己的版本下载后安装。
分类模型:
import pandas as pd
from sklearn.metrics import f1_score
#转换为FastText需要的格式
train_df = pd.read_csv('data/train_set.csv', sep='\t', nrows=15000)
train_df['label_ft'] = '__label__' + train_df['label'].astype(str)
train_df[['text', 'label_ft']].iloc[:-5000].to_csv('train.csv', index=None, header=None, sep='\t')
import fasttext
model = fasttext.train_supervised('train.csv', lr=1, wordNgrams=2, verbose=2, minCount=1, epoch=25, loss="hs")
val_pred = [model.predict(x)[0][0].split('__')[-1] for x in train_df.iloc[-5000:]['text']]
print(f1_score(train_df['label'].values[-5000:].astype(str), val_pred, average='macro'))
结果:0.8235765814370285
这里使用的数据量较小,增加训练集数量后,精度也会相应增加。在5W条训练样本时,验证集得到可以到0.89~0.90左右。
训练时,模型的参数在一定程度上会影响模型的精度,该如何去选择这些参数呢?方法如下:
1.通过阅读文档,弄清楚参数的大致含义,了解哪些参数会增加模型的复杂度。
2.通过在验证集上进行模型精度验证,判断模型是否存在过拟合或者欠拟合的问题;
可以使用10折交叉验证,每折使用9/10的数据进行训练,剩下1/10作为验证集检验模型的效果。需要注意每折的划分必须保证标签的分与整个数据集的分布一致。
label2id = {
}
for i in range(total):
label = str(all_labels[i])
if label not in label2id:
label2id[label] = [i]
else:
label2id[label].append(i)
通过10折划分,一共得到10份分布一致的数据,索引分别为0到9,每次通过将一份数据作为验证集,剩余数据作为训练集,获得所有数据的10种分割。一般来说,可以使用最后一份,即索引为9的一份作为验证集,索引0-8的作为训练集,然后基于验证集的结果调整超参数,使得模型性能更优。
本章介绍了FastText的原理,并且创建了基础的分类模型。然后介绍了10折交叉验证划分数据集。
1.阅读FastText的参数,尝试修改参数,得到更好的分数。
参数含义:
train_supervised parameters :
input # training file path (required)
lr # learning rate [0.1]
dim # size of word vectors [100]
ws # size of the context window [5]
epoch # number of epochs [5]
minCount # minimal number of word occurences [1]
minCountLabel # minimal number of label occurences [1]
minn # min length of char ngram [0]
maxn # max length of char ngram [0]
neg # number of negatives sampled [5]
wordNgrams # max length of word ngram [1]
loss # loss function {ns, hs, softmax, ova} [softmax]
bucket # number of buckets [2000000]
thread # number of threads [number of cpus]
lrUpdateRate # change the rate of updates for the learning rate [100]
t # sampling threshold [0.0001]
label # label prefix [‘label’]
verbose # verbose [2]
2.基于验证集的结果调整超参数,使得模型性能更优。
调参可以使用贝叶斯优化方法:
import pandas as pd
from sklearn.metrics import f1_score
from bayes_opt import BayesianOptimization
import fasttext# 导入fasetext
def rf_cv(lr, wordNgrams,epoch,dim):
model = fasttext.train_supervised('train.csv', lr=lr, wordNgrams=int(wordNgrams),
verbose=2, minCount=1, epoch=int(epoch),dim=int(dim))#训练模型
val_pred = [model.predict(x)[0][0].split('__')[-1] for x in train_df.iloc[-5000:]['text']]# 预测
return f1_score(train_df['label'].values[-5000:].astype(str), val_pred, average='macro')#输出f1值
rf_bo = BayesianOptimization(
rf_cv,
{
'lr':(0.001,2),
'wordNgrams': (2, 6),
'epoch': (8, 30),
'dim':(60,600)
}
)
rf_bo.maximize()
第一个参数是我们的优化目标函数,第二个参数是我们所需要输入的超参数名称,以及其范围。
| iter | target | dim | epoch | lr | wordNg... |
-------------------------------------------------------------------------
| 1 | 0.8389 | 103.0 | 21.61 | 0.4715 | 3.989 |
| 2 | 0.7764 | 123.4 | 19.76 | 0.2017 | 2.315 |
| 3 | 0.8693 | 356.4 | 27.2 | 1.462 | 5.929 |
| 4 | 0.8735 | 209.3 | 20.82 | 1.998 | 3.542 |
| 5 | 0.8723 | 290.8 | 26.28 | 0.457 | 2.828 |
| 6 | 0.8711 | 207.9 | 20.11 | 1.796 | 4.146 |
| 7 | 0.8745 | 239.3 | 23.68 | 1.377 | 3.204 |
| 8 | 0.853 | 323.0 | 12.71 | 0.9987 | 3.346 |
| 9 | 0.09211 | 266.6 | 8.0 | 0.001 | 6.0 |
| 10 | 0.1185 | 310.9 | 30.0 | 0.001 | 6.0 |
| 11 | 0.8675 | 226.1 | 15.05 | 1.635 | 5.776 |
| 12 | 0.8617 | 341.9 | 14.21 | 0.6688 | 2.609 |
| 13 | 0.8136 | 360.6 | 9.077 | 2.0 | 6.0 |
| 14 | 0.06795 | 225.3 | 30.0 | 0.001 | 2.0 |
| 15 | 0.8678 | 237.3 | 13.04 | 2.0 | 5.957 |
| 16 | 0.8487 | 214.9 | 8.833 | 2.0 | 4.95 |
| 17 | 0.8682 | 342.7 | 27.58 | 2.0 | 6.0 |
| 18 | 0.02293 | 371.2 | 23.2 | 0.01911 | 3.282 |
| 19 | 0.87 | 351.2 | 19.17 | 1.633 | 5.009 |
| 20 | 0.4848 | 109.0 | 8.254 | 0.2686 | 3.916 |
| 21 | 0.8097 | 332.8 | 8.0 | 2.0 | 6.0 |
| 22 | 0.8366 | 91.3 | 29.95 | 0.4541 | 4.21 |
| 23 | 0.8707 | 250.7 | 30.0 | 2.0 | 6.0 |
| 24 | 0.8696 | 84.88 | 16.14 | 2.0 | 6.0 |
| 25 | 0.02293 | 74.65 | 26.0 | 0.01381 | 3.487 |
| 26 | 0.8234 | 91.36 | 8.716 | 0.6761 | 2.719 |
| 27 | 0.874 | 279.2 | 29.72 | 0.8131 | 3.492 |
| 28 | 0.8754 | 196.6 | 8.0 | 2.0 | 2.0 |
| 29 | 0.02293 | 188.4 | 19.42 | 0.007377 | 2.679 |
| 30 | 0.8732 | 248.9 | 19.68 | 1.083 | 2.146 |
=========================================================================
最优结果: 0.8754
最优参数参数dim = 196.6,epoch = 8.0,lr = 2.0,wordNgram = 2.0
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法