1 賽題理解
2 數(shù)據(jù)分析
3 詞向量+機(jī)器學(xué)習(xí)模型
4 Fasttext
- 安裝:Fasttext安裝教程 艇挨,python的第三方庫(kù) 残炮,安裝到虛擬環(huán)境中
- fasttext的參數(shù)解釋
- 更加詳細(xì)一點(diǎn)的介紹
- 相關(guān)介紹及實(shí)例,包含了文件的處理操作缩滨,模型的屬性和方法
- 源碼解析
一势就、簡(jiǎn)介
keras版本的fasttext實(shí)現(xiàn)
image.png
fastText是Facebook于2016年開源的一個(gè)詞向量計(jì)算和文本分類工具,在學(xué)術(shù)上并沒有太大創(chuàng)新脉漏。但是它的優(yōu)點(diǎn)也非常明顯苞冯,在文本分類任務(wù)中,fastText(淺層網(wǎng)絡(luò))往往能取得和深度網(wǎng)絡(luò)相媲美的精度侧巨,卻在訓(xùn)練時(shí)間上比深度網(wǎng)絡(luò)快許多數(shù)量級(jí)舅锄。在標(biāo)準(zhǔn)的多核CPU上, 能夠訓(xùn)練10億詞級(jí)別語料庫(kù)的詞向量在10分鐘之內(nèi)司忱,能夠分類有著30萬多類別的50多萬句子在1分鐘之內(nèi)皇忿。
這里有原理和基礎(chǔ)知識(shí)的介紹,可以看一看
二烘贴、實(shí)例
import numpy as np
import pandas as pd
import fasttext
from sklearn.metrics import f1_score
train = pd.read_csv(r'E:\jupyter_lab\TianChi\News_classifier\data\train\train_set.csv',sep='\t',encoding='utf8')
train.head()
train.shape #(200000,2)
image.png
1.處理成fasttext的輸入格式,并保存
train['label_ft'] = '__label__' + train['label'].astype(str)
train[['text','label_ft']].iloc[:-5000].to_csv(r'E:\jupyter_lab\TianChi\News_classifier\data\train\train_fasttext.csv',index=None,header=None,sep='\t')
#默認(rèn)逗號(hào)分隔
train[['text','label_ft']].iloc[-5000:].to_csv(r'E:\jupyter_lab\TianChi\News_classifier\data\test_a\test_fasttext.csv',index=None,header=None,sep='\t')
2.訓(xùn)練并保存
%%time
data_path = r'E:\jupyter_lab\TianChi\News_classifier\data\train\train_fasttext.csv'
model = fasttext.train_supervised(input=data_path, lr=1.0, wordNgrams=3, minCount=1,label='__label__',epoch=25,loss='hs')
output_dir = r"E:\jupyter_lab\TianChi\News_classifier\model\model.bin"
model.save_model(output_dir)
超長(zhǎng)時(shí)間預(yù)警:image.png
fasttext的參數(shù)解釋
input: 訓(xùn)練數(shù)據(jù)文件路徑
lr: 學(xué)習(xí)率
dim: 向量維度
ws: cbow模型時(shí)使用
epoch: 次數(shù)
minCount: 詞頻閾值, 小于該值在初始化時(shí)會(huì)過濾掉
minCountLabel: 類別閾值禁添,類別小于該值初始化時(shí)會(huì)過濾掉
minn: 構(gòu)造subword時(shí)最小char個(gè)數(shù)
maxn: 構(gòu)造subword時(shí)最大char個(gè)數(shù)
neg: 負(fù)采樣
wordNgrams: n-gram個(gè)數(shù)
loss: 損失函數(shù)類型, softmax, ns: 負(fù)采樣, hs: 分層softmax
label: 類別前綴
3.重新加載模型并測(cè)試
model_reload = fasttext.load_model(output_dir)
pred_result = model_reload.predict(train.iloc[-1]['text'])
pred_result
#看看返回的形式 return 標(biāo)簽列表, 概率列表
image.png
%%time
val_pred = [model_reload.predict(x)[0][0].split('__')[-1] for x in train.iloc[-5000:]['text']]
#return 類別的列表
print(f1_score(train['label'].values[-5000:].astype(str),val_pred,average='macro'))
image.png
%%time
data_test_path = r'E:\jupyter_lab\TianChi\News_classifier\data\test_a\test_fasttext.csv'
clf_model = r"E:\jupyter_lab\TianChi\News_classifier\model\model.bin"
def predict(input_data, clf_model): #return [樣本個(gè)數(shù), 準(zhǔn)確率, 召回率]
classifier_model = fasttext.load_model(clf_model)
prd_label = classifier_model.test_label(input_data)
print(prd_label)
prd_label = classifier_model.test(input_data)
acc = prd_label[1]
return acc
acc=predict(data_test_path,clf_model)
pre_label長(zhǎng)這個(gè)樣子classifier_model.test_label.png
acc:0.94
4.關(guān)于參數(shù)調(diào)優(yōu)
改變fasttext里的參數(shù)老翘,進(jìn)行模型調(diào)整。
(1)API中默認(rèn)wordNgrams為1锻离,其實(shí)就是默認(rèn)不加入N-gram feature铺峭。當(dāng)然是加入之后效果更好。
(2)lr 在[0.1-1]之間進(jìn)行嘗試汽纠。
還有其他的一些參數(shù)卫键,可以嘗試修改。由于運(yùn)行時(shí)間有點(diǎn)長(zhǎng)虱朵,就先撤了~
更新中莉炉,下節(jié)預(yù)告:word2vec+texcnn