VS Code 資料科學教學課程
本教學課程示範如何使用 Visual Studio Code 和 Microsoft Python 擴充功能,搭配常見的資料科學程式庫來探索基本的資料科學情境。具體而言,您將使用鐵達尼號的乘客資料,學習如何建立資料科學環境、匯入與清理資料、建立機器學習模型來預測鐵達尼號的生存率,並評估所產生模型的準確度。
先決條件
完成本教學課程需要進行下列安裝。如果您尚未安裝,請務必先完成安裝。
-
從 Visual Studio Marketplace 安裝 VS Code 的 Python 擴充功能以及 VS Code 的 Jupyter 擴充功能。關於安裝擴充功能的詳細資訊,請參閱 擴充功能市集 (Extension Marketplace)。這兩項擴充功能皆由 Microsoft 發佈。
-
注意:如果您已經安裝完整的 Anaconda 發行版,則無需安裝 Miniconda。或者,如果您不希望使用 Anaconda 或 Miniconda,也可以建立 Python 虛擬環境,並使用 pip 安裝教學課程所需的套件。若採取此方式,您將需要安裝下列套件:pandas、jupyter、seaborn、scikit-learn、keras 和 tensorflow。
python -m pip install pandas jupyter seaborn scikit-learn keras tensorflow
建立資料科學環境
Visual Studio Code 與 Python 擴充功能為資料科學情境提供了絕佳的編輯器。結合對 Jupyter Notebook 的原生支援以及 Anaconda,讓入門變得十分容易。在本節中,您將為本教學課程建立工作區、建立含有必要資料科學模組的 Anaconda 環境,並建立一個用於開發機器學習模型的 Jupyter Notebook。
-
首先,請為資料科學教學課程建立一個 Anaconda 環境。開啟 Anaconda 命令提示字元並執行
conda create -n myenv python=3.10 pandas jupyter seaborn scikit-learn keras tensorflow,以建立名為 myenv 的環境。如需有關建立與管理 Anaconda 環境的更多資訊,請參閱 Anaconda 文件。 -
接下來,在方便的位置建立一個資料夾,作為教學課程的 VS Code 工作區,將其命名為
hello_ds。 -
執行 VS Code 並使用檔案 (File) > 開啟資料夾 (Open Folder) 指令,在 VS Code 中開啟專案資料夾。由於該資料夾是您所建立的,因此可以放心信任並開啟它。
-
VS Code 啟動後,請建立教學課程要使用的 Jupyter Notebook。開啟命令選擇區 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 並選擇 建立:新增 Jupyter Notebook (Create: New Jupyter Notebook)。

注意:或者,您也可以從 VS Code 的檔案總管使用「新增檔案」圖示,建立一個名為
hello.ipynb的 Notebook 檔案。 -
使用檔案 (File) > 另存新檔... (Save As...),將檔案儲存為
hello.ipynb。 -
檔案建立完成後,您應該會在 Notebook 編輯器中看到已開啟的 Jupyter notebook。關於原生 Jupyter Notebook 支援的更多資訊,您可以閱讀 Jupyter Notebooks 主題。

-
現在,請選取 Notebook 右上角的 選取核心 (Select Kernel)。

-
選擇您在上方建立的 Python 環境來執行您的核心。

