天地一逆旅
同悲萬古塵
前言
今天起便要正式開始學(xué)習(xí)《Hands-On Machine Learning with Scikit-Learn & TensorFlow》這本書了,因此之后的Blog都會基于這本書以及Python3.5、Scikit-Learn、TensorFlow,也希望自己有點產(chǎn)出,與大家多多分享知識,同時記錄下自己的學(xué)習(xí)過程,成就感滿滿哦!
介紹
《Hands-On Machine Learning with Scikit-Learn & TensorFlow》

本書中譯版名《機器學(xué)習(xí)實戰(zhàn):基于Scikit-Learn和TensorFlow》,此書兼顧理論與實踐,對于初學(xué)者來說,一般很難直接上手晦澀難懂的TensorFlow API,且缺乏實踐經(jīng)驗。本書則是一個相對容易的選擇,本書以幫數(shù)據(jù)分析人員快速入門機器學(xué)習(xí)并找到工作為目標(biāo),邏輯清晰,學(xué)習(xí)路線合理,十分適合初學(xué)者。且已有中譯版,可中英對照,對于提升自己有很大幫助。
Scikit-Learn
Scikit-learn項目最早由數(shù)據(jù)科學(xué)家David Cournapeau在2007年發(fā)起,需要NumPy和SciPy等其他包的支持,是Python語言中專門針對機器學(xué)習(xí)應(yīng)用而發(fā)展起來的一款開源框架。
TensorFlow
Tensorflow是廣泛使用的實現(xiàn)機器學(xué)習(xí)以及其它涉及大量數(shù)學(xué)運算的算法庫之一。Tensorflow由Google開發(fā),是GitHub上最受歡迎的機器學(xué)習(xí)庫之一。
機器學(xué)習(xí)概覽
定義
機器學(xué)習(xí)是一門能夠讓編程計算機從數(shù)據(jù)中學(xué)習(xí)的計算機科學(xué)。
機器學(xué)習(xí)與傳統(tǒng)方法區(qū)別
傳統(tǒng)的編程方法需要三個步驟:
- 研究問題,找到問題的規(guī)律
- 根據(jù)找到的規(guī)律,設(shè)計實現(xiàn)解決問題的算法
- 測試程序,重復(fù)1、2兩步,直到滿足需求

機器學(xué)習(xí)方法的步驟:
- 研究問題
- 基于數(shù)據(jù),訓(xùn)練機器學(xué)習(xí)算法
- 測試模型

機器學(xué)習(xí)方法的優(yōu)勢
- 簡化現(xiàn)有的需要大量手動調(diào)整或者規(guī)則特別復(fù)雜的程序,并提升執(zhí)行表現(xiàn)
- 可應(yīng)用于太過復(fù)雜以至于傳統(tǒng)算法無法解決的問題
- 問題條件發(fā)生變化時,可以自適應(yīng)新數(shù)據(jù),不需要像傳統(tǒng)方法一樣手動回頭重改
- 從復(fù)雜問題和海量數(shù)據(jù)中提取知識
機器學(xué)習(xí)的分類
- 是否在人類監(jiān)督下訓(xùn)練:
- 監(jiān)督式學(xué)習(xí)(supervised learning)
- 無監(jiān)督式學(xué)習(xí)(unsupervised learning)
- 半監(jiān)督式學(xué)習(xí)(semisupervised learning)
- 強化學(xué)習(xí)(Reinforcement Learning)
- 是否可以動態(tài)地進(jìn)行增量學(xué)習(xí):
- 在線學(xué)習(xí)(online learning)
- 批量學(xué)習(xí)(batch learning)
- 是否需要建立模型:
- 基于實例的學(xué)習(xí)(instance-based learning):
簡單地將新數(shù)據(jù)點與已知的數(shù)據(jù)點進(jìn)行匹配 - 基于模型的學(xué)習(xí) (model-based learning):
對訓(xùn)練數(shù)據(jù)進(jìn)行模式檢測,然后建立一個預(yù)測模型
機器學(xué)習(xí)方法簡介
監(jiān)督/無監(jiān)督式學(xué)習(xí)
在監(jiān)督式學(xué)習(xí)中,需要經(jīng)過標(biāo)記的訓(xùn)練數(shù)據(jù)。分類問題是典型的監(jiān)督式學(xué)習(xí)。另一種典型的監(jiān)督式學(xué)習(xí)是回歸問題,也就是給一定的特征來預(yù)測一個目標(biāo)數(shù)值。以下是一些重要的監(jiān)督式學(xué)習(xí)的算法:
- K-近鄰算法(k-Nearest Neighbors)
- 線性回歸(Linear Regression)
- 邏輯回歸(Logistic Regression)
- 支持向量機(Support Vector Machines)
- 決策樹和隨機森林(Decision Trees and Random Forests)
- 神經(jīng)網(wǎng)絡(luò)(Neural networks)
PS:一些回歸算法可以運用于分類任務(wù),反之亦然。例如邏輯回歸,因為它可以輸出“屬于某個特定類別的概率”

無監(jiān)督式學(xué)習(xí)的訓(xùn)練數(shù)據(jù)是未經(jīng)標(biāo)記的,以下是一些重要的監(jiān)督式學(xué)習(xí)的算法:
- 聚類算法
- k-平均算法(k-Means)
- 分層聚類分析(Hierarchical Cluster Analysis )
- 最大期望算法(Expectation Maximization)
- 可視化和降維
- 主成分分析(PCA)
- 核主成分分析(Kernel PCA)
- 局部線性嵌入(LLE)
- t-分布隨機近鄰嵌入(t-SNE)
- 關(guān)聯(lián)規(guī)則學(xué)習(xí)
- Apriori
- Eclat

