新手福利:免费百页机器学习入门书
選自?themlbook
作者:Andriy Burkov
機器之心編譯
參與:張倩、淑婷、曉坤
近日,Gartner 公司機器學習團隊負責人、人工智能博士 Andriy Burkov 開源了自己寫的機器學習入門書——《The Hundred-Page Machine Learning Book》。這本書短小精悍,只有一百頁左右,包含大量自 20 世紀 60 年代以來具有重要實用價值的機器學習材料。它既適用于初學者,也適用于有經驗的從業者。
作者本著「先讀后買」的原則,允許讀者免費下載。
下載地址:http://themlbook.com/wiki/doku.php
本書是陸陸續續寫的,之前已經公開一部分內容,近日終于完成初稿。
初稿目錄
為讓讀者一睹為快,機器之心將從第八章中截取一部分內容進行介紹。
新書試讀
第八章介紹了在某些情況下可能會用到的實踐技術。這些技術被應用在一些非常具體的環境中。在許多實際情況下,你很可能不需要使用這些技術,但有時它們非常實用。本章包含八個小節,分別是:處理不平衡數據集、組合模型、訓練神經網絡、高級正則化、處理多輸入問題、處理多輸出問題、遷移學習及算法效率。以下是其中兩個小節:
組合模型
集成算法,如隨機森林,通常會組合具有相同性質的模型。它們通過組合數百個較弱的模型來提高性能。在實踐中,有時我們可以通過組合利用不同學習算法得出的較強模型來獲得額外的性能提升。在這種情況下,我們通常只需要兩三個模型。
有三種典型的模型組合方式:
取平均
多數投票
堆棧
取平均適用于回歸以及那些返回分類分數的分類模型。你只需將所有模型應用到輸入 x,然后平均預測值,我們可以把這些模型稱為基礎模型。為了查看平均的模型效果是否比每個單獨的算法更好,你可以使用自己選擇的度量在驗證集上測試它。
多數投票適用于分類模型。你可以把所有基礎模型應用到輸入 x,然后返回所有預測值中占多數的類。如果出現平局,你要么隨機選擇一個類,或者返回一條錯誤信息(如果錯誤分類會導致成本巨大)。
堆棧包括構建元模型,該模型將基礎模型的輸出作為輸入。假如你想組合分類器 f_1 和分類器 f_2,且它們都預測同一組類別。為了給堆棧模型創建訓練樣本,你設置了和。
如果有些基礎模型不僅返回了一個類,還返回了對每個類的分數,你也可以把這些分數作為特征使用。
為了訓練堆棧模型,建議使用來自訓練集的樣本,并使用交叉驗證為堆棧模型調參。
顯而易見,你要確保堆棧模型在驗證集上的表現要比每個用來堆棧的基礎模型更好,否則就沒有必要這么做。
組合多個模型最終能夠帶來更好性能的原因是,多個無關聯的較強模型更有可能一致妥協正確的結果。這里的關鍵詞是「無關聯(uncorrelated)」。不同的較強模型最好是通過不同的特征或性質不同的算法來獲得,如支持向量機和隨機森林。組合不同版本的決策樹學習算法或具有不同超參數的支持向量機可能不會帶來很大的性能提升。
算法效率
并非所有用于解決問題的算法都很實用。有些算法可能很快,有些卻很慢。有些問題可以用快速算法解決,但其他問題可能只能用較慢的算法解決。
算法分析是計算機科學的一個研究方向,著重測定、分析算法的復雜性。大 O 符號用于對算法進行分類,依據的是算法的運行時間及隨輸入大小增長產生的占用空間需求。
例如,假設我們要在大小為 N 的一組示例 S 中尋找兩個最遙遠的一維示例。我們可以用 Python 寫出如下所示的算法來解決這個問題:
在上述算法中,我們遍歷 S 中所有的值,在首次遍歷的每次迭代中,我們再次遍歷 S 中所有的值。因此,上述算法對數字進行了 N^2 次比較。如果我們把比較(一次)、abs(兩次)和賦值(兩次)運算所花費的時間作為單位時間,那么這個算法的時間復雜度(或者簡單地說,復雜度)至多是 5N^2。在最壞的情況下測定算法的復雜度時使用大 O 符號。對于上述算法,我們使用大 O 符號將算法的復雜度寫為 O(N^2)(忽略常數,如上述例子中的 5)。
這一問題還可以用下面這個算法解決:
在上述算法中,我們只遍歷 S 中所有的值一次,因此算法復雜度為 O(N)。在這種情況下,我們認為后面這個算法比前面的快。
通常來講,如果一個算法復雜度的輸入大小可以用大 O 符號寫成多項式的形式,這個算法就被視為高效算法。因此 O(N) 和 O(N^2) 都是高效算法。然而,對于比較大的輸入,O(N^2) 算法可能也會很慢。在大數據領域,科學家經常用到的是 O(logN) 算法。
從實用的角度來講,在實施你的算法時應該盡可能避免遍歷。你應該將運算用在矩陣和向量,而不是遍歷上。計算 wx 的算法如下:
使用合適的數據結構。如果一個集合中的元素順序并不重要,那么要用 set 而不是 list。當 S 被認定為 set 時,用于驗證 S 中的某個示例的運算是高效的,當 S 被認定為一個 list 時,該運算是低效的。
用來優化 Python 代碼的另一個重要數據結構是 dict,也叫字典或哈希圖(hashmap)。它允許你用非常快速尋找鍵值的方法定義一個鍵值對的集合。
除非你知道自己在做什么,否則請盡量使用主流庫來寫代碼。科學 Python 包(如 numpy、scipy 和 scikit-learn)是由考慮到效率的資深科學家、工程師創建的。這些包擁有很多用 C 語言實現以達到最大速度的方法。
如果你需要迭代大量元素,可以使用創建函數的生成器,該函數一次返回一個而不是所有元素。
使用 Python 中的 cProfile 包來找出代碼中的不足。
最后,當從算法的角度無法再改進代碼時,你還可以通過以下方式進一步提高代碼的運行速度:
用 multiprocessing 包并行運行計算
用 PyPy、Numba 或類似工具將 Python 代碼編譯成快速、優化的機器代碼。
本文為機器之心編譯,轉載請聯系本公眾號獲得授權。
?------------------------------------------------
加入機器之心(全職記者 / 實習生):hr@jiqizhixin.com
投稿或尋求報道:content@jiqizhixin.com
廣告 & 商務合作:bd@jiqizhixin.com
總結
以上是生活随笔為你收集整理的新手福利:免费百页机器学习入门书的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速上手笔记,PyTorch模型训练实用
- 下一篇: 我知道你会用Jupyter Notebo