關于機器學習你要了解的5件事
在任何快速發(fā)展的話題上,總是有一些新的東西可以學習,機器學習也不例外。這篇文章將指出5件關于機器學習的事,5件你可能不知道的,可能沒有意識到,或是可能曾經(jīng)知道,現(xiàn)在被遺忘了。
請注意,這篇文章的標題不是關于機器學習的"最重要的5件事情"或"前5件事";這只是"5件事"。它不具有權威性的,也并不是事無巨細的,僅僅是5件可能有用的東西的集合。
1.數(shù)據(jù)準備是機器學習的80%,所以……
在機器學習任務中,數(shù)據(jù)準備花費了很大一部分的時間;或者,至少花費了一個看似很大一部分的時間。許多人都是這樣認為的。
我們經(jīng)常討論執(zhí)行數(shù)據(jù)準備時的細節(jié)以及其重要性的原因;但除了這些之外,我們還應該關注到更多的東西。那就是為什么我們應該關心數(shù)據(jù)準備。我的意思不是僅僅為了得到一致性的數(shù)據(jù),但更像一個哲學性的謾罵,以便讓你明白為什么應該接受數(shù)據(jù)準備。做好數(shù)據(jù)準備工作,做一個有數(shù)據(jù)準備的人。
CRISP-DM模型中的數(shù)據(jù)準備。
我可以想到的一些關于機器學習最好的建議就是,既然你注定要為一個大項目花非常多的時間準備數(shù)據(jù),那么決心做一名最好的數(shù)據(jù)準備的專業(yè)人士,是一個相當好的目標。因為它不僅僅只是費時費力的工作,數(shù)據(jù)準備其實對對后續(xù)的步驟(無效數(shù)據(jù)的輸入、無效數(shù)據(jù)的輸出等)有很大的重要性,并且因為作為一個糟糕的數(shù)據(jù)準備人員而產(chǎn)生壞名聲也不會是世界上最糟糕的事情。
所以,是的,雖然數(shù)據(jù)準備可能需要一段時間來執(zhí)行和掌握,但這真的不是一件壞事。在數(shù)據(jù)準備存在的必要性中有著很多機會,無論是對一名脫穎而出的專業(yè)人士,還是展現(xiàn)你工作能力很強的內在價值。
2.性能基線的值
當你用一個特定的算法模擬了一些數(shù)據(jù),并且花了很多時間來調整你的超參數(shù),執(zhí)行一些工程特點和/或著挑選;你很高興,因為你已經(jīng)鉆研出了如何訓練準確性,比方說,準確性是75%。你對自己完成的工作十分滿意。
但是,你將你得到的結果與什么進行了比較?如果你沒有基線——一個比拇指規(guī)則都簡單的完整檢查來比較你的數(shù)據(jù)——然后你實際上并沒有把那些辛勤勞動的結果與任何東西進行比較。所以就有理由理所當然的認為任何準確性在沒有與其他數(shù)據(jù)比較時都是有價值的了么?顯然不是。
隨機猜測不是基線的最佳方案;相反,的確存在廣為接受的用于確定比較基準精度的方法。例如,Scikit-learn在其DummyClassifier的分類中提供了一系列基線分類器:
- stratified 通過尊重訓練集類分布來生成隨機預測。
 - most_frequent總是預測訓練集中最頻繁的標簽。
 - prior總是預測最大化優(yōu)先級的類(像most_frequent')和"predict_proba返回類的優(yōu)先級。
 - uniform隨機生成預測。
 - constant總是預測用戶提供的常量標簽。
 
基線也不僅是分類器;例如,基線回歸任務中也存在統(tǒng)計方法。在探索性數(shù)據(jù)分析、數(shù)據(jù)準備和預處理之后,建立基線是機器學習工作流程中的一個合乎邏輯的下一步。
3.驗證:不止于訓練和測試
當我們建立機器學習模型時,我們訓練他們使用訓練數(shù)據(jù)。當我們測試結果模型時,我們使用測試數(shù)據(jù)。那么驗證是在哪里出現(xiàn)的呢?
fast.ai的Rachel Thomas最近寫了一篇關于如何以及為什么創(chuàng)建良好的驗證集的文章,并介紹了以下3類數(shù)據(jù):
- 用于訓練給定模型的訓練集
 - 用于在模型之間進行選擇的驗證集
 
(例如,隨機森林和神經(jīng)網(wǎng)絡哪個更好地解決了您的問題?你想要一個有40棵或者50棵樹的隨機森林嗎?)
- 告訴您您的工作方式的測試集。如果你嘗試了很多不同的模型,你可能會得到一個很好的驗證集,但這只是偶然的,因為總有一個測試集不屬于這樣的情況。
 
因此,將數(shù)據(jù)隨機拆分為測試、訓練和驗證集一定是個好主意嗎?事實證明,答案是否定的。雷切爾在時間序列數(shù)據(jù)的文中解答了此問題:Kaggle目前正努力解決預測厄瓜多爾雜貨店銷售量的預測問題。Kaggle的"訓練數(shù)據(jù)"從2013年1月1日運行到2017年8月15日,測試數(shù)據(jù)跨越了2017年8月16日到2017年8月31日。使用2017年8月1日到8月15日作為您的驗證集不失為一種好的方法,并且所有早期的數(shù)據(jù)也可以作為您的訓練集。
這篇文章的其余部分將涉及到分裂到Kaggle競爭數(shù)據(jù)的數(shù)據(jù)集,這是十分實用的;并且我將會把交叉驗證納入討論,讀者可以按照我的方法自行探究。
其他許多時候,數(shù)據(jù)的隨機分割會是有用的;它取決于進一步的因素,如當你得到數(shù)據(jù)時數(shù)據(jù)的狀態(tài),(它是否已被分為訓練/測試數(shù)據(jù)?),以及它是什么類型的數(shù)據(jù)(見上面的時間序列分類)。
對于什么條件下隨機拆分是可行的,Scikit可能沒有train_validate_test_split的方法,但您可以利用標準的Python庫來創(chuàng)建您自己的方法。
4.集成方法可比樹還要多
選擇算法對于機器學習新手來說可能是一個挑戰(zhàn)。在構建分類器時,特別是對于初學者來說,通常采用一種方法來解決單個算法的單實例問題。然而,在給定的情況下,把分類器串聯(lián)或是組合起來會更加有效;這種方式使用了投票、加權、和組合的技術,以追求最準確的分類器。集成學習就是用多種方式來提供此功能的分類器。
隨機森林是集合學習者的一個非常重要的例子,它在一個預測模型中使用許多個決策樹。隨機森林已成功地應用于各種問題,并據(jù)此取得了很好的效果。但它們不是唯一存在的集成方法,許多其他的也值得一試。
關于套袋操作的簡單概念:建立多個模型,觀察這些模型的結果,并解決大多數(shù)的結果。我最近有一個關于我的車后橋總成的問題:我沒有采取診斷問題的經(jīng)銷商的建議,并且我把它帶到其他兩個修車的地方,這兩個都認為這個問題是和經(jīng)銷商所提出的不同問題。這就說明,套袋在實際生活中的運用。隨機森林就是基于套袋技術所改進的。
加速類似于套袋,但有一個概念上的略微不同。它不是將相等的權重分配給模型,而是增加了對分類器的權重分配,并導出了基于加權投票的最終結果。再以我的汽車問題為例,也許我過去曾多次去過一個修車行,并且比其他人更信任他們的診斷。同時假設我之前并沒有和經(jīng)銷商有過互動或打過交道,并且相比較而言我更不相信他們的能力。我分配的重量將是反射性的。
堆疊與前兩個技術有所不同,因為它訓練多個單一分類器,而不是各種相同的學習者的集合。雖然套袋和加速使用了許多建立的模型,使用了相同的分類算法的不同實例(如決策樹),但堆疊建立模型也使用了不同的分類算法(比如決策樹,邏輯回歸,一個ANNs或其他的組合)。
然后,通過對其他算法的預測,對合并算法進行訓練,以得到最終的預測。這種組合可以是任何集成技術,但邏輯回歸往往被認為是一個來執(zhí)行這一組合最充分和最簡單的算法。隨著分類的進行,堆疊也可以在非監(jiān)督學習任務(如密度估計)中使用。
5.谷歌Colab?
最后,讓我們來看看一些更實用的東西。Jupyter Notebook事實上已成為數(shù)據(jù)科學開發(fā)最實用的工具,大多數(shù)人都在個人電腦,或者通過一些其他配置——比較復雜的方法(如在Docker容器或虛擬機中) 運行該軟件。首先第一個受到關注的就是谷歌的Colaboratory,它允許Jupyter風格和兼容的Notebook直接運行在您的Google驅動器中,不需要任何配置。
Colaboratory是預先配置了一些近期較為流行的Python庫,并通過支持的打包管理,使其可以把自己安裝在Notebooks中。例如,TensorFlow就屬于這一類,但Keras不是;但通過pip安裝Keras僅需要幾秒鐘的時間。
在這一問題上的好消息就是,如果你使用的是神經(jīng)網(wǎng)絡,你可以在你的訓練中啟用GPU硬件加速,開啟一次就可以享受長達12小時的免費服務。這個好消息其實并沒有它一開始看起來那么完美,但這也算是一個額外的好處,也是一個全民化GPU加速的良好開端。


















 
 
 






 
 
 
 