機器學習的基本知識 作為一個終生的微軟開發人員,我經常看到開發人員努力尋找解決日常問題所需的資源。讓我們面對現實吧,我們沒有人有時間按照自己喜歡的方式做事,我們中很少有人有幸在真正的研發部門工作。雖然這些年來我們已經走過了相當長的一段旅程,還記得曾經我們通過桌上的C程式員參考資料和其他50本書中翻找 ...
機器學習的基本知識
作為一個終生的微軟開發人員,我經常看到開發人員努力尋找解決日常問題所需的資源。讓我們面對現實吧,我們沒有人有時間按照自己喜歡的方式做事,我們中很少有人有幸在真正的研發部門工作。雖然這些年來我們已經走過了相當長的一段旅程,還記得曾經我們通過桌上的C程式員參考資料和其他50本書中翻找資料,到現在能夠在谷歌中快速搜索並得到我們想要的東西。但現在人工智慧時代已經到來,情況有些不同了。
作為c#開發人員,當涉及到機器學習時,谷歌搜索並不總是我們最好的朋友,因為幾乎所有正在使用的東西都是Python, R, MATLAB和Octave。我們還必須記住,機器學習已經存在很多年了; 只是在最近,美國的企業已經接受了它,我們看到越來越多的人參與其中。
但是,我的朋友們,毫無疑問,這個世界是一個可怕的地方!c# .NET開發人員該何去何從? 讓我們在下一節開始用一個小故事來回答這個問題,不幸的是,這個故事是千真萬確的。
在本章中,我們將學習以下主題:
數據挖掘技術(即指從資料中發掘資訊或知識)
是購買、構建還是開源
強化學習
無監督學習
監督式學習
概率和統計
深度學習
人工智慧(AI)和生物人工智慧
機器學習概論
我曾經有一個老闆,我告訴他我正在使用機器學習來發現更多關於我們數據的信息。他的回答是:“你認為你能學到什麼,我不知道!”。 如果你在職業生涯中還沒有遇到這樣的情況,那麼恭喜你。如果你有任何職位空缺請告訴我!但你很可能會遇到或者已經遇到了。如果是你你會如何處理呢?而我並沒有因此放棄這件事。
我:“我們的目標是瞭解更多關於我們所擁有的基金的信息和細節,以及它們如何與用戶的實際情況進行關聯的。”
Boss:“但這些我都知道。機器學習只是一個時髦的詞,它最終都是數據,我們都只是數據管理員。其餘的都是流行語。我們為什麼要這樣做,它最終將如何幫助我。”
我:“我來問你。當你在谷歌中輸入搜索時,你認為會發生什麼?”
Boss看起來有些憤怒。
Boss:“你想表達什麼?Google當然是拿著我的輸入的內容在網路中尋找與之相似的東西。”
我:“好,那這是怎麼做的呢?”
Boss看起來更憤怒以及有些沮喪。
Boss:“很顯然它會先在網路中進行搜索,然後將我的輸入和它的搜索結果進行比對。”
我:“但是你有沒有想過這個搜索是如何在其他數十億個搜索中匹配的,以及搜索背後的所有數據是如何不斷更新的?很明顯,人們不能參與其中,否則就無法擴大規模。”
Boss:“當然,演算法經過了很好的調整,給出了我們正在尋找的結果,或者至少給出了建議。”
我:“沒錯,正是機器學習做到了這一點。” (不一定,但足夠接近!)
Boss:“好吧,我不知道我還能從這些數據中學到什麼所以讓我們看看它是怎樣的。”
所以,讓我們做誠實的人。有時候,再多的邏輯也無法覆蓋盲目或抗拒改變的心理,但這個故事的背後,有著與一個無視我們在生物學中所學到的一切的老闆截然不同、更為重要的意義。在機器學習的世界里,要想向那些不像你一樣每天都在開發戰壕里的人證明/展示正在發生的事情、事情是否在工作、它們如何工作、它們為什麼(或為什麼不)工作,等等要難得多。即使那樣,你也很難理解這個演算法在做什麼。
以下是你在決定機器學習是否適合你時應該問自己的一些問題:
你只是想順應流行(這可能是真正需要的),還是真的需要這種類型的解決方案?
你有你需要的資料嗎?
數據是否足夠清晰以供使用(稍後將詳細介紹)?
您知道在哪裡以及是否可以獲得可能丟失的數據嗎?更重要的是,您如何知道數據實際上是丟失的?
你有很多數據還是只有少量數據?
有沒有另一種已知且經過驗證的解決方案,我們可以用它來代替?
你知道你想要完成什麼嗎?
你知道你將如何完成它嗎?
你將如何向別人解釋?
當被問到這個問題的時候,你如何能夠證明在幕後發生了什麼?
這些只是我們在開始機器學習之旅時將共同解決的許多問題中的一部分。
現在,如果有人能夠執行一個返回多行數據的SQL查詢,他們似乎將稱自己為數據科學家。對於簡歷來說這足夠公平;每個人偶爾都需要鼓勵一下,即使是自己提供的。但他們真的是數據科學家嗎?數據科學家到底是什麼意思?我們真的在做機器學習嗎?這到底意味著什麼?好吧,到這本書的結尾,我們希望能找到所有這些問題的答案,或者至少,創造一個你可以自己找到答案的環境。
並不是所有人都能在奢華的研究或學術領域工作。我們許多人每天都火要救,正確的解決方案可能只是一個戰術解決方案,必須在2小時內解決。這就是我們c#開發人員所做的。我們整天坐在桌子後面,運氣好的話戴上耳機,不停地打字。但是我們真的能得到我們想要的或者需要的全部時間來按照我們想要的方式開發一個項目嗎?如果我們這樣做了,我們的項目中就不會有我們現在所擁有的那麼多技術債務了,對嗎(您確實跟蹤了您的技術債務,對嗎) ?
我們需要思考如何才能避免走彎路,有時我們通過思考而不是編碼來做到這一點,尤其是在前期。知識是無價的,因為知識是無法被替代的。但在美國企業中,大多數生產代碼都不是用Python、R、Matlab和Octave等學術語言編寫的。即使所有的學術財富都是可以得到的,但它們並不是以最適合我們工作的形式得到的。
在此,讓我們停下來,贊美那些為開源社區做出貢獻的人。正因為有了它們,我們才有了一些優秀的第三方開源解決方案,我們可以利用它們來完成這項工作。開源社區允許我們利用他們所開發的東西,這本書的目的是讓你瞭解其中的一些工具並展示如何使用它們。在這個過程中,我們會試著至少給你們一些你們應該知道的基本的背景知識,這樣一切就不是黑洞對黑盒了!
你到處都能聽到流行語。我以前每天上下班要花2-4個小時,我不記得我看到過多少廣告牌上面寫著機器學習或人工智慧。它們無處不在,但這一切到底意味著什麼? 人工智慧,機器學習,數據科學,自然語言處理(NLP),數據挖掘,神經元。似乎只要美國公司參與進來,似乎一旦美國企業參與進來,這門曾經完美的藝術就變成了一場混亂的混戰,一項完全不切實際的微觀管理項目。我甚至聽到一位潛在客戶說,我不知道這意味著什麼,但我就是不想被落在後面!
我們必須做的第一件事是學習處理機器學習項目的正確方法。讓我們從一些定義開始:
Tom Mitchell將機器學習定義為:
"A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P if its performance at tasks in T, as measured by P, improves with experience E."
我們的定義會有一點不同。希望當你被要求為你選擇的道路辯護時,你可以使用它:
"Machine learning is a collection of techniques which can be used to deal with large amounts of data in the most efficient and effective manner possible, which will derive actionable results and insight for us from that data."
“機器學習是一組技術的集合,可以用來以最有效的方式處理大量數據,這將為我們從這些數據中獲得可操作的結果和洞察力。”
現在,那些我們稱之為技術的東西呢? 毫無疑問;諸如概率,統計等技術,它們都在那裡,只是被隱藏起來了。我們將要用來執行示例的工具將隱藏細節,就像Python、R和其他工具一樣!話雖這麼說,如果我們沒有至少讓您瞭解一些基本知識,這將是對您的一種傷害,我們稍後將介紹這些基本知識。我並不是要降低它們的重要性因為它們都是同等重要的,但是我們的目標是讓所有的c#開發人員儘可能快地啟動和運行。我們將為您提供足夠的信息,使您的buzzword符合規範,然後您將瞭解更多,而不僅僅是封裝好的黑盒API調用! 我鼓勵你們每個人在這個領域儘可能多地追求學術知識。機器學習和人工智慧似乎每天都在變化,所以要時刻跟上最新的發展。你知道的越多,你的項目就越容易被接受。
既然我們提出了buzzword相容的主題,讓我們從一開始就清理一些術語。數據挖掘,機器學習,人工智慧,等等。我現在只講幾個術語,但是這裡有一個簡單的方法。
你和家人在公路上旅行。讓我們假設你有孩子,讓我們把“我們還在嗎”的對話放在一邊! 你和你的一個孩子在高速公路上開車(一個很小的蹣跚學步的孩子),你的孩子指著窗外的一輛卡車大喊卡車。這個孩子還很小,所以他是怎麼知道那輛車是卡車的(讓我們假設它真的是卡車!)。他們知道這是一輛卡車,因為每次他們做同樣的事情,你說“是”或“不是”。這是機器學習。然後,當你告訴他們是或不是,那就是強化學習。如果你說是的話,那是一輛大卡車,它會給強化過程增加背景,讓我們沿著這條路深入學習。看看你教給你的孩子什麼是甚至你都不知道的。
數據挖掘
數據挖掘處理的是為非常具體的信息搜索大量的數據。您正在數據中搜索特定的內容。例如,信用卡公司將使用數據挖掘,通過分析購買行為和購買地點來瞭解購買者的習慣。這些信息對諸如目標廣告之類的東西非常有用。
另一方面,機器學習側重於使用您提供的演算法搜索數據的實際任務。有道理嗎?
這裡有一個很好的鏈接,您可以在這裡學習更多關於數據挖掘的知識: https://blog.udacity.com/2014/12/24-data-science-resources-keep-fingerpulse.html
人工智慧
人工智慧是機器學習的一個更高層次。有些人把它定義為機器看起來和人類一樣聰明或比人類聰明。對我來說,這個問題還沒有定論。我每天看的新聞越多,我就越想知道到底哪種智能是人工的,就這一點而言,什麼才是真正的智能!關於人工智慧的定義有很多,但簡而言之,人工智慧被認為是一種機器,它所做的事情是人類能夠或應該做的,以至於任何理性的人都無法在反應上區分機器和人類。無論如何,人工智慧是一個影響深遠的主題,不幸的是,它的含義和人們使用這個術語的含義一樣多。
生物-AI
生物-AI指的是將一個生物組件與一個計算組件放在一起。基因型,表現型,神經元,鏡像神經元,典型神經元,突觸…你會聽到在這個類別下所有提到的,人工神經網路(ANNs)!生物人工智慧主要應用於醫學領域。現在,我們不需要關心這個問題,只需要知道這個術語的存在,以及生物學是它的構成的基礎。
深度學習
多年來,人們認為神經網路(使用一種稱為隱藏層的概念)只需要一個隱藏層就可以解決任何問題。隨著計算能力的提高,計算硬體成本的降低,以及神經網路演算法的進步,在您的網路中有數百甚至數千個隱藏層是很常見的。隱藏層的數量的增加,以及其他一些東西,簡單來說就是什麼是深度學習!這裡有一個直觀的比較,可能有助於讓事情變得更清楚:
如下圖所示,網路中有幾個隱藏的層
概率與統計
信不信由你,這就是你正在做的;它是從你的觀點中很好地抽象出來的。但是讓我給你一個難以置信的,過度簡化的,快速入門…以防你被繞暈了。
你看見一隻北極熊在雪地里走。你想知道它會留下什麼樣的腳印。這是概率。接下來,你看到雪地上的腳印,想知道這是不是北極熊。這是統計數據。再舉一個例子以防萬一:
- 概率是指預測未來事件發生的可能性。
- 統計數據用於分析過去事件的頻率
開始你的機器學習項目
接下來,讓我們談談我們將如何處理我們的機器學習項目,在此過程中,繼續定義/改進我們的機器學習心態。讓我們從定義每次處理這些項目時需要使用的基本步驟開始。基本上,我們可以把它們分成以下幾類。
數據收集
有無數類型的數據可供您使用,從SQL和NoSQL資料庫、Excel文件、Access資料庫、文本文件等等。您需要決定數據位於何處、如何格式化數據、如何導入和細化數據。您需要始終記住,大量的測試和培訓數據以及它們的質量是無法替代的。在機器學習中,無用輸入和無用輸出會變得非常混亂
數據準備
如前所述,數據質量是無可替代的。是否有丟失、畸形或不正確的數據?我們不要忘記另一個你們可能熟悉的術語,數據離群值。這些討厭的小數據片段根本不適合您的其他數據!你有嗎?如果是,他們應該在那裡嗎?如果是,他們將如何處理?如果您不確定,下麵是在繪製數據時數據離群值的樣子:
在統計學中,離群值是一個觀測點,它與其他觀測點之間的距離很遠,有時非常遠,有時不太遠。異常值本身可能是由於測量的可變性導致的,這表明瞭實驗存在缺陷,或者它實際上可能是有效的。如果您在數據中看到異常值,您需要瞭解原因。它們可以指示某種形式的測量誤差,而您使用的演算法可能不夠健壯,無法處理這些異常值。
選擇與訓練模型
在創建和訓練模型時,需要考慮以下幾點。
- 您需要為手頭的任務選擇適當的機器學習演算法,它將代表您正在處理的數據。然後將其分成2-3組數據:培訓、驗證和測試。正確比例的規則根據您處理的數據量的不同而不同。例如,如果您有10,000行數據,那麼20%到培訓和80%到測試可能是好的。但是如果您有108行數據,那麼5%的訓練和95%的測試可能更好。
- 有一條規則你必須嚴格遵守。無論您決定為您的測試、訓練和驗證集使用什麼分數,所有的數據都必須來自相同的數據集。這是非常重要的。您永遠不希望從一個數據集中獲取一些數據來進行訓練,然後從另一個完全不同的數據集中獲取數據來進行測試。這隻會導致失望。
- 總是積累大量的數據集來訓練、測試和驗證。
- 驗證數據可用於在使用測試數據集之前驗證您的測試數據。有些人使用它,有些人不使用它。無論您如何分割數據,您總是有一個要訓練的數據集和一個要測試的數據集。您的演算法的目標必須是足夠靈活地處理它以前沒有見過的數據,如果您使用開發時使用的同一組數據進行測試,則無法做到這一點。以下是可以拆分數據的兩種方法。這兩種方法展示瞭如何分離測試和訓練集(一個帶有交叉驗證集,另一個沒有):
評估模型
一旦您使用了您的訓練數據,您將繼續使用您之前準備的測試數據集來測試/評估您的模型。在這裡,我們可以發現我們的模型是如何根據它以前沒有看到的數據工作的。如果我們的模型在這裡失敗了,我們將返回到開始的地方,並改進我們的流程。
調教模型
當您在評估您的模型時,您可能在某個時候決定您需要選擇一個不同的模型,或者引入更多的特性/變數/超參數來提高模型的效率和性能。減少暴露的一個好方法是在數據收集部分和數據準備部分花費額外的時間。正如我們前面所說,大量正確的數據是無可替代的。
鳶尾花數據集
鳶尾花數據集是生物學家Ronald Fisher先生於1936年介紹的花卉數據集。此數據集包含了3種鳶尾花(鳶尾花,鳶尾花,鳶尾花色)各50個樣本。每個樣本包括四個特征(萼片的長度,花瓣的長度,萼片的寬度,花瓣的寬度)。結合這些數據,就可以得到一個線性判別模型來區分不同的物種。
那麼,我們如何從花到數據:
我們現在需要把我們所知道的花的視覺表現形式轉化成電腦可以理解的東西。我們將花的所有信息分解為列(特征)和行(數據項),如下所示:
既然所有的測量數據都是電腦能夠理解的格式,我們的第一步應該是確保我們沒有丟失或畸形的數據,因為這會帶來麻煩。如果您查看前面屏幕截圖中的黃色高亮部分,您可以看到我們丟失了一些數據。我們需要確保在將其提交給應用程式之前填充了它。一旦正確地準備和驗證了數據,我們就可以開始了。如果我們從Encog34運行Iris驗證器,我們的輸出應該反映出我們有150個數據集,它確實有:
機器學習中的分類
現在,讓我們簡要地熟悉一下我們將在整本書中討論的不同類型的機器學習,重要的是你至少要熟悉這些術語,因為它們總有一天會出現,你知道的和理解的越多,你就能更好地處理你的問題並向別人解釋它。
下麵是一個簡單的圖表,展示了機器學習的三個主要類別:
監督式學習
這些類型的機器學習模型被用來根據提供給它的數據預測結果。所提供的說明是明確和詳細的,或者至少應該是明確和詳細的,這是獲得所監督的標簽的原因。我們基本上是在學習一個基於輸入和輸出對將輸入映射到輸出的函數。這個函數是從被稱為標記的訓練數據中推斷出來的,因為它明確地告訴這個函數它期望什麼。在監督學習中,總是有一個輸入和相應的輸出(或者更準確地說,是一個期望的輸出值)。更正式地說,這類演算法使用一種稱為歸納偏差的技術來實現這一點,這基本上意味著演算法將使用一組假設來預測給定輸入的輸出,這些輸入可能是它以前見過的,也可能不是。
在監督學習中,我們通常可以訪問一組X特征(X1, X2, X3,…)Xx),用觀測值來測量,響應Y,也用同樣的n個觀測值來測量。然後我們試著用X1,X2, X3…Xn來預測Y。
支持向量機(SVM)、線性回歸、朴素貝葉斯和基於樹的方法等模型只是監督學習的幾個範例。
接下來,讓我們簡要討論一下在有監督學習中我們需要關註的一些事情。它們沒有特定的順序。
- 偏見方差的權衡
- 數據的多樣性
- 不正確的輸出值
- 輸入空間維數
- 培訓數據量
在討論偏差-方差權衡之前,我們首先要確保您熟悉各個術語本身。
當我們討論偏差-方差權衡時,偏差指的是學習演算法中由於不正確的假設而產生的錯誤。高偏差會導致所謂的欠擬合現象,這種現象會導致演算法遺漏數據中相關的特征-輸出層關係
另一方面,方差是對訓練集中的小波動的敏感誤差。高方差會導致演算法模擬隨機雜訊,而不是實際的預期輸出,這種現象稱為過擬合。
每個機器學習開發人員都需要理解偏差和方差之間的平衡。它與數據的過擬合和過擬合有直接關係。我們說,如果一個學習演算法在不同的訓練集中預測不同的輸出結果,那麼它對輸入的方差很大,這當然不好。
低偏差的機器學習演算法必須足夠靈活,才能很好地適應數據。但是,如果演算法設計過於靈活,每個訓練和測試數據集的擬合就會不一樣,導致方差很大。
然而您的演算法又必須足夠靈活,那麼你可以通過固有的演算法知識或可由用戶調整的參數來調整這種權衡。
下圖顯示了一個具有高偏差(左側)的簡單模型和一個具有高方差(右側)的更複雜模型。
正如我們反覆說過的,沒有什麼可以替代足夠的數據來正確和完整地完成這項工作。這與學習演算法的複雜性直接相關。一個低偏差、低方差的簡單演算法可以從更少的數據中獲得更好的學習效果。然而,如果您的學習演算法很複雜(許多輸入特性、參數等),那麼您將需要一個更大的訓練集,在低偏差和高方差的情況下進行學習。
對於每一個學習問題我們的輸入都是向量的形式。特征向量,即數據本身的特征,這對演算法的影響很大。如果輸入的特征向量非常大,也就是所謂的高維性,那麼即使只需要其中的幾個特征,學習起來也會更加困難。有時,額外的維度會混淆您的學習演算法,從而導致高方差。反過來,這意味著您必須優化演算法,使其具有更低的方差和更高的偏差。如果適用的話,從數據中刪除額外的特性有時會更容易提高學習方法的準確性。
也就是說,一些機器學習演算法使用了一種稱為降維的流行技術。這些演算法將識別和刪除不相關的特征。
不正確的輸出值
我們在這裡需要問自己的是,機器學習演算法的期望輸出中存在多少錯誤。學習演算法可能會試圖將數據擬合得太好,從而導致我們前面提到的過擬合。過度擬合可能是由於不正確的數據,或學習演算法過於複雜,無法完成手頭的任務。如果出現這種情況,我們需要調整演算法,或者尋找一個偏差更大、方差更小的演算法。
數據的多樣性意味著特征向量包含許多不同種類的特征。如果這適用於我們的應用程式,那麼我們最好為任務應用不同的學習演算法。一些學習演算法還要求我們的數據被縮放以適應特定的範圍,如[0 -1]、[-1 -1]等。當我們學習以距離函數為基礎的演算法時,比如最近鄰居法和支持向量法,你會發現它們對這個非常敏感。另一方面,基於樹的演算法(決策樹等)可以很好地處理這種現象。
我們應該始終從最簡單、最合適的演算法開始,並確保正確地收集和準備我們的數據。從這裡開始,我們可以嘗試不同的學習演算法,並對它們進行優化,看看哪種演算法最適合我們的情況。毫無疑問,優化演算法可能不是一項簡單的任務,並且最終會消耗比我們可用的時間多得多的時間。總是首先確保有適當數量的數據可用
無監督式學習
與監督學習相反,在如何確定結果方面,非監督學習通常有更多的靈活性。對於演算法來說,數據的處理使得數據集中沒有任何一個特征比其他特征更重要。這些演算法從輸入數據的數據集學習,而不需要標記期望的輸出數據。k均值聚類(聚類分析)是無監督模型的一個例子。它非常善於在數據中找到與輸入數據相關的有意義的模式。我們在監督部分所學到的和這裡的最大區別是我們現在有了x的特征X1 X2 X3,…用n個觀測值測量。但我們不再對Y的預測感興趣,因為我們不再有Y了,我們唯一感興趣的是在已有的特征上發現數據模式:
在前面的圖中,我們可以看到這樣的數據本身更適合於非線性方法,在這種方法中,數據似乎是按重要性分組的。它是非線性的,因為我們無法得到一條直線來準確地分離和分類數據。無監督學習允許我們在幾乎不知道結果會是什麼或應該是什麼的情況下解決問題。結構來自於數據本身,而不是應用於輸出標簽的監督規則。這種結構通常由數據的聚類關係導出。
例如,假設我們有許多個基因來自我們的基因組數據科學實驗。我們希望將這些數據分組為類似的片段,如頭髮顏色、壽命、體重等等。
第二個例子是眾所周知的酒會效應,它基本上指的是大腦能夠將註意力集中到一件事上,並過濾掉周圍的噪音。
這兩個示例都可以使用集群來實現它們的目標。
強化學習
強化學習是一種機器被訓練為一個特定的結果,唯一的目的是最大化的效率和/或性能。該演算法因做出正確的決策而得到獎勵,因做出錯誤的決策而受到懲罰。持續的訓練是為了不斷提高績效。持續的學習過程意味著更少的人為干預。馬爾可夫模型是強化學習的一個例子,自動駕駛汽車就是這樣一個應用的很好的例子。它不斷地與環境進行交互,監視障礙物、速度限制、距離、行人等等,以便(希望如此)做出正確的決策。