自然语言处理之新闻分类(四)利用FastText进行自然语言处理

介绍

FastText是facebook开源用来学习词向量的文本分类框架,可以快速地在CPU上进行训练,性能十分强悍。用户只需要输入训练集以及测试集,并且增加时间限制,FastText就会自动学习并且在规定的时间内找到最佳的超参数。这一些超参数包括学习率,模型的维度,训练次数。

模型架构

FastText的架构与CBOW的类似,它是通过输入的这个词,假设为w(t),所在上下文的2d个词,经过应隐藏层后,输出分类结果。也就是利用上下文来预测当前这个词。加入了N-gram后,FastText就可以考虑词与词之间的顺序关系。因为在FastText中,每个词都可以看做是n-gram的子串。
在这里插入图片描述
在分类的时候,FastText采用了层次softmax的思想。这个思想建立在哈夫曼编码上,对标签进行编码,这样就可以大大减少模型预测的数量。
当它在遍历分类树所有叶子结点的时候,会找到概率最大的那个label。

import pandas as pd
from sklearn.metrics import f1_score


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.0, 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'))

通过FastText,使用了1.5w的数据量,最后的输出结果可以稳定在88-90这个区间。不过吗,相信继续加大数据量的话,可以提高模型分类的准确率。

使用K折交叉验证进行调参

我们在训练完成后,会发现有些参数需要进行选择,优化,因为这一些参数对模型的精度会造成影响,比方说过拟合。
这里我们就来介绍一下什么是k折交叉验证。
在这里插入图片描述
比方说,这里我们进行10折交叉验证。那么,在每折中使用9/10的数据进行训练,剩余1/10作为验证集检验模型的效果。最后取平均误差来当做泛化误差。在K折交叉验证中,我们可以使用无重复抽样技术的好处:每次迭代过程中每个样本点只有一次被划入训练集或测试集的机会。并且训练集的所有样本都必然会成为训练数据同时页必然有机会成为一次测试集。可以更好的利用训练集数据。
这里需要注意每折的划分必须保证标签的分布与整个数据集的分布一致。

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种分割。
然后每次都会得出相应的正确率,将10次的结果的正确率作为对算法精度的估计,再求其均值,作为对算法准确性的估计。最后,这些模型的超参数会在整个训练集上进行训练,来观察最后的正确率,使得模型性能更优。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值