1. 程式人生 > >機器學習綜述與“Hello World”實戰

機器學習綜述與“Hello World”實戰

本文結構思維導圖

概述

友情提示: 
1. 對於本文中資料集,訓練集,特徵點,空間等基礎概念,請參考周志華老師的《機器學習》第一章的內容 
2. Python的語法並不難理解,有編碼基礎的可以直接看懂,如果不懂,請參考廖雪峰老師的個人部落格中Python的教學內容 
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

資訊科技的發展分為五個階段:

語言的使用,語言成為人類進行思想交流和資訊傳播不可缺少的工具。
文字的出現和使用,使人類對資訊的儲存和傳播取得重大突破,較大地超越了時間和地域的侷限。
印刷術的發明和使用,使書籍、報刊成為重要的資訊儲存和傳播的媒體。
電話、廣播、電視的使用,使人類進入利用電磁波傳播資訊的時代。
計算機與互連網的使用,即網際網路的出現。
在資訊科技發展的第五個階段之後,資訊革命已經進入了重點階段。每天大量的資料被產生,全世界約90%的資料是近兩年產生的,在現代計算機計算效能的提高,於大量各種各樣的資料作為支援下,機器學習技術迎來了高速發展的新機遇。

在概率論、統計學、逼近論、凸分析、演算法複雜度理論等多門學科支援下。專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能。

人工智慧的核心就是機器學習,這是使計算機具有智慧的根本方法,機器學期相關的應用遍及生活中的各個領域,比如專家系統、自動推理、模式識別、智慧機器人、資料探勘、計算機視覺、自然語言處理、生物特徵識別、搜尋引擎、醫學診斷、檢測信用卡欺詐、證券市場分析、DNA序列測序、語音和手寫識別、戰略遊戲和機器人運用。它主要使用歸納、綜合而不是演繹。

什麼是機器學習,為什麼要學習機器學習

現在特斯拉公司的無人車已經在國內外顯示生活中開始使用,雖然現在無人車的技術不是十分的成熟,車禍事情時有發生,但是假以時日,無人車完全代替人類駕駛,交通事故率將會下降很多。

機器學習相關的崗位

精準推薦:負責推薦系統演算法的開發,針對特定問題進行數學建模,並解決各種應用問題,如音樂歌曲的推薦,頁面廣告的推薦,相關資訊的推送等。

資料探勘:應用各類大資料技術,分析資料與記錄,如挖掘使用者的興趣和意圖,或從海量資料中發掘有價值的資訊,建立多個維度上的模型,用於指導產品優化。

自然語言處理:機器翻譯(machine translation,MT),自動文摘(automatic summarizing),資訊檢索(information retrieval),文件分類(document classification),問答系統(question-answering system),文字編輯和自動校對(atuomatic profreading),語言教學(language teaching),文字識別(OCR,optical character recognition),語音識別(speech recognition),文語轉換(text-to-speech conversion),說話人識別驗證(speaker recognition)。

此外還包括機器視覺,語音識別,影象識別,影象處理,深度學習,機器學習等崗位。

機器學習的五大流派

符號主義學派:將符號、現實規則和邏輯關係來表徵知識和進行邏輯推理演繹,常用演算法是 規則和決策樹。

貝葉斯學派:根據事件發生的可能性與其他事件的關聯性來判斷,常用演算法是 樸素貝葉斯或馬爾可夫。

聯結主義學派:使用概率矩陣和加權神經元來動態地識別和歸納的模型,常用演算法是 神經網路。

進化主義學派:不斷生成結果,尋找結果中的最優解方案,常用演算法是 遺傳演算法。

Analogizer學派:根據約束條件來最大化的優化模型,常用演算法是 支援向量機。

根據統計學分類機器學習演算法

監督學習(有教師學習)
監督學習即輸入的資料有相對應的標籤,如識別貓的圖片的時候,會標註哪些影象上有貓,哪些影象上沒有貓,模型會學習影象上有貓的特徵是是什麼,和影象上沒有貓的特徵是什麼。

結果就是讓模型學習一個規則,當輸入新的資料時可以得到一個預測或者分類的效果。

非監督學習(無教師學習)
非監督學習則相反,就是輸入的資訊不知道是什麼分類,不知道規則,沒有輸出,結果就是尋找資料當中的規則。

半監督學習(半教師學習)
最近幾年新起的半監督學習就是介於監督學習和半監督學習之間的,因為在實際生活環境中,人工標註資料成本過大,大部分的情況是遇到的資料都是沒有經過標籤的,所以用半監督學習可以先少量的標註一部分資料,然後尋找這部分資料的特徵,自動給剩下的資料標註標籤。

強化學習
增強學習強調如何基於環境而行動,以取得最大化的預期利益。有機體如何在環境給予的獎勵或懲罰的刺激下,逐步形成對刺激的預期,產生能獲得最大利益的習慣性行為。常被應用在機器人、無人機等領域。

根據資料處理方式分類機器學習演算法

線上學習
線上學習就是在得到新的資料的時候直接加入到正在不斷訓練模型的資料集當中,這樣可以不斷的更新模型,但是對資料的要求比較高。好處在於可以隨時更新模型的引數。

離線學習
與線上學習相反,當資料更新時,停下模型的訓練,將原有資料一起預處理再輸入到訓練集中訓練模型。

監督學習演算法的分類

生成模型
生成模型是由資料學習聯合概率分佈P(X,Y),然後求出條件概率分佈

P(Y|X)
1
作為預測的模型,即生成模型:

