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 擴充套件為資料科學場景提供了一個出色的編輯器。結合 Anaconda 對 Jupyter Notebook 的原生支援,入門變得非常簡單。在本節中,您將為本教程建立一個工作區,使用本教程所需的資料科學模組建立一個 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 並使用 檔案 > 開啟資料夾 命令在 VS Code 中開啟專案資料夾。由於您建立了該資料夾,因此可以安全地信任並開啟它。
-
VS Code 啟動後,建立將用於本教程的 Jupyter Notebook。開啟命令面板(⇧⌘P(Windows、Linux Ctrl+Shift+P))並選擇 建立:新建 Jupyter Notebook。
注意:或者,從 VS Code 檔案資源管理器中,您可以使用“新建檔案”圖示建立名為
hello.ipynb
的 Notebook 檔案。 -
使用 檔案 > 另存為... 將檔案儲存為
hello.ipynb
。 -
檔案建立後,您應該會在 Notebook 編輯器中看到開啟的 Jupyter Notebook。有關原生 Jupyter Notebook 支援的更多資訊,您可以閱讀 Jupyter Notebooks 主題。
-
現在,在 Notebook 的右上角選擇 選擇核心。
-
選擇您之前建立的 Python 環境以執行您的核心。
-
要從 VS Code 的整合終端管理您的環境,請透過 (⌃` (Windows, Linux Ctrl+`)) 開啟它。如果您的環境未啟用,您可以像在終端中一樣啟用它 (
conda activate myenv
)。
準備資料
本教程使用 OpenML.org 上提供的 泰坦尼克號資料集,該資料集來源於範德堡大學生物統計系 https://hbiostat.org/data。泰坦尼克號資料提供了有關泰坦尼克號乘客生存情況以及乘客特徵(例如年齡和票務等級)的資訊。使用這些資料,本教程將建立一個模型,用於預測給定乘客是否會在泰坦尼克號沉沒中倖存。本節將展示如何在 Jupyter Notebook 中載入和操作資料。
-
首先,從 hbiostat.org 下載泰坦尼克號資料,儲存為名為
titanic3.csv
的 CSV 檔案(右上角有下載連結),並將其儲存到您在上一節中建立的hello_ds
資料夾中。 -
如果您尚未在 VS Code 中開啟檔案,請透過 檔案 > 開啟資料夾 開啟
hello_ds
資料夾和 Jupyter Notebook (hello.ipynb
)。 -
在您的 Jupyter Notebook 中,首先匯入 pandas 和 numpy 庫,這兩個是用於資料操作的常用庫,並將泰坦尼克號資料載入到 pandas DataFrame 中。為此,將以下程式碼複製到 Notebook 的第一個單元格中。有關在 VS Code 中使用 Jupyter Notebook 的更多指導,請參閱 使用 Jupyter Notebook 文件。
import pandas as pd import numpy as np data = pd.read_csv('titanic3.csv')
-
現在,使用執行單元格圖示或快捷鍵 Shift+Enter 執行該單元格。
-
單元格執行完成後,您可以使用變數瀏覽器和資料檢視器檢視已載入的資料。首先選擇 Notebook 上方工具欄中的 變數 圖示。
-
一個 JUPYTER:變數 面板將在 VS Code 底部開啟。它包含您正在執行的核心中迄今為止定義的所有變數的列表。
-
要檢視之前載入到 Pandas DataFrame 中的資料,請選擇
data
變數左側的資料檢視器圖示。 -
使用資料檢視器檢視、排序和篩選資料行。審查資料後,繪製其某些方面以幫助視覺化不同變數之間的關係會很有幫助。
或者,您可以使用其他擴充套件(如 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])
提示:要快速複製您的圖表,您可以將滑鼠懸停在圖表的右上角,然後單擊出現的 複製到剪貼簿 按鈕。您還可以透過單擊 展開影像 按鈕更好地檢視圖表的詳細資訊。
-
這些圖表有助於檢視生存率與資料輸入變數之間的一些關係,但也可以使用 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,如果是,則可以說他們在船上有親屬。
使用以下程式碼在資料集中建立一個名為
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 庫也支援其中的許多演算法,並提供了一個 圖表 來幫助選擇適合您場景的演算法。目前,我們使用 樸素貝葉斯演算法,這是一種用於分類問題的常用演算法。新增一個包含以下程式碼的單元格來建立和訓練演算法。
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 來構建神經網路,並探索它如何處理泰坦尼克號資料集。
-
第一步是匯入所需的庫並建立模型。在本例中,您將使用 序列 神經網路,它是一種分層神經網路,其中有多個層按順序相互饋送。
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 Notebook (影片)。
- 開始使用適用於 VS Code 的 Azure 機器學習,利用 Azure 的強大功能部署和最佳化您的模型。
- 在 Azure 開放資料集 上查詢更多可探索的資料。