【数据竞赛】Kaggle实战之特征工程篇-20大文本特征(下)
作者:塵沙杰少、櫻落、新峰、DOTA、謝嘉嘉
特征工程--文本特征下半篇!
前 言
這是一個系列篇,后續我們會按照我們第一章中的框架進行更新,因為大家平時都較忙,不會定期更新,如有興趣歡迎長期關注我們的公眾號,如有任何建議可以在評論區留言,該系列以往的經典內容可參考下面的篇章。
1. kaggle競賽寶典-競賽框架篇!
2.1?賽題理解,分析,規劃之賽題理解與分析!
2.2??kaggle競賽寶典-回歸相關指標優化!
2.3??kaggle競賽寶典-二分類相關指標優化!
2.4??kaggle競賽寶典-多分類相關指標優化!
2.5?數據競賽規劃!
3.1?數據探索分析-全局數據探索分析!
3.2?數據探索分析-單變量數據分析!
3.3 數據探索分析-交叉變量分析篇!
3.4?訓練集測試集分布不一致性探索!
4.1?kaggle競賽寶典-樣本篩選篇!
4.2?kaggle競賽寶典-樣本組織篇!
5. 驗證策略設計!
6.1. 模型理解、選擇--GBDT!
6.2.模型理解、選擇--XGBoost!
6.3.模型理解、選擇--LightGBM!
6.4.模型理解、選擇--CatBoost!
7.1 特征工程--為什么要做特征工程!
7.2?特征工程-無序單無序類別特征特征工程!
7.3 特征工程-有序類別變量&單數值變量特征工程!
7.4 特征工程-單時間變量特征工程!
7.5 特征工程-文本特征工程上篇!
文本特征-下篇
針對梯度提升樹模型對文本特征進行特征工程,我們需要充分挖掘Label編碼丟失的信息,例如上面的名字特征,內部存在非常強的規律,Mr等信息,這些信息反映了性別相關的信息,如果直接進行Label編碼就會丟失此類信息,所以我們可以通過文本技巧對其進行挖掘。在本文中,我們對現在常用的文本特征進行匯總。在上篇中介紹過的此處不在贅述。
1.詞匯屬性特征
每個詞都有其所屬的屬性,例如是名詞,動詞,還是形容詞等等。詞匯屬性特征很多時候能幫助模型帶來效果上的微弱提升,可以作為一類補充信息。
2.文本向量特征
TDIDF特征可以緩解詞頻特征的高頻詞匯特征帶來的問題,同時通過N-Gram的策略還可以間接捕捉文本中的詞的關系,但是這些信息的捕捉還是較差的,而且N-Gram的策略還會使得字典過大,帶來存儲的問題。但是詞向量特征卻可以很好地緩解這兩個問題。
詞嵌入模型通過建立所選詞與相鄰前后詞之間的概率分布,將詞映射到某個維度的向量。這樣我們就僅僅只需要記錄每個詞對應的向量,而且在實踐中我們發現基于詞向量的特征往往能取得更好的效果,這也從側面說明了詞向量的形式可以更好地捕捉詞與詞之間的關系。
目前可以通過使用Gensim來抽取詞向量。因為我們抽取的是基于詞的向量,而不同文本的詞的個數是不一樣的,所以最后還需要通過某種轉化將我們的的文本特征轉化為相同維度的特征。最為常見的就是下面兩種策略:
1. 計算統計特征,例如均值、中位數、方差等等;?
2. 先將文本長度進行截斷,缺失的補0,然后進行PCA,TSNE等轉化;
目前可以產出詞向量的策略非常多,例如Word2Vec,Glove等等,還有許多最新預訓練好的包都可以直接拿過來使用。
import?gensim.downloader?as?gensim_api glove_model?=?gensim_api.load("glove-wiki-gigaword-300")? word?=?"love" glove_model[word]3.HashVector
不管是CounterVector,TfidfVectorizer還是Word2Vector等詞向量的方式抽取的特征我們都需要存儲一個映射表,這會帶來非常大的內存壓力,但我們仍然需要將文檔編碼為向量,這個時候我們就需要用到HashVector,HashingVectorizer不存儲結果詞匯表,該方法使用單向哈希方法將單詞轉化成整數,因而我們不需要詞匯表,可以選擇任意長的固定長度向量,這對于大型數據集非常有效。缺點是哈希量化是單向的,因此無法將編碼轉換回單詞,在很多有監督學習中是不影響的。
因為我們使用的是HashVector就自然會存在散列沖突的問題(如果矩陣大小太小,則必然會發生這種情況),在計算資源達到最大值的情況下,HashVector是非常好的特征。
from?sklearn.feature_extraction.text?import?HashingVectorizer text?=?["The?quick?brown?fox?jumped?over?the?lazy?dog."] vectorizer?=?HashingVectorizer(n_features=20) vector?=?vectorizer.transform(text) print(vector.shape) print(vector.toarray()) (1, 20) [[ 0. 0. 0. 0. 0. 0.333333330. -0.33333333 0.33333333 0. 0. 0.333333330. 0. 0. -0.33333333 0. 0.-0.66666667 0. ]]4.文本語言信息
在很多問題中,并不是所有的文本都是同一種語言,這個時候我們需要對不同的文本進行分類,判斷其是哪一種類型的語言。
| I love it. | sl |
| 我喜歡你。 | zh-cn |
| I think you are great! | en |
| OK! | en |
| 太棒了。 | zh-cn |
| No pro. | pt |
5.語意特征
情感分析是通過數字或類來表達文本數據的主觀情感,在非常多的問題中都至關重要。目前情感分析是自然語言處理中最困難的任務之一,需要處理自然語言的歧義等問題,但是如果我們能很好地挖掘出文本的情感,那么對于我們模型的幫助是非常巨大的。
但是一個好的語言模型的訓練是非常耗費時間的,如果沒有足夠的時間或數據時,我們可以使用預先訓練好的模型,比如Textblob和Vader。Textblob建立在NLTK之上,是最流行的語言之一,它可以給單詞分配極性,并將整個文本的情感作為一個平均值進行估計。Vader是一個基于規則的模型,目前在社交媒體的數據上使用較多。
import?pandas?as?pd from?textblob?import?TextBlob df?=?pd.DataFrame() df['text']?=?['I?love?it.',?'I?hate?you.',?'I?think?you?are?great!',?'She?is?beautiful.',?'Good!',?'No?problem.'] df["sentiment"]?=?df['text'].apply(lambda?x:??TextBlob(x).sentiment.polarity) df.head()| I love it. | 0.500 |
| I hate you. | -0.800 |
| I think you are great! | 1.000 |
| She is beautiful. | 0.850 |
| Good! | 0.875 |
從上面的特征中,我們發現情感的特征還是相對靠譜的。
6.特殊詞匯特征
標點符號能從側面反映文本的情感強烈程度等信息,在情感分類,文本分類中有很重要的作用,當然與此同時,特殊詞匯的特征特征則更為重要。特殊詞匯依據問題的不同,會有非常大的不同,我們舉幾個簡單的例子:
文本情感分類問題
我們可以選擇直接分類別(每一類情感表示一類)統計每個類別中詞匯的出現次數。
代碼病毒檢測問題
代碼的關鍵詞信息都尤為重要,例如截圖,聯網,發送等特殊詞匯會為我們判斷該代碼文件是否含有病毒提供重要的依據。
7.NER特征
命名實體識別(Named entity recognition,NER)是用預定義的類別(如人名、地點、組織等)標記非結構化文本中提到的命名實體的過程。這些重要的命名實體在非常多的問題中都很有用。例如判斷某用戶點擊某廣告的概率等,可以通過NER識別出廣告中的代言人,依據代言人與用戶的喜好來判定用戶點擊某條廣告的概率。目前使用較多的NER工具包是SpaCy,關于NER目前能處理多少不同的命名實體,有興趣的朋友可以看一下Spacy工具包
除了可與直接抽取我們想要的NER特征,SpaCy還可以對其進行標亮,如下所示。
import?spacy import?pandas?as?pd #?!pip?install?zh_core_web_sm-3.0.0-py3-none-any.whl ner?=?spacy.load("zh_core_web_sm") df?=?pd.DataFrame() df['txt']?=?['','我喜歡四川。','成都的女孩喜歡吃辣。'] df["tags"]?=?df["txt"].apply(lambda?x:?[(tag.text,?tag.label_)???for?tag?in?ner(x).ents]?) df?| 在無錫車站,我遇見了來自南京的你。 | [(無錫車站, FAC), (南京, GPE)] |
| 我喜歡四川。 | [(四川, GPE)] |
| 成都的女孩喜歡吃辣。 | [(成都, GPE)] |
在無錫車站 FAC,我遇見了來自南京 GPE的你。但沒想到你那么喜歡吃四川 GPE的火鍋。
8.K近鄰特征
除了LDA主題模型,我們基于向量做的最多的衍生特征就是相似度特征。我們找到距離每個文本最近的N個文本,并將最近的N個文本對應的ID以及其與當前文本的距離作為我們新的特征。
距離的計算方式可以是歐幾里得,cosine等等,依據距離的不同,文本相似度特征可以有非常多。
from?sklearn.metrics.pairwise?import?cosine_similarity similarity_matrix?=?cosine_similarity(tfidf_matrix) similarity_matrix array([[1. , 0.36651513, 0.52305744, 0.13448867],[0.36651513, 1. , 0.72875508, 0.54139736],[0.52305744, 0.72875508, 1. , 0.43661098],[0.13448867, 0.54139736, 0.43661098, 1. ]])9.聚類特征
和K近鄰特征經常一起使用的就是聚類特征。同樣地,因為聚類特征的方式是非常多的,最常見的就是Kmeans等等,此處我們列舉常見的兩種聚類特征。
Kmeans聚類
hierarchy聚類
| 1 | 2 | 0.736539 | 2 |
| 3 | 4 | 1.08712 | 3 |
| 0 | 5 | 1.24292 | 4 |
| 3 |
| 1 |
| 1 |
| 2 |
10.小結
目前文本相關的問題都是以DeepLearning為主的方案,但上述的許多特征都是非常重要的,可以作為神經網絡的Dense側特征加入模型訓練或者直接抽取放入梯度提升樹模型進行訓練,往往都可以帶來不錯的提升,因為本系列我們重點是梯度提升樹模型的建模,關于DeepLearning的很多訓練等策略有興趣的可以閱讀相關的文章自行研究。
參考文獻
https://blog.socratesk.com/blog/2018/06/17/featuren-engineering-and-extraction
https://datascience.stackexchange.com/questions/10509/how-to-deal-with-categorical-feature-of-very-high-cardinality
KaggleDays SF: 2. Amazon - Unsupervised encoding
Mean (likelihood) encodings: a comprehensive study
http://blog.kaggle.com/2015/06/22/profiling-top-kagglers-owen-zhang-currently-1-in-the-world/
Feature Engineering Techniques
How the Magic Works
Why One-Hot Encode Data in Machine Learning?
Label Encoding in Python Explained
Why does frequency encoding work?
Encoding categorical variables using likelihood estimation
Mean (likelihood) encoding for categorical variables with high cardinality and feature interactions: a comprehensive study with Python
Category Encoders
Leave One Out Encoding for Categorical Feature Variables on Spark
https://github.com/pourya-ir/Medium/tree/master/K-fold-target-enc
How to deal with Features having high cardinality
https://github.com/scikit-learn-contrib/category_encoders
Handling Categorical Data in Python
Here’s All you Need to Know About Encoding Categorical Data (with Python code)
Encodings for Ordered Data
Feature Engineering, Feature Extraction, and Feature Selection
Detailed Text Based Feature Engineering
Extensive Text Data Feature Engineering
了解一下Sklearn中的文本特征提取
Traditional Methods for Text Data
Feature Extraction from Text (USING PYTHON)
https://spacy.io/usage/linguistic-features
https://github.com/RaRe-Technologies/gensim-data
Text Analysis & Feature Engineering with NLP
Foundations of AI & ML
Feature Engineering Methods for Text Data
HashingVectorizer vs. CountVectorizer
使用Scikit-Learn提取文本特征
總結
以上是生活随笔為你收集整理的【数据竞赛】Kaggle实战之特征工程篇-20大文本特征(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win11如何清理D盘垃圾
- 下一篇: 【计算广告】不懂这些专业术语别说你懂广告