半監(jiān)督式學(xué)習(xí)的訓(xùn)練數(shù)據(jù)則是部分標(biāo)記的,通常是大量未標(biāo)記數(shù)據(jù)和少量標(biāo)記數(shù)據(jù)。例如照片托管服務(wù),它會自動識別出照片中每一位人物,只需要你給每個人物命名,之后你上傳每一張照片,系統(tǒng)都會自動識別那是誰了。大多數(shù)半監(jiān)督式學(xué)習(xí)算法都是無監(jiān)督式和監(jiān)督式算法的組合,如深度信念網(wǎng)絡(luò)(DBN),它基于一種互相堆疊的無監(jiān)督式組件,叫做受限玻爾茲曼機(RBM),受限玻爾茲曼機以無監(jiān)督方式訓(xùn)練,然后使用監(jiān)督式學(xué)習(xí)對整個系統(tǒng)進(jìn)行微調(diào)。

強化學(xué)習(xí)的學(xué)習(xí)系統(tǒng)能夠觀察環(huán)境,做出選擇,執(zhí)行操作,并獲得回報,或者以負(fù)面回報方式獲得懲罰。所以它必須自行學(xué)習(xí)什么事最優(yōu)策略。例如AlphaGo。

批量/在線學(xué)習(xí)
在批量學(xué)習(xí)中系統(tǒng)無法進(jìn)行增量學(xué)習(xí),必須使用所有數(shù)據(jù)進(jìn)行訓(xùn)練。如果有新數(shù)據(jù)引入,則需要在完整數(shù)據(jù)集(包括新舊數(shù)據(jù))的基礎(chǔ)上,重新訓(xùn)練一個新的系統(tǒng),然后停用舊系統(tǒng)。這也許會耗費大量時間和資源,但整個訓(xùn)練、評估和啟動機器學(xué)習(xí)系統(tǒng)的過程可以輕易實現(xiàn)自動化,所以批量學(xué)習(xí)系統(tǒng)也能夠適應(yīng)變化。
而在線學(xué)習(xí)可以循序漸進(jìn)的提供訓(xùn)練數(shù)據(jù),也可以采用小批量的小組數(shù)據(jù)進(jìn)行訓(xùn)練。

如這類系統(tǒng),需要接受持續(xù)的數(shù)據(jù)流(股票價格)同時對數(shù)據(jù)流的變化作出快速或自主的反應(yīng)。

而對這種超大數(shù)據(jù)集的,算法則每次只加載部分?jǐn)?shù)據(jù),并針對這部分?jǐn)?shù)據(jù)進(jìn)行訓(xùn)練,然后不斷重復(fù)這個過程,直到完成所有數(shù)據(jù)的訓(xùn)練。
基于實例/模型的學(xué)習(xí)
基于實例的學(xué)習(xí)會將新實例與已有的實例進(jìn)行對比,從而進(jìn)行判斷或預(yù)測,一般來說這不是最好的選擇,但也不會是最差的。

基于模型的學(xué)習(xí)首先會構(gòu)建一個能夠泛化當(dāng)前實例的模型,然后通過模型對新實例進(jìn)行判斷或預(yù)測。

機器學(xué)習(xí)的挑戰(zhàn)
訓(xùn)練數(shù)據(jù)的數(shù)量不足
一般樣本集太小會導(dǎo)致采樣噪聲
訓(xùn)練數(shù)據(jù)不具有代表性
采樣方式欠妥會導(dǎo)致樣本偏差,代表性數(shù)據(jù)沒有被納入樣本,導(dǎo)致擬合結(jié)果不準(zhǔn)確

如圖中的挪威、瑞士、盧森堡顯著地改變了虛線代表的舊模型
數(shù)據(jù)質(zhì)量差
訓(xùn)練集滿是錯誤、異常值、噪聲需要清理數(shù)據(jù)集:
- 剔除或修復(fù)異常值
- 如果某些實例缺少某些特征(比如%5的顧客缺少年齡),你必須決定是整體忽略這些特征,還是忽略這些缺失特征的實例,亦或是填充這些特征
無關(guān)特征
一個優(yōu)秀的機器學(xué)習(xí)項目,關(guān)鍵是提取有效的特征,這個過程就是特征工程
- 特征選擇
- 特征提取
- 創(chuàng)造新特征
訓(xùn)練數(shù)據(jù)過度擬合
訓(xùn)練出的模型在訓(xùn)練集上表現(xiàn)良好,但泛化時卻不如人意

如圖是一個過擬合的模型,其預(yù)測就十分不準(zhǔn)確了。
可能解決過擬合的方案:
- 簡化模型,選擇較少參數(shù)的模型、減少訓(xùn)練數(shù)據(jù)中的屬性數(shù)量、約束模型
- 收集更多的訓(xùn)練數(shù)據(jù)
- 減少訓(xùn)練數(shù)據(jù)中的噪聲
訓(xùn)練數(shù)據(jù)擬合不足
與過擬合相對的概念,模型太過簡單,無法描述復(fù)雜的現(xiàn)實問題,可能的解決方案:
- 選擇更強大的模型
- 給學(xué)習(xí)算法更好的特征集(特征工程)
- 減少模型中的約束(如減少正則化超參數(shù))
驗證與測試
一般將數(shù)據(jù)集按80%訓(xùn)練、20%測試進(jìn)行劃分來評估模型好壞
資料
書籍資料
- 《Hands-On Machine Learning with Scikit-Learn & TensorFlow》 ——機器學(xué)習(xí)實戰(zhàn)
網(wǎng)絡(luò)資源
- Scikit-Learn ——官網(wǎng)及文檔
- Tensorflow ——官網(wǎng)及文檔
- Aurélien Geron ——《Hands-On Machine Learning with Scikit-Learn & TensorFlow》作者GitHub