1. 程式人生 > >Julia 資料科學應用

Julia 資料科學應用

內容簡介

本書的目標是教你如何使用 Julia 語言來應對現實世界中資料科學的艱鉅挑戰。在介紹了 Julia 對於資料科學社群的重要性和若干資料科學基本準則之後,本書講解了 Julia 基礎知識,包括如何安裝 Julia 及其功能強大的程式庫。本書通過豐富的示例展示瞭如何使用 Julia 命令、資料集和函式。

本書介紹並描述了專用的指令碼和軟體包。針對在資料科學流程中經常會遇到的問題,本書提供了有代表性的實用示例,並引導你通過 Julia 使用公開的資料集來解決這些問題。在很多情況下,使用現成的軟體包和內建函式就可以完成任務。

本書每一章都包括一些思考題和練習,來幫助你加強學習效果,指導你使用 Julia 從頭開始建立一個數據科學應用。

  • 資料科學流程概覽,並通過 Julia 實現一個示例,說明了其中的關鍵點。
  • Julia IDE 的選擇。
  • 程式結構與函式。
  • 資料工程中的任務,如資料匯入、資料清理、資料格式化和資料儲存,以及如何執行資料預處理。
  • 資料視覺化,以及一些簡單但非常強大的用來進行資料探索的方法。
  • 資料降維和特徵評價。
  • 各種機器學習方法,從非監督式學習(不同型別的聚類方法)到監督式學習(決策樹、隨機森林、 基礎神經網路、迴歸樹和極限學習機)。
  • 圖分析,包括找出不同實體之間的聯絡以及如何對其進行挖掘以獲取有用的知識。

作者簡介

Zacharias Voulgaris

博士出生於希臘雅典。他就讀於克里特理工大學生產工程與管理專業,後轉而學習電腦科學,在倫敦城市大學獲得了資訊系統與技術的碩士學位,此後,又研究資料科學,在倫敦大學獲得了機器學習博士學位。他曾經在佐治亞理工大學工作並任研究員,他還擔任過 SEO 經理、資料科學家,還做過 Microsoft 公司的程式經理,負責 Bing 的資料分析流程。除了資料科學,他對新技術、文學和音樂抱有濃厚的興趣。

本書內容

前言

我是在幾年前發現 Julia 的,從此就被它的強大能力與巨大潛力所吸引。Julia 具有使用者友好的整合開發環境(Integrated Development Environment,IDE),這使它很容易上手;它還具有高階的邏輯表達能力(非常類似 Matlab 和其他高階語言)和極高的效能,這使它的功能非常強大。但是,當時我正致力於研究其他更成熟的平臺,比如 R 和 Java,未能給予 Julia 太多的關注。

因此,我只瞭解了 Julia 的一些基礎知識,以及當時的教程中提供的一些具體應用,並沒有進行更多的研究。除了 Julia 之外,我還知道不斷有一些新的有趣的語言被開發出來,但大多數是曇花一現。

那麼,為什麼我現在又對 Julia 感興趣了呢?一個原因就是,這些年它一直保持著良好的發展勢頭,Julia 會議的參與人數每年都有顯著的增長。儘管我曾經很熟悉它的基本知識,但當我重拾 Julia 時,發現有很多新的知識需要學習。從我初識 Julia 之後,它已經有了很大的發展。

更重要的原因是,Julia 已經跨過了大西洋,引起了歐洲從業者的極大興趣,其中一位已經為這種相當年輕的語言建立了一系列視訊和練習資料。

在試用了 Julia 0.2版之後,我開始琢磨,除了快速分解質因數和計算第 n 個斐波那契數之外,是否能使用 Julia 來做些真正有用的事情。雖然0.2版僅有幾個軟體包,文件也做得很差,我只能找到零星幾個介紹這門語言的視訊,多數還是來自某個 Python 會議上的發言。但是,我還是在計算機上保留著 Julia,並時不時地用它寫個指令碼,來解決 Project Euler、Programming Praxis 或類似站點上的程式設計問題。當時我是個專案經理,所以沒有很大的積極性去掌握一門新的程式語言。我在 Julia 上所做的一切都是出於興趣。

