做爲一個終生的微軟開發人員,我常常看到開發人員努力尋找解決平常問題所需的資源。讓咱們面對現實吧,咱們沒有人有時間按照本身喜歡的方式作事,咱們中不多有人有幸在真正的研發部門工做。雖然這些年來咱們已經走過了至關長的一段旅程,還記得曾經咱們經過桌上的C程序員參考資料和其餘50本書中翻找資料,到如今可以在谷歌中快速搜索並獲得咱們想要的東西。但如今人工智能時代已經到來,狀況有些不一樣了。html
做爲c#開發人員,當涉及到機器學習時,谷歌搜索並不老是咱們最好的朋友,由於幾乎全部正在使用的東西都是Python, R, MATLAB和Octave。咱們還必須記住,機器學習已經存在不少年了; 只是在最近,美國的企業已經接受了它,咱們看到愈來愈多的人蔘與其中。程序員
可是,個人朋友們,毫無疑問,這個世界是一個可怕的地方!c# .NET開發人員該何去何從? 讓咱們在下一節開始用一個小故事來回答這個問題,不幸的是,這個故事是千真萬確的。算法
在本章中,咱們將學習如下主題:數據庫
數據挖掘技術(即指從資料中發掘資訊或知識)c#
是購買、構建仍是開源網絡
強化學習app
無監督學習機器學習
監督式學習函數
機率和統計工具
深度學習
人工智能(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指的是將一個生物組件與一個計算組件放在一塊兒。基因型,表現型,神經元,鏡像神經元,典型神經元,突觸…你會聽到在這個類別下全部提到的,人工神經網絡(ANNs)!生物人工智能主要應用於醫學領域。如今,咱們不須要關心這個問題,只須要知道這個術語的存在,以及生物學是它的構成的基礎。
多年來,人們認爲神經網絡(使用一種稱爲隱藏層的概念)只須要一個隱藏層就能夠解決任何問題。隨着計算能力的提升,計算硬件成本的下降,以及神經網絡算法的進步,在您的網絡中有數百甚至數千個隱藏層是很常見的。隱藏層的數量的增長,以及其餘一些東西,簡單來講就是什麼是深度學習!這裏有一個直觀的比較,可能有助於讓事情變得更清楚:
以下圖所示,網絡中有幾個隱藏的層
信不信由你,這就是你正在作的;它是從你的觀點中很好地抽象出來的。可是讓我給你一個難以置信的,過分簡化的,快速入門…以防你被繞暈了。
你看見一隻北極熊在雪地裏走。你想知道它會留下什麼樣的腳印。這是機率。接下來,你看到雪地上的腳印,想知道這是否是北極熊。這是統計數據。再舉一個例子以防萬一:
接下來,讓咱們談談咱們將如何處理咱們的機器學習項目,在此過程當中,繼續定義/改進咱們的機器學習心態。讓咱們從定義每次處理這些項目時須要使用的基本步驟開始。基本上,咱們能夠把它們分紅如下幾類。
有無數類型的數據可供您使用,從SQL和NoSQL數據庫、Excel文件、Access數據庫、文本文件等等。您須要決定數據位於何處、如何格式化數據、如何導入和細化數據。您須要始終記住,大量的測試和培訓數據以及它們的質量是沒法替代的。在機器學習中,無用輸入和無用輸出會變得很是混亂
如前所述,數據質量是無可替代的。是否有丟失、畸形或不正確的數據?咱們不要忘記另外一個大家可能熟悉的術語,數據離羣值。這些討厭的小數據片斷根本不適合您的其餘數據!你有嗎?若是是,他們應該在那裏嗎?若是是,他們將如何處理?若是您不肯定,下面是在繪製數據時數據離羣值的樣子:
在統計學中,離羣值是一個觀測點,它與其餘觀測點之間的距離很遠,有時很是遠,有時不太遠。異常值自己多是因爲測量的可變性致使的,這代表了實驗存在缺陷,或者它實際上多是有效的。若是您在數據中看到異常值,您須要瞭解緣由。它們能夠指示某種形式的測量偏差,而您使用的算法可能不夠健壯,沒法處理這些異常值。
在建立和訓練模型時,須要考慮如下幾點。
一旦您使用了您的訓練數據,您將繼續使用您以前準備的測試數據集來測試/評估您的模型。在這裏,咱們能夠發現咱們的模型是如何根據它之前沒有看到的數據工做的。若是咱們的模型在這裏失敗了,咱們將返回到開始的地方,並改進咱們的流程。
當您在評估您的模型時,您可能在某個時候決定您須要選擇一個不一樣的模型,或者引入更多的特性/變量/超參數來提升模型的效率和性能。減小暴露的一個好方法是在數據收集部分和數據準備部分花費額外的時間。正如咱們前面所說,大量正確的數據是無可替代的。
鳶尾花數據集是生物學家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了,咱們惟一感興趣的是在已有的特徵上發現數據模式:
在前面的圖中,咱們能夠看到這樣的數據自己更適合於非線性方法,在這種方法中,數據彷佛是按重要性分組的。它是非線性的,由於咱們沒法獲得一條直線來準確地分離和分類數據。無監督學習容許咱們在幾乎不知道結果會是什麼或應該是什麼的狀況下解決問題。結構來自於數據自己,而不是應用於輸出標籤的監督規則。這種結構一般由數據的聚類關係導出。
例如,假設咱們有許多個基因來自咱們的基因組數據科學實驗。咱們但願將這些數據分組爲相似的片斷,如頭髮顏色、壽命、體重等等。
第二個例子是衆所周知的酒會效應,它基本上指的是大腦可以將注意力集中到一件事上,並過濾掉周圍的噪音。
這兩個示例均可以使用集羣來實現它們的目標。
強化學習是一種機器被訓練爲一個特定的結果,惟一的目的是最大化的效率和/或性能。該算法因作出正確的決策而獲得獎勵,因作出錯誤的決策而受到懲罰。持續的訓練是爲了避免斷提升績效。持續的學習過程意味着更少的人爲干預。馬爾可夫模型是強化學習的一個例子,自動駕駛汽車就是這樣一個應用的很好的例子。它不斷地與環境進行交互,監視障礙物、速度限制、距離、行人等等,以便(但願如此)作出正確的決策。
咱們與強化學習最大的不一樣是咱們沒有處理正確的輸入和輸出數據。這裏的重點是性能,這意味着須要在看不見的數據和算法已經學過的東西之間找到一種平衡。
算法將一個動做應用到它的環境中,根據它所作的、重複的等行爲接受獎勵或懲罰,以下圖所示。你能夠想象一下每秒有多少次這種狀況發生在剛剛在酒店接你的自動駕駛出租車上。
接下來,讓咱們問本身一個很是重要的問題。咱們是須要購買、構建仍是使用開源?
接觸開源世界,這是個人建議,固然也是我寫這本書的緣由之一。我意識到許多開發人員都有「它不是在這裏構建的」綜合症,可是在走上這條道路以前,咱們應該對本身誠實。咱們真的認爲咱們有能力作得更好、更快、在咱們的時間限制內進行測試嗎?咱們應該先試着看看已經有什麼可使用。有不少很棒的開源工具包可供咱們使用,這些工具包的開發人員已經投入了大量的時間和精力來開發和測試它們。顯然,開源並非每一個人、每次均可以使用的解決方案,可是即便您不能在應用程序中使用它,也能夠經過使用和試驗它們得到大量的知識。
購買一般不是一個最佳選擇。若是你足夠幸運地找到要買的東西,但你可能不會獲得批准,由於它將花費一大筆錢!若是你須要修改產品來作你須要的事情,會發生什麼?祝您好運,可以訪問源代碼或者讓支持團隊爲您更改他們的優先級。這中狀況幾乎不會發生,至少不會像咱們須要的那麼快。
至於本身構建,嘿,咱們是開發者,這是咱們都想作的,對吧?可是在您啓動Visual Studio以前,請仔細地考慮一下您將要進入的環境。
因此開源應該永遠是第一選擇。您能夠將其引入內部(假設許可容許您這樣作),在須要時根據您的標準對其進行調整(代碼聯繫、更多的單元測試、更好的文檔,等等)。
在這一章中,咱們討論了機器學習的許多方面,以及實現您的代碼的不一樣策略,如構建、購買或開源,並簡單介紹了一些重要的定義。我但願這能讓大家爲接下來的章節作好準備。
轉載請註明出處:http://www.javashuo.com/article/p-xcauaigp-gn.html
文章發表的另外一個地址:https://blog.csdn.net/wyz19940328/article/details/85835239