P(Y|X)=P(X,Y)/P(X)
1
模型表示了給定輸入X產生輸出Y的生成關係。典型的生成模型有:樸素貝葉斯方法和隱馬爾可夫模型。 
生成模型能夠還原出聯合概率分佈P(X,Y);生成模型的收斂速度快,當樣本容量增加的時候,學到的模型可以更快地收斂於真實模型;當存在隱變數時,仍可以使用生成學習方法,此時判別方法就不能用。

判別模型
判別方法由資料直接學習決策函式f(x)或者條件概率分佈P(Y|X)作為預測的模型,即判別模型。典型的判別模型包括:k近鄰法、感知機、決策樹、logistic迴歸模型、最大熵模型、支援向量機、提升方法和條件隨機場。判別模型直接面對預測,往往學習的準確率越高。可以對資料進行各種程度上的抽象、定義特徵並使用特徵,因此可以簡化學習問題。

機器學習和深度學習的區別

深度學習(deep learning)是機器學習裡面的演算法之一,是屬於神經網路演算法,但是今年來由於在影象影象,語音處理等領域取得了突破性的進展,所以被大家熟知。

人工智慧,機器學習,深度學習關係與發展時間由下圖所示。

機器學習的六大步驟

選擇資料:將資料集分成三部分,分別是訓練集、驗證集和測試集。

模型資料:用訓練集來構建相關特徵的模型。

驗證模型:將驗證資料匯入到模型中。

測試模型:測試集檢查被驗證模型的表現。

使用模型:訓練好的模型在新資料上做預測,分類,聚類。

調優模型:用更多資料、不同的特徵或調整過的引數來提升演算法的效能表現,提高模型的泛化性。

機器學習問題的解決方案如下。

定義問題
在軟體工程當中開始也是十分重要的一個環節就是軟體的需求分析,同理,在“機器學習工程”當中開始的部分也是定義問題。一個問題是分類問題,聚類問題或者是預測問題在一開始就需要確定好。

對資料進行預處理
機器學習的所有演算法和模型都是建立在資料之上的,好的資料對於問題的解決更加有益,所以資料的預處理就變得十分重要。首先是資料的收集過程,然後清理資料,去噪聲,處理缺失資料,對於缺失資料是補充還是刪除。

資料的分析
在kaggle中資料的分析的各種專案中是十分常見的步驟,資料的分析主要有兩部組成。第一部分是資料的概述,第二部分是資料的視覺化。資料的概述主要是對資料的結構和資料的分佈做一個必要的分析,確認資料是以什麼結構和數值型號存在的,其次是資料的分佈,對於每一個維,特徵點的選擇,或許我們並不需要那麼多的特徵點,這裡就要用正則化去刪除一些關係性,對結果影響小的特徵點。這一步中特徵點的提取同樣十分重要,合適特徵點的選擇直接影響了模型結果是否滿意。資料的視覺化就主要是對資料做一個散點圖,條形圖等便於直觀理解資料的形式分佈和型別即可。

演算法的抽查
對於專案中的資料,可以用不同演算法進行訓練,然後選擇初步效果最好的演算法。如果資料集過於龐大,可以用部分資料進行訓練。然後優化選中的演算法,如果多次訓練優化結果不滿意,可以再試試別的演算法再進行優化。

優化
如果模型的結果不滿意,這時候就要對其進行優化。

- 演算法調優(Algorithm tuning)

- 整合方法/整合學習(Ensembles)

- 極端特徵工程(Extreme Feature Engineering)

演算法調優:

機器學習的終極目標就是為了可以自動的從資料中構建模型,不需要認為的參與資料的處理,訓練模型,評估模型,優化模型等步驟。但其中一個困難的點是演算法的引數,模型當中的引數十分重要,如何調參將影響模型的最終結果。

比如用像KNN這樣的分類演算法,須指定使用的模型(或質心)中的K數,這時候可以為模型嘗試許多不同的K值。

另一個例子,支援向量機(SVM)分類。SVM分類需要一個初始學習階段,其中訓練資料用於調整分類引數。這實際上是指初始引數調整階段,可以像程式設計人員一樣,嘗試“調整”模型以獲得高質量的結果。

現在,你可能會認為這個過程可能很繁瑣,你是對的。事實上,由於難以確定哪些最優模型引數,一些研究人員在使用更好的調參進行更簡單的替代方案之前,會使用複雜的學習演算法。

整合方法/整合學習:

整合學習通過構建多個學習演算法模型學習,最後整個成一個模組輸出結果。換句話來說就是“三個臭皮匠頂個諸葛亮”,多個基礎演算法模型(又叫做弱學習器)整合一個結果輸出。也可以理解為投票原則。

帶入到二分類問題當中,結果有√和×2個結果,至少結果為2個√整合結果才為√。

分類器/資料集    資料集1    資料集2    資料集3
分類器結果1    √    √    ×
分類器結果2    ×    √    √
分類器結果3    √    ×    √
整合結果    √    √    √
整合學習之後效果提高。

分類器/資料集    資料集1    資料集2    資料集3
分類器結果1    √    √    ×
分類器結果2    √    √    ×
分類器結果3    √    √    ×
整合結果    √    √    ×
整合學習之後效果不好。

分類器/資料集    資料集1    資料集2    資料集3
分類器結果1    √    ×    ×
分類器結果2    ×    √    ×
分類器結果3    ×    ×    √
整合結果    ×    ×    ×
整合學習之後起到反作用,本來可以分類的演算法反而整合之後無法實現分類。

現在整合學習的兩個大放向為Boosting,和Bagging與隨機森林。

Boosting是學習器之間存在強依賴關係。

Bagging與隨機森林是學習器之間不存在強依賴關係,相互獨立。

