機器學習的坑__機器學習

來源:互聯網
上載者:User

之前拜讀過Xavier Amatriain 大神的“10 lessons learned from building ML systems”以及“10 more Lessons learned from building real-life Machine Learning System - Quora” 感受頗深,而且相當可以引起共鳴。因此,今天小編就結合從大神那裡get到的精華和自己和隊友一起踩過的坑和大家分享一下我們工作中遇到的問題,以及一些解決方案。希望能讓剛入行不久的童鞋們避開我們曾經踩過的坑。

小編之前工作做的是電商推薦,現在是在做招聘推薦,包括求職方和招聘方的推薦。二者在業務上雖然差異很大,但萬變不離其宗,無非就是資料,特徵,模型以及效果評估這四個方面。今天小編也就從這四個方面和大家分享一下自己的經驗和體會。資料部分會和大家分享一下常用的資料類型,異常資料對模型訓練的負面影響以及如何避免,模型訓練時正負樣本不均衡的影響及其解決方案;特徵部分會主要介紹一下特徵選取的原則,以及一些基本的特徵處理方法;模型主要想和大家分享的是多模型融合是趨勢;最後的效果評估會介紹一下小編常用的三個離線評測指標以及模型debug. 其中有些例子可能會用到電商中的情境,有些會用到招聘推薦。

資料

顯性資料&隱性資料

資料也許有很多不同的分發,“顯性資料”和“隱形資料”是其中一種。所謂“顯性資料”就是可以直觀反映出使用者喜好的資料,比如說電影評分,點贊,踩;而“隱性資料”就是那些不是很直觀的反應使用者喜好的資料,比如說電商使用者的瀏覽,收藏,加購物車。而且有時候使用者直接表達的喜好也許並非他真正的喜好,換言之“話可以騙人,但長期的行為騙不了人”表1列出了二者的差別。很明顯,在實際應用中我們用到最多的還是隱性資料。

表1. 顯性資料和隱性資料比較

Junk in Junk out

我們先來看看資料。我們是做大資料處理的,因此資料是我們的根本。引用一句統計業內非常流行的話“Junk in, Junk out”,如果你的輸入資料是Junk,那你能期望的輸出也只能是Junk。因此我們要時刻考慮異常資料對計算結果的影響。下面我舉兩個栗子:

電商的“打包購買”模組,也叫“拍檔組合”,“最佳拍檔”等,如圖一所示。顧名思義就是適合和當前商品一起購買的其他商品。這個模組的推薦用到的是關聯規則演算法。“打包購買”用數學式子表達就是求的機率,其中Y表示當前商品,X表示適合一起買的其他商品,即如果使用者要買商品Y,他有多大的機率買商品X。將候選商品集合按照從高到低排序取topN就是展示在使用者面前的這個模組的結果。這個模組用到的資料就是使用者的訂單資料。而我們都知道電商中普遍存在“刷單”和“囤貨”的行為”,這些“刷單”以及“囤貨”的行為就屬於我們訂單資料中的“異常點”,如果不加以處理必然會影響推薦結果。

圖1. 圖書“拍檔組合”模組

我們先討論一下“刷單”的影響。通常理解的“刷單”就是刷銷量,充其量會影響到熱銷熱門排行榜推薦。但我們在分析資料中發現還有一種更進階的刷單方式,就是“刷搭配”,就是反覆的和暢銷書一起購買,這樣不用像單純的刷銷量那樣需要刷非常多單,也可以有很多機會出現在使用者面前。他們會出現在暢銷書的“打包購買”推薦模組裡。比如出現暢銷書A的訂單總共有1000單,其中有100單裡包含了作弊書B,50單裡包含C書,35包含D書,那麼P(B|A)的機率必然是最大的,因此會被放在推薦位的第一位。而這絕對不是我們期望的結果。

討論完“刷單”,我們再討論一下“囤貨”的影響。電商的各種造節造就了一批又一批的剁手黨,這些剁手黨往往會提前把想買的商品提前放入購物車,可能有母嬰,可能有男裝,也可能有童書,或者是文學,社科什麼的,然後等節日那一天一併下單。如果利用這些訂單進行計算關聯規則,會使得原本根本不“相關”的商品關聯起來,這樣也會影響我們的推薦結果

當然,這裡的例子只是影響結果的兩種類型,在不同的業務情境下也會有不同的影響模型計算的結果。比如說簡曆推薦中會有如圖2中的“批量查看簡曆”,職位推薦中的“批量申請”等。這些批量處理的資料都會對模型學習產生影響。