但是,幾個月之後,我重新開始從事資料科學工作,並更加正式地使用 Julia 程式設計。我很快就發現,使用 Julia 編寫程式碼比使用 Python 更容易,例如,即使使用 Python 完成一個基本的資料加工任務,也需要一大堆擴充套件包。

在使用 Julia 解決小問題之後,我決定使用 Julia 獨立完成一個完整的資料科學專案。在經歷了不可避免的學習曲線和成長陣痛之後,我終於達到了目標。這並不是我最得意的成果,但它證明了在進行一些訓練、嘗試和糾錯之後,Julia 可以高效地完成正式的資料科學任務。

在本書中,我會分享在這個專案以及隨後的專案中獲得的經驗,闡述如何在資料科學的各個環節使用 Julia。儘管現在已經有了一些介紹 Julia 的書籍,但還沒有一本全面介紹如何在資料科學領域內應用 Julia 的專著。我曾非常期待有這樣一本書,但有了多年使用 Julia 的經驗之後,我決定親自上陣,撰寫這樣的一本書。

我完全清楚,撰寫一本介紹正處於發展時期的語言的書風險有多大,但是 Julia 這門語言不會停止發展,如果我等待它完全成熟,這本書就永遠不會完成。

我並不期待你能夠全面掌握 Julia,或成為一個成熟的資料科學家。如果你渴望擴充套件技能,學習解決老問題的新方法,並嚴格按照本書的進度進行學習,那麼 Julia 就會成為你進行資料分析的一個有效工具。

第1章 Julia 簡介

現在的程式語言有幾十種,有些是通用的,有些則專注於某個領域,但每種語言都號稱比其他語言更優秀。最強大的語言(能夠快速執行復雜運算的語言)學習起來應該很難(要想掌握就更難了),它們的使用者僅侷限於那些對程式設計具有天賦的“硬核”程式設計師。雄心勃勃的資料科學家不得不面對這樣一種前景:花費大量時間和精力學習了一門語言,卻對他們的工作幫助甚微,寫下了一行又一行復雜的程式碼,卻實現不了一種可用的演算法。

“即插即用”的程式語言是另外一種情況,它們將所有的程式設計複雜性都進行了精心的封裝。那些最單調乏味的(一般也是應用最廣泛的)演算法都被預先包裝好了,供使用者方便地使用,幾乎不需要學習過程。這些語言的問題是,它們的速度會很慢,而且對記憶體和運算能力有很苛刻的要求。資料科學家們又面臨了一種與前面相反的困境:語言學習沒有陡峭的學習曲線,這是個優點,但想用這些語言來完成任務,卻困難重重。

Julia 正是位於這兩種極端情況中間的一種語言,它最大程度地綜合了上面兩類語言的優點。其實,它就是一門設計用來進行技術計算的程式語言,它計算速度快,易於使用,並內建了許多資料處理工具。儘管它還處於初級階段,那些對它進行了充分測試的人們已經感受到了它的巨大潛力,並確信它在技術計算和資料科學領域內有很大的用武之地。

以下一些特點使 Julia 在眾多程式語言中脫穎而出。

  • 極其卓越的效能。Julia 在很多資料分析任務以及其他程式設計實踐中都表現出了令人難以置信的效能。它的表現可以和 C 語言媲美,C 語言經常被用來作為衡量運算速度的標準。
  • 強大的基礎庫。Julia 有一個強大的基礎庫,它不需要其他平臺,就可以進行所有的線性代數運算,這些運算是資料分析模組的必備元件。
  • 支援多分派。Julia 實現了多分派機制,這使它可以使用同一種函式實現不同的過程,使函式更容易擴充套件,並可以對不同型別的輸入重複使用。
  • 容易上手。特別是對於那些從 Python、R、Matlab 或 Octave 遷移過來的使用者,學習 Julia 特別容易。
  • 使用者友好的介面。不論是在本地還是雲上,Julia 的使用者介面都非常友好,在所有的流程中,使用者與 Julia 的交流都非常順暢。Julia 還對所有的功能和資料型別提供了方便易用的幫助檔案。
  • 與其他語言無縫對接。這些語言包括(但不限於)R、Python 和 C。這使你不需要進行完整的遷移,就可以使用現有的程式碼庫。
  • 開源。Julia 以及它的所有文件與教程都是開源的,非常易於獲取,詳盡而又全面。
  • 開發者承諾。Julia 的開發者承諾會一直加強這門語言的效能,並對使用者提供儘可能的幫助。他們提供了大量的討論,組織年度會議,並提供諮詢服務。
  • 自定義函式。Julia 的自定義函式可以和內建在基礎程式碼中的函式一樣快速而簡潔。
  • 並行能力。Julia 具有強大的並行能力,這使得在多核計算機和叢集上的部署非常容易。
  • 極大的靈活性。Julia 在開發新程式方面極其靈活,不論是程式設計新手,還是專家級使用者,Julia 適合各種程式設計水平的使用者,這個特性在其他語言中是很難得的。