-
若要從 VS Code 的整合終端機管理您的環境,請使用 (⌃` (Windows, Linux Ctrl+`)) 將其開啟。如果您的環境未啟用,您可以像在一般終端機中一樣執行指令(例如
conda activate myenv)。
準備資料
本教學課程使用 鐵達尼號資料集,該資料集可於 OpenML.org 取得,原始來源為范德堡大學生物統計學系 https://hbiostat.org/data。鐵達尼號資料提供了乘客生存資訊以及乘客特徵,如年齡和票務等級。使用這些資料,本教學課程將建立一個模型,用以預測特定乘客在鐵達尼號沉船事件中是否能存活。本節將示範如何在 Jupyter Notebook 中載入與操作資料。
-
首先,從 hbiostat.org 下載鐵達尼號資料 CSV 檔案(下載連結位於右上角),並將其命名為
titanic3.csv,然後儲存至您在前一節建立的hello_ds資料夾中。 -
如果您尚未在 VS Code 中開啟該檔案,請透過檔案 (File) > 開啟資料夾 (Open Folder) 開啟
hello_ds資料夾以及 Jupyter Notebook (hello.ipynb)。 -
在 Jupyter Notebook 中,首先匯入 pandas 和 numpy 程式庫(這兩個是處理資料時常用的程式庫),並將鐵達尼號資料載入到 pandas DataFrame 中。請將下方的程式碼複製到 Notebook 的第一個儲存格。有關在 VS Code 中使用 Jupyter Notebook 的更多指引,請參閱 使用 Jupyter Notebooks 文件。
import pandas as pd import numpy as np data = pd.read_csv('titanic3.csv') -
現在,請使用「執行儲存格」圖示或 Shift+Enter 快速鍵來執行該儲存格。

-
儲存格執行完畢後,您可以使用「變數總管」(Variables Explorer) 和「資料檢視器」(Data Viewer) 來檢視載入的資料。首先,請選取 Notebook 上方工具列中的變數 (Variables) 圖示。

-
VS Code 下方會開啟 JUPYTER: 變數 (JUPYTER: VARIABLES) 面板。它包含目前執行中的核心內已定義的變數清單。

-
若要檢視先前載入的 Pandas DataFrame 資料,請選取
data變數左側的「資料檢視器」(Data Viewer) 圖示。
-
使用資料檢視器來檢視、排序與篩選資料列。檢視完資料後,繪製圖表來視覺化不同變數之間的關聯性會有所幫助。

此外,您也可以使用其他擴充功能(如 Data Wrangler)提供的資料檢視功能。Data Wrangler 擴充功能提供了豐富的使用者介面,可顯示您的資料洞察,並協助您進行資料剖析、品質檢查、轉換等工作。在我們的文件中了解更多關於 Data Wrangler 擴充功能的資訊。
-
在繪製資料之前,您需要確保資料沒有問題。如果您查看鐵達尼號的 CSV 檔案,會發現其中使用了問號 ("?") 來標示資料缺失的儲存格。
雖然 Pandas 可以將此數值讀取到 DataFrame 中,但像「年齡」(age) 這樣的欄位,其資料類型會被設定為 object 而非數值類型,這在繪圖時會造成問題。
您可以將問號替換為 Pandas 能夠識別的缺失值來修正此問題。請在 Notebook 的下一個儲存格中加入下列程式碼,將年齡 (age) 和票價 (fare) 欄位中的問號替換為 numpy NaN 值。請注意,替換數值後,我們也需要更新欄位的資料類型。
提示:若要新增儲存格,您可以使用現有儲存格左下角的「插入儲存格」圖示。或者,您也可以按 Esc 進入指令模式,然後按 B 鍵。
data.replace('?', np.nan, inplace= True) data = data.astype({"age": np.float64, "fare": np.float64})注意:如果您需要查看欄位使用的資料類型,可以使用 DataFrame dtypes 屬性。
-
現在資料狀態良好,您可以使用 seaborn 和 matplotlib 來檢視資料集中特定欄位與存活率的關聯。請將下列程式碼加入 Notebook 的下一個儲存格並執行,以查看產生的繪圖。
import seaborn as sns import matplotlib.pyplot as plt fig, axs = plt.subplots(ncols=5, figsize=(30,5)) sns.violinplot(x="survived", y="age", hue="sex", data=data, ax=axs[0]) sns.pointplot(x="sibsp", y="survived", hue="sex", data=data, ax=axs[1]) sns.pointplot(x="parch", y="survived", hue="sex", data=data, ax=axs[2]) sns.pointplot(x="pclass", y="survived", hue="sex", data=data, ax=axs[3]) sns.violinplot(x="survived", y="fare", hue="sex", data=data, ax=axs[4])
提示:若要快速複製您的圖表,可以將滑鼠游標移至圖表右上角,並按一下出現的複製到剪貼簿 (Copy to Clipboard) 按鈕。您也可以按一下展開影像 (Expand image) 按鈕,以查看圖表的詳細資訊。