那如何處理這種因資料造成的學習結果不盡人意呢。我們常用的有兩種方法:一種是直接從資料本身下手,想辦法去掉對結果產生不良影響的“異常點”。比如說去作弊訂單,去除掉雙11等大促訂單;另一種方法是在計算的時候對“異常點”資料進行降權處理,將其對結果的影響儘可能的衰減。比如說在計算關聯規則的時候,計算兩兩商品共同出現次數的時候,根據訂單中包含商品的數量進行適當衰減。

圖2:簡曆詳情頁“您的同行還查看了以下簡曆”模組

樣本不均衡

正負樣本不均衡的問題大家應該都不陌生。電商推薦中被點的商品總是遠小於展現;招聘推薦中使用者申請的職位也是眾多職位中的一小部分,其他互連網應用也大多如此。這就造成的實際樣本中正樣本會遠遠小於負樣本的個數。

而理想情況下,模型訓練時我們期望正負樣本比為1:1。 為什麼這麼說呢。我們舉個極端的例子,假設正負樣本比為1:99,如果模型的目標是儘可能的減少誤判。如果各位就是那個“模型”,新來樣本之後,你會怎麼辦呢。你是不是會無腦全部判成負樣本呢。因為即使全部判成負樣本,都可以保證99%的準確率。 而當正負樣本比我1:1 的時候,模型就沒辦法“投機取巧”,只能“靜下心”的去學習哪些特徵可以激發點擊,哪些特徵無法勾起使用者點擊的慾望。

現實PK理想,那實際工作中我們該如何解決樣本不均衡造成的問題呢。主要有兩種方法,一種方法就是從代價函數入手。這裡我用SVM的代價函數為例,我們可以對正負樣本做不同程度的懲罰,對正樣本懲罰小點,而對負樣本卻加大懲罰力度,如式1。這樣就會讓模型“知道”我們是“偏心”正樣本的,進而會影響權重w的結果。

式1:從代價函數入手解決樣本不均衡

考慮到實際工作中我們都會採用各種各樣開源的工具,因此調整代價函數的可操作性相對較差,因此還有另外一種應用更多的方法,就是直接從樣本入手,人工調整正負樣本的比例,主要有降採樣和過採樣兩種方法。降採樣是針對樣本多的那個類別,;而過採樣是針對樣本比較少的那個類別。因為小編經曆的大多數情況都是負樣本遠遠大於正樣本,所以之後我都會用負樣本降採樣和正樣本的過採樣來介紹。但需要注意的是,對樣本做了人工調整後,並不是沒有代價的。下面我們具體分析一下兩種採樣方法可能付出的代價。

負樣本降採樣,顧名思義就是對負樣本進行抽樣。但需要注意的是,降採樣也需要有度,如果要降採樣到正負樣本比為1:1就有點太誇張了。降採樣可以採用隨機抽樣的方法,也可以根據業務特點,針對性根據一定的條件做降採樣。降採樣之後導致負樣本丟失,可能會使得最後的模型和真是結果存在一定的偏差。如圖3所示。因此我們需要在降採樣導致的偏差和用原樣本進行訓練的不足之間進行權衡,選擇對業務更有利的一方。

圖3. 降採樣對結果的影響

介紹完負樣本的降採樣,我們來一起看一下正樣本過採樣的方法以及可能導致的結果。過採樣其實也可以稱作“插值”,就是在現有正樣本的基礎上根據一定的原則再插入一些正樣本。最簡單粗暴的方法,就是將部分正樣本複製多次,但也不是無理由的複製,一般都是會結合業務來進行複製。比如說招聘推薦中某個職位被點擊了,而且使用者還申請了,那麼這種樣本可以做適當加強。這樣可能導致的問題如圖4所示。因為某些正樣本被加強了,因此模型會過分去擬合那些正樣本,從而導致過擬合的問題。

圖4. 正樣本簡單複製對訓練結果的影響

另外一種相對高明的方法,就是插值出一些“偽正樣本”,純數字特徵的話,可以考慮中值插值,最近鄰點插值等方法。我遇到的情況一般是會根據業務進行插值,比如可以把和正樣本相似性非常高的那些負樣本強行變成正樣本。這種方法也會產生如圖5的問題。雖然也會偏離理想模型,但比之前單純複製的過採樣方法還是好很多,過擬合問題會相對緩解一些。

圖5. 增加偽正樣本對訓練結果的影響

總結一下,實際的大部分應用樣本都是不均衡的,而且可能不均衡的特別嚴重。在這種樣本上訓練模型多數情況下達不到我們預期的結果。因此很多時候我們需要對樣本做一些抽樣,但這樣必然會導致偏差,畢竟抽樣之後樣本分布已經發生變化,和線上真實情況是不一致的。但只要抽樣帶來的好處遠大於導致的誤差,我們就還是可以進行樣本抽樣的。

