作者:射命丸咲 Python 與 機器學習 愛好者
知乎專欄:https://zhuanlan.zhihu.com/carefree0910-pyml
個人網站:http://www.carefree0910.com
往期閱讀:
從零開始學人工智慧(16)--Python · 決策樹(四)· 樹
從零開始學人工智慧(15)--Python · 決策樹(三)· 節點
從零開始學人工智慧(14)--Python · 決策樹(二)· 節點
從零開始學人工智慧(13)--Python · 決策樹(一)· 準則
從零開始學人工智慧(12)--Python · 決策樹(零)· 簡介
「機器學習」在最近雖可能不至於到人盡皆知的程度、卻也是非常火熱的詞彙。機器學習是英文單詞「Machine Learning」(簡稱ML)的直譯,從字面上便說明了這門技術是讓機器進行「學習」的技術。然而我們知道機器終究是死的,所謂的「學習」歸根結底亦只是人類「賦予」機器的一系列運算。這個「賦予」的過程可以有很多種實現,而 Python 正是其中相對容易上手、同時性能又相當不錯的一門語言。作為綜述,我們只打算談談機器學習相關的一些比較寬泛的知識,介紹與說明為何要使用 Python 來作為機器學習的工具的工作則交給下一篇文章來做。而在最後,我們會提供一個簡短易懂的、具有實際意義的例子來給大家提供一個直觀的感受。
目錄:
人生苦短,我用 Python
第一個機器學習樣例
「緒論」小結
什麼是機器學習?正如前面所說,由於近期的各種最新成果、使得「機器學習」成為了非常熱門的詞彙。機器學習在各種鄰域的優異表現(圍棋界的Master是其中最具代表性的存在),使得各行各業的人們都或多或少對機器學習產生了興趣與敬畏。然而與此同時,對機器學習有所誤解的群體也日益壯大;他們或將機器學習想得過於神秘、或將它想得過於萬能。然而事實上,清晨的一句「今天天氣真好」、朋友之間的寒暄「你剛剛是去吃飯了吧」、考試過後的感嘆「複習了那麼久終有收穫」……這些日常生活中隨處可見的話語,其背後卻已蘊含了「學習」的思想——它們都是利用以往的經驗、對未知的新情況做出的有效的決策。而把這個決策的過程交給計算機來做、可以說就是「機器學習」的一個最淺白的定義。
我們或許可以先說說機器學習與以往的計算機工作樣式有什麼不同。傳統的計算機如果想要得到某個結果、需要人類賦予它一串實打實的指令,然後計算機就根據這串指令一步步地執行下去。這個過程中的因果關係非常明確,只要人類的理解不出偏差、運行結果是可以準確預測的。但是在機器學習中,這一傳統樣式被打破了:計算機確實仍然需要人類賦予它一串指令,但這串指令往往不能直接得到結果;相反,它是一串賦予了機器「學習能力」的指令。在此基礎上,計算機需要進一步地接受「數據」並根據之前人類賦予它的「學習能力」從中「學習」出最終的結果,這個結果往往是無法僅僅通過直接編程得出的。是故這裡就導出了稍微深一點的機器學習的定義:它是一種讓計算機利用數據而非指令來進行各種工作的方法。在這背後,最關鍵的就是「統計」的思想,它所推崇的「相關而非因果」的概念是機器學習的理論根基。在此基礎上,機器學習可以說是計算機使用輸入給它的數據、利用人類賦予它的算法得到某種模型的過程,其最終的目的則是使用該模型、預測未來未知數據的信息。
既然提到了統計,那麼一定的數學理論就不可或缺。相關的、比較簡短的定義會在第四章給出(PAC框架),這裡我們就先只敘述一下機器學習在統計理論下的、比較深刻的本質:它追求的是合理的假設空間(Hypothesis Space)的選取和模型的泛化。(Generalization)能力。該句中出現了一些專用術語,詳細的定義會在介紹術語時提及,這裡我們提供一個直觀:
注意:上述本質嚴格來說應該是 PAC Learning 的本質;在其餘的理論框架下、機器學習是可以具有不同的內核的。
從上面的討論可以看出,機器學習和人類思考的過程有或多或少的類似。事實上,我們在第六、第七章講的神經網絡(Neural Network,簡稱 NN)和卷積神經網絡(Convolutional Neural Network,簡稱 CNN)背後確實有著相應的神經科學的理論背景。然而與此同時我們需要知道的是,機器學習並非是一個「會學習的機器人」和「具有學習的人造人」之類的,這一點從上面諸多討論也可以明晰(慚愧的是,我在第一次聽到「機器學習」四個字時,腦海中浮現的正是一個「聰明的機器人」的圖像,甚至還幻想過它和人類一起生活的場景)。相反的,它是被人類利用的、用於發掘數據背後信息的工具。
當然,現在也不乏「危險的人工智慧」的說法,霍金大概是其中的「標杆」,這位偉大的英國理論物理學家甚至警告說「人工智慧的發展可能意味著人類的滅亡」。孰好孰壞果然還是見仁見智,但可以肯定的是:本書所介紹的內容絕不至於導致世界的毀滅,大家大可輕鬆愉快地進行接下來的閱讀 ( σ』ω』)σ。
機器學習常用術語機器學習領域有著許多非常基本的術語,這些術語在外人聽來可能相當高深莫測、它們事實上也可能擁有非常複雜的數學背景,但我們需要知道:它們往往也擁有著相對淺顯平凡的直觀理解(上一節的假設空間和泛化能力就是兩個例子)。本節會對這些常用的基本術語進行說明與解釋,它們背後的數學理論會有所闡述、但不會涉及到過於本質的東西。
正如前文反覆強調的,數據在機器學習中發揮著不可或缺的作用;而用於描述數據的術語有好幾個,它們是需要被牢牢記住的:
「數據集」(Data Set):就是數據的集合的意思。其中,每一條單獨的數據被稱為「樣本」(Sample)。若沒有進行特殊說明,本書都會假設數據集中樣本之間在各種意義下相互獨立。事實上,除了某些特殊的模型(如隱馬爾可夫模型和條件隨機場),該假設在大多數場景下都是相當合理的。
對於每個樣本,它通常具有一些「屬性」(Attribute)或說「特徵」(Feature),特徵所具體取的值就被稱為「特徵值」(Feature Value)。
特徵和樣本所張成的空間被稱為「特徵空間」(Feature Space)和「樣本空間」(Sample Space),可以把它們簡單地理解為特徵和樣本「可能存在的空間」。
相對應的,我們有「標籤空間」(Label Space),它描述了模型的輸出「可能存在的空間」;當模型是分類器時、我們通常會稱之為「類別空間」。
其中、數據集又可以分為以下三類:
訓練集(Training Set);顧名思義、它是總的數據集中用來訓練我們模型的部分。雖說將所有數據集都拿來當做訓練集也無不可,不過為了提高及合理評估模型的泛化能力、我們通常只會取數據集中的一部分來當訓練集。
測試集(Test Set);顧名思義、它是用來測試、評估模型泛化能力的部分。測試集不會用在模型的訓練部分;換句話說,測試集相對於模型而言是「未知」的、所以拿它來評估模型的泛化能力是相當合理的。
交叉驗證集(Cross-Validation Set,簡稱 CV Set);這是比較特殊的一部分數據,它是用來調整模型具體參數的。
注意:需要指出的是,獲取數據集這個過程是不平凡的;尤其是當今「大數據」如日中天的情景下,諸如「得數據者得天下」的說法也不算誑語。在此我推薦一個非常著名的、含有大量真實數據集的網站——UCI,接下來的篇章中也常常會用到其中一些合適的數據集來評估我們自己實現的模型。
我們可以通過具體的例子來理解上述概念。比如、我們假設小明是一個在北京讀了一年書的學生,某天他想通過宿舍窗外的風景(能見度、溫度、溼度、路人戴口罩的情況等)來判斷當天的霧霾情況並據此決定是否戴口罩。此時,他過去一年的經驗就是他擁有的數據集,過去一年中每一天的情況就是一個樣本。「能見度」、「溫度」、「溼度」、「路人戴口罩的情況」就是四個特徵,而(能見度)「低」、(溫度)「低」、(溼度)「高」、(路人戴口罩的)「多」就是相對應的特徵值。現在小明想了想、決定在腦中建立一個模型來幫自己做決策,該模型將利用過去一年的數據集來對如今的情況作出「是否戴口罩」的決策。此時小明可以用過去一年中 8 個月的數據量來做訓練集、2 個月的量來做測試集、2 個月的量來做交叉驗證集,那麼小明就需要不斷地思考(訓練模型):
用訓練集訓練出的模型是怎樣的?
該模型在交叉驗證集上的表現怎麼樣?
最後,小明可能會在測試集上評估一下自己剛剛思考後得到的模型的性能、然後根據這個性能和模型作出的「是否戴口罩」的決策來綜合考慮自己到底戴不戴口罩。
接下來說明一下上一節中提到過的重要概念:假設空間與泛化能力。泛化能力的含義在上文也有說明,為強調、這裡再敘述一遍:
這一點當然是十分重要的,因為我們拿來訓練我們模型的數據終究只是樣本空間的一個很小的採樣,如果只是過分專注於它們的話、就會出現所謂的「過擬合」(Over Fitting)的情況。當然,如果過分罔顧訓練數據,又會出現「欠擬合」(Under Fitting)。我們可以用一張圖來直觀感受過擬合和欠擬合(如下圖所示,左為欠擬合、右為過擬合):
欠擬合與過擬合
所以我們需要「張弛有度」、找到最好的那個平衡點。統計學習中的結構風險最小化(Structural Risk Minimization、簡稱 SRM)就是研究這個的,它和傳統的經驗風險最小化(Empirical Risk Minimization、簡稱 ERM)相比,注重於對風險上界的最小化、而不是單純使經驗風險最小化。它有一個原則:在使得風險上界最小的函數子集中、挑選出使得經驗風險最小的函數。而這個函數子集,正是我們之前提到過的假設空間
注意:所謂經驗風險,可以理解為訓練數據集上的風險。相對應的,ERM 則可以理解為只注重訓練數據集的學習方法,它的理論基礎是經驗風險在某種足夠合理的數學意義上一致收斂於期望風險、亦即所謂的「真正的」風險。
關於 SRM 和 ERM 的詳細討論會涉及到諸如 VC 維和正則化的概念,這裡不進行詳細展開、但我們需要有這麼一個直觀:為了使我們學習方法訓練出的模型泛化能力足夠好,我們需要對我們的模型做出一定的「限制」、而這個「限制」就表現在假設空間的選取上。一個非常普遍的做法是對模型的複雜度做出一定的懲罰、從而使模型趨於精簡。這與所謂的「奧卡姆剃刀原理」(奧卡姆:我的剃刀還能再戰 500 年)不謀而合:「如無必要,勿增實體」「切勿浪費較多的東西去做,用較少的東西、同樣可以做好事情」
相比起通過選取合適的假設空間來規避過擬合,進行交叉驗證(Cross Validation)則可以讓我們知道過擬合的程度、從而幫助我們選擇合適的模型。常見的交叉驗證有三種:
S-fold Cross Validation:中文可翻譯成S折交叉驗證,它是應用最多的一種方法。其方法大致如下:
將數據分成 S 份:
D={D1,D2,...,DS}、一共作 S 次試驗在第 i 次試驗中,使用作為(D−Di)訓練集、
Di作為測試集對模型進行訓練、評測最終選擇平均測試誤差最小的模型
留一交叉驗證(Leave-one-out Cross Validation):這是S折交叉驗證的特殊情況,此時
S=N簡易交叉驗證:這種實現起來最簡單、也是本博客(在進行交叉驗證時)所採用的方法。它簡單地將數據進行隨機分組、最後達到訓練集約佔原數據的 70% 的程度(這個比率可以視情況改變),選擇模型時使用測試誤差作為標準。
機器學習的重要性
道理說了不少,但到底為什麼要學機器學習、機器學習的重要性又在哪裡呢?事實上,回顧歷史我們可以發現,人類的發展通常伴隨著簡單體力勞動向複雜腦力勞動的過渡。過去的工作基本都有著明確的定義,告訴你這一步怎麼做、下一步再怎麼做。而如今這一類的工作已是越來越少,取而代之的是更為寬泛模糊的、概念性的東西,比如說「將本季度的產品推向最合適的市場,在最大化期望利潤的同時、儘量做到風險最小化」這種需求。想要做好這樣的任務,我們需要獲取相應的數據;雖說網絡的存在讓我們能夠得到數之不盡的數據,然而從這些數據中獲得信息與知識卻不是一項平凡的工作。我們當然可以人工地、仔細地逐項甄選,但這樣顯然就又回到了最初的原點。機器學習這門技術,可以說正因此應運而生
單單抽象地說一大堆空話可能會讓人頭暈腦脹,我們就舉一舉機器學習具體的應用範圍吧,從中大概能夠比較直觀地看出機器學習的強大與重要。
發展到如今,機器學習的「爪牙」可謂已經伸展到了各個角落、包括但不限於:
機器視覺、也就是最近機器學習裡很火熱的深度學習的一種應用
語音識別、也就是微軟 Cortana 背後的核心技術
數據挖掘、也就是耳熟能詳的大數據相關的領域
統計學習、也就是本書講解的主要範圍之一,有許許多多著名的算法(比如支持向量機 SVM)都源於統計學習(但是統計學習還是和機器學習有著區別;簡單地說,統計學習偏數學而機器學習偏實踐)
機器學習還能夠進行模式識別、自然語言處理等等,之前提過的圍棋界的 Master 和最新人工智慧在德州撲克上的表現亦無不呈現著機器學習強大的潛力。一言以蔽之,機器學習是當今的熱點,雖說不能保證它的熱度能 100% 地一直延續下去,至少本人認為、它能在相當長的一段時間內保持強大的生命力。
回復 人工智慧 揭開人工智慧的神秘面紗
回復 貝葉斯算法 貝葉斯算法與新聞分類
回復 機器學習 R&Python機器學習
回復 阿里數據 阿里數據系列課程
回復 Python Python機器學習案例實戰
回復 Spark 徵服Spark第一季
回復 kaggle 機器學習kaggle案例
回復 大數據 大數據系列視頻
回復 數據分析 數據分析人員的轉型
回復 數據挖掘 數據挖掘與人工智慧
回復 機器學習 R&Python機器學習
回復 阿里數據 阿里數據系列課程
回復 R R&Python機器學習入門