一、 什麼是Machine Learning
機器學習,簡單來說就是從曆史數據中學習規律,然後将規律應用到未來中。國内大家一緻推薦的,南京大學周志華教授的機器學習教材西瓜書裡面如此介紹機器學習。
機器學習是機器從曆史數據中學習規律,來提升系統的某個性能度量。
機器學習,是一個非常寬泛的概念,它是一門學科。你可以理解為和數學、物理一樣的學科。
簡單點講:
大家從小到大都學習過數學,刷過大量的題庫。老師和我們強調什麼?要學會去總結,從之前做過的題目中,總結經驗和方法。總結的經驗和方法,可以理解為就是機器學習産出的模型,然後我們再做數學題利用之前總結的經驗和方法就可以考更高的分。有些人總結完可以考很高的分,說明他總結的經驗和方法是對的,他産出的的模型是一個好模型。
複雜點講:
比如說金融領域,利用機器學習來構建一個反欺詐模型。銀行做金融貸款業務時,很多客戶是欺詐客戶,專門來騙取貸款的。根據曆史上還款的好客戶和首次即逾期的欺詐客戶的數據,去找出“好客戶”的特征和“欺詐客戶”的特征,然後利用機器學習構建一個模型來區分出客戶的欺詐度。模型的好壞決定了識别客戶欺詐的能力。
學術界:
上圖是周志華教授的西瓜書裡面對于機器學習的解釋,機器學習是研究“學習算法”的學問。
工業界:
但實際上到了工業界,很多時候問題并不是如何研究“學習算法”,而變成如何應用了,算法很多時候都是現成的,關于這個問題的算法人們早研究透了。但就和物理一樣,牛頓一二三定理加上各種公式都給你了,你還是不會解題。一個是理論物理和一個是應用物理。
當你有了學習算法,你在工業界實際應用的時候,你還得做特征工程,做訓練和評估等等。最後才能産生一個效果不錯的模型。而在工業界很多應用機器學習的場景下,實際上後者的重要性大于前者(此部分後面會專門介紹)。
總結來說:機器學習,是一門研究如何讓計算機從曆史數據中去更好地學習,從而産生一個優秀模型可以提升系統某項性能的學科。但實際應用遠遠不是研究算法這麼簡單。
1.1 機器學習名稱的由來
專門提一下機器學習為什麼叫機器學習。
機器學習這些年在國内很火,其實機器學習在國際上研究很久了,1952年一位IBM的工程師Arthur Samuel研發了一個西洋跳棋程序,然後一些知名的棋手都輸給了這個程序,有點像上個世紀50年代的阿法狗。後來1956年,這位工程師受邀,在達沃斯會議上介紹自己的這項研究,第一次提出了“Machine Learning”這個詞彙, Arthur Samuel也因為被稱為“機器學習之父”,他将“Machine Learning”定義為“不需要确定性編程就可以賦予機器某項技能的研究領域“,讓機器像人一樣學習起來。
1.2 機器學習與AI、深度學習、強化學習的關系
這是矽谷的一位工程師的調侃:AI和機器學習的區别。AI基本上都是PPT,而機器學習是真材實料用Python寫出來的。這雖然是調侃,但卻是當前人工智能發展的現狀。所有人都在吹噓AI,自己的AI多麼牛逼,但都是僅限于PPT層面,等到落地的時候就沒有那麼神話了,很多時候都是打着AI的噱頭。
用上圖清晰地給大家介紹彼此之間的關系:人工智能包含機器學習,機器學習又包含強化學習和深度學習等。目前人類所研究的AI還是弱人工智能,電影裡面看到的那種機器完全和人類一樣去思考、行動的智能還遠遠達不到。然後強化學習和深度學習都是機器學習裡面的兩個子技術,兩個不同研究領域。可以通俗地理解為物理學裡面的力學和電學。
那物理學除了電和力,還有光學、磁場等等。所以機器學習技術中還有很大一部分是“高維特征大數據建模”。其實現在我們在工業界專門提“機器學習”技術,更多地指的是我所列出來的第三部分“高維特征大數據建模”。前兩者我們不會說機器學習技術,而是直接說強化學習和深度學習。
1.3 機器學習構建模型泛化的步驟
下面主要講述高維特征大數據建模的一些泛化步驟。
以下是正常一位數據科學家進行建模的步驟:
步驟一定義問題:
首先客戶的問題是什麼?客戶想利用機器學習構建模型來滿足什麼需求?比如在金融反欺詐領域,銀行的需求就是能不能構建一個模型,來區分出欺詐客戶和正常客戶。有了這個模型,就可以盡可能地降低銀行的信貸逾期風險。再比如在零售領域,電商APP的需求是在推薦欄目為用戶主動推薦一些商品,提高用戶對于該頁面商品的點擊率、加購率以及下單率。
定義問題決定了兩件事情,第一件事情是決定了數據科學家要用什麼算法來構建模型;反欺詐場景下基本用的都是GBDT算法,而推薦場景下基本用的都是協同過濾算法。這些算法本身都已經很成熟了,在這些場景下也得到了大量的應用和驗證。這就和物理中力學場景下離不開牛頓三大定律一樣,定律本身已經成熟了,就看你怎麼用。很多時候人們吐槽數據科學家是調包俠就是因為這些算法是有現成的包的,科學家們隻需要在程序裡面調用一下就行了,當然實際工作要比這複雜的多。
第二件事情是決定了數據科學家如何來評估模型的好壞。模型沒有對錯之分,隻存在效果的好壞之分。那在反欺詐場景下,哪個模型能夠将正常客戶和欺詐客戶分類的最準确,哪個模型的效果就好。而在推薦場景下,那麼就是同時對模型進行一段時間的觀察,哪個模型為用戶推薦的商品,用戶的點擊率下單率更高,哪個模型的效果更好。
步驟二收集數據:
定義完問題後,我們需要收集數據,數據質量的好壞,對模型效果的影響非常大。根據場景下,我們需要使用的數據不一樣。比如反欺詐場景下,我們需要使用到用戶的基本信息、曆史還款信息等,這裡面包含正常用戶和欺詐用戶的,二者的信息都需要。正常情況下,用戶的數據都會分布在數據庫不同的表裡面,為了建模的方便,通常我們都是合并成一張大寬表。
數據清洗:很多時候曆史數據比較亂,有很多髒數據,比如說某條記錄是測試人員當時測試時候的數據,并不是真實數據,那這種數據我們就要剔除掉。還有就是數據缺失,很可能某些記錄的某些字段内容缺失,這時候就需要看能不能補充。還有很多時候數據字段意義不統一,比如說在某個時間點前,數據庫裡面性别是男女,而這個時間點後性别變成了AB,A代表男,B代表女,這時需要把字段意義統一。數據清洗很多時候占據着數據科學家們大量時間。
數據标注:清洗完數據後,有的時候我們甚至還需要進行數據标注。比如在反欺詐場景下,大寬表裡面一條客戶的記錄,到底是正常用戶還是欺詐用戶,有的時候數據庫裡面沒有對這些數據進行分類,我們還需要人工地去判斷這條記錄應該屬于哪個label的客戶。
數據抽樣:數據抽樣一般是因為曆史數據太多了,而且有的曆史數據太久遠不具有參考意義。所以我們一般都是選擇近期的用戶數據。如果數據還是太多,導緻訓練時間太長,我們就會采用随機抽樣的方法,再從近期的用戶數據中,随機抽取XX%的數據出來。
數據切分:就是将我們抽樣出來的數據分為訓練集和測試集,我們在訓練集上進行訓練,測試集上面測試我們模型的效果。必須要區分開訓練集和測試集,不可能一個數據集既作為訓練集又作為測試集。就相當于,你準備考試的模拟試卷你拿來練習,結果考試的試卷就是模拟試卷,那沒辦法反映出你真實的水平。一般我們訓練和測試集的比例是9:1。但實際工作中這個比例也不是固定的。
數據穿越:數據穿越是科學家建模在挑選數據的過程中常見的一個問題。比如說現在這個時間點2020.2.23日我們需要構建一個反欺詐模型,來判斷2019.2.1日開始的用戶是正常用戶還是欺詐用戶。那麼我們隻能使用2019.2.1日之前的曆史用戶數據來進行訓練,而不能使用截止到2020.2.23日的用戶數據,因為此時此刻我們已經知道了絕大部分2019.2.1日的用戶是正常用戶還是欺詐用戶,用截止到此時此刻的數據來訓練模型就相當于作弊,訓練出來的模型效果很好也不具備參考價值。很多情況下數據科學家還會遇到一個問題就是沒有曆史數據。是的,這種情況也經常有。沒有積累曆史數據,或者曆史數據太少幾乎等于沒有,那麼怎麼辦?這個時候就直接照搬同樣場景下另外一個項目的模型直接用,這種我們叫做“冷啟動”。因為相同場景下,模型大同小異,可以直接先用着曆史其他項目的模型。然後再積累一段時間的數據後,再根據該場景下的積累的曆史數據對模型進行調優。
步驟三特征工程:
特征工程是工業界建模中最最最重要的一個模塊。模型效果的好壞,一部分是由數據質量決定的,另一部分是由特征工程決定的。
什麼是特征工程?我們如何評估一個用戶是否是欺詐用戶還是正常用戶,那麼我們就需要找到這二者在哪些特征上表現存在明顯差異,通過這些特征來進行區分。尋找特征來有效的區分不同label的樣本,這個就是特征工程。
反欺詐場景下,用戶的曆史還款行為就是一個有效的特征來判斷該用戶是否是欺詐用戶。如果用戶曆史經常逾期,那麼用戶欺詐的可能性就大,用戶曆史都正常還款,欺詐的可能性就低。除了該特征,用戶所在的地域、年齡、是否已婚、經濟情況、受教育成都、職業等等都是有效特征。數據科學家們在建模中都會加入這些特征。
很多時候數據科學家還要去請教業務專家,和業務專家調研他們在做實際業務中,發現不同label的用戶在哪些特征上表現差異化比較明顯。業務專家懂業務,有很多經驗規則是數據上面看不出來的,就需要業務專家的輸入。業務專家的輸入,可以讓科學家們鎖定到一些有效的特征上,而舍棄一些無效的特征,對建模過程起到一定的指導作用,提高了效率。
同時數據科學家們還會構建一些組合特征,将很多特征組合在一起構成一個新的特征。一方面是因為曆史數據特征本身可能不多,另一方面是單獨某兩個特征判斷不了什麼但當結合在一起成為一個新的特征時有時卻可以反映出一些有價值的信息。
所以為了構建一個高維特征的模型,實際建模中科學家們會将很多特征組合在一起構造一些原本曆史數據中沒有的特征。就像我們隻通過兩三個特征去評估一個人好壞,是很難評估的,容易片面。當我們通過成百上千個特征去評估時就比較客觀。特征工程很多時候科學家們會做很多組不同的特征工程,因為有時候科學家們也無法判斷哪一組更好,就多幾種可能性,放到模型訓練中去訓練。
步驟四模型訓練:
構建完特征工程後,科學家們開始要生成初版的模型,模型的表現形式是一個函數。假設在反欺詐場景下,函數為z=ax by c這麼一個函數,x和y是特征,a、b、c就是參數,z是結果。當z大于0時,用戶為正常用戶,z小于等于0時,用戶為欺詐用戶。(為了方便大家理解,這邊舉了一個比較簡單的函數。實際反欺詐場景下,我們使用的是邏輯回歸函數)
那麼模型訓練什麼?模型訓練就是訓練參數。最開始的時候我們會對a、b、c設置一個初始值,假設都設置為1。接下來我們就需要通過步驟二裡面的訓練數據來訓練模型,不停地調整我們的參數。訓練的過程可以理解為就是不停地嘗試各種參數組合,使得每條用戶記錄評估出來的z的值和用戶真實z的值接近。當然嘗試是有技巧性的嘗試,而不是窮舉,模型訓練的方式有梯度下降法等等,在此不詳細叙述。實際工作中每一次模型訓練的時間,短的以天為單位,長的甚至可能以周為單位。對的不誇張,正常情況下每一次模型訓練的時間都要很長,計算機要不停地高速運轉去計算。
實際模型訓練當中經常出現的一個問題叫做過拟合Overfitted。
就是為了在訓練集上面達到一個好的效果,而構造出來像上圖這樣的模型。該模型在訓練集上面會有不錯的效果,但是在測試集上大概率會效果不佳,比較好的模型表現是上圖的Good Fit。所以實際訓練中我們不能過于地考慮訓練集中的某些特征和某些樣本。不然模型的泛化能力會比較差,測試集上效果不佳。
模型訓練很多情況下,數據科學家們都會訓練好幾版模型出來,這幾版模型在訓練集上表現差異不大,但特征工程等不一樣,最後統一拿到測試集上進行評估。
步驟五模型評估:
步驟四訓練出來的模型,我們如何來評估模型效果的好壞?就需要在測試集上面進行驗證了。分類模型評估最經常使用的兩個指标就是查全率Precision Rate和召回率Recall Rate。假設現在測試集有100個用戶,90個為正常用戶,10個為欺詐用戶。我們的目的是為了把測試集裡面的欺詐用戶全部找出來,下圖為預測結果:
我們可以發現,一共10個欺詐用戶,模型挑出來了8個欺詐用戶,查全率Recall Rate=8/10=80%,模型把80%的欺詐用戶都找出來了。但是模型将10個用戶誤判成了欺詐用戶,查準率Precision Rate=8/18。我們在評估模型效果好壞的時候會綜合考慮Recall Rate和Precision Rate一起評估。不同模型評估的指标完全不一樣,剛剛列舉的模型評估指标隻是分類模型的一種評估指标。
步驟五介紹了,一般數據科學家會訓練出好幾版模型出來,我們會挑選在測試集上表現最好的模型作為最終的模型。
步驟六模型應用:
我們将效果最好的模型部署到實際的生産環境中去進行使用。實際生産環境中效果的好壞,才是對模型真正的考驗。即使模型在測試集上表現效果很好,有可能生産環境下效果表現一般。因為用戶的行為等不停地在發生變化,數據也在更新,以前的一些特征工程可能不再适用于當下的環境。所以即使上線後,數據科學家們也會持續地關注模型的表現,再根據新積累的數據不斷地對模型進行調優,總之這是一個不斷更新叠代的過程,并不能一勞永逸。
本文由 @King James 原創發布于人人都是産品經理。未經許可,禁止轉載。
題圖來自 Unsplash,基于 CC0 協議
,