這篇文章我將從兩個(gè)方面寫一些機(jī)器學(xué)習(xí)模型的事項(xiàng),一是如何從真實(shí)數(shù)據(jù)中抽取數(shù)據(jù)集蜗细,二是如何從數(shù)據(jù)集構(gòu)建機(jī)器學(xué)習(xí)模型怒详。因?yàn)榈谝徊糠制蚬I(yè)應(yīng)用昆烁,我們先從第二部分開始。內(nèi)容比較多白粉,大概要好幾篇文章才能寫完吧(╯‵□′)╯︵┻━┻
1.構(gòu)建機(jī)器學(xué)習(xí)模型
我們首先從最常見的Supervised Learning開始鼠渺,之后會(huì)介紹unsupervised Learning及Reinforce Learning算法的一些細(xì)節(jié)。
1.1 數(shù)據(jù)分析(Data Exploration)
一般來(lái)說(shuō)我們提取后的的數(shù)據(jù)集可能并不是像SPAM或者M(jìn)NIST的標(biāo)準(zhǔn)數(shù)據(jù)集鹃祖,我們需要在觀察數(shù)據(jù)的過(guò)程中思考以下幾個(gè)問(wèn)題:
- 數(shù)據(jù)應(yīng)該怎么清洗和處理才是合理的恬口?
- 數(shù)據(jù)中的哪些特征會(huì)對(duì)標(biāo)簽的預(yù)測(cè)有幫助沼侣?
- Balanced Or Unbalanced問(wèn)題?
- 根據(jù)數(shù)據(jù)的類型可以挖掘怎樣的特征?
1.1.1 數(shù)據(jù)預(yù)處理(Data Preprocessing)
(1)首先我們要考慮對(duì)數(shù)據(jù)進(jìn)行分析,因?yàn)閿?shù)據(jù)的特征項(xiàng)可能并不是同一量綱雅潭,甚至不是一種數(shù)據(jù)類型,直接比較可能導(dǎo)致溢出以及分析誤差筛圆。我們主要考慮以下方面:
- 是否要對(duì)特征向量化椿浓,一般除了決策樹這種對(duì)特征不敏感的算法外扳碍,其他大部分都是只能取數(shù)值類型變量,需要進(jìn)行合適的編碼操作碱蒙,常用的有One-hot Encoding(但會(huì)導(dǎo)致Sparse及抹除數(shù)據(jù)相關(guān)性等問(wèn)題)夯巷,哈夫曼編碼(復(fù)雜度問(wèn)題)等趁餐;
- 是否要對(duì)連續(xù)變量進(jìn)行分割,因?yàn)橐恍┤鏜AP等概率算法一般無(wú)法處理連續(xù)變量季惯;
- 是否要考慮數(shù)據(jù)的序數(shù)特性喷面,對(duì)此類數(shù)據(jù)要用有序的編碼方式如rank編碼或序數(shù)編碼惧辈;
- 是否要考慮數(shù)據(jù)的特殊性,如時(shí)間變量念逞,一般可以獨(dú)立地作為核心變量边翁;
(2)在做后續(xù)數(shù)據(jù)處理之前,我的建議是先進(jìn)行數(shù)據(jù)歸一化(Data Nomalization)叨咖,同樣因?yàn)椴煌瑪?shù)據(jù)之間的量綱可能是不同的,先進(jìn)行歸一化可以防止我們?cè)诜治鰯?shù)據(jù)時(shí)意外抹除了一些有效地特征甸各,這里一般會(huì)用maxminmap算法及z-score算法(quantile normalization也有趣倾,不過(guò)不常見)等,前者將特征映射到[-1,+1],后者將特征映射到零均值單位方差的高斯區(qū)間善绎。
這里提一下Normalization的作用:
- 規(guī)范化特征诫尽,保證特征之間可以比較箱锐,這一點(diǎn)可以參考SVM;
- 加速訓(xùn)練過(guò)程及表現(xiàn)Performance浩聋,這一點(diǎn)可以參考反向傳播梯度更新問(wèn)題臊恋,也就是Adam和RMSprop算子的核心抖仅;
- 減少溢出錯(cuò)誤的可能,這一點(diǎn)可以參考C語(yǔ)言等的溢出問(wèn)題环凿,Python因?yàn)槭褂肂lock塊存儲(chǔ)數(shù)據(jù)放吩,這方面的問(wèn)題可能還好一些;
但Normalization也有問(wèn)題到推,比較明顯的是舍入誤差莉测,以及均值信息的移除唧喉。
最后一些分類器如樸素貝葉斯Naive Bayer在做連乘積的過(guò)程中不進(jìn)行Normalization可能會(huì)導(dǎo)致算法失效,不過(guò)算是特例梯找,大部分分類器沒(méi)有這個(gè)問(wèn)題益涧。
(3)由于收集的數(shù)據(jù)不是完美的驯鳖,我們要考慮數(shù)據(jù)是否是滿的(full data set)浅辙,如果數(shù)據(jù)不是滿的,我們就必須要考慮對(duì)數(shù)據(jù)進(jìn)行清洗或者數(shù)據(jù)填充鸽捻。數(shù)據(jù)清洗一般可以選擇直接刪除column不滿的樣本或者不滿的特征族泽腮,優(yōu)點(diǎn)是不會(huì)引入錯(cuò)誤數(shù)據(jù)诊赊,但缺點(diǎn)是造成數(shù)據(jù)丟失,而數(shù)據(jù)填充則可以選擇依據(jù)中值碘箍,均值鲸郊,零以及概率填充等方式保留樣本項(xiàng)秆撮,優(yōu)缺點(diǎn)與前者正好相反。概率填充在決策樹模型比較常用峻黍,而更一般的我們會(huì)選擇保留特征觀察后再考慮填充與運(yùn)用拨匆。
1.1.2 數(shù)據(jù)分析(Data Analysis)
接下來(lái)我們要考慮特征的相關(guān)性(Data Relevance)惭每,低相關(guān)性模型可能是邊緣特征亏栈,也可能是噪聲绒北,我們需要對(duì)這部分特征進(jìn)行分類處理察署。一般來(lái)說(shuō)分析相關(guān)性有以下方法:
a.皮爾遜相關(guān)系數(shù)贴汪,描述了特征與標(biāo)簽的線性相關(guān)性,但是在高次特征可能失效业簿;
b.斯皮爾曼相關(guān)秩阳懂,描述了特征與標(biāo)簽的秩相關(guān)性岩调,比較常用;
c.卡方檢驗(yàn)矾湃,描述特征相關(guān)性堕澄,常用與檢驗(yàn)特征的獨(dú)立性蛙紫;
不過(guò)這三種是理論方法,在現(xiàn)實(shí)應(yīng)用上我們更多用的是特征工程:
總結(jié)一下蒜茴,也就是要移除低方差(low variance)浆西,共線性(cor-linear),難編碼诺核,低相關(guān)(low relevance)及不合理(outlier)的特征窖杀。一般來(lái)說(shuō)常用的有繪制histogram或者coefficient matrix做處理前后的分析。
例如在分析某個(gè)特征的分布常用的hisogram
以及分析變量相關(guān)性的coefficient matrix:
用法很多,建議多嘗試吧,我就不具體舉例了锅风。
1.1.3 數(shù)據(jù)聚合(Data Aggregation)
這里的數(shù)據(jù)組合其實(shí)也就是對(duì)一般的數(shù)據(jù)特征鞍泉,我們可以組合產(chǎn)生高次特征咖驮,這一點(diǎn)可以參考SVM的Kernel方法训枢,對(duì)特征進(jìn)行組合并升維恒界,使得樣本在高維度更容易分類』Ь矗或者對(duì)一些變量進(jìn)行聚合,例如小時(shí)間區(qū)間聚合成大事件區(qū)間。這個(gè)方法有太多的tricks我并不太喜歡搓彻,不過(guò)數(shù)據(jù)集比賽效果似乎很好嘱朽。稍微舉個(gè)栗子:
假設(shè)有樣本:
特征1 特征2
- a t1
- b t2
前者的大意就是生成特征3(at1) 搪泳,特征4(aa),特征5(abb) etc.
后者則是如果t1-t2間隔過(guò)小就把樣本1,2合并,特征去max或者mean都可以靶端。
1.1.4 數(shù)據(jù)擴(kuò)充(Data Boost)
而后我們考慮一下,加入數(shù)據(jù)集不是平衡的脏榆,也就是Balanced Or Unbalanced問(wèn)題须喂。例如大量正樣本趁蕊,少量負(fù)樣本掷伙,我們可以用ROC或者PC圖分析分類器結(jié)果,但很難依據(jù)這些不平衡訓(xùn)練好的分類器卒废,此時(shí)我們可以考慮down-sampling的隨機(jī)采樣或up-sampling的數(shù)據(jù)增強(qiáng)(Data Augmentation)宙地。down-sampling很直接宅粥,而up-sampling可能我再簡(jiǎn)單說(shuō)明一下比較好秽梅。
up-sampling最常用的方式是SMOTE算法(Synthetic Minority Over-sampling Technique),其實(shí)也就是通過(guò)k個(gè)小類的最近鄰用line segments joining產(chǎn)生synthetic的樣本(原諒我沒(méi)想出個(gè)好的翻譯方式[(σ-`д?′)好氣]况鸣。
基本產(chǎn)生也很簡(jiǎn)單 C=aA+(1-a)B镐捧,用滑動(dòng)變量a做不同的k近鄰的trade-off來(lái)產(chǎn)生新的偽樣本臭增,具體可以參考Chawla,Hall,& Kegelmeyer在2002的論文誊抛。但是這個(gè)算法的問(wèn)題是新數(shù)據(jù)只會(huì)在舊樣本內(nèi)部,代表性可能遠(yuǎn)小于舊樣本瞎领,參考SVM的非支持向量九默,因此隨后出現(xiàn)Borderline SMOTE及ADASYN。
另一種則是SPO(Structure Preserving Oversampling)殿遂,這個(gè)我沒(méi)想好怎么解釋墨礁,可能看一下這篇論文比較好:
Structure Preserving Oversampling for Imbalanced Time Series Classification (icdm 2011)
以及Integrated Oversampling for Imbalanced Time Series Classification (TKDE,2013)
最后我們可以做optimal的選擇恩静,也就是數(shù)據(jù)增強(qiáng)(Data augmentation)蹲坷。常用的有以下兩種不同的使用場(chǎng)合:
- 對(duì)文本類的文字特征可以考慮添加語(yǔ)法語(yǔ)義諸如Pos-tagger,Parsing及FOL等擴(kuò)充冠句,我們留到NLP算法再做講解及實(shí)現(xiàn)幸乒;
- 對(duì)圖形的像素特征罕扎,我們可以運(yùn)用包括切割(clip),旋轉(zhuǎn)(rotate)杆查,翻轉(zhuǎn)(reverse)臀蛛,縮放(scale)等方法做數(shù)據(jù)集的擴(kuò)充,具體可以參考:Keras中文文檔(圖片預(yù)處理) 這其實(shí)是因?yàn)樵谧霰荣悤r(shí)數(shù)據(jù)可能并不足夠支撐復(fù)雜模型浊仆,我們用數(shù)據(jù)增強(qiáng)的方式降低模型的方差抡柿。在這一點(diǎn)上,諸如銳化鈍化备蚓,高斯模糊郊尝,色相變換甚至尺度空間從原理上都是可以做為數(shù)據(jù)增強(qiáng)項(xiàng)的,可能是因?yàn)閺?fù)雜度的關(guān)系才沒(méi)有廣泛應(yīng)用同欠;
1.1.5 數(shù)據(jù)降維(Dimension Deduction)
這里主要提兩種算法铺遂,PCA和LDA茎刚,實(shí)施細(xì)節(jié)及其他的算法可以參考以下鏈接:
四大機(jī)器學(xué)習(xí)降維算法:PCA膛锭、LDA、LLE莫杈、Laplacian Eigenmaps
做數(shù)據(jù)降維的主要目的是將特征重新投影到新的空間筝闹,以求新維度空間可以以一個(gè)低維度的尺度來(lái)描述高緯度的原始數(shù)據(jù)腥光,并最大可能保留原始信息武福。降維可以在降低模型冗余的同時(shí)減少噪音,發(fā)掘本質(zhì)特征及解決Sparse問(wèn)題平痰,但計(jì)算的空間復(fù)雜度極大,在模型較小的時(shí)候我們有時(shí)會(huì)采用這種算法觉增,不過(guò)現(xiàn)代模型用處可能不大逾礁,尤其是在HDFS環(huán)境下,我們更希望模型是獨(dú)立的而不是PCA腻扇,LDA這種比較global的算法幼苛,獨(dú)立的算法更便于我們部署MapReduce的設(shè)計(jì)焕刮。Spark的流式RDD圖可能會(huì)有g(shù)lobal的一些優(yōu)化吧配并,只能以后研究清楚再來(lái)說(shuō)明了。
PCA算是最常用的數(shù)據(jù)降維方式畸冲,核心思路是將原始特征空間映射到彼此正交的特征向量對(duì)應(yīng)的空間邑闲,復(fù)雜度主要集中在分解特征向量的過(guò)程梧油,而一般數(shù)據(jù)在非滿秩的情況下更多會(huì)用SVD分解來(lái)構(gòu)建特征向量儡陨;
LDA則是在PCA的基礎(chǔ)上要求最小化組內(nèi)距的同時(shí)最大化組間距迄委,其實(shí)也就是fisher法則叙身。
以上主要是數(shù)據(jù)的分析部分信轿,下一篇我們開始討論模型選擇及模型原理分析残吩。
最后在這篇的結(jié)尾再補(bǔ)充點(diǎn)具體的東西泣侮,以后大概會(huì)在每篇結(jié)尾寫一些具體結(jié)構(gòu)活尊。今天主要說(shuō)一下DQN這個(gè)東西吧漏益。Stanford的公開課有專門介紹這個(gè)鬼東西的绰疤,其實(shí)我覺(jué)得這個(gè)東西用generator類比可能比較合適舞终。
傳統(tǒng)的RL算法不論是Dynamic Programming還是Q-learning都需要基于Reward矩陣構(gòu)建Value矩陣以作迭代敛劝,思路很直接攘蔽,Bellman公式也很容易接受龙屉,但是有個(gè)問(wèn)題,就是需要的狀態(tài)矩陣可能及其龐大满俗,一個(gè)256256的像素游戲转捕,就需要pow(256,256256)的狀態(tài),這是不可接受的唆垃。而DQN則將256的像素作為輸入值五芝,256*256的像素點(diǎn)作為輸入特征,通過(guò)權(quán)值擬合來(lái)達(dá)到比較好的分離辕万,或者說(shuō)低維度表示高緯度枢步。
每次在轉(zhuǎn)移狀態(tài)時(shí),傳統(tǒng)算法用的是O(1)的hashmap,這個(gè)hashmap的空間就是算法的局限性渐尿,尤其是在狀態(tài)無(wú)限時(shí),算法會(huì)直接失效砖茸,這一點(diǎn)可以參考self-driving的問(wèn)題隘擎。
而DQN用的是MLP的深層網(wǎng)絡(luò),相當(dāng)于時(shí)間換空間凉夯,不過(guò)更多的是通過(guò)擬合產(chǎn)生對(duì)新狀態(tài)的判斷货葬,解決了RL算法中無(wú)法對(duì)新狀態(tài)做估計(jì)的問(wèn)題