机器学习之特征工程
特征工程-概念
特征工程是一個(gè)面向十分廣的概念,只要是在處理數(shù)據(jù)就可以認(rèn)為是在做特征工程。個(gè)人理解,真正意義上的特征工程還是數(shù)據(jù)降維和數(shù)據(jù)升維的過(guò)程。
而前期對(duì)數(shù)據(jù)的處理過(guò)程:
- 需要哪些數(shù)據(jù)?
- 數(shù)據(jù)如何存儲(chǔ)?
- 數(shù)據(jù)如何清洗?
將這三步歸納到數(shù)據(jù)準(zhǔn)備的過(guò)程。
1、需要哪些數(shù)據(jù)?根據(jù)領(lǐng)導(dǎo)提出的一個(gè)分析要求,我們需要構(gòu)思自己需要哪些數(shù)據(jù),這個(gè)時(shí)候我們要和企業(yè)中的運(yùn)維人員進(jìn)行溝通,看看運(yùn)維人員能夠提供哪些數(shù)據(jù)。
2、數(shù)據(jù)如何存儲(chǔ)?一般如果不是那種需要一個(gè)人頂十個(gè)人的超級(jí)創(chuàng)業(yè)公司,像數(shù)據(jù)存儲(chǔ)的工作一般不會(huì)交給我們?nèi)ネ瓿伞?/p>
3、數(shù)據(jù)如何清洗?對(duì)我們來(lái)說(shuō),數(shù)據(jù)準(zhǔn)備過(guò)程中最關(guān)鍵的第一步操作是如何對(duì)數(shù)據(jù)進(jìn)行清洗。比如數(shù)據(jù)庫(kù)中存的是作者和文章所在的url地址。我們可以對(duì)作者進(jìn)行啞編碼的操作,對(duì)url地址返回的文章進(jìn)行詞袋法的處理,等等。
4、數(shù)據(jù)特征工程。數(shù)據(jù)特征工程和數(shù)據(jù)清洗有時(shí)候概念的邊界比較模糊。有些在數(shù)據(jù)清理過(guò)程中也會(huì)遇到特征選擇的問(wèn)題,但很多時(shí)候數(shù)據(jù)本身特征就少,你再做個(gè)特征選擇就更加欠擬合了??偟膩?lái)說(shuō)實(shí)際情況實(shí)際分析。
一、需要哪些數(shù)據(jù)?
在進(jìn)行機(jī)器學(xué)習(xí)之前,收集數(shù)據(jù)的過(guò)程中,我們主要按照以下規(guī)則找出我們所需要的數(shù)據(jù):
- 業(yè)務(wù)的實(shí)現(xiàn)需要哪些數(shù)據(jù)?
基于對(duì)業(yè)務(wù)規(guī)則的理解,盡可能多的找出對(duì)因變量有影響的所有自變量數(shù)據(jù)。
- 數(shù)據(jù)可用性評(píng)估
在獲取數(shù)據(jù)的過(guò)程中,首先需要考慮的是這個(gè)數(shù)據(jù)獲取的成本;
獲取得到的數(shù)據(jù),在使用之前,需要考慮一下這個(gè)數(shù)據(jù)是否覆蓋了所有情況以及這個(gè)數(shù)據(jù)的可信度情況。
- 一般公司內(nèi)部做機(jī)器學(xué)習(xí)的數(shù)據(jù)源:
PS:入職第一周可能就是讓你拿數(shù)據(jù),熟悉數(shù)據(jù)來(lái)源,這樣后續(xù)工作也好上手。
二、數(shù)據(jù)如何存儲(chǔ)?
一般情況下,用于后期模型創(chuàng)建的數(shù)據(jù)都是存在在本地磁盤(pán)、關(guān)系型數(shù)據(jù)庫(kù)或者一些相關(guān)的分布式數(shù)據(jù)存儲(chǔ)平臺(tái)的。
- 本地磁盤(pán)
- MySQL
- Oracle
- HBase
- HDFS
- Hive
三、數(shù)據(jù)清洗
數(shù)據(jù)清洗(data cleaning)是在機(jī)器學(xué)習(xí)過(guò)程中一個(gè)不可缺少的環(huán)節(jié),其數(shù)據(jù)的清洗結(jié)果直接關(guān)系到模型效果以及最終的結(jié)論。在實(shí)際的工作中,數(shù)據(jù)清洗通常占開(kāi)發(fā)過(guò)程的50%-80%左右的時(shí)間。推薦一本書(shū)
數(shù)據(jù)清洗過(guò)程:
1、數(shù)據(jù)預(yù)處理
在數(shù)據(jù)預(yù)處理過(guò)程主要考慮兩個(gè)方面,如下:
- 選擇數(shù)據(jù)處理工具:關(guān)系型數(shù)據(jù)庫(kù)或者Python
- 查看數(shù)據(jù)的元數(shù)據(jù)以及數(shù)據(jù)特征:一是查看元數(shù)據(jù),包括字段解釋、數(shù)據(jù)來(lái)源等一切可以描述數(shù)據(jù)的信息;另外是抽取一部分?jǐn)?shù)據(jù),通過(guò)人工查看的方式,對(duì)數(shù)據(jù)本身做一個(gè)比較直觀的了解,并且初步發(fā)現(xiàn)一些問(wèn)題,為之后的數(shù)據(jù)處理做準(zhǔn)備。
注意:建模和做特征之前,要先了解字段含義,來(lái)源,再用data.describe() 抽取一部分?jǐn)?shù)據(jù)通過(guò)人工查看,進(jìn)一步分析。
作為研究者,我們不能為了完成任務(wù)而完成任務(wù),至少在數(shù)據(jù)層面上必須要嚴(yán)謹(jǐn),做出來(lái)的模型必須要起到作用。很多時(shí)候,客戶(hù)要求模型的準(zhǔn)確率達(dá)到98%,不過(guò)也許我們能給出的模型一般在91%~92%,但是必須保證我們分析的數(shù)據(jù)是絕對(duì)有用的,有解釋意義的。這樣的模型也許在指標(biāo)上沒(méi)有完成客戶(hù)的需求,但模型也是有價(jià)值的。
反之有些分析師為了獲得更好的模型評(píng)分,強(qiáng)行加入一些沒(méi)有意義的奇怪?jǐn)?shù)據(jù),這樣一來(lái)在當(dāng)前的數(shù)據(jù)集中能夠跑出很好的評(píng)分,到了實(shí)際運(yùn)用中結(jié)果會(huì)很差。這就是過(guò)擬合。
2、格式內(nèi)容清洗
一般情況下,數(shù)據(jù)是由用戶(hù)/訪(fǎng)客產(chǎn)生的,也就有很大的可能性存在格式和內(nèi)容上不一致的情況,所以在進(jìn)行模型構(gòu)建之前需要先進(jìn)行數(shù)據(jù)的格式內(nèi)容清洗操作。格式內(nèi)容問(wèn)題主要有以下幾類(lèi):
- 時(shí)間、日期、數(shù)值、半全角等顯示格式不一致:直接將數(shù)據(jù)轉(zhuǎn)換為一類(lèi)格式即可,該問(wèn)題一般出現(xiàn)在多個(gè)數(shù)據(jù)源整合的情況下。
- 內(nèi)容中有不該存在的字符:最典型的就是在頭部、中間、尾部的空格等問(wèn)題,這種情況下,需要以半自動(dòng)校驗(yàn)加半人工方式來(lái)找出問(wèn)題,并去除不需要的字符。
- 內(nèi)容與該字段應(yīng)有的內(nèi)容不符:比如姓名寫(xiě)成了性別、身份證號(hào)寫(xiě)成手機(jī)號(hào)等問(wèn)題。
3、邏輯錯(cuò)誤清洗
主要是通過(guò)簡(jiǎn)單的邏輯推理發(fā)現(xiàn)數(shù)據(jù)中的問(wèn)題數(shù)據(jù),防止分析結(jié)果走偏,主要包含以下幾個(gè)步驟:
- 數(shù)據(jù)去重
- 去除/替換不合理的值
- 去除/重構(gòu)不可靠的字段值(修改矛盾的內(nèi)容)
4、去除不需要的數(shù)據(jù)
一般情況下,我們會(huì)盡可能多的收集數(shù)據(jù),但是不是所有的字段數(shù)據(jù)都是可以應(yīng)用到模型構(gòu)建過(guò)程的,也不是說(shuō)將所有的字段屬性都放到構(gòu)建模型中,最終模型的效果就一定會(huì)好,實(shí)際上來(lái)講,字段屬性越多,模型的構(gòu)建就會(huì)越慢,所以有時(shí)候可以考慮將不要的字段進(jìn)行刪除操作。在進(jìn)行該過(guò)程的時(shí)候,要注意備份原始數(shù)據(jù)。
5、關(guān)聯(lián)性驗(yàn)證
如果數(shù)據(jù)有多個(gè)來(lái)源,那么有必要進(jìn)行關(guān)聯(lián)性驗(yàn)證,該過(guò)程常應(yīng)用到多數(shù)據(jù)源合并的過(guò)程中,通過(guò)驗(yàn)證數(shù)據(jù)之間的關(guān)聯(lián)性來(lái)選擇比較正確的特征屬性,比如:汽車(chē)的線(xiàn)下購(gòu)買(mǎi)信息和電話(huà)客服問(wèn)卷信息,兩者之間可以通過(guò)姓名和手機(jī)號(hào)進(jìn)行關(guān)聯(lián)操作,匹配兩者之間的車(chē)輛信息是否是同一輛,如果不是,那么就需要進(jìn)行數(shù)據(jù)調(diào)整。
特征工程 - 數(shù)據(jù)不平衡
PS:工作中可能遇到的最大的問(wèn)題是數(shù)據(jù)不均衡。
怎么去解決的? 上采樣、下采樣、SMOTE算法。
解決的效果如何? 有一點(diǎn)點(diǎn)改進(jìn),但不是很大。
事實(shí)上確實(shí)如此,很多時(shí)候即使用了上述算法對(duì)采樣的數(shù)據(jù)進(jìn)行改進(jìn),但是結(jié)果反而可能更差。在業(yè)界中,對(duì)數(shù)據(jù)不均衡問(wèn)題的處理確實(shí)是一件比較頭疼的問(wèn)題。最好的處理方法還是:盡可能去獲得更多的那些類(lèi)別比較少的數(shù)據(jù)。
數(shù)據(jù)不平衡概念
在實(shí)際應(yīng)用中,數(shù)據(jù)往往分布得非常不均勻,也就是會(huì)出現(xiàn)“長(zhǎng)尾現(xiàn)象”,即:絕大多數(shù)的數(shù)據(jù)在一個(gè)范圍/屬于一個(gè)類(lèi)別,而在另外一個(gè)范圍或者另外一個(gè)類(lèi)別中,只有很少的一部分?jǐn)?shù)據(jù)。那么這個(gè)時(shí)候直接使用機(jī)器學(xué)習(xí)可能效果會(huì)不太少,所以這個(gè)時(shí)候需要我們進(jìn)行一系列的轉(zhuǎn)換操作。
而在采樣過(guò)程中修改樣本的權(quán)重,一般做的比較少。
數(shù)據(jù)不平衡解決方案一
設(shè)置損失函數(shù)的權(quán)重,使得少數(shù)類(lèi)別數(shù)據(jù)判斷錯(cuò)誤的損失大于多數(shù)類(lèi)別數(shù)據(jù)判斷錯(cuò)誤的損失,即當(dāng)我們的少數(shù)類(lèi)別數(shù)據(jù)預(yù)測(cè)錯(cuò)誤的時(shí)候,會(huì)產(chǎn)生一個(gè)比較大的損失值,從而導(dǎo)致模型參數(shù)往讓少數(shù)類(lèi)別數(shù)據(jù)預(yù)測(cè)準(zhǔn)確的方向偏。可以通過(guò)scikit-learn中的class_weight參數(shù)來(lái)設(shè)置權(quán)重。
數(shù)據(jù)不平衡解決方案二
下采樣/欠采樣(under sampling):從多數(shù)類(lèi)中隨機(jī)抽取樣本從而減少多數(shù)類(lèi)別樣本數(shù)據(jù),使數(shù)據(jù)達(dá)到平衡的方式。
PS:比如本來(lái)樣本正負(fù)例的比例是100:1,一般使用下采樣將數(shù)據(jù)比例控制到4:1就是極限了。如果強(qiáng)行將正負(fù)例的比例控制到1:1,會(huì)損失很多樣本的特性,使得模型效果還不如100:1的訓(xùn)練結(jié)果。
集成下采樣/欠采樣:采用普通的下采樣方式會(huì)導(dǎo)致信息丟失,所以一般采用集成學(xué)習(xí)和下采樣結(jié)合的方式來(lái)解決這個(gè)問(wèn)題;主要有兩種方式:
1、EasyEnsemble
采用不放回的數(shù)據(jù)抽取方式抽取多數(shù)類(lèi)別樣本數(shù)據(jù),然后將抽取出來(lái)的數(shù)據(jù)和少數(shù)類(lèi)別數(shù)據(jù)組合訓(xùn)練一個(gè)模型;多次進(jìn)行這樣的操作,從而構(gòu)建多個(gè)模型,然后使用多個(gè)模型共同決策/預(yù)測(cè)。
2、BalanceCascade
利用Boosting這種增量思想來(lái)訓(xùn)練模型;先通過(guò)下采樣產(chǎn)生訓(xùn)練集,然后使用Adaboost算法訓(xùn)練一個(gè)分類(lèi)器;然后使用該分類(lèi)器多對(duì)所有的大眾樣本數(shù)據(jù)進(jìn)行預(yù)測(cè),并將預(yù)測(cè)正確的樣本從大眾樣本數(shù)據(jù)中刪除;重復(fù)迭代上述兩個(gè)操作,直到大眾樣本數(shù)據(jù)量等于小眾樣本數(shù)據(jù)量。
擴(kuò)展一個(gè)技巧:
如果參加一個(gè)比賽,我們會(huì)在模型訓(xùn)練的時(shí)候?qū)?shù)據(jù)分成訓(xùn)練集和開(kāi)發(fā)集。模型提交后,比賽方會(huì)提供測(cè)試集對(duì)結(jié)果進(jìn)行預(yù)測(cè)。
一般來(lái)說(shuō)我們訓(xùn)練集上的模型評(píng)分會(huì)在86 ~ 88%左右,開(kāi)發(fā)集上的評(píng)分為82 ~ 84%,但是到了實(shí)際的測(cè)試集上,模型評(píng)分可能只有72%左右。
技巧來(lái)了:
1、一般來(lái)說(shuō)測(cè)試集的數(shù)據(jù)是不帶標(biāo)簽的,但是測(cè)試集依然有特征X。
2、我們都不考慮訓(xùn)練集和測(cè)試集的目標(biāo)Y,人為創(chuàng)建一列目標(biāo)值Z,將訓(xùn)練集中的Z都設(shè)為0,將測(cè)試集的目標(biāo)Z都設(shè)為1。
3、尋找測(cè)試集的X和Z之間的映射。
4、根據(jù)這個(gè)X和Z之間的映射,使用訓(xùn)練集中的X預(yù)測(cè)Z,結(jié)果肯定是組0,1向量。
5、將預(yù)測(cè)值為1的數(shù)據(jù)提出來(lái),作為我的開(kāi)發(fā)集(用來(lái)驗(yàn)證我們模型的數(shù)據(jù)集合),剩下預(yù)測(cè)為0的數(shù)據(jù)作為訓(xùn)練集。在這個(gè)基礎(chǔ)上對(duì)我的訓(xùn)練數(shù)據(jù)進(jìn)行調(diào)優(yōu)。
這是一個(gè)在不做任何特征的情況下對(duì)模型調(diào)優(yōu)的一個(gè)技巧,一般可以將模型在真實(shí)環(huán)境中的評(píng)分提高一點(diǎn)點(diǎn)。大概72%提高到74%左右。
為什么?實(shí)際上我們做訓(xùn)練的目的是為了找一找比賽中人家提供給我們的訓(xùn)練數(shù)據(jù)和真實(shí)數(shù)據(jù),哪些長(zhǎng)得比較像。將更像真實(shí)測(cè)試數(shù)據(jù)的樣本放到開(kāi)發(fā)集中作為調(diào)參的標(biāo)準(zhǔn),從而能夠提高最終的評(píng)分。雖然沒(méi)有什么科學(xué)依據(jù),但是確實(shí)比較有效,不登大雅之堂。
數(shù)據(jù)不平衡解決方案三
Edited Nearest Neighbor(ENN): 對(duì)于多數(shù)類(lèi)別樣本數(shù)據(jù)而言,如果這個(gè)樣本的大部分k近鄰樣本都和自身類(lèi)別不一樣,那我們就將其刪除,然后使用刪除后的數(shù)據(jù)訓(xùn)練模型。
數(shù)據(jù)不平衡解決方案四
Repeated Edited Nearest Neighbor(RENN): 對(duì)于多數(shù)類(lèi)別樣本數(shù)據(jù)而言,如果這個(gè)樣本的大部分k近鄰樣本都和自身類(lèi)別不一樣,那我們就將其刪除;重復(fù)性的進(jìn)行上述的刪除操作,直到數(shù)據(jù)集無(wú)法再被刪除后,使用此時(shí)的數(shù)據(jù)集據(jù)訓(xùn)練模型。
數(shù)據(jù)不平衡解決方案五
Tomek Link Removal: 如果兩個(gè)不同類(lèi)別的樣本,它們的最近鄰都是對(duì)方,也就是A的最近鄰是B,B的最近鄰也是A,那么A、B就是Tomek Link。將所有Tomek Link中多數(shù)類(lèi)別的樣本刪除。然后使用刪除后的樣本來(lái)訓(xùn)練模型。
上面是對(duì)多數(shù)樣本進(jìn)行刪除,下面是對(duì)少數(shù)樣本進(jìn)行增加
數(shù)據(jù)不平衡解決方案六
過(guò)采樣/上采樣(Over Sampling):和欠采樣采用同樣的原理,通過(guò)抽樣來(lái)增加少數(shù)樣本的數(shù)目,從而達(dá)到數(shù)據(jù)平衡的目的。一種簡(jiǎn)單的方式就是通過(guò)有放回抽樣,不斷的從少數(shù)類(lèi)別樣本數(shù)據(jù)中抽取樣本,然后使用抽取樣本+原始數(shù)據(jù)組成訓(xùn)練數(shù)據(jù)集來(lái)訓(xùn)練模型;不過(guò)該方式比較容易導(dǎo)致過(guò)擬合一般抽樣樣本不要超過(guò)50%。
過(guò)采樣/上采樣(Over Sampling):因?yàn)樵谏喜蓸舆^(guò)程中,是進(jìn)行是隨機(jī)有放回的抽樣,所以最終模型中,數(shù)據(jù)其實(shí)是相當(dāng)于存在一定的重復(fù)數(shù)據(jù),為了防止這個(gè)重復(fù)數(shù)據(jù)導(dǎo)致的問(wèn)題,我們可以加入一定的隨機(jī)性,也就是說(shuō):在抽取數(shù)據(jù)后,對(duì)數(shù)據(jù)的各個(gè)維度可以進(jìn)行隨機(jī)的小范圍變動(dòng),eg: (1,2,3) --> (1.01, 1.99, 3);通過(guò)該方式可以相對(duì)比較容易的降低上采樣導(dǎo)致的過(guò)擬合問(wèn)題。
數(shù)據(jù)不平衡解決方案七
采用數(shù)據(jù)合成的方式生成更多的樣本,該方式在小數(shù)據(jù)集場(chǎng)景下具有比較成功的案例。常見(jiàn)算法是SMOTE算法,該算法利用小眾樣本在特征空間的相似性來(lái)生成新樣本。
比如:給少數(shù)樣本編號(hào),1~100;將1、2樣本連起來(lái),取他們的中點(diǎn)(期望),作為一個(gè)新的樣本。以此類(lèi)推,最后可以新生成50個(gè)樣本。用這種算法一次可以提高50%的樣本量。
數(shù)據(jù)不平衡解決方案八
對(duì)于正負(fù)樣本極不平衡的情況下,其實(shí)可以換一種思路/角度來(lái)看待這個(gè)問(wèn)題:可以將其看成一分類(lèi)(One Class Learning)或者異常檢測(cè)(Novelty Detection)問(wèn)題,在這類(lèi)算法應(yīng)用中主要就是對(duì)于其中一個(gè)類(lèi)別進(jìn)行建模,然后對(duì)所有不屬于這個(gè)類(lèi)別特征的數(shù)據(jù)就認(rèn)為是異常數(shù)據(jù),經(jīng)典算法包括:One Class SVM、IsolationForest等。
特征工程 - 特征轉(zhuǎn)換 - 文本特征屬性轉(zhuǎn)換
特征轉(zhuǎn)換主要指將原始數(shù)據(jù)中的字段數(shù)據(jù)進(jìn)行轉(zhuǎn)換操作,從而得到適合進(jìn)行算法模型構(gòu)建的輸入數(shù)據(jù)(數(shù)值型數(shù)據(jù)),在這個(gè)過(guò)程中主要包括但不限于以下幾種數(shù)據(jù)的處理:
- 文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù)
- 缺省值填充
- 定性特征屬性啞編碼
- 定量特征屬性二值化
- 特征標(biāo)準(zhǔn)化與歸一化
機(jī)器學(xué)習(xí)的模型算法均要求輸入的數(shù)據(jù)必須是數(shù)值型的,所以對(duì)于文本類(lèi)型的特征屬性,需要進(jìn)行文本數(shù)據(jù)轉(zhuǎn)換,也就是需要將文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù)。常用方式如下:
- 詞袋法(BOW/TF)
- TF-IDF(Term frequency-inverse document frequency)
- HashTF
詞袋法
詞袋法(Bag of words,BOW)是最早應(yīng)用于NLP和IR領(lǐng)域的一種文本處理模型,該模型忽略文本的語(yǔ)法和語(yǔ)序,用一組無(wú)序的單詞(words)來(lái)表達(dá)一段文字或者一個(gè)文檔,詞袋法中使用單詞在文檔中出現(xiàn)的次數(shù)(頻數(shù))來(lái)表示文檔。
詞集法
詞集法(Set of words,SOW)是詞袋法的一種變種,應(yīng)用的比較多,和詞袋法的原理一樣,是以文檔中的單詞來(lái)表示文檔的一種的模型,區(qū)別在于:詞袋法使用的是單詞的頻數(shù),而在詞集法中使用的是單詞是否出現(xiàn),如果出現(xiàn)賦值為1,否則為0。
TF-IDF
在詞袋法或者詞集法中,使用的是單詞的詞頻或者是否存在來(lái)進(jìn)行表示文檔特征,但是不同的單詞在不同文檔中出現(xiàn)的次數(shù)不同,而且有些單詞僅僅在某一些文檔中出現(xiàn)(例如專(zhuān)業(yè)名稱(chēng)等等),也就是說(shuō)不同單詞對(duì)于文本而言具有不同的重要性,那么,如何評(píng)估一個(gè)單詞對(duì)于一個(gè)文本的重要性呢?
單詞的重要性隨著它在文本中出現(xiàn)的次數(shù)成正比增加,也就是單詞的出現(xiàn)次數(shù)越多,該單詞對(duì)于文本的重要性就越高。同時(shí)單詞的重要性會(huì)隨著在語(yǔ)料庫(kù)中出現(xiàn)的頻率成反比下降,也就是單詞在語(yǔ)料庫(kù)中出現(xiàn)的頻率越高,表示該單詞與常見(jiàn),也就是該單詞對(duì)于文本的重要性越低。
TF-IDF(Item frequency-inverse document frequency)是一種常用的用于信息檢索與數(shù)據(jù)挖掘的常用加權(quán)技術(shù),TF的意思是詞頻(Item Frequency),IDF的意思是逆向文件頻率(Inverse Document Frequency)。TF-IDF可以反映語(yǔ)料中單詞對(duì)文檔/文本的重要程度。
假設(shè)單詞用t表示,文檔用d表示,語(yǔ)料庫(kù)用D表示,那么N(t,D)表示包含單詞t的文檔數(shù)量,|D|表示文檔數(shù)量,|d|表示文檔d中的所有單詞數(shù)量。N(t,d)表示在文檔d中單詞t出現(xiàn)的次數(shù)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
TF-IDF除了使用默認(rèn)的tf和idf公式外,tf和idf公式還可以使用一些擴(kuò)展之后公式來(lái)進(jìn)行指標(biāo)的計(jì)算,常用的公式有:
有兩個(gè)文檔,單詞統(tǒng)計(jì)如下,請(qǐng)分別計(jì)算各個(gè)單詞在文檔中的TF-IDF值以及這些文檔使用單詞表示的特征向量。
HashTF-IDF
不管是前面的詞袋法還是TF-IDF,都避免不了計(jì)算文檔中單詞的詞頻,當(dāng)文檔數(shù)量比較少、單詞數(shù)量比較少的時(shí)候,我們的計(jì)算量不會(huì)太大,但是當(dāng)這個(gè)數(shù)量上升到一定程度的時(shí)候,程序的計(jì)算效率就會(huì)降低下去,這個(gè)時(shí)候可以通過(guò)HashTF的形式來(lái)解決該問(wèn)題。
HashTF的計(jì)算規(guī)則是:在計(jì)算過(guò)程中,不計(jì)算詞頻,而是計(jì)算單詞進(jìn)行hash后的hash值的數(shù)量(有的模型中可能存在正則化操作)。
HashTF的特點(diǎn):運(yùn)行速度快,但是無(wú)法獲取高頻詞,有可能存在單詞碰撞問(wèn)題(hash值一樣)。
Scikit-learn中進(jìn)行文本特征提取
在Scikit-learn中,對(duì)于文本數(shù)據(jù)主要提供了三種方式將文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值型的特征向量,同時(shí)提供了一種對(duì)TF-IDF公式改版的公式。所有的轉(zhuǎn)換方式均位于模塊:sklearn.feature_extraction.text。
| 名稱(chēng) | 描述 |
| CountVectorizer | 以詞袋法的形式表示文檔 |
| HashingVectorizer | 以HashingTF的模型來(lái)表示文檔的特征向量 |
| TfidfVectorizer | 以TF-IDF的模型來(lái)表示文檔的特征向量,等價(jià)于先做CountVectorizer,然后做TfidfTransformer轉(zhuǎn)換操作的結(jié)果 |
| TfidfTransformer | 使用改進(jìn)的TF-IDF公式對(duì)文檔的特征向量矩陣(數(shù)值型的)進(jìn)行重計(jì)算的操作,TFIDF=TF*(IDF+1)。備注:該轉(zhuǎn)換常應(yīng)用到CountVectorizer或者HashingVectorizer之后 |
Scikit-learn中進(jìn)行缺省值填充
對(duì)于缺省的數(shù)據(jù),在處理之前一定需要進(jìn)行預(yù)處理操作,一般采用中位數(shù)、均值或者眾數(shù)來(lái)進(jìn)行填充,在Scikit-learn中主要通過(guò)Imputer類(lèi)來(lái)實(shí)現(xiàn)對(duì)缺省值的填充。
案例:
啞編碼
啞編碼(OneHotEncoder):對(duì)于定性的數(shù)據(jù)(也就是分類(lèi)的數(shù)據(jù)),可以采用N位的狀態(tài)寄存器來(lái)對(duì)N個(gè)狀態(tài)進(jìn)行編碼,每個(gè)狀態(tài)都有一個(gè)獨(dú)立的寄存器位,并且在任意狀態(tài)下只有一位有效。啞編碼是一種常用的將特征數(shù)字化的方式。比如有一個(gè)特征屬性:[‘male’,‘female’],那么male使用向量[1,0]表示,female使用[0,1]表示。
?
二值化
二值化(Binarizer):對(duì)于定量的數(shù)據(jù)根據(jù)給定的閾值,將其進(jìn)行轉(zhuǎn)換,如果大于閾值,那么賦值為1;否則賦值為0。
標(biāo)準(zhǔn)化
標(biāo)準(zhǔn)化:基于特征屬性的數(shù)據(jù)(也就是特征矩陣的列),獲取均值和方差,然后將特征值轉(zhuǎn)換至服從標(biāo)準(zhǔn)正態(tài)分布。計(jì)算公式如下:
區(qū)間縮放法
區(qū)間縮放法:是指按照數(shù)據(jù)的方差特性對(duì)數(shù)據(jù)進(jìn)行縮放操作,將數(shù)據(jù)縮放到給定區(qū)間上,常用的計(jì)算方式如下。
歸一化
歸一化:和標(biāo)準(zhǔn)化不同,歸一化是基于矩陣的行進(jìn)行數(shù)據(jù)處理,其目的是將矩陣的行均轉(zhuǎn)換為“單位向量”,l2規(guī)則轉(zhuǎn)換公式如下:
標(biāo)準(zhǔn)化、區(qū)間縮放法(歸一化)、正則化
有的書(shū)把區(qū)間縮放說(shuō)為歸一化,歸一化說(shuō)為正則化
標(biāo)準(zhǔn)化的目的是為了降低不同特征的不同范圍的取值對(duì)于模型訓(xùn)練的影響;比如對(duì)于同一個(gè)特征,不同的樣本的取值可能會(huì)相差的非常大,那么這個(gè)時(shí)候一些異常小或者異常大的數(shù)據(jù)可能會(huì)誤導(dǎo)模型的正確率;另外如果數(shù)據(jù)在不同特征上的取值范圍相差很大,那么也有可能導(dǎo)致最終訓(xùn)練出來(lái)的模型偏向于取值范圍大的特征,特別是在使用梯度下降求解的算法中;通過(guò)改變數(shù)據(jù)的分布特征,具有以下兩個(gè)好處:1. 提高迭代求解的收斂速度;2. 提高迭代求解的精度。
?
歸一化 對(duì)于不同特征維度的伸縮變換的主要目的是為了使得不同維度度量之間特征具有可比性,同時(shí)不改變?cè)紨?shù)據(jù)的分布(相同特性的特征轉(zhuǎn)換后,還是具有相同特性)。和標(biāo)準(zhǔn)化一樣,也屬于一種無(wú)量綱化的操作方式。
正則化 則是通過(guò)范數(shù)規(guī)則來(lái)約束特征屬性,通過(guò)正則化我們可以降低數(shù)據(jù)訓(xùn)練的模型的過(guò)擬合可能,和之前在機(jī)器學(xué)習(xí)中所講述的L1、L2正則的效果一樣。
備注:廣義上來(lái)講,標(biāo)準(zhǔn)化、區(qū)間縮放法、正則化都是具有類(lèi)似的功能。在有一些書(shū)籍上,將標(biāo)準(zhǔn)化、區(qū)間縮放法統(tǒng)稱(chēng)為標(biāo)準(zhǔn)化,把正則化稱(chēng)為歸一化操作。
PS:如果面試有人問(wèn)標(biāo)準(zhǔn)化和歸一化的區(qū)別:標(biāo)準(zhǔn)化會(huì)改變數(shù)據(jù)的分布情況,歸一化不會(huì),標(biāo)準(zhǔn)化的主要作用是提高迭代速度,降低不同維度之間影響權(quán)重不一致的問(wèn)題。
數(shù)據(jù)多項(xiàng)式擴(kuò)充變換
多項(xiàng)式數(shù)據(jù)變換主要是指基于輸入的特征數(shù)據(jù)按照既定的多項(xiàng)式規(guī)則構(gòu)建更多的輸出特征屬性,比如輸入特征屬性為[a,b],當(dāng)設(shè)置degree為2的時(shí)候,那么輸出的多項(xiàng)式特征為?
?
GBDT/RF+LR
認(rèn)為每個(gè)樣本在決策樹(shù)落在決策樹(shù)的每個(gè)葉子上就表示屬于一個(gè)類(lèi)別,那么我們可以進(jìn)行基于GBDT或者隨機(jī)森林的維度擴(kuò)展,經(jīng)常我們會(huì)將其應(yīng)用在GBDT將數(shù)據(jù)進(jìn)行維度擴(kuò)充,然后使用LR進(jìn)行數(shù)據(jù)預(yù)測(cè),這也是我們進(jìn)行所說(shuō)的GBDT+LR做預(yù)測(cè)。
先通過(guò)GBDT,將原來(lái)樣本中的維度進(jìn)行擴(kuò)展,然后將新生成的特征放到邏輯回歸或線(xiàn)性回歸中進(jìn)行模型構(gòu)建。
特征選擇
當(dāng)做完特征轉(zhuǎn)換后,實(shí)際上可能會(huì)存在很多的特征屬性,比如:多項(xiàng)式擴(kuò)展轉(zhuǎn)換、文本數(shù)據(jù)轉(zhuǎn)換等等,但是太多的特征屬性的存在可能會(huì)導(dǎo)致模型構(gòu)建效率降低,同時(shí)模型的效果有可能會(huì)變的不好,那么這個(gè)時(shí)候就需要從這些特征屬性中選擇出影響最大的特征屬性作為最后構(gòu)建模型的特征屬性列表。
在選擇模型的過(guò)程中,通常從兩方面來(lái)選擇特征:
- 特征是否發(fā)散:如果一個(gè)特征不發(fā)散,比如方差解決于0,也就是說(shuō)這樣的特征對(duì)于樣本的區(qū)分沒(méi)有什么作用
- 特征與目標(biāo)的相關(guān)性:如果與目標(biāo)相關(guān)性比較高,應(yīng)當(dāng)優(yōu)先選擇
特征選擇的方法主要有以下三種:
- Filter:過(guò)濾法,按照發(fā)散性或者相關(guān)性對(duì)各個(gè)特征進(jìn)行評(píng)分,設(shè)定閾值或者待選擇閾值的個(gè)數(shù),從而選擇特征;常用方法包括方差選擇法、相關(guān)系數(shù)法、卡方檢驗(yàn)、互信息法等
- Wrapper:包裝法,根據(jù)目標(biāo)函數(shù)(通常是預(yù)測(cè)效果評(píng)分),每次選擇若干特征或者排除若干特征;常用方法主要是遞歸特征消除法
- Embedded:嵌入法,先使用某些機(jī)器學(xué)習(xí)的算法和模型進(jìn)行訓(xùn)練,得到各個(gè)特征的權(quán)重系數(shù),根據(jù)系數(shù)從大到小選擇特征;常用方法主要是基于懲罰項(xiàng)的特征選擇法
方差選擇法
先計(jì)算各個(gè)特征屬性的方差值,然后根據(jù)閾值,獲取方差大于閾值的特征。
相關(guān)系數(shù)法
先計(jì)算各個(gè)特征屬性對(duì)于目標(biāo)值的相關(guān)系數(shù)以及相關(guān)系數(shù)的P值,然后獲取大于閾值的特征屬性。
卡方檢驗(yàn)
檢查定性自變量對(duì)定性因變量的相關(guān)性:
遞歸特征消除法
使用一個(gè)基模型來(lái)進(jìn)行多輪訓(xùn)練,每輪訓(xùn)練后,消除若干權(quán)值系數(shù)的特征,再基于新的特征集進(jìn)行下一輪訓(xùn)練。
基于懲罰項(xiàng)的特征選擇法
在使用懲罰項(xiàng)的基模型,除了可以篩選出特征外,同時(shí)還可以進(jìn)行降維操作。
基于樹(shù)模型的特征選擇法
樹(shù)模型中GBDT在構(gòu)建的過(guò)程會(huì)對(duì)特征屬性進(jìn)行權(quán)重的給定,所以GBDT也可以應(yīng)用在基模型中進(jìn)行特征選擇。
特征選取/降維
當(dāng)特征選擇完成后,可以直接可以進(jìn)行訓(xùn)練模型了,但是可能由于特征矩陣過(guò)大,導(dǎo)致計(jì)算量比較大,訓(xùn)練時(shí)間長(zhǎng)的問(wèn)題,因此降低特征矩陣維度也是必不可少的。常見(jiàn)的降維方法除了基于L1的懲罰模型外,還有主成分析法(PCA)和線(xiàn)性判別分析法(LDA),這兩種方法的本質(zhì)都是將原始數(shù)據(jù)映射到維度更低的樣本空間中,但是采用的方式不同,PCA是為了讓映射后的樣本具有更大的發(fā)散性,LDA是為了讓映射后的樣本有最好的分類(lèi)性能。
主成分分析(PCA)
將高維的特征向量合并成為低維度的特征屬性,是一種無(wú)監(jiān)督的降維方法。
- 二維到一維降維
- 多維情況—協(xié)方差矩陣:
線(xiàn)性判別分析(LDA)
LDA是一種基于分類(lèi)模型進(jìn)行特征屬性合并的操作,是一種有監(jiān)督的降維方法。
異常數(shù)據(jù)處理
缺省值是數(shù)據(jù)中最常見(jiàn)的一個(gè)問(wèn)題,處理缺省值有很多方式,主要包括以下四個(gè)步驟進(jìn)行缺省值處理:
1、確定缺省值范圍。
2、去除不需要的字段。
3、填充缺省值內(nèi)容。
4、重新獲取數(shù)據(jù)。
注意:最重要的是缺省值內(nèi)容填充。
一、確定缺省值范圍
在進(jìn)行確定缺省值范圍的時(shí)候,對(duì)每個(gè)字段都計(jì)算其缺失比例,然后按照缺失比例和字段重要性分別指定不同的策略。
二、去除不需要的字段
在進(jìn)行去除不需要的字段的時(shí)候,需要注意的是:刪除操作最好不要直接操作與原始數(shù)據(jù)上,最好的是抽取部分?jǐn)?shù)據(jù)進(jìn)行刪除字段后的模型構(gòu)建,查看模型效果,如果效果不錯(cuò),那么再到全量數(shù)據(jù)上進(jìn)行刪除字段操作??偠灾?#xff1a;該過(guò)程簡(jiǎn)單但是必須慎用,不過(guò)一般效果不錯(cuò),刪除一些丟失率高以及重要性低的數(shù)據(jù)可以降低模型的訓(xùn)練復(fù)雜度,同時(shí)又不會(huì)降低模型的效果。
三、填充缺省值內(nèi)容
填充缺省值內(nèi)容是一個(gè)比較重要的過(guò)程,也是我們常用的一種缺省值解決方案,一般采用下面幾種方式進(jìn)行數(shù)據(jù)的填充:
1、以業(yè)務(wù)知識(shí)或經(jīng)驗(yàn)推測(cè)填充缺省值。
2、以同一字段指標(biāo)的計(jì)算結(jié)果(均值、中位數(shù)、眾數(shù)等)填充缺省值。
3、以不同字段指標(biāo)的計(jì)算結(jié)果來(lái)推測(cè)性的填充缺省值,比如通過(guò)身份證號(hào)碼計(jì)算年齡、通過(guò)收貨地址來(lái)推測(cè)家庭住址、通過(guò)訪(fǎng)問(wèn)的IP地址來(lái)推測(cè)家庭/公司/學(xué)校的家。
四、重新獲取數(shù)據(jù)
如果某些指標(biāo)非常重要,但是缺失率有比較高,而且通過(guò)其它字段沒(méi)法比較精準(zhǔn)的計(jì)算出指標(biāo)值的情況下,那么就需要和數(shù)據(jù)產(chǎn)生方(業(yè)務(wù)人員、數(shù)據(jù)收集人員等)溝通協(xié)商,是否可以通過(guò)其它的渠道獲取相關(guān)的數(shù)據(jù),也就是進(jìn)行重新獲取數(shù)據(jù)的操作。
scikit中通過(guò)Imputer類(lèi)實(shí)現(xiàn)缺省值的填充
對(duì)于缺省的數(shù)據(jù),在處理之前一定需要進(jìn)行預(yù)處理操作,一般采用中位數(shù)、均值或者眾數(shù)來(lái)進(jìn)行填充,在scikit中主要通過(guò)Imputer類(lèi)來(lái)實(shí)現(xiàn)對(duì)缺省值的填充。
如m行n列 axis = 0 對(duì)第0個(gè)位置進(jìn)行填充, 即對(duì)m進(jìn)行填充,保持n不變。
按列進(jìn)行填充
axis = 1 對(duì)第1個(gè)位置進(jìn)行填充, 即對(duì)n進(jìn)行填充,保持m不變。
按行進(jìn)行填充
思考:按行填充好,還是按列填充好?
當(dāng)然是按列填充好。 因?yàn)槊苛斜硎镜亩际菍傩?#xff0c;我要填充,自然需要和同一個(gè)屬性?xún)?nèi)的各個(gè)值進(jìn)行對(duì)比。如果按行填充,那么一個(gè)身高,一個(gè)體重的值,我們?cè)趺捶治龆疾恢涝撎畛涫裁础?/p>
六、自然語(yǔ)言處理
分詞是指將文本數(shù)據(jù)轉(zhuǎn)換為一個(gè)一個(gè)的單詞,是NLP自然語(yǔ)言處理過(guò)程中的基礎(chǔ);因?yàn)閷?duì)于文本信息來(lái)講,我們可以認(rèn)為文本中的單詞可以體現(xiàn)文本的特征信息,所以在進(jìn)行自然語(yǔ)言相關(guān)的機(jī)器學(xué)習(xí)的時(shí)候,第一操作就是需要將文本信息轉(zhuǎn)換為單詞序列,使用單詞序列來(lái)表達(dá)文本的特征信息。
分詞: 通過(guò)某種技術(shù)將連續(xù)的文本分隔成更具有語(yǔ)言語(yǔ)義學(xué)上意義的詞。這個(gè)過(guò)程就叫做分詞。
- 自然語(yǔ)言處理:即實(shí)現(xiàn)人機(jī)間自然語(yǔ)言通信,或?qū)崿F(xiàn)自然語(yǔ)言理解和自然語(yǔ)言生成。
- 主要技術(shù):漢字詞法分析、句法分析、語(yǔ)義分析、文本生成、語(yǔ)言識(shí)別。
- 應(yīng)用場(chǎng)景:文本分類(lèi)和聚類(lèi)、信息檢索和過(guò)濾、機(jī)器翻譯。
- Python中漢字分詞包:jieba,Python開(kāi)發(fā)的中文分詞模塊。
- 分詞:來(lái)把連續(xù)的漢字分隔成更具有語(yǔ)言語(yǔ)義學(xué)上意義的詞。這個(gè)過(guò)程就叫做分詞。
- 分詞的常見(jiàn)方法:
Jieba分詞
jieba:中文分詞模塊;
Python中漢字分詞包:jieba
安裝方式: pip install jieba
Github:https://github.com/fxsjy/jieba
Jieba分詞原理
- 字符串匹配:把漢字串與詞典中的詞條進(jìn)行匹配,識(shí)別出一個(gè)詞
- 理解分詞法:通過(guò)分詞子系統(tǒng)、句法語(yǔ)義子系統(tǒng)、總控部分來(lái)模擬人對(duì)句子的理解
- 統(tǒng)計(jì)分詞法:建立大規(guī)模語(yǔ)料庫(kù),通過(guò)隱馬爾可夫模型或其他模型訓(xùn)練,進(jìn)行分詞
Jieba分詞使用
- jieba分詞模式:全模式:jieba.cut(str,cut_all=True),精確模式:jieba.cut(str),搜索引擎模式:jieba.cut_for_search(str)
- 分詞特征提取:返回TF/IDF權(quán)重最大的關(guān)鍵詞,默認(rèn)返回20個(gè),jieba.analyse.extract_tags(str,topK=20)
- 自定義詞典:幫助切分一些無(wú)法識(shí)別的新詞,加載詞典jieba.load_userdict(‘dict.txt’)
- 調(diào)整詞典:add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中動(dòng)態(tài)修改詞典。使用 suggest_freq(segment, tune=True) 可調(diào)節(jié)單個(gè)詞語(yǔ)的詞頻
https://www.jianshu.com/p/9332b04e06d3
總結(jié)
- 上一篇: 元胞自动机基本概念
- 下一篇: ffmpeg系列之编译安卓版ffmpeg