極端特徵工程:

從資料集出發,分析資料結構,特徵點提取之後進行分解或合併,優化特徵點,這樣得到的加工處理過的“新”資料集帶入到模型訓練當中會得到更好的結果。

結果展示
為了方便展示結果和便於人們理解,帶入到實際應用當中,並展示結果。

模型的訓練過程主要分為以下四個步驟:

這裡解釋一下上圖,舉個簡單的例子,高考複習是要做很多很多的練習題去鞏固自己罪域知識點的理解是否透徹,然後再去做練習題,到期末檢測或者質量檢測的時候再不斷的抓差補缺來不斷的更新自己對於知識點的理解。等同於下圖。

機器學習的起源與歷史

人工智慧發展史概述

1950年以前,統計方法被發現和並不斷被改進。

1950年代,使用簡單的演算法進行開創性機器學習研究。

1970年代,機器學習表現效能不高的原因,悲觀主義盛行,機器學習研究進入寒冬。

1980年代,反向傳播的重新發現導致機器學習研究的復甦。

1990年代,機器學習的工作從知識驅動的方式轉變為資料驅動的方法。科學家們開始建立計算機程式來分析大量資料,並從結果中得出結論或“學習”。支援向量機和復現神經網路變得流行起來。

2000年代,深度學習重新被廣泛使用,神經網路看到廣泛的商業用途。

2010年代,機器學習成為許多被廣泛使用的軟體服務的組成部分,並得到各大廠商的大力宣傳。紛紛推出自己平臺的計算硬體。

機器學習大事件紀年表

【貝葉斯定理的基礎】1763年,托馬斯·貝耶斯(ThomasBayes)的作品“解決機會原則”中的一個問題是在他死後兩年出版的,經過貝葉斯的朋友理查德·價格的修改和編輯。這篇文章提出了支撐貝葉斯定理的工作。

【最小二乘法】1805,Adrien-MarieLegendre描述了以英文稱為最小二乘法的“méthodedes moindrescarrés”。最小二乘法廣泛應用於資料擬合。

【貝葉斯定理】1812年,Pierre-Simon Laplace發行ThéorieAnalytiquedesProbabilités,他擴充套件了貝葉斯的作品,並定義了現在稱為貝葉斯定理。

【馬爾可夫鏈】1913年,安德烈·馬可夫首先描述了他用來分析一首詩的技巧。 這種技術後來被稱為馬爾科夫鏈。

【圖靈機】1950年,艾倫·圖靈(AlanTuring)提出了一種可以學習和人工智慧的“學習機器”。圖靈的具體建議預示著遺傳演算法的出現。

【第一個神經網路】1951年,Marvin Minsky和Edmonds建立了第一臺能夠學習SNARC的神經網路機器。

【機器跳棋程式】1952年,Arthur Samuel加入IBM的Poughkeepsie實驗室,並開始研究一些機器學習計劃,首先開發出下跳棋程式。

【感知機】1957年,Frank Rosenblatt在康奈爾航空實驗室工作時發明了感知器演算法。 大量的媒體報道了感知器演算法被髮明出來。

【k近鄰演算法(knn)】1967年,建立最近鄰演算法,這是基本模式識別的開始。 該演算法被廣泛應用於對映路由。

【神經網路的侷限性】1969年,Marvin Minsky和Seymour Papert出版了他們的書Perceptrons,描述了感知器和神經網路的一些限制。 這本書顯示神經網路基本上受到限制的解釋被視為對神經網路研究的障礙。

【自動分化】1970年,Seppo Linnainmaa釋出了巢狀可微分函式的離散連線網路的自動分化(AD)的一般方法。這與現代版本的反向傳播相對應,但尚未被命名。

【斯坦福購物車】1979年,斯坦福大學的學生開發了一個可以導航和避開房間障礙物的推車。

【神經認知機】1980年,邦彥福島首先出版他的Neocognitron作品,這是一種人工神經網路。認知後來激發卷積神經網路。

【基於解釋學習】1981年,Gerald Dejong介紹了基於說明的學習,其中計算機演算法分析資料並建立可以遵循的一般規則,並丟棄不重要的資料。

【遞迴神經網路】1982年,約翰·霍普菲爾德(Hop Hopfield)普及了霍普菲爾德網路(Hopfield Networks),一種可用作可內容定址的記憶體系統的迴圈神經網路。

【NetTalk】1985年,Terry Sejnowski開發了一種學習用與嬰兒相同的方式發音的程式。

【反向傳播】1986年,反向傳播的過程由David Rumelhart,Geoff Hinton和Ronald J. Williams描述。

【強化學習】1989年,克里斯托弗·沃特曼斯(Christopher Watkins)開發Q-learning,大大提高了強化學習的實用性和可行性。

【個人電腦上機器學習的商業化】1989年,Axcelis公司釋出Evolver,這是第一個在個人電腦上使用遺傳演算法進行商業化的軟體包。

【玩西洋雙陸棋的機器】1992年,傑拉爾德·泰索羅(Gerald Tesauro)開發了TD-Gammon,一款計算機西洋雙陸棋程式,它利用了使用時差學習訓練的人造神經網路(因此以“TD”的名義)。 TD-Gammon能夠與頂級人類西洋雙陸棋玩家的能力相提並論,但並不總是超越。

【隨機森林演算法】1995年,田錦浩出版了一篇描述隨機決策林的論文。

【IBM深藍擊敗卡斯帕羅夫】1997年,IBM的Deep Blue在國際象棋中擊敗世界冠軍。

【支援向量機】1995年,Corinna Cortes和Vladimir Vapnik發表了他們在支援向量機上的工作。

