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) 图标。

-
底部会打开一个 JUPYTER: 变量 (JUPYTER: VARIABLES) 面板。它包含当前运行的内核中已定义变量的列表。

-
要查看之前加载的 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])
提示:要快速复制图表,可以将鼠标悬停在图表的右上角,然后点击出现的 复制到剪贴板 (Copy to Clipboard) 按钮。你还可以通过点击 展开图像 (Expand image) 按钮来查看图表的详细信息。

-
这些图表有助于观察生存情况与数据输入变量之间的关系,但也可以使用 pandas 计算相关性。为此,用于相关性计算的所有变量都必须是数值型的,而目前性别(gender)存储为字符串。要将这些字符串值转换为整数,请添加并运行以下代码。
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 库也支持其中许多算法,并提供了一张图表来帮助你选择适合你场景的算法。目前,请使用 朴素贝叶斯算法 (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%。
(可选)使用神经网络
神经网络是一种使用权重和激活函数来模拟人类神经元某些方面的模型,旨在根据提供的输入确定输出。与你之前看到的机器学习算法不同,神经网络是深度学习的一种形式,你无需预先了解解决问题的理想算法。它可以用于许多不同的场景,分类就是其中之一。在本节中,你将使用带有 TensorFlow 的 Keras 库来构建神经网络,并探索它如何处理泰坦尼克号数据集。
-
第一步是导入所需的库并创建模型。在本例中,你将使用 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) 激活函数被用作前两层的良好通用激活函数,而最后一层则需要 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 资源和教程。
- 数据科学配置文件模板 (Data Science profile template) - 创建一个新的 配置文件,其中包含精心策划的扩展、设置和代码片段。
- 了解更多关于在 Visual Studio Code 中使用 Jupyter Notebooks (视频) 的信息。
- 开始使用 VS Code 的 Azure 机器学习 (Azure Machine Learning for VS Code),利用 Azure 的强大功能来部署和优化你的模型。
- 在 Azure 开放数据集 (Azure Open Data Sets) 上查找更多可供探索的数据。