資料科學工作流程包含許多繁瑣的步驟,從資料收集、清理到建模與分析,都需要投入大量時間和精力。本文介紹的 OSEMN 模型提供了一個系統化的框架,而命令列工具則為每個步驟提供了強大且靈活的支援。透過命令列,資料科學家可以更有效率地處理資料、自動化重複性任務,並整合各種工具,提升整體工作效率。本文將詳細介紹如何在命令列環境下執行 OSEMN 模型的各個步驟,並提供實用的技巧和案例,幫助讀者快速上手並應用於實際工作中。
資料科學的 OSEMN 模型
資料科學領域仍處於初期發展階段,因此對於其涵蓋範圍存在多種不同的定義。在本文中,我們採用由 Hilary Mason 和 Chris H. Wiggins 提出的實用定義,將資料科學分為五個步驟:取得資料、清理資料、探索資料、建模資料和解讀資料。這五個步驟共同構成了 OSEMN(讀作 awesome)模型。除了最後一步「解讀資料」外,本文其他每個步驟都有專門的章節進行詳細介紹。
OSEMN 模型的迭代與非線性過程
儘管這五個步驟在書中是按線性和增量順序進行討論的,但在實際操作中,人們經常需要在不同步驟之間來回切換,或同時執行多個步驟。圖 1-1 展示了進行資料科學的過程是一個迭代和非線性的過程。例如,一旦對資料進行建模並檢視結果後,可能會決定傳回到資料清理步驟,以調整資料集的特徵。
取得資料
沒有資料就無法進行資料科學。因此,第一步是取得資料。除非已經擁有資料,否則可能需要執行以下一或多個操作:
- 從其他位置下載資料(例如網頁或伺服器)
- 從資料函式庫或 API 查詢資料(例如 MySQL 或 Twitter)
- 從其他檔案中提取資料(例如 HTML 檔案或電子試算表)
- 自行生成資料(例如讀取感測器或進行調查)
在第三章中,我們將討論使用命令列取得資料的多種方法。取得的資料很可能是純文字、CSV、JSON、HTML 或 XML 格式。下一步是清理這些資料。
清理資料
取得的資料通常存在缺失值、不一致性、錯誤、奇怪的字元或不感興趣的欄位。在這種情況下,需要在對資料進行任何有趣的操作之前對其進行清理。常見的清理操作包括:
- 篩選行
- 提取特定欄位
- 取代值
- 提取單詞
- 處理缺失值和重複項
- 將資料從一種格式轉換為另一種格式
雖然資料科學家熱衷於建立令人興奮的資料視覺化和富有洞察力的模型(OSEMN 模型的第 3 和第 4 步),但通常大部分工作都花在取得和清理所需的資料上(第 1 和第 2 步)。在《Data Jujitsu》中,DJ Patil 表示:「任何資料專案中 80% 的工作都在於清理資料。」在第五章中,我們將展示命令列如何協助完成這些資料清理操作。
探索資料
一旦清理完資料,就可以開始探索它。這是事情變得有趣的地方,因為在探索過程中才能真正瞭解自己的資料。在第七章中,我們將展示如何使用命令列來:
- 檢視資料
- 從資料中匯出統計資料
- 建立富有洞察力的視覺化
第七章中使用的命令列工具包括 csvstat 和 rush。
建模資料
如果想要解釋資料或預測未來事件,很可能需要建立一個統計模型。建立模型的技術包括分群、分類別、迴歸和降維。命令列不適合從頭開始編寫新的模型,但可以用來建立模型。在第九章中,我們將介紹多種命令列工具,這些工具可以在本地建立模型或使用 API 在雲端進行計算。
解讀資料
OSEMN 模型的最後一步,也是最重要的步驟,是解讀資料。這一步驟包括:
- 從資料中得出結論
- 評估結果的意義
- 傳達結果
本文結構
除了涵蓋 OSEMN 步驟的章節外,本文還有四個插曲章節。每個章節都討論了與資料科學相關的更一般性的主題,以及如何在這些主題中使用命令列。這些主題適用於資料科學過程中的任何步驟。
在第四章中,我們將討論如何為命令列建立可重複使用的工具。這些個人工具可以來自曾經在命令列上輸入的長命令,或來自現有的 Python 或 R 程式碼。能夠建立自己的工具可以提高效率和生產力。
因為命令列是進行資料科學的互動式環境,所以很難跟蹤工作流程。在第六章中,我們將展示一個名為 make 的命令列工具,它允許以任務和任務之間的依賴關係來定義資料科學工作流程。這個工具提高了工作流程的可重複性,不僅對自己有益,也對同事和同行有益。
在第八章中,我們將解釋如何透過平行執行命令和工具來加快速度。使用一個名為 GNU Parallel 的命令列工具,可以將命令列工具應用於非常大的資料集,並在多個核心甚至遠端機器上執行它們。
在第十章中,我們將討論如何在其他環境和程式語言中使用命令列的功能,例如 R、RStudio、Python、Jupyter Notebooks,甚至 Apache Spark。
何謂命令列?
在討論為什麼應該使用命令列進行資料科學之前,讓我們先來看看命令列到底是什麼樣子(你可能已經很熟悉了)。圖 1-2 和圖 1-3 分別顯示了 macOS 和 Ubuntu 上預設的命令列截圖。Ubuntu 是 GNU/Linux 的一個特定發行版,也是本文所使用的系統。
圖 1-2:macOS上的命令列介面
圖 1-3:Ubuntu上的命令列介面
命令列的使用與優勢
本文將探討如何利用命令列進行高效的資料科學工作,包括資料處理、模型建立和結果解讀等各個環節。透過實踐案例和詳細的技術解析,幫助讀者掌握利用命令列工具提升工作效率的方法。
為何資料科學需要命令列?
在 Ubuntu 系統中,我們可以透過終端機(terminal)與殼層(shell)互動。殼層負責執行我們輸入的命令。在本文中,我們將探討為何資料科學需要命令列,以及命令列的優勢。
命令列的優勢
命令列具有多項優勢,使其成為資料科學家高效且富有成效的工具。這些優勢大致可歸納為以下幾點:敏捷(agile)、增強(augmenting)、可擴充套件(scalable)、可擴充(extensible)以及無所不在(ubiquitous)。
命令列的敏捷性
命令列的第一大優勢是其敏捷性。資料科學具有高度的互動性和探索性,而命令列環境正好滿足了這一點。命令列透過兩種方式實作敏捷性:
讀取-評估-輸出迴圈(REPL):在命令列中輸入命令後按下 Enter 鍵,命令會立即被評估執行。這種機制比起編寫指令碼、編譯程式或執行 Hadoop 任務等 edit-compile-run-debug 迴圈更為方便。命令列的 REPL 環境允許資料科學家快速執行命令、隨時停止或修改命令,從而實作與資料的快速互動。
$ whoami dst $ date Tue Jun 29 02:25:17 PM CEST 2021
#### 內容解密:
- `whoami` 命令用於顯示當前使用者的名稱。
- `date` 命令則顯示目前的日期和時間。
2. **接近檔案系統**:由於資料是資料科學的核心,命令列提供了許多便捷的工具來處理包含資料集的檔案。
### 命令列的增強能力
命令列能夠與其他技術無縫整合,無需放棄現有的資料科學工作流程。事實上,命令列可以視為一種增強技術,能夠放大現有技術的效能。這種增強可以透過三種方式實作:
1. **作為多種資料科學工具之間的橋樑**:命令列可以將第一個工具的輸出直接連線到第二個工具的輸入,從而實作工具之間的協同工作。
```bash
$ echo 'The command line is awesome!' | cowsay -f tux
______________________________
< The command line is awesome! >
---
-
---
-
---
-
---
-
---
-
---
-
---
---
\
\
.--.
|o_o |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/
$
內容解密:
echo命令輸出字串'The command line is awesome!'。cowsay命令接收該字串並以 ASCII 藝術的形式顯示出來,使用-f tux引數指定了 Tux 這隻企鵝作為圖案。
從現有環境委派任務給命令列:許多環境如 Python、R 和 Apache Spark 都允許執行命令列工具並擷取其輸出。
將程式碼轉換為可重複使用的命令列工具:將 Python 或 R 指令碼轉換為命令列工具後,無論從命令列直接使用還是從其他整合了命令列的環境中使用,都變得非常方便。
命令列的可擴充套件性
與圖形使用者介面(GUI)相比,命令列的操作方式是透過鍵入命令來完成任務,而非透過滑鼠點選。這種操作方式使得命令列在處理大量資料或執行複雜任務時更具優勢。
為何選擇命令列進行資料科學
在進行資料科學時,選擇合適的工具和環境至關重要。命令列(Command Line)提供了一個強大、靈活且可擴充套件的環境,使其成為資料科學工作的理想選擇。
命令列的優勢
可自動化
在命令列上手動輸入的任何命令都可以透過指令碼和工具自動化。這使得在出錯時、輸入資料變更時,或同事需要執行相同分析時,能夠輕易地重新執行命令。此外,命令可以按照特定的間隔、在遠端伺服器上以及在多個資料區塊上平行執行。
可擴充套件與可重複
由於命令列是可自動化的,因此它變得可擴充套件和可重複。自動化使得大規模處理資料和重複執行任務變得更加容易。相比之下,圖形使用者介面(GUI)因為難以自動化指標和點選操作,不太適合進行可擴充套件和可重複的資料科學工作。
可擴充套件性
命令列本身是在50多年前發明的,其核心功能基本保持不變,但其工具卻在不斷地發展。命令列是語言無關的,這使得命令列工具可以用多種不同的程式語言編寫。開源社群提供了許多免費且高品質的命令列工具,用於資料科學。
無處不在
由於命令列伴隨著任何類別Unix的作業系統,包括Ubuntu Linux和macOS,因此它無處不在。加上前500名超級電腦中100%執行Linux,命令列的重要性不言而喻。不論是超級電腦、伺服器、筆記型電腦還是嵌入式系統,Linux都有其身影。如今,許多公司提供雲端運算服務,可以輕易地啟動新的機器。如果登入這樣的機器(或一般的伺服器),幾乎一定會到達命令列。
為何在命令列上進行資料科學
本章介紹了用於資料科學的OSEMN模型,並提供了有關Unix命令列的背景知識。下一章將展示如何透過安裝資料集和工具來開始,並解釋基本概念。
開始使用
本章確保讀者具備進行命令列資料科學的所有先決條件。首先,下載本文使用的資料集。其次,安裝包含所有必要命令列工具的Docker映像。最後,透過示例瞭解使用命令列時的必備概念。
取得資料
- 從本文網站下載ZIP檔案。
- 建立一個新目錄,將ZIP檔案移至該目錄並解壓縮。
- 該目錄現在包含每個章節的一個子目錄。
安裝Docker映像
為了方便使用,本文提供了一個Docker映像,其中包含了所有必要的命令列工具。要安裝Docker映像,首先需要從Docker網站下載Docker本身。安裝後,可以透過以下命令下載Docker映像:
$ docker pull datasciencetoolbox/dsatcl2e
執行Docker映像:
$ docker run --rm -it datasciencetoolbox/dsatcl2e
這將進入一個包含所有必要命令列工具的隔離環境。如果以下命令產生一個熱情的牛,則表示一切正常:
#### 內容解密:
此處使用 `$ docker run` 命令啟動了一個 Docker 容器。引數 `--rm` 表示容器離開時自動刪除,`-it` 表示以互動模式執行並分配一個偽終端。`datasciencetoolbox/dsatcl2e` 是要執行的 Docker 映象名稱。
Docker 環境下的資料科學工具箱使用
當你開始使用 Docker 映像進行資料科學工作時,瞭解如何在容器內外傳輸資料至關重要。你可以透過掛載本機目錄到容器內部目錄來實作這一點。以下是在不同作業系統上執行此操作的指令:
macOS 或 Linux
$ docker run --rm -it -v "$(pwd)":/data datasciencetoolbox/dsatcl2e
Windows 命令提示字元 (cmd)
C:\> docker run --rm -it -v "%cd%":/data datasciencetoolbox/dsatcl2e
Windows PowerShell
PS C:\> docker run --rm -it -v ${PWD}:/data datasciencetoolbox/dsatcl2e
內容解密:
docker run:啟動一個新的 Docker 容器。--rm:容器離開後自動刪除容器。-it:-i表示互動模式,-t分配一個偽終端。-v "$(pwd)":/data:將目前目錄掛載到容器的/data目錄。$(pwd)在 Linux/macOS 上取得目前工作目錄。%cd%在 Windows cmd 中取得目前工作目錄。${PWD}在 Windows PowerShell 中取得目前工作目錄。
datasciencetoolbox/dsatcl2e:使用的 Docker 映像名稱。
完成工作後,輸入 exit 即可關閉 Docker 容器。
基本的 Unix 概念
在開始使用 Docker 映像後,你將在命令列環境中工作。本文將介紹一些你需要了解的基本概念和工具。
環境層級
- 命令列工具:你直接與之互動的工具,如
ls、cat和jq。 - 終端:你輸入命令的應用程式。
- Shell:解釋你輸入命令的程式,如 Z shell、Bash 和 Fish。
- 作業系統:底層系統,Docker 映像根據 Ubuntu GNU/Linux 發行版。
執行命令列工具
嘗試在終端中輸入以下命令:
$ pwd
/home/dst
內容解密:
pwd:輸出目前工作目錄的路徑。
使用 cd 命令導航到不同目錄:
$ cd /data/ch02
$ pwd
/data/ch02
$ cd ..
$ pwd
/data
$ cd ch02
內容解密:
cd /data/ch02:切換到/data/ch02目錄。cd ..:切換到父目錄。cd ch02:切換到目前目錄下的ch02子目錄。
使用 head 命令輸出檔案的前幾行:
$ head -n 3 movies.txt
Matrix
Star Wars
Home Alone
內容解密:
head -n 3 movies.txt:輸出movies.txt的前三行。-n:指定輸出行數的選項。3:要輸出的行數。movies.txt:要操作的檔案名稱。
命令列工具的五種型別
命令列工具可以分為以下五種型別:
- 二進位可執行檔
- Shell 內建命令
- 解譯指令碼
- Shell 函式
- 別名
這些工具使你在命令列環境中能夠執行各種任務,從簡單的檔案操作到複雜的資料處理。
深入理解Unix命令列工具的多樣性
在資料科學領域,熟練運用各種命令列工具是提升工作效率的關鍵。命令列工具的多樣性使得它們能夠滿足不同的需求,從簡單的檔案操作到複雜的資料處理。本文將探討命令列工具的不同型別,並透過具體例項展示如何利用這些工具提升資料科學工作的效率。
命令列工具的分類別
命令列工具大致可以分為五類別:二進位可執行檔、Shell內建指令、解釋型指令碼、Shell函式和別名。每種型別都有其獨特的特點和適用場景。
二進位可執行檔
二進位可執行檔是透過將原始碼編譯成機器碼而生成的程式。這類別程式無法直接閱讀,因為它們已經被編譯成了電腦可以直接執行的二進位格式。例如,許多Unix系統中的基本命令如ls、cp等都是二進位可執行檔。
Shell內建指令
Shell內建指令是由Shell本身提供的命令,例如cd和pwd。這些指令直接由Shell解釋執行,無需呼叫外部程式。不同的Shell可能提供不同的內建指令。
# 檢視目前的工作目錄
$ pwd
/home/user/projects
解釋型指令碼
解釋型指令碼是一種文字檔案,由特定的直譯器執行。Python、R和Bash指令碼都是常見的解釋型指令碼。這類別指令碼的一大優勢是可讀性和可修改性。
#!/usr/bin/env python
def factorial(x):
result = 1
for i in range(2, x + 1):
result *= i
return result
if __name__ == "__main__":
import sys
x = int(sys.argv[1])
sys.stdout.write(f"{factorial(x)}\n")
Shell函式
Shell函式是由Shell執行的函式,通常用於實作特定的功能。與解釋型指令碼相比,Shell函式更為簡潔,適合用於定義個人化的操作。
# 定義一個計算階乘的Shell函式
$ fac() { (echo 1; seq $1) | paste -s -d\* - | bc; }
$ fac 5
120
別名
別名是一種簡化命令輸入的方式,透過定義別名,可以將常用的命令或命令序列簡化為一個簡單的名稱。
# 定義別名
$ alias l='ls --color -lhF --group-directories-first'
$ l
total 40K
drwxr-xr-x 2 user user 4.0K Jun 29 14:25 dir1/
drwxr-xr-x 2 user user 4.0K Jun 29 14:25 dir2/
提升資料科學工作效率的實踐
透過掌握不同型別的命令列工具,資料科學家可以大幅提升工作效率。例如,使用解釋型指令碼可以自動化重複性的任務,而Shell函式和別名則可以簡化日常操作。
#### 內容解密:
- 命令列工具的多樣性:瞭解不同型別的命令列工具對於資料科學家來說至關重要,因為這能夠幫助他們選擇最合適的工具來完成任務。
- 二進位可執行檔與Shell內建指令:這兩類別工具通常由系統提供,用於基本的檔案操作和Shell管理。
- 解釋型指令碼:透過使用Python等語言編寫指令碼,可以實作複雜的資料處理任務,並且具有良好的可讀性和可維護性。
- Shell函式和別名:這兩種工具提供了簡化操作和個人化命令的可能,使得日常工作更加高效。