搜索技术博客-淘宝
關注技術 關注搜索 關注淘寶
?????? “機器學習”這個名詞對大家來說想必不是一個陌生的詞匯,特別對算法組的同學來說,工作中或多或少接觸使用過這種“高科技“。對于我來說,剛來淘寶工作一個月就開始接觸了機器學習,當時做主搜索功夫熊貓項目,和小致飄雪一起做交易模型,正是使用了機器學習的方法,也首次接觸了treelink模型。做完那個項目后對機器學習解決問題的流程有了一定的了解,但對其內部的工作原理和實現機制還是完全不知道,基本也就是在黑盒使用機器學習工具。后面也多多少少聽了一些機器學習的講座,但都是一些比較寬泛的基本概念,沒有深入的原理性的介紹。也自己嘗試過專研一下,但生硬晦澀的E文讓人望而生畏。一直到今年做導購搜索的項目,又再次需要使用機器學習,“懷揣著對科學真理的向往”,主動請纓做模型方面的工作。經過一個多月的學習實踐,算是對treelink模型有了一定的了解。下面做一些對treelink模型通俗版的介紹。都是自己的一些理解,如果有誤,多指教。
??????? 在介紹treelink之前首先不得不簡單介紹一下決策樹算法,決策樹相信大家都有所了解,任何一本機器學習書籍都會介紹這種算法,也是應用最廣的歸納推理算法之一。該模型學習的結果是一棵決策樹,這棵決策樹可以被表示成多個if-else的規則。下圖是一個典型的學習得到決策樹。這棵決策樹根據兩個特征因素來分類“元涵今天的心情好壞”。長方形的表示特征,橢圓型的表示特征的取值,最下面的葉子節點就是最后的分類結果了。
???????? 學習得到如上這棵決策樹之后,當輸入一個待預測的樣本實例的時候,我們就可以根據這個樣本的兩個特征的取值來把這個樣本劃分到某一個葉子節點,得到分類結果了,這就是決策樹模型的預測過程,決策樹的學習構建過程這里就不介紹了,大家看書吧,比較經典的有ID3算法和C4.5算法。
???????? 切入正題下面開始說treelink算法,treelink這個名字其實只是我們阿里集團內部的叫法,學術上的名稱叫GBDT(Gradient boost decision tree)。treelink模型不像決策樹模型那樣僅由一棵決策樹構成,而是由多棵決策樹構成,通常都是上百棵樹,而且每棵樹規模都較小(即樹的深度會比較淺)。模型預測的時候,對于輸入的一個樣本實例,首先會賦予一個初值,然后會遍歷每一棵決策樹,每棵樹都會對預測值進行調整修正,最后得到預測的結果。
????????F0是設置的初值, Ti是一棵一棵的決策樹。對于不同的問題(回歸問題或者分類問題)和選擇不同的損失函數,初值的設定是不同的。比如回歸問題并且選擇高斯損失函數,那么這個初值就是訓練樣本的目標的均值。
??????? 下面是一個簡單的treelink模型示意圖。模型的目標是上海一套普通商品房的價格,特征有三個:房子的面積(連續特征),是否在內環(分類特征),是否學區房(分類特征)。模型由四棵決策樹構成,每棵決策樹只進行了一次分裂,即樹的深度為一(這種樹被稱為Decision Stump)。實際應用中通常較復雜,深度不會為一。
??????? ?初值設定為上海普通商品房價格的均值150萬,每經過一棵決策樹,都會對根據相應特征的取值對預測價格進行調整。比如一個面積為120平的內環非學區房的價格預測值為:150+20-10+30-10=180萬。
???????? 那為什么要用多棵決策樹,一棵決策樹為什么不好呢?使用單棵決策樹,最大的問題就是會因為過度分裂,而造成過擬合,失去泛化能力。試想一下,對于給定的一批訓練數據,完全可以只構造一棵樹,不斷分裂下去,直到每個葉子節點包含的樣本的目標值都一樣,然后把這節點的預測值設定成這個目標值,這樣構造出來的這棵樹就可以在這批訓練數據上達到100%的準確性。但這樣一棵過度分裂的決策樹,對于新的樣本基本沒有什么預測能力。而如果分裂太少,又會造成學習不夠充分。Treelink使用多棵決策樹正是希望能夠在訓練精度和泛化能力兩個方面都能達到較好的效果。作為一種boosting算法,Treelink自然包含了boosting的思想:將一系列弱分類器組合起來,構成一個強分類器。它不要求每棵樹學到太多的東西,每顆樹都學一點點知識,然后將這些學到的知識累加起來構成一個強大的模型。舉個現實生活中的例子,電視里的那種益智類節目,如開心詞典,答題者有三次請求幫組的機會,其中一個就是請求現場所有觀眾,通過他們的選擇來給出答案。我們可以把每個觀眾當做一個弱的分類器,他們各個單獨的準確率都不高,但把他們的知識綜合起來這個準確率會大大提升。也許上面這個例子不太能說服你,我們來把這個例子量化。假如我們有三個觀眾,他們各自的準確率為60%(非常弱的分類器,只比隨機分類器好一點點),如果這三位觀眾中有大于等于兩位的答案是正確的,那么則認為我們正確了,反之則錯誤。那么我們正確的概率是多少呢?preciseness = p(三個人都正確) + p(三個人中有兩個人正確) = 0.6*0.6*0.6 + 3*0.6*0.6*0.4 = 0.648,比單個人0.6的正確率有所提升,驗了中國那句老話“三個臭皮匠頂個諸葛亮”。隨著人數的增加,這個正確率還會提升。
???????? Treelink模型的學習過程,就是多顆樹的構建過程。和決策樹模型一樣,在樹的構建過程中,最重要的就是尋找分裂點(某個特征的某個取值)。我們希望選擇的這個分裂點是最能區分樣本的。那么如何衡量一個分裂點對樣本的區分能力?在treelink算法我們通過Loss(衡量樣本預測值與目標值的差異)的減小程度用來衡量這個區分能力,Loss減小得越多,這個分裂點就越好。即以某個分裂點劃分,把樣本分成兩部分,使得分裂后樣本的損失函數(Loss Function)值減小的最多。好像有點不太通俗了,沒辦法。
??????訓練流程:
1??? 估計初值
2??? 按如下方式構造M顆樹
????? 2.1??? 隨機選取部分樣本作為本顆樹的訓練數據
????? 2.2??? 按如下方式尋找最優分裂點,進行N次葉子節點的分裂
???????????????? 2.2.1??? 對當前所有葉子節點
?????????????????????????????? 2.2.1.1??? 計算該葉子節點的最優劃分以及其增益(損失函數減少量)
?????????????????????????????? 2.2.1.2??? 選擇增益最大的葉子節點及其劃分點,進行分裂,將樣本劃分到子節點中
?????????????????????????????? 2.2.1.3??? 更新樣本估計值
???????? 集團開發的mllib機器學習工具包中treelink是最重要的一個模型。對于如何使用這個工具包, mlllib user manual里面已經寫的非常詳細了。下面說一下其中一些重要參數的意義及如何設置。
tree_count:前面提到的決策樹的個數,這個數設的越大學習就越充分,但太大也會造成過度擬合,而且也消耗訓練和預測的時間。可以先選擇比較大的樹個數,然后觀察訓練過程中的損失減少趨勢,損失減少比較平緩時,樹個數就比較合適了。tree_count和shrinkage也有關系,shrinkage越大,學習越快,需要的樹越少。
shrinkage:步長,它代表的是學習的速度,越小表示學習越保守(慢),而越大則表示學習越冒進(快)。通常我們可以把Shrinkage設小一點,把樹的個數設大一點。
sample_rate:樣本采樣率,一次學習使用全部的樣本是浪費,為了構造出具有不同傾向性的模型,需要使用樣本的子集來進行訓練,而過多的樣本對簡單的模型無益,只會造成更多的過擬合和局部極小問題。這個采樣的比例一般選擇50%-70%比較合適。
variable_sample_rate:特征采樣率,和上面的樣本采樣率不同,這個采樣率是指從樣本的所有特征中選取部分的特征來學習,而不使用全部特征。當你發現訓練出來的模型,某一兩個特征非常強勢,重要性很大,而造成其他特征基本學不到的時候,可以考慮設置一下把這個參數設置成<1的數。
???????? 最后是對于使用機器學習的一些常見問題的一些理解。
1?????? 機器學習是萬能的?
???????? 當然不是,如果你認為可以簡單地把一堆特征樣本扔給機器學習,就期望它給一個好的模型,那是不可能。在使用機器學習之前,一定要對所使用的模型有個基本的了解,最好能夠知道它的計算原理。如果你都不知道treelink為何物,那些參數大概是個什么意思,你最好就不要用了,用也是在拼人品。
2??????使用機器學習的同時做好數據分析工作
???????? 就算使用機器學習,數據的分析工作也是省不了的,做好了分析工作,你會發現自己都可以像機器一樣找到那些規律。其實機器學習本身也就是統計,幫你找數據之間的規律,并把這些規律做成規則。好萊塢奧斯卡金像獎電影《美麗心靈》中的男主人翁,諾貝爾經濟學獎得主數學家約翰納什在電影中被稱為最厲害的人肉密碼破譯者,充分向我們展現了how people learning beats machine learning,當然是有些夸張的成份。下面是一些可以做的最基本的數據分析工作:
1) 特征的分布:按特征的取值分段,每一段包含的樣本數量,特征均值,方差。
2) 目標分布同上
3) 特征目標關系:特征分段,每段中包含的樣本的目標取值。
4) 目標特征關系:目標分段,每段中包含的樣本的特征取值
3????? 模型在訓練數據上效果不錯,但做Cross-validation效果不佳
???????? 主要原因有兩個:
1) 選取的樣本數據太少,覆蓋度不夠,考慮增加訓練樣本
2) 樣本特征過多,可以考慮減少一些特征,只留下重要的特征
4??????模型在類似Cross-validation這樣的封閉測試上效果不錯,但在開放測試上效果不佳
1) 選取的訓練數據覆蓋度不夠,不具備代表性,不能體現真實數據的分布。
2) 模型遷移(Model drift),隨著時間變化,特征數據也隨之變化。比如3個月前做的模型對現在的特征可能不會有好的效果。
總結
- 上一篇: python 大智慧自定义数据_大智慧扩
- 下一篇: java函数命名规范_java命名规范