【数据竞赛】Kaggle实战之特征工程篇-20大文本特征(下)
作者:塵沙杰少、櫻落、新峰、DOTA、謝嘉嘉
特征工程--文本特征下半篇!
前 言
這是一個(gè)系列篇,后續(xù)我們會(huì)按照我們第一章中的框架進(jìn)行更新,因?yàn)榇蠹移綍r(shí)都較忙,不會(huì)定期更新,如有興趣歡迎長(zhǎng)期關(guān)注我們的公眾號(hào),如有任何建議可以在評(píng)論區(qū)留言,該系列以往的經(jīng)典內(nèi)容可參考下面的篇章。
1. kaggle競(jìng)賽寶典-競(jìng)賽框架篇!
2.1?賽題理解,分析,規(guī)劃之賽題理解與分析!
2.2??kaggle競(jìng)賽寶典-回歸相關(guān)指標(biāo)優(yōu)化!
2.3??kaggle競(jìng)賽寶典-二分類相關(guān)指標(biāo)優(yōu)化!
2.4??kaggle競(jìng)賽寶典-多分類相關(guān)指標(biāo)優(yōu)化!
2.5?數(shù)據(jù)競(jìng)賽規(guī)劃!
3.1?數(shù)據(jù)探索分析-全局?jǐn)?shù)據(jù)探索分析!
3.2?數(shù)據(jù)探索分析-單變量數(shù)據(jù)分析!
3.3 數(shù)據(jù)探索分析-交叉變量分析篇!
3.4?訓(xùn)練集測(cè)試集分布不一致性探索!
4.1?kaggle競(jìng)賽寶典-樣本篩選篇!
4.2?kaggle競(jìng)賽寶典-樣本組織篇!
5. 驗(yàn)證策略設(shè)計(jì)!
6.1. 模型理解、選擇--GBDT!
6.2.模型理解、選擇--XGBoost!
6.3.模型理解、選擇--LightGBM!
6.4.模型理解、選擇--CatBoost!
7.1 特征工程--為什么要做特征工程!
7.2?特征工程-無序單無序類別特征特征工程!
7.3 特征工程-有序類別變量&單數(shù)值變量特征工程!
7.4 特征工程-單時(shí)間變量特征工程!
7.5 特征工程-文本特征工程上篇!
文本特征-下篇
針對(duì)梯度提升樹模型對(duì)文本特征進(jìn)行特征工程,我們需要充分挖掘Label編碼丟失的信息,例如上面的名字特征,內(nèi)部存在非常強(qiáng)的規(guī)律,Mr等信息,這些信息反映了性別相關(guān)的信息,如果直接進(jìn)行Label編碼就會(huì)丟失此類信息,所以我們可以通過文本技巧對(duì)其進(jìn)行挖掘。在本文中,我們對(duì)現(xiàn)在常用的文本特征進(jìn)行匯總。在上篇中介紹過的此處不在贅述。
1.詞匯屬性特征
每個(gè)詞都有其所屬的屬性,例如是名詞,動(dòng)詞,還是形容詞等等。詞匯屬性特征很多時(shí)候能幫助模型帶來效果上的微弱提升,可以作為一類補(bǔ)充信息。
2.文本向量特征
TDIDF特征可以緩解詞頻特征的高頻詞匯特征帶來的問題,同時(shí)通過N-Gram的策略還可以間接捕捉文本中的詞的關(guān)系,但是這些信息的捕捉還是較差的,而且N-Gram的策略還會(huì)使得字典過大,帶來存儲(chǔ)的問題。但是詞向量特征卻可以很好地緩解這兩個(gè)問題。
詞嵌入模型通過建立所選詞與相鄰前后詞之間的概率分布,將詞映射到某個(gè)維度的向量。這樣我們就僅僅只需要記錄每個(gè)詞對(duì)應(yīng)的向量,而且在實(shí)踐中我們發(fā)現(xiàn)基于詞向量的特征往往能取得更好的效果,這也從側(cè)面說明了詞向量的形式可以更好地捕捉詞與詞之間的關(guān)系。
目前可以通過使用Gensim來抽取詞向量。因?yàn)槲覀兂槿〉氖腔谠~的向量,而不同文本的詞的個(gè)數(shù)是不一樣的,所以最后還需要通過某種轉(zhuǎn)化將我們的的文本特征轉(zhuǎn)化為相同維度的特征。最為常見的就是下面兩種策略:
1. 計(jì)算統(tǒng)計(jì)特征,例如均值、中位數(shù)、方差等等;?
2. 先將文本長(zhǎng)度進(jìn)行截?cái)?#xff0c;缺失的補(bǔ)0,然后進(jìn)行PCA,TSNE等轉(zhuǎn)化;
目前可以產(chǎn)出詞向量的策略非常多,例如Word2Vec,Glove等等,還有許多最新預(yù)訓(xùn)練好的包都可以直接拿過來使用。
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等詞向量的方式抽取的特征我們都需要存儲(chǔ)一個(gè)映射表,這會(huì)帶來非常大的內(nèi)存壓力,但我們?nèi)匀恍枰獙⑽臋n編碼為向量,這個(gè)時(shí)候我們就需要用到HashVector,HashingVectorizer不存儲(chǔ)結(jié)果詞匯表,該方法使用單向哈希方法將單詞轉(zhuǎn)化成整數(shù),因而我們不需要詞匯表,可以選擇任意長(zhǎng)的固定長(zhǎng)度向量,這對(duì)于大型數(shù)據(jù)集非常有效。缺點(diǎn)是哈希量化是單向的,因此無法將編碼轉(zhuǎn)換回單詞,在很多有監(jiān)督學(xué)習(xí)中是不影響的。
因?yàn)槲覀兪褂玫氖荋ashVector就自然會(huì)存在散列沖突的問題(如果矩陣大小太小,則必然會(huì)發(fā)生這種情況),在計(jì)算資源達(dá)到最大值的情況下,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.文本語言信息
在很多問題中,并不是所有的文本都是同一種語言,這個(gè)時(shí)候我們需要對(duì)不同的文本進(jìn)行分類,判斷其是哪一種類型的語言。
| I love it. | sl |
| 我喜歡你。 | zh-cn |
| I think you are great! | en |
| OK! | en |
| 太棒了。 | zh-cn |
| No pro. | pt |
5.語意特征
情感分析是通過數(shù)字或類來表達(dá)文本數(shù)據(jù)的主觀情感,在非常多的問題中都至關(guān)重要。目前情感分析是自然語言處理中最困難的任務(wù)之一,需要處理自然語言的歧義等問題,但是如果我們能很好地挖掘出文本的情感,那么對(duì)于我們模型的幫助是非常巨大的。
但是一個(gè)好的語言模型的訓(xùn)練是非常耗費(fèi)時(shí)間的,如果沒有足夠的時(shí)間或數(shù)據(jù)時(shí),我們可以使用預(yù)先訓(xùn)練好的模型,比如Textblob和Vader。Textblob建立在NLTK之上,是最流行的語言之一,它可以給單詞分配極性,并將整個(gè)文本的情感作為一個(gè)平均值進(jìn)行估計(jì)。Vader是一個(gè)基于規(guī)則的模型,目前在社交媒體的數(shù)據(jù)上使用較多。
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 |
從上面的特征中,我們發(fā)現(xiàn)情感的特征還是相對(duì)靠譜的。
6.特殊詞匯特征
標(biāo)點(diǎn)符號(hào)能從側(cè)面反映文本的情感強(qiáng)烈程度等信息,在情感分類,文本分類中有很重要的作用,當(dāng)然與此同時(shí),特殊詞匯的特征特征則更為重要。特殊詞匯依據(jù)問題的不同,會(huì)有非常大的不同,我們舉幾個(gè)簡(jiǎn)單的例子:
文本情感分類問題
我們可以選擇直接分類別(每一類情感表示一類)統(tǒng)計(jì)每個(gè)類別中詞匯的出現(xiàn)次數(shù)。
代碼病毒檢測(cè)問題
代碼的關(guān)鍵詞信息都尤為重要,例如截圖,聯(lián)網(wǎng),發(fā)送等特殊詞匯會(huì)為我們判斷該代碼文件是否含有病毒提供重要的依據(jù)。
7.NER特征
命名實(shí)體識(shí)別(Named entity recognition,NER)是用預(yù)定義的類別(如人名、地點(diǎn)、組織等)標(biāo)記非結(jié)構(gòu)化文本中提到的命名實(shí)體的過程。這些重要的命名實(shí)體在非常多的問題中都很有用。例如判斷某用戶點(diǎn)擊某廣告的概率等,可以通過NER識(shí)別出廣告中的代言人,依據(jù)代言人與用戶的喜好來判定用戶點(diǎn)擊某條廣告的概率。目前使用較多的NER工具包是SpaCy,關(guān)于NER目前能處理多少不同的命名實(shí)體,有興趣的朋友可以看一下Spacy工具包
除了可與直接抽取我們想要的NER特征,SpaCy還可以對(duì)其進(jìn)行標(biāo)亮,如下所示。
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主題模型,我們基于向量做的最多的衍生特征就是相似度特征。我們找到距離每個(gè)文本最近的N個(gè)文本,并將最近的N個(gè)文本對(duì)應(yīng)的ID以及其與當(dāng)前文本的距離作為我們新的特征。
距離的計(jì)算方式可以是歐幾里得,cosine等等,依據(jù)距離的不同,文本相似度特征可以有非常多。
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近鄰特征經(jīng)常一起使用的就是聚類特征。同樣地,因?yàn)榫垲愄卣鞯姆绞绞欠浅6嗟?#xff0c;最常見的就是Kmeans等等,此處我們列舉常見的兩種聚類特征。
Kmeans聚類
hierarchy聚類
| 1 | 2 | 0.736539 | 2 |
| 3 | 4 | 1.08712 | 3 |
| 0 | 5 | 1.24292 | 4 |
| 3 |
| 1 |
| 1 |
| 2 |
10.小結(jié)
目前文本相關(guān)的問題都是以DeepLearning為主的方案,但上述的許多特征都是非常重要的,可以作為神經(jīng)網(wǎng)絡(luò)的Dense側(cè)特征加入模型訓(xùn)練或者直接抽取放入梯度提升樹模型進(jìn)行訓(xùn)練,往往都可以帶來不錯(cuò)的提升,因?yàn)楸鞠盗形覀冎攸c(diǎn)是梯度提升樹模型的建模,關(guān)于DeepLearning的很多訓(xùn)練等策略有興趣的可以閱讀相關(guān)的文章自行研究。
參考文獻(xiàn)
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提取文本特征
總結(jié)
以上是生活随笔為你收集整理的【数据竞赛】Kaggle实战之特征工程篇-20大文本特征(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win11如何清理D盘垃圾
- 下一篇: 【计算广告】不懂这些专业术语别说你懂广告