特徵

特徵是模型訓練中非常重要的環節,而特徵的選取一般都是和業務高相關,特徵選取的好壞直接影響模型預測的準確性。那麼選取特徵時有哪些原則呢。Xavier Amatriain 大神在他的分享中提到好的特徵應該具有以下四個特質:

可複用,好的特徵不應該是只用一次

可變換,靈活性要比較好

可解釋,選取的特徵得對業務有意義,否則只是雜訊而已

可靠,方便監測和debug

除此之外,還需要注意的是特徵組選取時應該儘可能獨立,即使不能獨立,也要低相關。

常用的特徵有數字特徵和文本特徵兩類。數字特徵一般會涉及到去異常點,離散化,歸一化等基本操作;而文本特徵會涉及到分詞,提取主題詞等操作。模型訓練時候可以直接採用原始特徵,但很多情況下我們也會根據實際應用對特徵做一些轉化,我們也稱之為“特徵工程”。比如說生物資訊應用中(小編讀書時候做過生物資訊學的研究),樣本的特徵通常是基因,而基因的數量級那就上了天了, 因此在生物資訊學界經常會遇到“curse of dimension”,所以在此類應用中一般都會做降維處理,一方面達到降維的效果,另一方面也是提取出對模型更重要的,表達性更好的,相對獨立性更好的特徵組,比較常用的如PCA, LDA等。又或者在某些情境下原始特徵太少,而導致線性不可分,這時候我們可能就需要做一些工作提高維度,使之在高維度下線性可分,比如說SVM中的核函數,它成功的將低維線性不可分的樣本變換成高緯線性可分。亦或是在另一些應用下,原始特徵的表達能力比較弱,這時候也需要特徵變化提高特徵的表達能力,比如深度學習在映像中的應用,將像素預先處理得到邊緣,然後再抽象為對象的組件,最後再進一步抽象為物件模型。實際應用中,大家可以根據具體的業務來進行具體選擇。

在特徵處理中還有一個不可忽視的內容就是適當的人工幹預。適當的人工幹預對模型訓練結果的提升效果那是杠杠的。模型不懂業務,真正懂業務的是人。模型能做的只是根據代價函數和樣本進行學習,找到符合當前樣本的最優的擬合。因此機器學習工作者應該根據也許需求適當對特徵進行一些人工幹預和“指導”,比如說硬規則的摒棄一些噪音特徵。如何判斷是噪音,那就依賴對業務的理解了。小編之前做電商推薦的時候,就做過這樣的事情。當時推薦效果遇到瓶頸,於是大家一橫心就對商品標題,商家分類資訊等的分詞後結果,去掉低頻詞和太高頻詞,對剩餘的詞人工過濾了一遍,眼都看瞎了有木有。但過濾一遍之後,特徵不但增多了,而且品質更好,模型的效果提升異常明顯。

當然會有人說“特徵多不怕啊,把它們丟給模型,然後讓模型去訓練找到好的特徵”,這種想法小編認為too young too naïve。模型訓練只是工具,它不是阿拉丁神燈,可以對你有求必應;它也不是牛,你給它草,它能給你牛奶。你需要給模型一個高品質的輸入,它才能返還你一個完美的結果。

模型

模型是根據訓練樣本,目標函數以及評價指標這三個內容來進行學習的。模型的效果直接依賴三者的設計。不同的目標函數造就不同的機器學習演算法。

說到模型,那就不得不提過擬合和欠擬合的問題了。所謂過擬合就是過分的去擬合訓練樣本而導致泛化能力太弱,等面對新的資料就會產生較大的偏差;而欠擬合就是模型表達能力太弱,根本沒有很好的“描述”出樣本。

圖6. 欠擬合,完美擬合,過擬合樣本

因此為了保證模型一方面可以完美擬合訓練樣本,一方面也不損失泛化能力,我們都需要做交叉驗證,即一部分樣本用來訓練,另一部分用來測試。除此之外,我們一般還需要通過正則化來防止過擬合,常用的有L1正則,也叫Lasso; L2正則Ridge。 以最小二乘為例,帶L1和L2正則化的代價函數如式2所示:

式2. 帶L1正則和L2正則代價函數樣本