【LSTM】1997年,Sepp Hochreiter和JürgenSchmidhuber發明了長期記憶復發神經網路,大大提高了復發神經網路的效率和實用性。

【MNIST資料庫】1998年,由Yann LeCun領導的團隊釋出了MNIST資料庫,這是一個數據集,其中包含美國人口普查局員工和美國高中學生的手寫數字。MNIST資料庫已成為評估手寫識別的基準。

【火炬機器學習庫】2002年,火炬機器學習庫首次釋出。

【Netflix獎】2006年,Netflix大獎由Netflix推出。 比賽的目的是使用機器學習來擊敗Netflix自己的推薦軟體的準確性,以預測使用者對以前電影的評分至少10%的電影評級。該獎項在2009年獲勝。

【Kaggle比賽】2010年,Kaggle是一個作為機器學習競賽平臺的網站。

【打敗人類】2011年,使用機器學習,自然語言處理和資訊檢索技術的組合,IBM的沃森擊敗了兩個人類的冠軍。

【識別YouTube上的貓】2012年,由Andrew Ng和Jeff Dean領導的Google Brain團隊建立了一個神經網路,通過觀看從YouTube視訊框架中獲取的未標記影象,學習識別貓。

【人臉識別飛躍發展】2014年,Facebook研究人員在DeepFace上發表了自己的研究成果,該系統使用神經網路來識別具有97.35%準確度的面孔。 結果是比以前的系統和對手人類表現超過27%的改進。

【Sibyl】2014年,Google的研究人員詳細介紹了Sibyl的工作,Sibyl是Google內部使用的大規模並行機器學習的專有平臺,用於對使用者行為進行預測並提供建議。

【谷歌的AlphaGo戰勝人類】2016年,Google的AlphaGo計劃成為第一個使用機器學習和樹型搜尋技術相結合的打擊無障礙專業人員的“計算機科技”計劃。

機器學習的實戰步驟

分析問題

當遇到一個實際問題想要用機器學習的方法來解決的時候,首先要分析問題,確定問題型別,是要聚類分類,還是要預測結果。然後確定可以收集到的資料資訊,更具資料的型別,特徵量思考能否得出我們想要的結果,特徵和結果之間有沒有必然的聯絡。比如,我們要預測上海地區未來房租的價格,首先要收集的肯定是過去上海各地區的房租價格,然後想人口數量有可能會影響房租價格,人口越多,房租越貴,其次想到物價水平也有可能對房租產生影響,等等。但是中國北方下不下雨就對上海的房租影響就沒有多大關係了。所以分析到這,影響上海地區房租水平的可能是過去的房租,人口數量和當年物價水平。與軟體工程中的需求分析步驟相同,在整個機器學習問題中這一步十分重要。

資料的收集

資料的收集有很多種方法,網路上的資訊可以用爬蟲下載,現在也有很多資料網站,比如UCI,Kaggle,ImageNet等等。

資料的預處理

這一步是十分重要,資料的好壞直接影響訓練集和好壞,這會直接影響模型的訓練程度。首先觀察資料資訊是否有缺損,可以先用演算法補全資訊,這一步算是預測(資料補全)。其次可以用PCA等方法對資料進行降維處理,去除為結果影響度不高的特徵量(資料清洗)。資料的結構也要統一,便於模型訓練就好(資料變換)。建立資料倉庫,將多個數據源的資料集中到一個數據集當中(資料整合)。在儘可能保持資料原貌的前提下,最大限度地精簡資料量(資料歸約)。

模型的訓練

這一步就是編碼,輸入訓練集,對模型進行訓練,更新模型引數。

模型的評價

帶入測試集測試模型,如果效果好則模型好,差則反之。

模型的改良

帶入新的資料集對模型引數進一步更新優化,或者用別的演算法,或者強化分類器等方法對模型進行優化。

機器學習的幾個重要概念

奧卡姆剃刀

“若有多個假設與觀察一致,則選擇最簡單的那一個。”即在多個模型效果相同的情況下,選擇模型最簡單的那一個。

比如給出兩個點,(0,0)和(1,1),模型有2個,一個是y=x,另外一個是y=x^2,由於後一個是二元二次方程比前者二元一次方程要複雜,所以選擇y=x比較簡單的二元一次方程。

沒有免費午餐理論(no free lunch theorems)

即在脫離實際問題的情況下是沒有最好,最壞的演算法。哪一個演算法好,哪一個演算法壞,必須要針對現實的問題具體分析。

欠擬合與過擬合

1. 欠擬合

模型較好地學習了訓練集的特徵量,不能很好地擬合數據。

解決方法:

適當加入特徵量。 
比如,模型y=x欠擬合,我們可以加入別的特徵向量,把模型變成y=x1+x2+x3,這樣特徵量變多了可以更好的表示模型。

降低正則化引數,正則化的作用是防止過擬合,如果模型出現了欠擬合,則需要降低正則化引數。 


2. 過擬合

學習過訓練集裡的噪聲資料,與欠擬合相反,模型過度的學習訓練集的特徵量,過好地擬合數據,模型的泛化能力太差,意思就是模型結果和資料集太吻合,放到別的測試集裡效果就會變的很差。

解決方法:

再次清洗資料,資料不純可能導致結果過擬合。

增加訓練集,訓練集過小可能導致結果過擬合。

正則化。

偏差與方差

偏差:模型預測結果與實際的結果相差的距離,差距越大,偏差越大,如下圖第二行所示。

方差:模型預測結果的變化範圍,離散橫渡,如果資料分佈越分散則資料方差越大。如下圖右列所示。 


機器學習常用開發工具