-
這些圖表有助於觀察存活率與資料輸入變數之間的關聯,但也可以使用 pandas 來計算相關係數。為此,所有使用的變數都必須是數值,但目前性別是以字串儲存的。若要將這些字串值轉換為整數,請加入並執行下列程式碼。
data.replace({'male': 1, 'female': 0}, inplace=True) -
現在,您可以分析所有輸入變數之間的相關性,以識別出最適合用於機器學習模型的特徵。數值越接近 1,該變數與結果之間的相關性就越高。請使用下列程式碼來關聯所有變數與存活率之間的關係。
data.corr(numeric_only=True).abs()[["survived"]]
-
查看相關性結果,您會發現性別等變數與存活率有相當高的相關性,而親屬(sibsp = 兄弟姊妹或配偶,parch = 父母或子女)似乎沒什麼相關性。
我們假設 sibsp 和 parch 對存活率的影響是相關的,因此將它們分組到一個名為「親屬」(relatives) 的新欄位中,看看它們的組合是否對存活率有更高的相關性。為此,您將檢查特定乘客的 sibsp 和 parch 數量是否大於 0;若大於 0,則可視為他們有親屬在船上。
使用下列程式碼在資料集中建立一個名為
relatives的新變數與欄位,並再次檢查相關性。data['relatives'] = data.apply (lambda row: int((row['sibsp'] + row['parch']) > 0), axis=1) data.corr(numeric_only=True).abs()[["survived"]]
-
您會發現,事實上從「是否有親屬」的角度來看,相較於「有多少親屬」,其與存活率的相關性確實更高。取得此資訊後,您現在可以從資料集中移除低相關性的 sibsp 和 parch 欄位,以及任何包含 NaN 值的列,以得到一個可用於訓練模型的資料集。
data = data[['sex', 'pclass','age','relatives','fare','survived']].dropna()注意:雖然年齡的直接相關性很低,但我們仍保留它,因為它與其他輸入變數結合時,可能仍具備相關性。
訓練並評估模型
資料集準備就緒後,您現在可以開始建立模型。在此節中,您將使用 scikit-learn 程式庫(因其提供了一些實用的輔助函式)來進行資料集的前處理、訓練分類模型以判定鐵達尼號的存活率,然後使用測試資料驗證該模型的準確度。
-
訓練模型時,一個常見的第一步是將資料集分為訓練資料和驗證資料。這讓您可以使用部分資料來訓練模型,並用另一部分資料來測試模型。如果您使用所有資料來訓練模型,就無法評估它在面對未見過的資料時表現如何。Scikit-learn 程式庫的一個優點是,它提供了專門用於將資料集分割為訓練與測試資料的方法。
在 Notebook 中加入並執行一個包含下列程式碼的儲存格,以分割資料。
from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(data[['sex','pclass','age','relatives','fare']], data.survived, test_size=0.2, random_state=0) -
接下來,您將標準化輸入值,使所有特徵都能被平等對待。例如,在資料集中,年齡的值範圍約為 0-100,而性別僅為 1 或 0。透過標準化所有變數,您可以確保數值範圍一致。請在新的程式碼儲存格中使用下列程式碼來縮放輸入值。
from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(x_train) X_test = sc.transform(x_test) -
您有很多不同的機器學習演算法可以選擇來對資料進行建模。Scikit-learn 程式庫也支援許多演算法,並提供了一份圖表來協助您選擇適合您情境的演算法。目前,請使用 單純貝氏演算法 (Naïve Bayes algorithm),這是分類問題中常見的演算法。請加入一個包含下列程式碼的儲存格來建立並訓練該演算法。
from sklearn.naive_bayes import GaussianNB model = GaussianNB() model.fit(X_train, y_train) -
有了訓練好的模型,您現在可以嘗試用它來測試從訓練中保留下來的測試資料集。加入並執行下列程式碼,以預測測試資料的結果並計算模型的準確度。
from sklearn import metrics predict_test = model.predict(X_test) print(metrics.accuracy_score(y_test, predict_test))
查看測試資料的結果,您會發現訓練後的演算法在估計存活率方面的成功率約為 75%。
(選用)使用神經網路
神經網路是一種利用權重與激發函式(模擬人類神經元)的模型,根據提供的輸入值判定結果。與您之前看到的機器學習演算法不同,神經網路屬於深度學習的一種形式,您不需要事先知道問題集的理想演算法。它可以應用於許多不同的情境,分類就是其中之一。在本節中,您將使用 Keras 程式庫與 TensorFlow 來建構神經網路,並探索它如何處理鐵達尼號資料集。
-
第一步是匯入必要的程式庫並建立模型。在此情況下,您將使用 Sequential(循序)神經網路,這是一種層疊式神經網路,由多層組成,各層按順序傳輸資料。
from keras.models import Sequential from keras.layers import Dense model = Sequential() -
定義模型後,下一步是新增神經網路層。目前,為了簡單起見,我們僅使用三層。請加入下列程式碼來建立神經網路層。
model.add(Dense(5, kernel_initializer = 'uniform', activation = 'relu', input_dim = 5)) model.add(Dense(5, kernel_initializer = 'uniform', activation = 'relu')) model.add(Dense(1, kernel_initializer = 'uniform', activation = 'sigmoid'))- 第一層將設定為維度 5,因為您有五個輸入:性別 (sex)、票務等級 (pclass)、年齡 (age)、親屬 (relatives) 和票價 (fare)。
- 最後一層必須輸出 1,因為您需要一個 1 維的輸出,用來指示乘客是否存活。
- 為了簡化,中間層設定為 5,儘管該數值也可以是其他值。
「整流線性單元」(relu) 激發函式是前兩層不錯的通用激發函式,而最後一層則需要「S 曲線」(sigmoid) 激發函式,因為您想要的輸出(乘客是否存活)需要在 0-1 的範圍內縮放(即乘客存活的機率)。
您也可以使用這一行程式碼來查看您建立的模型摘要:
model.summary()
-
模型建立完成後,需要進行編譯。作為編譯的一部分,您需要定義要使用的最佳化工具類型、損失如何計算,以及應最佳化的指標。加入下列程式碼來建構並訓練模型。您會注意到訓練後的準確度約為 61%。
注意:此步驟的執行時間可能從幾秒到幾分鐘不等,具體取決於您的電腦。
model.compile(optimizer="adam", loss='binary_crossentropy', metrics=['accuracy']) model.fit(X_train, y_train, batch_size=32, epochs=50)
-
模型建構並訓練完成後,我們可以測試它在測試資料上的表現。
y_pred = np.rint(model.predict(X_test).flatten()) print(metrics.accuracy_score(y_test, y_pred))
與訓練時類似,您會注意到在預測乘客生存率方面,現在有 79% 的準確度。使用這個簡單的神經網路,結果比之前嘗試的單純貝氏分類器 (Naive Bayes Classifier) 的 75% 準確度還要好。
後續步驟
既然您已經熟悉在 Visual Studio Code 中執行機器學習的基礎知識,以下還有一些其他的 Microsoft 資源和教學課程供您參考。
- 資料科學設定檔範本 - 使用精選的擴充功能、設定和程式碼片段建立新的 設定檔 (profile)。
- 深入了解 Visual Studio Code 中的 Jupyter Notebooks(影片)。
- 開始使用 VS Code 的 Azure Machine Learning,利用 Azure 的強大功能來部署並最佳化您的模型。
- 在 Azure Open Data Sets 上尋找更多可供探索的資料。