也就是說,我們將模型空間限制在w的一個 norm ball中。為了方便理解,正則化這部分我就直接引用ref[3]中的解釋, 我個人認為解釋的非常好。假定我們只考慮二維的情況,在(w1, w2)平面上畫出目標函數等高線,而約束條件則成為平面上半徑為C的一個norm ball. 等高線與norm ball首次相交的地方就是最優解。可以看到,L1-ball 與L2-ball 的不同就在於L1在和每個座標軸相交的地方都有“角”出現,而目標函數的測地線除非位置擺得非常好,大部分時候都會在角的地方相交。注意到在角的位置就會產生稀疏性,例如圖中的相交點就有w1=0,而更高維的時候(想象一下三維的L1-ball 是什麼樣的。)除了角點以外,還有很多邊的輪廓也是既有很大的機率成為第一次相交的地方,又會產生稀疏性。相比之下,L2-ball 就沒有這樣的性質,因為沒有角,所以第一次相交的地方出現在具有稀疏性的位置的機率就變得非常小了。這就從直觀上來解釋了為什麼L1-regularization 能產生稀疏性,而L2-regularization 不行的原因了。

圖6. L1正則和L2正則圖示

因此,一句話總結就是:L1會趨向於產生少量的特徵,而其他的特徵都是0,而L2會選擇更多的特徵,這些特徵都會接近於0。Lasso在特徵選取時候非常有用,而Ridge就只是一種規則化而已。

關於模型,還需要說的就是多模型融合。“Everything is an ensemble”,“三個臭皮匠頂個諸葛亮”,綜合不同演算法的優勢,揚長避短,整合一個牛掰的super model. 很多互連網公司在單一模型遇到瓶頸之後,大多都會採用模型融合,比較流行的是GBDT+LR。從根本上說多模型的融合,實質上是一個模型的輸出作為另一個模型的輸入,第一個模型充當特徵轉換的角色。

效果評估

訓練出模型後一般都需要對模型做效果評估。除了離線評測指標之外,還需要一個debug工具來真實類比線上環境,並且可以將模型結果可視化。

小編常用的離線評測指標有AUC, 校準(Calibration), 歸一化熵(Normalized Entropy, NE)。 表2中列出三個評測指標的具體計算方式。AUC大家都很熟悉,這邊就不多說了。Calibration計算的是實際的點擊和預測點擊的比值,這個值越接近1,說明預測越準確。Calibration其實是對AUC的一種補充,因為AUC在意的只是排序,而不關心具體預測值。NE的分子部分其實是交叉熵,也是LR的代價函數。(y是樣本label, 取1 或者-1; pi 為樣本i的點擊預測機率);分母部分是原樣本的資訊熵(p為正樣本的機率,或者準確的說是頻率),即原始樣本的不確定性。所以NE反應的是在模型的協助下,樣本剩餘的不確定性和沒有模型時候樣本的不確定性比值。那麼, 1-NE其實就是相對資訊增益,也即模型協助我們消除的樣本的不確定性。再通俗點講就是當我們沒有模型協助的時候,樣本正負的不確定性會大,我們不是很容易判斷樣本正負;但有了模型協助之後,我們會得到一個預測的點擊率,在這個協助下我們就可以更容易的去判斷樣本正負,這時候不確定性就下降了。換言之模型是給我們帶來了更多的資訊。這也是模型訓練的主要目的。那為什麼要用三種離線測試單位呢。小編最開始也是只用AUC,但後來我們發現AUC即使結果很好,上線後也可能不盡人意。因此多增加兩個評測指標,多指標一起評測,更可靠。一定程度上可以保證上線後的效果。

表2. 三種評測指標計算方法

除了指標評測外,我們還需要類比線上環境,人工的觀察模型效果。比如說看看用新模型排序後的推薦職位是否比現有的好;排在第一位的簡曆都有哪些特徵;每個特徵的權重是多少;是哪些特徵導致它排在第一位;這些特徵的權重是不是合理;是有多少訓練樣本中含有這些特徵;是不是樣本太少而導致權重不合理等等。我們需要對模型的結果有全面清晰的認識,這樣也方便我們對症下藥的對模型訓練做出一些調整。不能盲目的信賴模型訓練的結果。

總結一下:實際應用中隱性資料使用得更多;資料處理時要特別注意異常資料的清理;適當的樣本採樣(過採樣或者降採樣)可以調整正負樣本比,有利於演算法訓練出真正有意義的模型;當單一模型效能遇到瓶頸的時候,考慮多模型融合;多指標評測讓我們對模型更有信心,線下類比線上情況很有必要。

以上就是小編和自己的隊友們共同遇到過的一些問題,以及相應的解決方案。知識有限,有不對的地方歡迎大家指出,一起討論一下。小編連絡方式:

risingsun123@163.com

Reference

[1]10 lessons learned from building ML system – Netflix, Xavier Amatriain

[2] 10 more Lessonslearned from building real-life Machine Learning System – Quora, XavierAmatriain

[3] http://blog.csdn.net/zouxy09

[4] Practical Lessonsfrom Predicting Clicks on Ads at Facebook - Facebook

謝謝閱讀~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.