scikit-learn

http://scikit-learn.org/stable/

建立在NumPy,SciPy和matplotlib上,Python中的機器學習庫,簡單高效的資料探勘和資料分析工具。

功能有分類(SVM,nearest neighbors,random forest等),迴歸(SVR, ridge regression, Lasso等),聚類(k-Means, spectral clustering, mean-shift等),降維(PCA, feature selection, non-negative matrix factorization等),選擇模型(grid search, cross validation, metrics等),預處理(preprocessing, feature extraction等)。

OpenCV(影象處理與畢業論文大殺器)

http://opencv.org/

OpenCV具有C ++,C,Python和Java介面,並支援Windows,Linux,Mac OS,iOS和Android。 
OpenCV專為計算效率而設計,並強調實時應用。 
以優化的C / C ++編寫,庫可以利用多核處理。 
通過OpenCL啟用,可以利用底層異構計算平臺的硬體加速。 
OpenCV已經通過世界各地的使用者社群超過4.7萬人,估計下載量超過1400萬。 
使用範圍從互動藝術,到礦山檢查,在網上縫合地圖或通過先進的機器人。

http://blog.csdn.net/sileixinhua/article/details/72810858 
使用OpenCV,40行程式碼檢測人臉影象。

tensorflow

https://www.tensorflow.org/

TensorFlow™是使用資料流圖進行數值計算的開源軟體庫。 
圖中的節點表示數學運算,而圖形邊緣表示在它們之間傳遞的多維資料陣列(張量)。 
靈活的架構允許您使用單個API將計算部署到桌面,伺服器或移動裝置中的一個或多個CPU或GPU。 
TensorFlow用於進行機器學習和深層神經網路研究,但該系統普遍足以適用於各種其他領域。

caffe

http://caffe.berkeleyvision.org/

Caffe是一個深度學習框架,特點為速度和模組化。

http://demo.caffe.berkeleyvision.org/ 
cffe官方一個分類器的demo,可以上傳照片然後檢視分類結果

pyTouch

http://pytorch.org/

PyTorch是一個深度學習框架,將Python放在首位。

近年來PyTorch熱度上升,值得學習。

Java-ML

http://java-ml.sourceforge.net/

Java-ML簡而言之,機器學習演算法的集合,有每種演算法的公共介面和型別,主要針對軟體工程師和程式設計師,所以沒有GUI,但介面清晰,良好的原始碼。,大量的程式碼示例和教程。

如果你實際開發環境是java的話比較推薦。

Spark

http://spark.apache.org/

Apache Spark是用於大規模資料處理的快速和通用引擎。 
執行程式比Hadoop MapReduce在記憶體中快100倍,或者在磁碟上執行速度要快10倍。 
在Java,Scala,Python,R中快速編寫應用程式。 
結合SQL,流式傳輸和複雜分析。 
Spark在Hadoop,Mesos,獨立或雲端執行。 它可以訪問不同的資料來源,包括HDFS,Cassandra,HBase和S3。

NumPy,pandas,matplotlib

NumPy是使用Python進行科學計算的基礎軟體包。 
強大的N維陣列物件,複雜(廣播)功能,用於整合C / C ++和Fortran程式碼的工具,有用的線性代數,傅立葉變換和隨機數能力。

pandas為Python程式語言提供高效能,易於使用的資料結構和資料分析工具。

Matplotlib是一個Python 2D繪相簿,可以跨平臺生成各種硬拷貝格式和互動式環境的出版品質量圖。 Matplotlib可用於Python指令碼,Python和IPython shell,jupyter筆記本,Web應用程式伺服器和四個圖形使用者介面工具包。

keras

https://keras.io/

Keras是一種高階神經網路API,用Python編寫,能夠執行在TensorFlow,CNTK或Theano之上。 
開發重點是實現快速實驗。能夠從想法到結果儘可能快速的實現。 
允許簡單快速的原型(通過使用者友好,模組化和可擴充套件性)。 
支援卷積網路和遞迴網路,以及兩者的組合。 
在CPU和GPU上無縫執行。

theano

http://deeplearning.net/software/theano/

Theano是一個Python庫,定義,優化和評估涉及多維陣列的數學表示式。 
與NumPy緊密整合 - 在Theano編譯的函式中使用numpy.ndarray。 
透明使用GPU - 執行資料密集型計算比在CPU上快得多。 
有效的象徵性差異 - Theano用一個或多個投入為衍生工具做功能。 
速度和穩定性優化 - 即使x很小,也能為日誌(1 + x)找到正確的答案。 
動態C程式碼生成 - 更快地評估表示式。 
廣泛的單元測試和自我驗證 - 檢測和診斷許多型別的錯誤。

NLTK

http://www.nltk.org/

NLTK是構建Python程式以處理人類語言資料的領先平臺。 
它為超過50種語料庫和詞彙資源(如WordNet)提供易於使用的介面, 
以及一套用於分類,標記化,詞根,標記,解析和語義推理的文字處理庫,可用於工業級應用。

jieba

https://pypi.python.org/pypi/jieba/

“結巴”中文分詞:做最好的 Python 中文分片語件。

Storm

http://storm.apache.org/

最火的流式處理框架。 
Storm可以輕鬆地可靠地處理無限流資料,實時處理Hadoop對批處理的處理。 
可用於實時分析,線上機器學習,連續計算,分散式RPC,ETL等。

Julia/R

https://julialang.org/

https://www.r-project.org/

