機器學習實用指南(一):機器學習概覽
作者:LeonG
本文參考自:《Hands-On Machine Learning with Scikit-Learn & TensorFlow 機器學習實用指南》,感謝中文AI社區ApacheCN提供翻譯。
1. 什么是機器學習?
對于一個問題,我們有很多的解決方法,但是對于同一類型的問題難道我們都要自己來手動解決嗎?如果沒有一套完整的解決方案,問題會變得很復雜,比如垃圾郵件分類問題。
人可以識別什么是垃圾郵件,所以我們為郵件編寫一個分類規則,比如出現限時促銷 、在線賭場等字樣,我們就可以把它歸為垃圾郵件,這種方法稱為傳統方法。
但是這樣的結果就是:規則越來越復雜,錯誤率也很高
,那有什么辦法讓計算機自己分析郵件呢?
機器學習可以解決上述問題
我們先來看一下專家是怎么定義機器學習的:
機器學習是通過編程讓計算機從數據中進行學習的科學(和藝術)。
機器學習是讓計算機具有學習的能力,無需進行明確編程。 —— 亞瑟·薩繆爾,1959
計算機程序利用經驗 E 學習任務 T,性能是 P,如果針對任務 T 的性能 P 隨著經驗 E 不斷增 長,則稱為機器學習。 —— 湯姆·米切爾,1997
這是我個人的理解:計算機使用某種算法對已有的數據進行學習,并能夠分析新的數據得出合適的結論。
假設有一道初中數學題,那么初中生是怎么解決這道題目的?我們看看他的學習方式:
先找來已經解決過的類似的題目,然后把這些題目做出來,邊做邊總結方法,最后用總結出來的方法解決未知的題目。
將上圖類比到機器學習,紅色箭頭就是人類需要手動做的事情,尋找數據集,測試算法模型的準確度,而黑色箭頭則是機器學習自動完成的部分,自動分析數據,自動優化算法模型。
再將這個例子和機器學習做一個類比:
根據這兩幅圖,我們可以做出總結:
計算機通過數據來優化算法模型,優化后的算法模型用于解決新的實際問題。
那么,對于機器學習來說,最重要的兩個關鍵點就是: 數據
+ 算法
,機器學習和人類一樣,既需要足夠多的數據(知識),也需要良好的算法(學習方法)。
回到開頭的問題,那么相較于傳統的方法,機器學習的好處有哪些?
機器學習四大優勢:
-
簡化程序
機器學習省略了復雜的規則編寫,只需要設計出合理的算法,并給出合適的數據集,機器學習就能提供一個效果很好的算法模型。
-
自主學習
機器學習可以自動的學習,通過不斷的輸入數據,調整自己的參數,這一切都不需要人手動干預。
-
泛化能力
傳統的方法遇到了新的問題必須自己更新規則和計算方法,工作量很大。而機器學習可以自動學習新的規則。
-
數據挖掘
機器學習能夠分析出數據對結果的影響,而且能將隱藏的聯系展現出來,比如當地房價和政府對城市環保的投資力度有關。人很難分析出這種隱含的關系,而機器學習可以幫助我們。
2. 機器學習的類型
機器學習按照不同的標準可以分為很多種類,我們按照三種方式將其分類:
- 是否在人類監督下進行訓練(監督,無監督,半監督和強化學習)
- 是否可以動態漸進學習(在線學習 vs 批量學習)
- 是否只是通過簡單地比較新的數據點和已知的數據點,或者是在訓練數據中進行模式識別,以建立一個預測模型,就像科學家所做的那樣(基于實例學習 vs 基于模型學習)
根據是否在人類監督下進行訓練的標準我們可以分為以下三種類型:
(1)監督學習
在監督學習的訓練過程中,訓練的數據都包含了標簽,那什么是標簽呢?
很好理解,我們還是拿初中生學習的例子來說。
如果把一本習題集比作我們要學習的數據,那么習題集后面的參考答案就是標簽,它為我們做題目指引了方向,做錯了就改正,做對了繼續下一題,這種學習就是監督學習。
而監督學習一般又分為一下兩類任務:
-
分類
顧名思義,就是通過學習已經分好的數據,對新的數據進行分類。比如垃圾郵件分類器,就是先輸入帶有是否為垃圾郵件標簽的郵件,讓計算機進行學習,再對沒有分類的郵件進行判斷。上面有示意圖。
-
回歸
回歸就是預測目標數值,比如我想通過研究戴爾筆記本不同型號的配置,比如cpu、內存、顯卡和它們定價之間的聯系,然后來預測最新款的筆記本價格在什么范圍內,這就是預測。
預測new instance對應的value
(2)無監督學習
加了一個“無”字,意思就是沒有標簽咯?沒錯,無監督學習就是使用不帶標簽的數據進行學習。
這就奇怪了,如果做題目沒有答案給我參考,我怎么知道自己是不是做對了呢?
無監督學習中,數據是沒有標簽的或者是有一樣的標簽的。我們不知道數據的含義和作用,我們需要計算機自己進行分析和處理。
不用擔心看不懂,來看看無監督學習的幾個主要任務你就明白了。
-
聚類
聚類就是將數據自動分離成幾個部分,每個部分的內部都有相似之處。下面我們舉一個簡單的例子。
大家應該都喜歡看電影吧,一個人去看電影的孤獨想必大家都不想體會。假定你是一個大學生,那怎么樣才能在班上找到和自己興趣相投的電影愛好者呢?
我們可以收集一份班上同學的電影愛好表,然后按照大家的愛好信息將類型相近的同學分為一組,這樣我們就可以將所有的同學分成很多組,比如文藝片愛好者,動作片愛好者,科幻片愛好者。這就是一種聚類學習。
-
降維
降維就是剔除對數據影響較低的特征,優化數據的結構,減少數據的復雜度,還是舉一個例子。
你還是一個愛看電影的大學生,但是馬上要期末考了,不得不放下心愛的電影。由于你看電影上頭,所有的科目都還沒有復習,是不是要做一些取舍。
每一門課程對你來說重要程度肯定不一樣。比如影視鑒賞選修課,這一門聽學長說是穩過的,那我們就沒必要將精力集中在這門課上,可以從復習計劃中刪除。而高等數學成績直接影響了你整個大學生涯,所以我們要重視這門課。大學英語和專業英語是同類型課程,可以合并在一起學習。
這就是一種降維方法,將數據中不同的特征進行一些處理,分析哪些特征對結果的影響最大, 剔除對結果影響不大的特征,或者是將若干個特征進行合并,以便我們的算法更集中的分析重要的數據。
提示:在用訓練集訓練機器學習算法(比如監督學習算法)時,最好對訓練集進行降 維。這樣可以運行的更快,占用的硬盤和內存空間更少,有些情況下性能也更好。
-
異常檢測
我們常常使用無監督學習來分析數據里是否存在異常的數據,也就是不合群的數據。然后將這種數據剔除。
在正常的訓練過程中,遇到一個新的數據,我們也可以判斷這個數據是正常值還是異常值。
比如周末你閑賦在家,檢查了自己保存的所有電影票根,發現只有萬達影城的票特別貴,所以決定以后都不去萬達影城了。這就是異常檢測。
-
關聯規則
最后,另一個常見的非監督任務是關聯規則學習,它的目標是挖掘大量數據以找出數據特征之間的某些聯系。
例如,寒假期間你在電影院打工,善于觀察的你發現買了爆米花的人大概率也會買可樂,因此你推薦老板將爆米花和可樂做成套餐出售,這就是關聯規則。
(3)半監督學習
一些算法可以處理部分帶標簽的訓練數據,通常是大量不帶標簽數據加上小部分帶標簽數據。這稱作半監督學習。
我們假設喜歡看電影的你,同時也愛收藏票根。有一次你在家整理電影票根,發現一部分票根上面的影城信息磨損了。我們按照小票的顏色和格式將不同的票根分類(這一步是無監督學習的方法),然后再看每一類中沒有磨損的票根上面的影城信息,就能推導出每張票來自哪個影城了。(這一步是監督學習的方法)。
所以我們會發現:
多數半監督學習算法是非監督和監督算法的結合。
(4)強化學習
強化學習非常不同。學習系統在這里被稱為智能體(agent),可以對環境進行觀察,選擇和執行動作,獲得獎勵或懲罰。然后它必須自己學習哪個是最佳方法(稱為策略,policy),以得到長久的最大獎勵。策略決定了智能體在給定情況下應該采取的行動。
AlphaGo就是強化學習的典型代表,它通過不斷的試錯,最后得出一套完整的圍棋制勝策略,打敗了人類的最高水平。
另一個用來分類機器學習的準則是,它是否能從導入的數據流中進行持續的學習。
(1)批量學習
批量學習是一次性將所有的數據進行學習,這樣一般會占用很多的時間和計算資源,計算完了之后再開始使用。一般的學習方式都是批量學習,因為方法簡單。
舉個例子,初中數學書是人教版的,如果我們把人教版的書和習題全部學習一遍,再去考試,這就是批量學習,學習是一次性的。
假如考試范圍不僅僅是人教版的,還有蘇教版呢,那這個學生又要重新學習一遍蘇教版的內容。
這就是批量學習的不足之處,,用全部數據訓練需要大量計算資源(CPU、內存空間、磁盤空間、磁盤 I/O、網絡 I/O等等)。如果你有大量數據,并讓系統每天自動從頭開始訓練,就會開銷很大。如果數據量巨大,甚至無法使用批量學習算法。最后,如果你的系統需要自動學習,但是資源有限(比如,一臺智能手機或火星車),攜帶大量訓練數據、每天花費數小時的大量資源進行訓練是不實際的。
(2)增量學習
增量學習也叫在線學習,持續性學習,顧名思義,就是持續地輸入數據,算法根據每次輸入的數據進行相應的調整。每一個學習步驟都很快而且開銷很小。所以系統可以動態的學習新的數據。
也可以當機器的內存存不下大量數據集時,用來訓練系統(這稱作核外學習,out-of-core learning)。算法加載部分的數據,用這些數據進行訓練,重復這個過程,直到用所有數據都進行了訓練。
還有一種分類標準是判斷它們是如何進行歸納推廣的。分為基于實例的學習和基于模型的學習。
基于實例的學習是直接對數據進行記憶,然后用相似度的方式來推廣至新的數據。比如K近鄰、樸素貝葉斯。
基于模型的學習則是先選擇合適的模型,再用數據對模型進行訓練。比如多元線性回歸、支持向量機、深度學習。
比如線性回歸算法,就是先假定數據符合?這樣一個線性的擬合函數。然后通過調整?和?的值,擬合訓練數據:
3. 機器學習面臨的主要問題
簡單的來說,機器學習面臨的主要問題來自兩個方向,也就是機器學習最最重要的兩個關鍵點:數據
+ 算法
-
訓練數據少
如果一個學生只學了幾道題目就參加期末考試,那他可能會考得一塌糊涂,計算機也是這樣,如果訓練數據太少了,多數機器學習算法就無法正常工作。
即便對于一些非常簡單的問題,也需要數千的樣本。而對于復雜的問題,比如圖像、語音識別,則可能需要數百萬的樣本。
在2001年的一篇論文中,作者研究了不同算法在數據量級增加時表現出的性能,實驗證明一旦有大量數據進行訓練,不同算法之間的差異會大大減小。這就是傳說中的天賦不夠,努力來湊吧。
-
數據沒有代表性
數據具有代表性是非常重要的。舉個例子,如果很多人都跟你吐槽最近上映的一部電影很爛,你接收到的信息都是關于這部電影的缺點,那么你很有可能再還沒有看之前就把這部電影判了死刑。
使用了沒有代表性的訓練集,我們就會得出與事實不太相符的結論。書上也舉了一個很好的例子。
一個樣本偏差的著名案例
也許關于樣本偏差最有名的案例發生在 1936 年蘭登和羅斯福的美國大選:《文學文摘》做了一個非常大的民調,給 1000 萬人郵寄了調查信。
得到了 240 萬回信,非常有信心地預測蘭登會以 57% 贏得大選。然而,羅斯福贏得了 62% 的選票。
錯誤發生在《文學文摘》的取樣方法:
首先,為了獲取發信地址,《文學文摘》使用了電話黃頁、雜志訂閱用戶、俱樂部會員等相似的列表。所有這些列表都偏向于富裕人群,他們都傾向于投票給共和黨(即蘭登)。
第二,只有 25% 的回答了調研。這就又一次引入了樣本偏差,它排除了不關心政治的人、不喜歡《文學文摘》的人,和其它關鍵人群。這種特殊的樣本偏差稱作無應答偏差。
-
低質量數據
有的數據具有明顯的異常或是缺失關鍵信息,那么這種數據就是低質量數據。系統檢測出潛在的數據規律難度就會變大,性能就會降低。事實上這個問題很嚴重,所以實際工作中我們要花很多時間在數據清洗上。
-
不相關的特征
有的數據特征跟你的結論毫無關聯,就需要剔除掉。
比如影響你期末成績的課程有數學、英語、專業課,但是不應該包括你喜歡的游戲類型,如果你把你喜歡的游戲類型加進來一起分析,可能得不到任何正面的作用。
機器學習項目成功的關鍵之一是用好的特征進行訓練。
現在數據造成的問題我們已經分析完了,再看看算法會導致的問題。
-
欠擬合訓練數據
假如你的算法模型過于簡單,那么就不能得到很好的擬合效果。
比如我們想研究每個月電影上映的數量。如果用一個線性的模型來擬合顯然是不合適的,每個月上映的電影數量跟月份并不是簡單的線性關系,這樣就會出現欠擬合的現象。
解決這個問題的選項包括:
選擇一個更強大的模型,帶有更多參數
用更好的特征訓練學習算法(特征工程)
減小對模型的限制
-
過擬合訓練數據
相反,過擬合就是指由于訓練數據包含抽樣誤差,訓練時,復雜的模型將抽樣誤差也考慮在內,將抽樣誤差也進行了很好的擬合。
具體表現就是最終模型在訓練集上效果好;在測試集上效果差。模型泛化能力弱。
用數學老師的一句話描述過擬合:
同樣的題目教了無數遍,我換兩個數字你們就不會做了??
可能的解決方案有:
簡化模型,可以通過選擇一個參數更少的模型(比如使用線性模型,而不是高階多項式模型)、減少訓練數據的屬性數、或限制一下模型
收集更多的訓練數據
減小訓練數據的噪聲(比如,修改數據錯誤和去除異常值)
4. 測試和確認
講了這么多,那如何判斷一個算法模型得出的結論是好還是壞呢?一種比較常見的方法是將數據分為訓練集和測試集兩個部分。
用訓練集訓練算法模型,再用測試集測試準確率。
還是以初中生學習作為例子,一本習題冊分為10個部分,前8個部分作為學習部分,我們邊做邊對答案,然后總結解題的思路。后面2個部分作為測試,測試完之后的得分情況就代表自己對這種題目的掌握程度。
因此,評估一個模型很簡單:只要使用測試集。現在假設你在兩個模型之間猶豫不決(比如一個線性模型和一個多項式模型):如何做決定呢?一種方法是兩個都訓練,然后比較在測試集上的效果。
我們通過修改一些超參數(不能通過學習來自動調整的參數)來降低誤差,但是這種方法在實際中的應用效果卻并沒有想象的那么好。
這是因為超參數都是基于測試集來調整的,就相當于把測試集當成了訓練超參數的數據。這樣對于新的數據效果不一定會更好。
解決辦法是:
保留一個數據集作為驗證集,在這些步驟做完之后再進行最終的驗證。
類比到學習問題上就是對一本習題集進行反復學習,然后做很多的模擬測試來適應考試狀態,最后進行一次考試,這樣才能檢測出你真實的學習水平。
但是這種方法會減少訓練集,有一種比較常用的方法是交叉驗證法,這里不過多贅述,在后面的章節會學習到。
交叉驗證法:訓練集分成互補的子集,每個模型用不同的子集訓練,再用剩下的子集驗證。一旦確定模型類型和超參數,最終的模型使用這些超參數和全部的訓練集進行訓練,用測試集得到推廣誤差率。
最后解決一個許多新手都有的疑惑,機器學習發展了這么多年,有沒有一種萬能的算法能解決所有的學習問題?
這就好比問數學老師,有沒有一種方法能解題思路能解開所有的數學題目?
答案是不能。在1996年的一篇著名論文中,David Wolpert證明沒有一種機器學習算法能解決所有的問題,這稱作沒有免費午餐(NFL)公理。
對于一些數據集,最佳模型是線性模型,而對其它數據集則是神經網絡。沒有一個模型可以保證效果更好(如這個公理的名字所示)。所以機器學習首先面臨的問題是:
到底選擇哪一種機器學習算法得到的效果更佳?
歡迎來我的博客留言討論,我的博客主頁:LeonG的博客
本文參考自:《Hands-On Machine Learning with Scikit-Learn & TensorFlow機器學習實用指南》,感謝中文AI社區ApacheCN提供翻譯。
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。