11月13日,雲腦科技機器學習訓練營正式開營,本期訓練營由科賽 Kesci聯合雲腦科技打造,中美大咖導師授課,精心指導學員解決機器學習中的實際問題,爲人工智能行業培育高潛力人才。算法
K-Lab在線數據分析協做平臺爲本次訓練營提供全程支持,訓練營學員可在瀏覽器中方便、快捷地進行數據處理、模型搭建、代碼調試、撰寫報告等分析工做,實如今線「報名-AI應用算法案例學習與實踐-做品在線提交-能力測評與篩選」的一站式學習。數據庫
目前第一期大咖分享內容已出爐,如下是分享內容實錄~編程
分享內容簡介數組
主題:億級用戶電商平臺推薦系統挑戰瀏覽器
主講人:張本宇(雲腦科技創始人&CEO)網絡
從事人工智能十八年的老兵,曾就任於微軟亞洲研究院、Google和Facebook,在AI方面手握了150項美國專利,在國際一流期刊及會議上發表的45篇論文已被引用超過6000次,創新工場最新研究《AI領域,中國人/華人有多牛?》中,張本宇位列「華人前10位大牛科學家」。app
內容要點:機器學習
協同過濾 Collaborative Filtering編程語言
特徵工程 Feature Engineering函數
推薦系統實戰注意點
首先咱們看一下機器學習的五大環節。
一是特徵工程。第二是算法定義和調參,就是你該選擇什麼樣的算法,用什麼樣的參數進行調節。第三是數據採集和清洗,接下來是實現這個算法並進行優化。‘I’表明和業務生產系統集成,因此咱們就會簡稱爲FaDAI這五大步驟。特徵工程是這五大環節最重要的一部分。
咱們會簡單介紹一下特徵工程,以及一些常見的特徵工程的方法。
引用一下吳恩達的話:「應用機器學習其實就是在作特徵工程,特徵工程是很是難、耗時、也是須要專業知識的一個工做。」咱們理想中機器學習的狀況:有很乾淨的Raw data,而後變成可學習的Dataset, 經過某些算法學出某些模型,而後解決一個問題,這是最理想的一個狀態。但現實中,咱們會有各類各樣的數據,有的從數據庫來,有的從日誌來,有的從半結構結構化文檔來,有的從無結構的音頻、圖片中來。從中抽取什麼特徵,纔可以被咱們機器學習所使用,從而能學習出模型解決出問題呢?
接下來咱們看一下針對變量類型的特徵,這裏實際上有幾大類的變量類型。有分類型的特徵變量,也有數值型的特徵,還有兩個比較特殊的是時間和空間,接下來咱們也會一一介紹。
1.離散型特徵
對於離散型的特徵枚舉一些例子:你的操做系統是什麼類型?有多是桌面,有多是平板,有多是手機。那你的user_id是什麼?有121545,或者別的一些id。 這種類型的特徵是最須要特徵工程的,由於它的取值空間很是巨大,常常會致使稀疏數據。因此說從效率和精度上來講,都是對模型一個巨大的挑戰。
那最簡單的一個特徵工程,叫作One-Hot encoding。舉例來講,platform這個維度有三個取值:desktop、mobile、tablet。 那咱們能夠轉換成三個特徵,若是平臺是在desktop上,那這個特徵就取1,若是在mobile上,那這個特徵就取1,若是在tablet上,那這個特徵就取1,這是一個很是稀疏的結構。舉例來講,若是有十萬個站點,那就十萬維,這是十萬維只有這一個維度上取1,其餘都取0。
一種比較常見的方法就是作Hash Encoding。舉例來講:有200多個國家,用Hash的方法把它轉化爲100多列,但用剛纔One-Hot的方法就有200多列,但用Hash方式表達,參數是可調的,因此它能夠縮成100、50,甚至10。那它會有必定的代價,好比說巴西和智利被放在一列,可是這兩個國家可能有不一樣的特性,但他們必須share一樣的位置。這是它們潛在的一個問題,但稀疏性是能夠控制的,也能夠處理低頻和一些新的變量。這裏隱含的條件是有一個假設,這個假設是有些特徵能夠share同一個位置。這個假設在深度學習中也會有使用。因此在實踐中發現不少時候並不會影響實際的結果,只要你的參數空間相對是足夠的,就是它有足夠的表達能力。這個也是相對比較常見的一個方法 像有些比較知名、開源的機器學習的工具都有這樣的一個功能。
另一個是計數型的Encoding,就是把它變成全局的count。好比廣告id:423654,他看了多少次,點擊了多少次,直接把它轉化成一個統計量,能夠是觀看的次數,點擊的次數,廣告的CTR。就是用不一樣的id,每一個id有不一樣的權重,變成浮點數上的一個特徵,共享一個權重。這裏有一個假設,它跟全局統計有某種線性關係,或者在某個轉化空間以後有線性關係。
2.異常值
還有一個是咱們關心的異常值對整個統計的影響,那咱們可能就從絕對值改成一個相對值,相對值就是它排序的一個次序,好比說按CTR排序,最好的CTR有什麼特徵。
最後是在神經網絡中常見的作法,就是把分類變量轉換爲嵌入式變量,作Embedding。好比說你有十萬個不一樣sites,把它投影到64維或者128維的vector上面,至關於原來須要十萬個Free parameters,如今只須要64維或128維。之因此能這樣作,原來的十萬維空間是很是稀疏的,64維或者128維是更稠密的表達,因此仍是有很是強的表達意義,好處就是內存需求會更少,相對來講精度也會更高。
有同窗問Hash和Embedding的區別,Embedding自己是須要學習出來的,好比說id1它投影到怎樣的Embedding空間,經過學習來得到。而哈希是經過預約義的哈希函數,直接投影過去,自己的哈希函數是不須要學習的。這裏它最基礎的邏輯是不同的,Hash Encoding也就是說你這兩維特徵能夠share相同的weight。好比說巴西和智利放在同一列中,他們有相同的權重,而Embedding其實是一種distributional的表達方式。它的意思是說巴西可能使用64維上不一樣取值來表明,智利也是一樣用這64維,因此這64維,每一列都參與表達不一樣的國家,每個國家都由這64維來表達。它們兩個的基本思路上是有所區別的。
3.數值變量
咱們如今進入到數值變量,數值變量主要有兩種,一種是浮點數和一種是定點數,定點數也就是整數。不少時候數值變量也能夠當成模型的直接輸入來使用。可是基本上也都須要必定的特徵工程,由於實踐中它的取值範圍會很分散,實際上對模型的影響也比較大。
首先咱們看一下缺失數據,缺失數據一種最簡單的作法是轉化爲空白,或者NaN,但實際上空白都會當成0來處理,這其實不是一種最好的表達。這時候其實更好的是使用平均值、中位值,或者模值,或者由其餘模型來生成一些值。但常見來講平均值和中位值就足夠好了。那第二種狀況可能會作一些rounding,就是忽略掉一些小數位上的變化,由於有時候小數位太高會是一種噪音。他自己的觀測實際上沒有這麼高的精度,因此不少時候精度是一些更低階的噪音帶來的。或說咱們但願他在某些特徵上有必定的魯棒性。好比說這個例子,它在乘10取整後,實際上某種程度上能夠當成分類、離散型的變量,好比說12345678910,固然它變成分類變量以後,其實是產生了一個約束,10必定比9好,9必定比8好,它有個排序的次序和關係。因此這就是要看實際工做中,這樣一個約束是否成立。
而後還有一種狀況是對取整的進一步拓展,二次化,0和1,超過0的就是1,由於不少時候咱們須要關注它定性上的一些特性。再作一些擴展就是作Binning,就是作分塊,離散化,切到若干個bin裏面去,這個bin是等寬的,1到2,2到3,3到4 ,取值落到這裏面的個數是多少。另外還有一種分法是落入某個桶的分法平均,儘可能的平均,這樣橫軸就是平均的。
還有的時候取值的範圍跨度太大或過小,這時候就採用某種非線性的變化,好比說log的transformation,讓它在兩個有extreme的value range上相對來講更smooth一些,更有區分力。這也是非線性的一種經常使用手段。雖然它很是簡單,但實際上的效果是不錯的。List還有取平方或者開方。
最後一種是對數組作必定的normalization,有兩種方法:一種是minmax找到最小值最大值,把他們normalize到0到1之間,還有一種是作一個比較標準的正態化,就是減去mean 再除以var,但要對數據的分佈有個基本的瞭解。這裏有另外一種方法,是對數值向量作歸一化,這也是爲了防止數值上面一些outlier的點,主要仍是爲了數值上的穩定性。
這裏是一種特徵生成的方法,好比說原始特徵是X1,X2,經過兩兩交互可以生成新的特徵,也帶來必定的非線性。後面要講的推薦系統FFM本質上就是使用這樣的方法。
接下來是時間變量,本質上是一種連續值,可是實際上有一些特殊的處理,有時會忽略掉一些奇怪的問題,要注意一下。首先要注意一下時區的問題,是應該用local的時間仍是同一時區,要根據具體問題來定,還有夏令時的問題。具體要根據場景來定。時間是連續值,不少時候也要進行分段,有時候會有必定語義的分法,好比早上,中午,晚上這樣的切分。實際上對切分自己來講也能夠作成有重疊的, 好比說5點到9點是early morning,8點到11點是morning,這樣8點到9點就同時屬於兩個bin,這也是能夠的。第二個就是對它的某些時間趨勢作一個特徵,就是它所消耗的時間,上週所消耗的時間,或者是相對消耗時間上的一個變化。
4.時間空間特徵處理
還有一些場景下咱們關注一些特殊的時間,好比說節假日、雙十一。舉例來講這些作用電量的預測,那麼春節多是一個很是強的特徵。春節大城市的用電量會急劇降低,世界盃前、發工資又要作一些特殊的推薦多是實踐中須要考慮的東西。時間間隔:好比說上一次點擊廣告的時間,兩次點擊的間隔,由於會假設用戶的興趣會隨着時間變量發生變化。
和時間相對應的是空間上的變量,有多是GPS座標,也有多是語義上的地址、郵編、城市、省,或是與特定位置的距離。不少時候地點是連續的特徵流,每一秒可能都有GPS 的座標,他可能須要進行異常的監測,由於GPS並非那麼的精準可靠。也能夠基於外部資源強增地點信息:包括這個區域的人口狀況、收入狀況等。
接下來咱們看一下天然語言處理的特徵工程。文本本質上也是一種分類變量,因此他會有一些傳統的作法,好比說:Bag of words ,TF-IDF,也有比較新的Embedding 或Topic models。
Bag of words是One-Hot encoding的一種表達,TF-IDF是對Bag of words的一種簡單改進,它feature取值不只僅取決於出現或不出現,它但願在這個feature的取值上可以反映這個單詞對語義的相對重要性。Term Frequency 表明着一個詞若是在文檔中出現的次數越多,它可能的重要性越高。另一方面,若是這個詞在出現的文章個數越少,說明這個詞更有區分性或者越具備表明性。 因此TF表明的是Term Frequency,IDF是words出如今document 的Frequency,二者相乘是信息檢索領域對特徵取值進行re-weighting的一種常見的方法。
有了兩個文檔的TF-IDF向量以後,就能夠定義這個向量的類似性,能夠用Cosine來定義,Cosine能夠理解爲一個normalize的內積,把兩個特徵進行L2的正則,它們之間的關係就是內積,或者說是兩個向量之間的夾角。
Textual Similarity 是簡單的進行一些定量的計算,好比說從一個文本轉換成另外一個文本難易程度的一個計算。Word2vec其實是Embedding的一種方法,須要定義某種損失函數來學習,最終是哪一種損失函數知足最終咱們所指望的損失函數。Topic models本質上是進行某種矩陣的分解,目的是在高維的空間上進行低維的表達,可以更完整的刻畫數據,這個在推薦系統上也會用到。
協同過濾與推薦系統
推薦系統是一種很是普遍的機器學習的領域,和廣告系統密切相關。區別是業務上的邏輯,本質上算法能夠互相借鑑。
協同過濾本質是用別的用戶來爲這個用戶進行推薦和過濾,假設A和B在都看過的item很是類似,那麼A和B可能會share類似的list. 好比某些items 只有B看過,那麼A極可能和B會有相同的喜愛。Item多是廣告、電影、音樂等等。
舉例來講綠表明喜歡,紅色表明不喜歡,咱們要看一下該用戶對電視機的喜愛程度,什麼樣的用戶和他會比較像?咱們會注意到第二個和第三個用戶,咱們會借鑑第2、三個用戶的喜愛來猜想它在電視機上的喜愛,也意味着它喜歡第三個物品。
協同過濾分爲三個步驟:
用戶須要對某個物品表現出他的喜愛性。
用算法去找到和他比較類似的用戶。
基於用戶作一個推薦。
這是基於user的推薦,接下來還會舉例基於item的推薦。
首先他須要肯定一個度量方法,能夠度量user之間的類似性,也能夠度量item之間的類似性。假定這樣一個item都是使用一個特徵向量的表達,那麼它的類似性能夠經過歐氏距離或皮爾遜相關係數來度量。歐氏距離其實是最簡單的一種度量方式,但不少時候也是很是好用的方法。
假設兩個向量是n維空間的兩個點,那麼這兩個點的距離就是歐氏距離。距離咱們須要轉化爲類似性,有時候越小越好,有時候越大越好。因此咱們會用圖中的一個變化。本質上是把無窮區間投影到0,1區間。皮爾遜係數本質上也是刻畫二者之間的類似性。Cosine 也是基於內積的一個變化,若是在一個超球面上,它和歐氏距離有簡單的對應關係。有了這樣一個距離以後,咱們能夠找類似的label,有兩種找法:1.找最近的K個鄰居。2.找類似性小於或大於某種程度的一些鄰居。這兩種方法在實踐中都有使用。
Item-item Filtering:如今有用戶ABC和物品ABC, 咱們考慮是否要把物品C推薦給用戶C。咱們看物品C和哪個物品常常一塊兒出現,發現是物品A。用戶C被推薦了物品A,所以把物品C推薦給他。User-item Filtering 考慮對用戶A進行推薦,先找到和A類似的多是用戶C,看用戶C有說明額外的物品是用戶A不知道的,物品D是用戶A不知道的,那麼D就會推薦給A。這兩個多是不一樣的維度,用哪一種方法更好,也要看數據具體的特徵來定。
不管是哪一種方法都會有一些缺點:1.複雜度是O(n^2)的,會隨着用戶數和物品數增高。不管是用Item-item Filtering仍是User-item Filtering,自己feature vector的維度就很高,用來計算類似度或差別度的開銷就會更大,會有一個O(n)的增加。找類似的 item的作法有O(n)的複雜度;2.如何對新的用戶進行推薦。
因式分解機試圖來解決帶來的一些問題,這個工做是10年Steffen提出的,他從另一個角度來加強模型,同時也取得了很好的效果。他關注點在特徵間的協同做用,好比說將兩兩特徵組合起來。舉一個廣告的例子,他關心的是用戶是否有點擊這個廣告(1或者0),展現了用戶的一些特徵,國家、點擊的時間、還有廣告的類型,這是一個簡化的數據集,使用One-Hot encoding。
最簡單的方法是把全部特徵進行One-Hot 表達,也不對日期等別的特徵進行哈希等別的方法的處理。把這樣一個矩陣放回到推薦的系統中,好比用戶和電影的推薦,每行表明用戶和電影的關係,用戶和電影都進行了One-Hot 表達,時間作了一個normalization,y是好與很差。推薦系統除了協同過濾,另外一種方法是把它當成迴歸問題,那回歸問題X就是這些特徵,y就是rating,最簡單的一個模型就是線性迴歸。線性迴歸其實是賦予每一個特徵一個權重,而後相加,再加一個先驗。而後就獲得一個預測值,咱們但願預測值儘量的接近真實的y。
當只使用原始特徵時可能表達能力不夠強。好比說在USA且今天是Thanksgiving,這是一個很是重要的信息,咱們可能須要對這樣的特徵進行組合而後構造新的特徵。但這些組合空間可能會很是巨大,組合數是n方的關係。好比有200個國家,30個節日,再結合其餘特徵如站點,相乘就會很是巨大。咱們仔細觀察特徵組它們之間可能不是相互獨立的,有一些能夠share的參數,這些share的參數是一些很是重要的概念,在Hash Encoding、CNN、RNN上都會用到。好比說美國和Thanksgiving的組合,它與中國和中國的新年的組合很是有關聯,因此它們倆之間能夠用相同的latent factors進行刻畫。
找 latent factor傳統的技術是作矩陣因式分解,好比說咱們有很是大的矩陣是nm的,咱們經過找到兩個nk和km的矩陣相乘能夠重構出這樣一個nm的矩陣,就是SVD或者LSI,可能有不一樣的名詞可是有相同的作法。因此這個想法就被延展到了FFM上面,這裏最關鍵的想法是把wij定義成vi 乘以vj的內積,vi是k維上的一個元素,這樣的一個好處是把O(n^2)的複雜度降到O(n)的複雜度。因此wij就不是任意的一個參數,它是受限制的一個參數。因此FM能夠被表達成下面這樣一個式子,它不在是O(n^2)的複雜度,而是O(nk)這樣一個問題,k是一個可選的參數,不會隨着數據量或特徵的增加而變化。計算量看起來更大了,但實際上有不少計算是重複的,經過簡單的變化能夠變成O(nk)的複雜度。
總結一下它的優點:FM model 能夠線性時間來計算,它能夠和任何實數型的特徵向量一塊兒用,即便是在很是巨大的數據下它也能夠進行一些參數估計,還能夠作兩階的特徵組合。
由科賽推出的K-Lab在線數據分析協做平臺,已經爲你集成Python三、Python二、R三種主流編程語言環境,同步內置100+經常使用數據分析工具包(包括本文分享的Seaborn)。官網也聚合了豐富的數據資源,可直接登陸kesci.com,任選數據集,嘗試用Seaborn或其餘工具包開展數據分析。