在學習和使用 Julia 的過程中,你肯定會發現它的更多優點,尤其是在資料科學方面。

1.1 Julia 如何提高資料科學水平

“資料科學”是個相當含糊的名詞,自從它成為科學領域一門學科後,就具有很多不同的意義。在本書中,我們這樣來定義它:資料科學通過各種統計學和機器學習的技術與方法,將資料轉換為有用的資訊或知識。

由於資料的快速增長,資料科學必須利用各種工具的強大功能來應對大資料的挑戰。因為資料科學的一大部分任務就是執行指令碼來處理規模龐大、結構複雜的資料集(通常被稱為“資料流”),所以一門高效能的程式語言對於資料科學來說不是奢侈品,而是必需品。

考慮一下某種特定的資料處理演算法,它通過傳統語言實現,需要執行幾個小時。那麼演算法效能的適度提高就可以對資料處理過程的整體速度造成相當大的影響。作為一門新語言,Julia 做的就是這樣一件事情,這使它成為了資料科學應用的理想工具,既適合經驗豐富的資料科學家,也適用於入門者。

1.1.1 資料科學工作流程

人們認為資料科學是由多個環節組成的一個流程,每個環節都與手頭的資料和分析目標密切相關。很多時候,這個目標是實現一個儀表盤或某種智慧視覺化結果(通常是可互動的),這通常被稱為“資料產品”。

資料科學包括從真實世界(比如 HDFS 系統中的資料流,CSV 檔案中的資料集,或者關係資料庫中的資料)中獲取資料,對資料進行處理並得到有用的資訊,以及將資訊以一種精煉和可操作的形式返回到真實世界中。最終結果通常是資料產品的形式,但也不是必須的。舉例來說,你可能被要求在公司的內部資料上面應用資料科學,但只要將結果以視覺化的方式與公司管理者共享就可以了。

看一個小公司的例子,這個公司正在對部落格訂閱者進行問卷調查,從而進行資料驅動的市場研究。這個資料科學過程包括以下5個步驟。

1.從營銷團隊獲取資料。

2.進行資料準備,將資料轉換成可以用於預測分析的形式。

3.對資料進行探索性分析,分辨出是否某些人更傾向於購買某些特定產品。

4.對工作進行規範化,使整個工作過程達到資源有效和無誤差。

5.開發模型,深入研究公司客戶對哪些產品最感興趣,以及他們期望為這些產品付多少錢。

我們會在第5章中對這個過程進行更詳細的介紹。圖1.1是資料科學過程的一幅完整圖景,其中也包含了 Julia 語言的適用範圍。我們通常用三個堆疊起來的圓形表示 Julia,在圖中,這個符號指示出了 Julia 的用武之地。很明顯,除了資料產品開發和資料獲取,Julia 幾乎可以用於資料科學過程的各個階段。

enter image description here

圖1.1 資料科學過程概覽。3個堆疊起來的圓形表示可以應用 Julia 的階段

想想看,Julia 可以在多大程度上簡化你的工作流程?你不需要從其他平臺上抓取程式碼來修補自己的流程,從而造成令人困擾的瓶頸。而且,只要你在 Julia 中除錯通過了程式碼,也沒有必要將其轉換為像 C++ 或 Java 之類的語言,因為這樣做不會有效能上的提高。這一點非常重要,在用 R 和 Matlab 之類的語言構建原型時,這種轉換是個必需的步驟。