Julia是數字計算中高效能動態程式語言。 
它提供了一個複雜的編譯器,可以分散式並行執行,高精度數字和廣泛的數學函式庫。 
Julia的基礎庫主要用於Julia本身,還集成了成熟的,最好的開源C和Fortran庫,用於線性代數,隨機數生成,訊號處理和字串處理。 
此外,Julia開發人員社群正在通過Julia的內建軟體包管理器快速提供一些外部軟體包。 
Jupyter和Julia社群合作的IJulia為Julia提供了強大的基於瀏覽器的圖形筆記本介面。

R是用於統計計算和圖形的免費軟體環境。 它可以在各種UNIX平臺(Windows和MacOS)上編譯和執行。

Weka

http://www.cs.waikato.ac.nz/ml/weka/

Weka是資料探勘任務的機器學習演算法的集合。 
這些演算法可以直接應用於資料集,也可以從您自己的Java程式碼中呼叫。 
Weka包含用於資料預處理,分類,迴歸,聚類,關聯規則和視覺化的工具。

機器學習初步實戰

資料分析入門:Weka的使用(只要四步,不會編碼也可以做機器學習與資料分析)

http://www.cs.waikato.ac.nz/ml/weka/downloading.html 下載對應的Weka,並安裝,執行。
點選Explorer。
點選Open file…選擇weka安裝資料夾下的data資料夾中的iris.arff資料檔案。
點選Classify->choose,選擇bayes下的nativeBayes演算法,讓後點擊start。顯示以下結果。 
 


=== Run information ===

Scheme:       weka.classifiers.bayes.NaiveBayes 
Relation:     iris-weka.filters.supervised.attribute.AddClassification-Wweka.classifiers.rules.ZeroR
Instances:    150
Attributes:   5
              sepallength
              sepalwidth
              petallength
              petalwidth
              class
Test mode:    10-fold cross-validation

=== Classifier model (full training set) ===

Naive Bayes Classifier

                         Class
Attribute          Iris-setosa Iris-versicolor  Iris-virginica
                        (0.33)          (0.33)          (0.33)
===============================================================
sepallength
  mean                   4.9913          5.9379          6.5795
  std. dev.               0.355          0.5042          0.6353
  weight sum                 50              50              50
  precision              0.1059          0.1059          0.1059

sepalwidth
  mean                   3.4015          2.7687          2.9629
  std. dev.              0.3925          0.3038          0.3088
  weight sum                 50              50              50
  precision              0.1091          0.1091          0.1091

petallength
  mean                   1.4694          4.2452          5.5516
  std. dev.              0.1782          0.4712          0.5529
  weight sum                 50              50              50
  precision              0.1405          0.1405          0.1405

petalwidth
  mean                   0.2743          1.3097          2.0343
  std. dev.              0.1096          0.1915          0.2646
  weight sum                 50              50              50
  precision              0.1143          0.1143          0.1143

Time taken to build model: 0 seconds

=== Stratified cross-validation ===
=== Summary ===

Correctly Classified Instances         144               96      %
Incorrectly Classified Instances         6                4      %
Kappa statistic                          0.94  
Mean absolute error                      0.0342
Root mean squared error                  0.155 
Relative absolute error                  7.6997 %
Root relative squared error             32.8794 %
Total Number of Instances              150     

=== Detailed Accuracy By Class ===

                 TP Rate  FP Rate  Precision  Recall   F-Measure  MCC      ROC Area  PRC Area  Class
                 1.000    0.000    1.000      1.000    1.000      1.000    1.000     1.000     Iris-setosa
                 0.960    0.040    0.923      0.960    0.941      0.911    0.992     0.983     Iris-versicolor
                 0.920    0.020    0.958      0.920    0.939      0.910    0.992     0.986     Iris-virginica
Weighted Avg.    0.960    0.020    0.960      0.960    0.960      0.940    0.994     0.989     

=== Confusion Matrix ===

  a  b  c   <-- classified as
 50  0  0 |  a = Iris-setosa
  0 48  2 |  b = Iris-versicolor
  0  4 46 |  c = Iris-virginica

從結果可以看出識別精度是96%。

到目前位置你沒有寫一行程式碼,但是卻用機器學習的演算法實現了一個iris花的分類識別,在這個iris花資料集中有五個特徵,分別是sepallength,sepalwidth,petallength,petalwidth和結果花的種類class。

試想一下,如果你是一名HR,你手頭有很多客戶的資料,但是你推薦人選要一個篩選,一個個對應的崗位去推薦,如果你將客戶的資訊,比如技術,薪資,期望公司地址等等資訊分別開來,帶入weka中,就會根據以往的推薦,自動的給你分門別類的自動推薦客戶去目標公司,這就是機器學習在實際生活中的用處。

機器學習的“Hello World” MNIST手寫字型識別(用SVM支援向量機演算法)

複製以下程式碼並執行。

print(__doc__)

import matplotlib.pyplot as plt
# 載入matplotlib中畫相簿
from sklearn import datasets, svm, metrics
# 載入sklearn中樣本資料集,svm演算法,和矩陣處理庫

digits = datasets.load_digits()
# 匯入datasets樣本資料集中 MNIST手寫字型識別資料進digits

images_and_labels = list(zip(digits.images, digits.target))
# 匯入的資料分類影象和標籤兩部分,即數字影象和對應的數字標籤
for index, (image, label) in enumerate(images_and_labels[:4]):
    plt.subplot(2, 4, index + 1)
    plt.axis('off')
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    plt.title('Training: %i' % label)
# 包括標籤和影象在內的一共8組訓練影象

n_samples = len(digits.images)
# 獲取樣本數
data = digits.images.reshape((n_samples, -1))
# 將影象轉換成矩陣

classifier = svm.SVC(gamma=0.001)
# 使用SVM演算法

