VS Code 中的資料科學教學課程
本教學課程示範如何使用 Visual Studio Code 和 Microsoft Python 擴充功能,搭配常見的資料科學程式庫來探索基本資料科學案例。 具體來說,使用鐵達尼號的乘客資料,您將學習如何設定資料科學環境、匯入和清理資料、建立機器學習模型以預測鐵達尼號上的存活率,以及評估產生模型的準確性。
先決條件
完成本教學課程需要安裝下列項目。 如果您尚未安裝,請務必安裝。
-
來自 Visual Studio Marketplace 的VS Code 的 Python 擴充功能和VS Code 的 Jupyter 擴充功能。 如需安裝擴充功能的詳細資訊,請參閱擴充功能市集。 這兩個擴充功能皆由 Microsoft 發行。
-
注意:如果您已安裝完整 Anaconda 發行版本,則不需要安裝 Miniconda。 或者,如果您不想使用 Anaconda 或 Miniconda,您可以建立 Python 虛擬環境,並使用 pip 安裝教學課程所需的套件。 如果您採用此方法,則需要安裝下列套件:pandas、jupyter、seaborn、scikit-learn、keras 和 tensorflow。
設定資料科學環境
Visual Studio Code 和 Python 擴充功能為資料科學案例提供絕佳的編輯器。 透過對 Jupyter Notebooks 的原生支援,並結合 Anaconda,您可以輕鬆入門。 在本節中,您將為教學課程建立工作區、建立具有教學課程所需資料科學模組的 Anaconda 環境,並建立您將用於建立機器學習模型的 Jupyter Notebooks。
-
首先,為資料科學教學課程建立 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 中開啟專案資料夾,方法是執行 VS Code 並使用 [檔案] > [開啟資料夾] 命令。 您可以安全地信任開啟資料夾,因為它是您建立的。
-
VS Code 啟動後,建立將用於教學課程的 Jupyter Notebooks。 開啟 [命令選擇區] (⇧⌘P (Windows、Linux Ctrl+Shift+P)),然後選取 [建立:新增 Jupyter Notebooks]。
注意:或者,從 VS Code 檔案總管中,您可以使用 [新增檔案] 圖示來建立名為
hello.ipynb
的 Notebooks 檔案。 -
使用 [檔案] > [另存新檔...] 將檔案儲存為
hello.ipynb
。 -
檔案建立後,您應該會在 Notebooks 編輯器中看到開啟的Jupyter Notebooks。 如需有關原生 Jupyter Notebooks 支援的其他資訊,您可以閱讀Jupyter Notebooks 主題。
-
現在,在 Notebooks 右上方選取 [選取核心]。
-
選擇您在上方建立的 Python 環境,以在其中執行核心。
-
若要從 VS Code 的整合式終端機管理您的環境,請使用 (⌃` (Windows、Linux Ctrl+`)) 開啟它。 如果您的環境未啟用,您可以像在終端機中一樣執行啟用 (
conda activate myenv
)。
準備資料
本教學課程使用 鐵達尼號資料集,該資料集可在 OpenML.org 上取得,並從范德比大學生物統計學系 https://hbiostat.org/data 取得。 鐵達尼號資料提供鐵達尼號乘客的存活資訊,以及乘客的特徵,例如年齡和票務艙等。 本教學課程將使用此資料,建立模型來預測特定乘客是否能在鐵達尼號沉沒事件中存活。 本節說明如何在 Jupyter Notebooks 中載入和操作資料。
-
首先,從 hbiostat.org 下載鐵達尼號資料做為 CSV 檔 (右上角的下載連結),並命名為
titanic3.csv
,然後將其儲存到您在上節中建立的hello_ds
資料夾。 -
如果您尚未在 VS Code 中開啟檔案,請前往 [檔案] > [開啟資料夾],開啟
hello_ds
資料夾和 Jupyter Notebooks (hello.ipynb
)。 -
在您的 Jupyter Notebooks 中,首先匯入 pandas 和 numpy 程式庫,這兩個常見的程式庫用於操作資料,並將鐵達尼號資料載入 pandas DataFrame。 若要執行此操作,請將下列程式碼複製到 Notebooks 的第一個儲存格。 如需有關在 VS Code 中使用 Jupyter Notebooks 的詳細指引,請參閱使用 Jupyter Notebooks 文件。
import pandas as pd import numpy as np data = pd.read_csv('titanic3.csv')
-
現在,使用 [執行儲存格] 圖示或 Shift+Enter 快速鍵來執行儲存格。
-
儲存格完成執行後,您可以使用 [變數總管] 和 [資料檢視器] 來檢視載入的資料。 首先,在 Notebooks 上方工具列中選取 [變數] 圖示。
-
JUPYTER: 變數窗格將在 VS Code 底部開啟。 其中包含目前在執行中核心中定義的變數清單。
-
若要檢視先前載入的 Pandas DataFrame 中的資料,請選取
data
變數左側的 [資料檢視器] 圖示。 -
使用 [資料檢視器] 來檢視、排序和篩選資料列。 檢閱資料後,繪製資料的某些方面可能有助於視覺化不同變數之間的關聯性。
或者,您可以使用其他擴充功能 (例如 Data Wrangler) 提供的資料檢視體驗。 Data Wrangler 擴充功能提供豐富的使用者介面,可顯示有關資料的深入解析,並協助您執行資料分析、品質檢查、轉換等等。 在我們的文件中深入瞭解 Data Wrangler 擴充功能。
-
在繪製資料圖表之前,您需要確定資料沒有任何問題。 如果您查看鐵達尼號 csv 檔案,您會注意到其中使用問號 ("?") 來識別資料無法使用的儲存格。
雖然 Pandas 可以將此值讀取到 DataFrame 中,但對於像 age 這樣的資料行,其資料類型會設定為 object 而不是數值資料類型,這對於繪圖來說會造成問題。
此問題可以透過將問號取代為 pandas 能夠理解的遺漏值來修正。 將下列程式碼新增至 Notebooks 中的下一個儲存格,以將 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 來檢視資料集的某些資料行與存活率的關聯性。 將下列程式碼新增至 Notebooks 中的下一個儲存格並執行,以查看產生的繪圖。
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])
秘訣:若要快速複製圖表,您可以將滑鼠停留在圖表右上角,然後按一下出現的 [複製到剪貼簿] 按鈕。 您也可以按一下 [展開影像] 按鈕,以更清楚地檢視圖表的詳細資訊。
-
這些圖表有助於查看存活率與資料輸入變數之間的一些關聯性,但也可以使用 pandas 來計算相互關聯性。 若要執行此操作,所有使用的變數都必須是數值才能進行相互關聯性計算,而目前性別是以字串形式儲存。 若要將這些字串值轉換為整數,請新增並執行下列程式碼。
data.replace({'male': 1, 'female': 0}, inplace=True)
-
現在,您可以分析所有輸入變數之間的相互關聯性,以識別最適合機器學習模型的輸入特徵。 值越接近 1,值與結果之間的相互關聯性越高。 使用下列程式碼來關聯所有變數與存活率之間的關聯性。
data.corr(numeric_only=True).abs()[["survived"]]
-
查看相互關聯性結果,您會注意到某些變數 (例如性別) 與存活率有相當高的相互關聯性,而其他變數 (例如親屬 (sibsp = 兄弟姊妹或配偶,parch = 父母或子女)) 似乎與存活率的相互關聯性很小。
讓我們假設 sibsp 和 parch 與其影響存活率的方式相關,並將它們群組到名為「親屬」的新資料行中,以查看它們的組合是否與存活率有更高的相互關聯性。 若要執行此操作,您將檢查對於給定的乘客,sibsp 和 parch 的數字是否大於 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 程式庫的優點是它提供專門用於將資料集分割成訓練和測試資料的方法。
新增並執行具有下列程式碼的儲存格到 Notebooks,以分割資料。
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 程式庫也提供對許多演算法和圖表的支援,以協助您選取適合您案例的演算法。 現在,使用樸素貝氏演算法,這是一種常見的分類問題演算法。 新增具有下列程式碼的儲存格,以建立和訓練演算法。
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%。
(選用) 使用神經網路
神經網路是一種模型,它使用權重和啟動函式 (模擬人類神經元的各個方面) 來根據提供的輸入判斷結果。 與您先前查看的機器學習演算法不同,神經網路是一種深度學習形式,您不需要事先知道問題集的理想演算法。 它可以用於許多不同的案例,而分類是其中之一。 在本節中,您將搭配 TensorFlow 使用 Keras 程式庫來建構神經網路,並探索它如何處理鐵達尼號資料集。
-
第一個步驟是匯入必要的程式庫並建立模型。 在此案例中,您將使用循序神經網路,這是一種分層神經網路,其中有多個依序饋入彼此的層。
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,因為您有五個輸入:性別、pclass、年齡、親屬和票價。
- 最後一層必須輸出 1,因為您需要一維輸出,指出乘客是否能存活。
- 為了簡單起見,中間層保持為 5,儘管該值可能不同。
整流線性單位 (relu) 啟動函式用作前兩層的良好一般啟動函式,而 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% 的準確性。 使用這個簡單的神經網路,結果比先前嘗試的樸素貝氏分類器的 75% 準確性更好。
後續步驟
現在您已熟悉在 Visual Studio Code 中執行機器學習的基本概念,以下是一些其他 Microsoft 資源和教學課程可供查看。
- 資料科學設定檔範本 - 建立具有精選的擴充功能、設定和程式碼片段的新設定檔。
- 深入瞭解在 Visual Studio Code 中使用 Jupyter Notebooks (影片)。
- 開始使用適用於 VS Code 的 Azure Machine Learning,以使用 Azure 的強大功能部署和最佳化您的模型。
- 在 Azure 開放資料集上尋找更多資料來探索。