1.1.2 Julia 被資料科學社群接受的過程

你可能心生疑慮:“既然 Julia 是這麼完美的一種語言,為什麼還沒有被資料科學社群廣泛接受呢?”我們完全可以期待,Julia 這種功能豐富的語言嶄露頭角,未來會像 R 和 Python 一樣,在資料科學領域內佔有一席之地。

儘管 Julia 對於任何型別的資料處理專案來說都是一種明智的選擇,但是與其他更成熟的語言相比,它提供的擴充套件包還不夠多(儘管隨著使用者數量的增加,可用的 Julia 擴充套件包的數量也在平穩地增長)。主要原因是 Julia 是一門年輕的語言,而且隨著時間的推移,必定還會發展變化。

更重要的是,資料科學從業者與學習者還沒有確信 Julia 可以像 Python 和 R 那樣容易地學習和掌握。這兩種語言都以具有龐大的使用者社群為傲,使用者社群使程式設計不僅簡單,而且具有樂趣。想想 Python Challenge 吧:一系列程式設計任務,使學習 Python 就像是在遊戲裡面闖關。

毫無疑問,總有一天 Julia 也會發展出同等規模的粉絲圈,但現在它的影響力還不夠,特別是在資料科學從業者中間。儘管 Julia 潛力巨大,但很多人發現,在 Julia 中寫出清晰的程式碼並將初始程式除錯通過是一件相當困難的事情。對新手來說,整個開發過程令人望而卻步,甚至半途而廢。

預先開發好的程式通常以“庫”或“包”的形式來提供。儘管 Julia 提供了足夠多的包來完成資料科學任務,但是還缺少一些演算法,需要自己程式設計實現。在網頁發展的初級階段,HTML 和 CSS 也面臨了同樣的問題,但是當它們的深奧技術逐漸成為主流,形勢就一片大好了。對 Julia 的先驅者來說,可能會發生同樣的事情。即使你沒有積極地參與 Julia 程式設計社群,但在對這門語言逐漸熟練的過程中,你也肯定會受益匪淺。而且,當社群不斷增長完善時,Julia 使用者完成任務會越來越容易,特別是對先驅者來說。

1.2 Julia 擴充套件

儘管現在能夠擴充套件 Julia 功能的庫檔案(通常稱為“包”)還比較少,但是 Julia 資源正在不斷地增加。從2015年初到2016年中,Julia 包的數量翻了一番,而且還看不出減慢的跡象。由於 Julia 的使用者多數是從事高階計算的,所以這些包都是用來滿足他們的需求的。包的更新就更加頻繁了,這使得這門語言的魯棒性不斷提高。最後,因為 Julia 社群規模較小,並且聯絡緊密,所以很少有重複開發。

1.2.1 包的質量

“現有的包的質量如何?”你可能會問這個問題。因為開發這些包的使用者大多經驗豐富,他們會盡力寫出高質量的程式碼,從 GitHub 使用者獎勵的“星星”就可以反映出這一點。值得注意的是,從2015年末到我寫完這本書為止,各種 Julia 包獲得的星星數量增加了50%。很明顯,在這個著名的程式倉庫中,上傳的 Julia 程式碼受到了越來越多的青睞。

很多 GitHub 中的包(不管是什麼語言)都有一個有趣的特點,就是通過測試來建立程式的完整性和覆蓋率等指標,這樣在你開始使用這些程式之前,就可以清楚地瞭解它們的可靠性。對於最新版本的 Julia(0.4),測試結果相當感人:在所有610個包中,63%的包通過了所有測試,只有11%的包沒有通過測試(其餘的包還沒有進行測試,或者是不可測試的)。

1.2.2 找到新的包

如果想了解 Julia 包開發情況的最新資訊,你可以訪問 http://pkg.julialang.org/pulse.html。此外,在本書的末尾,我們給出了一個參考列表,其中包括了資料科學應用中最常用的包。值得注意的是,儘管 Julia 不像其他語言那樣有那麼多型別的擴充套件包,但是對資料分析而言,Julia 的擴充套件包完全夠用了。本書的主要內容就是闡述這些擴充套件包的工作原理,以及如何使用它們來解決艱鉅的資料科學問題。