classifier.fit(data[:n_samples // 2], digits.target[:n_samples // 2])
# 分類影象

expected = digits.target[n_samples // 2:]
predicted = classifier.predict(data[n_samples // 2:])
# 計算預測值

print("Classification report for classifier %s:\n%s\n"
      % (classifier, metrics.classification_report(expected, predicted)))
# 輸出分類後的結果資訊
print("Confusion matrix:\n%s" % metrics.confusion_matrix(expected, predicted))
# 輸出混淆矩陣(confusion_matrix)下面介紹什麼是混淆矩陣

images_and_predictions = list(zip(digits.images[n_samples // 2:], predicted))
for index, (image, prediction) in enumerate(images_and_predictions[:4]):
    plt.subplot(2, 4, index + 5)
    plt.axis('off')
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    plt.title('Prediction: %i' % prediction)
# 包括標籤和影象在內的一共8組預測影象

plt.show()
# 輸出結果影象
 

混淆矩陣(confusion_matrix)

混淆矩陣(confusion matrix),又稱為可能性表格或是錯誤矩陣。

option    Negative    Positive
Negative    A    B
Positive    C    D
- a 表示偽的預測正確值 即錯誤的資訊被預測為錯誤的資訊 預測正確 
- b 表示偽的預測錯誤值 即錯誤的資訊被預測為正確的資訊 預測錯誤 
- c 表示真的預測錯誤值 即錯誤的正確被預測為錯誤的資訊 預測正確 
- d 表示真的預測正確值 即錯誤的正確被預測為正確的資訊 預測錯誤

Iris花資料集分析

複製貼上並執行以下程式碼

print(__doc__)

import matplotlib.pyplot as plt
# 匯入matplotlib畫圖
from mpl_toolkits.mplot3d import Axes3D
# 匯入mpl_toolkits畫3D影象
from sklearn import datasets
# 匯入sklearn自帶的訓練集
from sklearn.decomposition import PCA
# 匯入特徵降維的PCA主成分分析法

iris = datasets.load_iris()
# 匯入iris花資料集進iris變數中
X = iris.data[:, :2] 
# 匯入影象資料給X變數,只使用頭兩個特徵向量
y = iris.target
# 匯入影象標籤給Y,即影象的結果,如1.2.3...9

x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
# 設定下,y的最大值和最小值

plt.figure(2, figsize=(8, 6))
plt.clf()

plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
# 設定輸出影象為散點圖
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
# 設定輸出影象的X軸和Y軸的標籤

plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())

fig = plt.figure(1, figsize=(8, 6))
ax = Axes3D(fig, elev=-150, azim=110)
# 設定3D影象
X_reduced = PCA(n_components=3).fit_transform(iris.data)
#用PCA給特徵向量降維
ax.scatter(X_reduced[:, 0], X_reduced[:, 1], X_reduced[:, 2], c=y,
           cmap=plt.cm.Paired)
# 在3D影象中顯示散點資訊
ax.set_title("First three PCA directions")
# 設定3D影象標題
ax.set_xlabel("1st eigenvector")
ax.w_xaxis.set_ticklabels([])
ax.set_ylabel("2nd eigenvector")
ax.w_yaxis.set_ticklabels([])
ax.set_zlabel("3rd eigenvector")
ax.w_zaxis.set_ticklabels([])
# 設定3D影象的X,Y,Z軸

plt.show()
# 輸出影象
 

支援向量機(SVM)人臉識別

複製貼上並執行以下程式碼

from __future__ import print_function

from time import time
import logging
import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import fetch_lfw_people
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.decomposition import PCA
from sklearn.svm import SVC
# 匯入必要的資料集和演算法


print(__doc__)

# 在stdout上顯示進度日誌
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')

lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)

# 影象陣列以找到形狀(繪圖)
n_samples, h, w = lfw_people.images.shape

# 對於機器學習,我們直接使用2個數據(由於該模型忽略了相對畫素位置資訊)
X = lfw_people.data
n_features = X.shape[1]

# 預測的標籤是該人的身份
y = lfw_people.target
# y為特徵臉的標籤
target_names = lfw_people.target_names
# 設定標籤的名字
n_classes = target_names.shape[0]

print("Total dataset size:")
print("n_samples: %d" % n_samples)
print("n_features: %d" % n_features)
print("n_classes: %d" % n_classes)

# 分為測試集和測試集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42)
# 測試集大小為全部資料集的25%

n_components = 150

print("Extracting the top %d eigenfaces from %d faces"
      % (n_components, X_train.shape[0]))
t0 = time()
# 記時
pca = PCA(n_components=n_components, svd_solver='randomized',
          whiten=True).fit(X_train)
# 設定PCA降維
print("done in %0.3fs" % (time() - t0))
# 輸出總耗時

eigenfaces = pca.components_.reshape((n_components, h, w))
# 將影象轉換為矩陣向量

print("Projecting the input data on the eigenfaces orthonormal basis")
t0 = time()
X_train_pca = pca.transform(X_train)
# 在測試集上PCA降維
X_test_pca = pca.transform(X_test)
# 在資料集上PCA降維
print("done in %0.3fs" % (time() - t0))

print("Fitting the classifier to the training set")
t0 = time()
param_grid = {'C': [1e3, 5e3, 1e4, 5e4, 1e5],
              'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1], }
clf = GridSearchCV(SVC(kernel='rbf', class_weight='balanced'), param_grid)
clf = clf.fit(X_train_pca, y_train)
print("done in %0.3fs" % (time() - t0))
print("Best estimator found by grid search:")
print(clf.best_estimator_)

print("Predicting people's names on the test set")
t0 = time()
y_pred = clf.predict(X_test_pca)
print("done in %0.3fs" % (time() - t0))

print(classification_report(y_test, y_pred, target_names=target_names))
print(confusion_matrix(y_test, y_pred, labels=range(n_classes)))

def plot_gallery(images, titles, h, w, n_row=3, n_col=4):
    """Helper function to plot a gallery of portraits"""
    plt.figure(figsize=(1.8 * n_col, 2.4 * n_row))
    plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.35)
    for i in range(n_row * n_col):
        plt.subplot(n_row, n_col, i + 1)
        plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray)
        plt.title(titles[i], size=12)
        plt.xticks(())
        plt.yticks(())


# 繪製測試結果的一部分

def title(y_pred, y_test, target_names, i):
    pred_name = target_names[y_pred[i]].rsplit(' ', 1)[-1]
    true_name = target_names[y_test[i]].rsplit(' ', 1)[-1]
    return 'predicted: %s\ntrue:      %s' % (pred_name, true_name)

prediction_titles = [title(y_pred, y_test, target_names, i)
                     for i in range(y_pred.shape[0])]

plot_gallery(X_test, prediction_titles, h, w)

# 繪製特徵臉

eigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
plot_gallery(eigenfaces, eigenface_titles, h, w)

plt.show()
 

多層感知機識別MNIST手寫字型識

1.安裝tensorlfow

python.exe -m pip install --upgrade pip
pip install tensorflow
1
2
2.複製貼上並執行以下程式碼,下載資料集要花一段時間

import tensorflow as tf
# 匯入tensorflow

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)
# 這裡可以初步理解為k
# 我們設立一個y=kx+b的方程,我們匯入資料x,y,有很多個這樣二元一次方程被設立
# 根據這個二元一次方程組可以求出k和b的值,然後帶入新的資料x,則可以求出結果y

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)
# 同理這裡可以初步理解為b

def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding='SAME')
# 轉換為2d

def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
# 設定最大為2x2

sess = tf.InteractiveSession()
# 設定sess

x = tf.placeholder("float", shape=[None, 784])
# 設定X輸入陣列
x_image = tf.reshape(x, [-1,28,28,1])
W_conv1 = weight_variable([5,5,1,32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([5,5,32,64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
W_fc1 = weight_variable([7*7*64,1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
keep_prob = tf.placeholder("float")
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
W_fc2 = weight_variable([1024,10])
b_fc2 = bias_variable([10])
y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
# 設定啟用函式
y_ = tf.placeholder("float", shape=[None, 10])
# 設定結果y
cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# 設定訓練步長
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
# 設定正確預測
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
# 設定結果精確度

sess.run(tf.initialize_all_variables())
# 執行

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

for i in range(20000):
    batch = mnist.train.next_batch(50)
    if i % 100 == 0:
        feed_dict = {x:batch[0],y_:batch[1],keep_prob:1.0}
        train_accuracy = accuracy.eval(feed_dict=feed_dict)
        print("step %d, training accuracy %g" % (i, train_accuracy))
    train_step.run(feed_dict={x:batch[0],y_:batch[1],keep_prob:0.5})
#不斷訓練模型,根新引數

feed_dict={x:mnist.test.images, y_: mnist.test.labels,keep_prob:1.0}
print("test accuracy %g" % accuracy.eval(feed_dict=feed_dict))
# 輸出結果
 


參考文獻

http://baike.baidu.com/link?url=Ge-4F7gXOGxDHi51DPz7_b56QweyViL9cLFKbpMs9QkWgT4LPm8MeHttJ_Ab-TfQ2885p6E6cYW5rQ5Fu8W4lZ_JqohW3HwJeMscz46IVOWbSj36s7ipCzp3E0btFMXB
http://baike.baidu.com/link?url=lsVLhyRFzq-dyJqNEjNODHhr60KzD57GAmetcpaKlVR1oCr6qS8JfFGFt4C8JvWLLhqxB8oqql6bfxbm1XxkOWOkjvB4EUZRhz6pXL6yit_
http://www.sohu.com/a/113502402_464065
https://en.wikipedia.org/wiki/Timeline_of_machine_learning
https://zhidao.baidu.com/question/1049414661018859259.html
http://baike.baidu.com/link?url=KZ1GgfnZjSRcRFVsA-kExSnlw6eX0BENgSjkaF-khkQhObjNGF1UCtEcfldeBLzJlIj1vbVrgv2sXtq2GxaO1BA_gBg8qUFiyKB7FqVQhKmZ2JhQHKs38GUT_7GToMv6
http://www.sohu.com/a/137630674_358836
http://blog.csdn.net/tuqinag/article/details/54730360
http://www.netlib.org/utk/people/JackDongarra/WEB-PAGES/cscads-libtune-09/talk24-vuduc.pdf
https://stackoverflow.com/questions/22903267/what-is-tuning-in-machine-learning
http://www.cyzone.cn/a/20170422/310196.html
《統計自然語言處理》宗成慶
http://aidiary.hatenablog.com/entry/20140205/1391601418
http://scikit-learn.org/dev/auto_examples/applications/plot_face_recognition.html#sphx-glr-auto-examples-applications-plot-face-recognition-py
http://scikit-learn.org/dev/auto_examples/datasets/plot_iris_dataset.html#sphx-glr-auto-examples-datasets-plot-iris-dataset-py
《機器學習》周志華
 

轉自https://blog.csdn.net/sileixinhua/article/details/73611056

 

https://blog.csdn.net/XCCCCZ/article/details/80292442

https://blog.csdn.net/sileixinhua/article/details/75203725