【NLP】情感分析:BERT vs Catboost
??作者 | Taras Baranyuk
編譯 | VK
來源 | Towards Data Science
介紹
情感分析是一種自然語言處理(NLP)技術,用于確定數據是積極的、消極的還是中性的。
情感分析是基礎,因為它有助于理解語言中的情感基調。這反過來又有助于自動排序評論、社交媒體討論等觀點,讓你做出更快、更準確的決定。
雖然情感分析在近幾年已經非常流行,但是從本世紀初開始,情感分析的研究就一直在進行中。
傳統的機器學習方法,如樸素貝葉斯、Logistic回歸和支持向量機(SVMs)由于其良好的可擴展性,被廣泛應用于大規模情感分析。深度學習(Deep learning,DL)技術已被證明能為各種NLP任務(包括情緒分析)提供更好的準確性;然而,它們的學習速度和使用往往更慢、更昂貴。
在這個故事中,我想提供一個鮮為人知的結合了速度和質量的替代方案。對于推薦方法的結論和評估,我需要一個基線模型。我選擇了久經考驗的BERT。
數據
社交媒體是一個以前所未有的規模產生大量數據的來源。我將用于這個文章的數據集是冠狀病毒tweets NLP:
https://www.kaggle.com/datatattle/covid-19-nlp-text-classification
正如我所看到的,這個模型沒有那么多的數據,乍一看,似乎沒有一個預訓練好的模型是不行的。
由于訓練樣本的數量較少,我們將它們結合起來,將類的數量減少到3個。
基線BERT模型
讓我們使用TensorFlow Hub。TensorFlow Hub是一個經過訓練的機器學習模型庫,可以在任何地方進行微調和部署。只需幾行代碼就可以重用像BERT和Faster R-CNN這樣的訓練模型。
!pip?install?tensorflow_hub !pip?install?tensorflow_textsmall_bert/bert_en_uncased_L-4_H-512_A-8-Smaller BERT模型。這個是一個較小的BERT模型,論文(https://arxiv.org/abs/1908.08962)。
Smaller BERT模型適用于計算資源有限的環境。它們可以按照與原始BERT模型相同的方式進行微調。然而,它們在知識蒸餾的環境中是最有效的。
bert_en_uncased_preprocess-BERT的文本預處理。這個模型使用從維基百科和書庫中提取的英語詞匯。文本輸入采用了“不區分大小寫”的方式進行規范化,這意味著在將標記轉換為單詞片段之前,文本是小寫的,并且去掉了任何重音標記。
tfhub_handle_encoder?=?\"https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-4_H-512_A-8/1" tfhub_handle_preprocess?=?\"https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3"我不會選擇參數和優化,以避免復雜的代碼。同樣,這是基準模型,不是SOTA。
def?build_classifier_model():text_input?=?tf.keras.layers.Input(shape=(),?dtype=tf.string,?name='text')preprocessing_layer?=?hub.KerasLayer(tfhub_handle_preprocess,?name='preprocessing')encoder_inputs?=?preprocessing_layer(text_input)encoder?=?hub.KerasLayer(tfhub_handle_encoder,?trainable=True,?name='BERT_encoder')outputs?=?encoder(encoder_inputs)net?=?outputs['pooled_output']net?=?tf.keras.layers.Dropout(0.1)(net)net?=?tf.keras.layers.Dense(3,?activation='softmax',?name='classifier')(net)model?=?tf.keras.Model(text_input,?net)loss?=?tf.keras.losses.CategoricalCrossentropy(from_logits=True)metric?=?tf.metrics.CategoricalAccuracy('accuracy')optimizer?=?Adam(learning_rate=5e-05,?epsilon=1e-08,?decay=0.01,?clipnorm=1.0)model.compile(optimizer=optimizer,?loss=loss,?metrics=metric)model.summary()return?model我已經創建了一個參數不到3000萬的模型。
我分配了30%的訓練數據用于模型驗證。
train,?valid?=?train_test_split(df_train,train_size=0.7,random_state=0,stratify=df_train['Sentiment'])y_train,?X_train?=?\train['Sentiment'],?train.drop(['Sentiment'],?axis=1) y_valid,?X_valid?=?\valid['Sentiment'],?valid.drop(['Sentiment'],?axis=1)y_train_c?=?tf.keras.utils.to_categorical(y_train.astype('category').cat.codes.values,?num_classes=3) y_valid_c?=?tf.keras.utils.to_categorical(y_valid.astype('category').cat.codes.values,?num_classes=3)epoch的數量是憑直覺選擇的
history?=?classifier_model.fit(x=X_train['Tweet'].values,y=y_train_c,validation_data=(X_valid['Tweet'].values,?y_valid_c),epochs=5) BERT?Accuracy:?0.833859920501709這里是基準模型。顯然,該模型還可以進一步改進。但是讓我們把這個任務作為你的家庭作業。
CatBoost模型
CatBoost是一個高性能的開源庫,用于在決策樹上進行梯度增強。從0.19.1版開始,它支持在GPU上進行文本分類。
主要優點是CatBoost可以在數據中包含分類函數和文本函數,而無需額外的預處理。對于那些重視推理速度的人來說,CatBoost預測的速度是其他開源梯度增強庫的20到40倍,這使得CatBoost對于延遲關鍵任務非常有用。
!pip?install?catboost我不會選擇最佳參數,那是你的另一個作業。讓我們編寫一個函數來初始化和訓練模型。
def?fit_model(train_pool,?test_pool,?**kwargs):model?=?CatBoostClassifier(task_type='GPU',iterations=5000,eval_metric='Accuracy',od_type='Iter',od_wait=500,**kwargs)return?model.fit(train_pool,eval_set=test_pool,verbose=100,plot=True,use_best_model=True)使用CatBoost時,我建議使用池。這個池是一個方便的包裝器,它結合了特征、標簽和元數據,比如分類特征和文本特征。
train_pool?=?Pool(data=X_train,label=y_train,text_features=['Tweet'] )valid_pool?=?Pool(data=X_valid,?label=y_valid,text_features=['Tweet'] )text_features -文本列索引(指定為整數)或名稱(指定為字符串)的一維數組。參數是一個二維特征矩陣(有以下類型之一:list, numpy.ndarray, pandas.DataFrame, pandas.Series)。
如果將該數組中的任何元素指定為名稱而不是索引,則必須提供所有列的名稱。為此,可以使用該構造函數的feature_names參數顯式地指定它們,或者在data參數中傳遞一個指定列名的pandas.DataFrame。
支持的訓練參數:
tokenizers-tokenizer用于在創建字典之前預處理文本類型特征列。
dictionaries-用于預處理文本類型特征列的字典。
feature_calcers—特征分解器,用于根據預處理的文本類型特征列計算新特征。
我直觀地設置了所有的參數;調整它們將再次成為你的作業。
model?=?fit_model(train_pool,?valid_pool,learning_rate=0.35,tokenizers=[{'tokenizer_id':?'Sense','separator_type':?'BySense','lowercasing':?'True','token_types':['Word',?'Number',?'SentenceBreak'],'sub_tokens_policy':'SeveralTokens'}??????],dictionaries?=?[{'dictionary_id':?'Word','max_dictionary_size':?'50000'}],feature_calcers?=?['BoW:top_tokens_count=10000'] )準確率
LOSS
CatBoost?model?accuracy:?0.8299104791995787結果非常接近于基線BERT模型所顯示的結果。因為我幾乎沒有訓練的數據,而且模型是從零開始學習的,所以在我看來,結果令人印象深刻。
額外
我得到了兩個模型,結果非常相似。這能給我們提供什么有用的信息嗎?這兩種模式在核心上幾乎沒有共同點,這意味著它們的結合將產生協同效應。檢驗這一結論的最簡單方法是將結果取平均值,然后看看會發生什么。
y_proba_avg?=?np.argmax((y_proba_cb?+?y_proba_bert)/2,?axis=1)提升很不錯。
Average?accuracy:?0.855713533438652結尾
在這個故事中,我:
利用BERT建立基線模型;
創建了一個CatBoost模型;
平均兩個模型的結果會發生什么。
在我看來,在大多數情況下,復雜和緩慢的SOTA是可以避免的,特別是在速度是一個關鍵需求的情況下。
CatBoost提供了很好的情感分析功能。對于Kaggle、DrivenData等競賽愛好者來說,CatBoost可以提供一個好的模型,既可以作為基線解決方案,也可以作為模型集合的一部分。
本文中的代碼可以在這里查看:
https://github.com/sagol/catboost_sentiment/blob/main/catboost_sentiment_analysis.ipynb
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯溫州大學《機器學習課程》視頻 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【NLP】情感分析:BERT vs Catboost的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么修改腾讯视频的昵称
- 下一篇: 谷歌Chrome浏览器添加新技术 可防止