1.3 關於本書

如果你正在閱讀本書(並計劃按照書中的示例進行練習),那麼你至少應該對資料科學領域有所涉獵。我假設你具有基本的程式設計經驗,並對資料結構、GitHub 倉庫和資料分析過程有所瞭解。如果你曾經獨立實現過某種演算法,完整地開發過某種程式,或使用過 GitHub 上的現成程式解決過實際問題(哪怕是個簡單的問題),那麼你就有了一個良好的開端。

最重要的是,我希望你有一個腳踏實地的態度,在遇到問題時,可以熟練使用各種技術文件和論壇來尋求解決方案。最後,你必須對學習這門語言有種發自內心的興趣,並將其與你的資料分析專案緊密地結合起來。

讀到現在,你應該知道學習本書的最大收益就是:在掌握用於資料科學的 Julia 語言方面取得顯著進步。你可能不會成為 Julia 開發專家,但你學到的知識足以使你看懂新的指令碼,並完全可以使用 Julia 完成一些有趣的資料分析專案。其中的一些資料工程任務,如果使用其他程式語言來完成的話,會不厭其煩。

本書會提出一系列在資料科學流程中常見的、有代表性的實際問題,並指導你使用 Julia 去解決這些問題。你不需要去重新發明輪子,因為可以使用現有的內建功能和擴充套件包解決絕大多數問題。而且,你還可以使用幾個真實資料集進行練習,以別人的成功經驗為指導,不用在盲人摸象的情況下不斷重複試錯的過程。

本書將要介紹的內容如下。

1.可以用於 Julia 開發的幾種現成的 IDE(整合開發環境),以及如何使用文字編輯器來建立和編輯 Julia 指令碼。

2.通過幾個相對簡單的示例程式,介紹 Julia 語言特性(主程式結構和函式)。

3.使用 Julia 完成資料工程任務的幾種不同方式,包括資料的匯入、清洗、格式化和儲存,以及如何進行資料預處理。

4.資料視覺化,以及幾種簡單但很強大的用於資料探索目的的統計方法。

5.通過各種技術去除不必要的變數,實現資料降維。在這部分內容中,我們還將涉及特徵評估技術。

6.機器學習方法,包括無監督式學習方法(各種聚類技術)和監督式學習方法(決策樹、隨機森林、基本神經網路、迴歸樹、極限學習機等)。

7.圖分析方法,研究如何在現有資料上應用目前最流行的演算法,並確定不同實體之間的聯絡。

除了上面這些內容,我們會繼續討論資料科學中的一些基本知識,這樣,在深入鑽研資料科學的各個環節之前,你會對資料科學的整體流程有一個清晰的認識。而且,書中的所有資料都帶有補充資訊,這對 Julia 初學者是非常重要的,補充資訊介紹了將 Julia 安裝到計算機上的方法,以及學習這門語言的一些資源。

在本書中,你將會接觸到很多示例和問題,它們可以加強你對每章內容的理解和掌握。如果你確信已經掌握了書中的大部分知識,就可以編寫自己的程式,充分發揮這門非凡程式語言的巨大威力。

本書會指導你如何以並行的方式執行 Julia(如果你不能使用叢集,在單機上也可以)。對於那些勇氣十足、希望接受挑戰的人,在最後一章可以利用本書中學到的所有知識和技能,使用 Julia 從零開始構建一項完整的資料科學應用。你準備好了嗎?

第2章 建立資料科學工作環境
第3章 Julia 入門
第4章 Julia 進階
第5章 Julia 資料科學應用概述
第6章 Julia 資料工程
第7章 探索資料集
第8章 構建資料空間
第9章 資料抽樣與結果評價
第10章 無監督式機器學習
第11章 監督式機器學習
第12章 圖分析
第13章 更上一層樓
附錄 A 下載安裝 Julia 與 IJulia
附錄 B 與 Julia 相關的一些常用站點
附錄 C 本書所用的擴充套件包
附錄 D Julia 與其他平臺的整合
附錄 E Julia 中的並行處理
附錄 F 各章思考題答案

閱讀全文: http://gitbook.cn/gitchat/geekbook/5bbec02c240954117464545f