现已发布!阅读 10 月份的新功能和修复。

VS Code 中的数据科学教程

本教程演示了如何使用 Visual Studio Code 和 Microsoft Python 扩展与常见的数据科学库一起使用,以探索一个基本的数据科学场景。具体来说,使用泰坦尼克号的乘客数据,您将学习如何设置数据科学环境、导入和清理数据、创建用于预测泰坦尼克号生存的机器学习模型,以及评估生成的模型的准确性。

先决条件

完成本教程需要以下安装。如果您尚未安装,请确保安装它们。

  • Visual Studio Code

  • 从 Visual Studio Marketplace 安装 VS Code 的 Python 扩展VS Code 的 Jupyter 扩展。有关安装扩展的更多详细信息,请参阅 扩展市场。这两个扩展都由 Microsoft 发布。

  • 带有最新 Python 的 Miniconda

    注意:如果您已安装完整的 Anaconda 发行版,则无需安装 Miniconda。或者,如果您不想使用 Anaconda 或 Miniconda,可以创建一个 Python 虚拟环境,并使用 pip 安装教程所需的软件包。如果您选择这种方式,则需要安装以下软件包:pandas、jupyter、seaborn、scikit-learn、keras 和 tensorflow。

设置数据科学环境

Visual Studio Code 和 Python 扩展为数据科学场景提供了一个很棒的编辑器。由于对 Jupyter 笔记本的原生支持以及 Anaconda,因此很容易上手。在本节中,您将为教程创建一个工作区,使用教程所需的数据科学模块创建一个 Anaconda 环境,并创建一个将用于创建机器学习模型的 Jupyter 笔记本。

  1. 首先,为数据科学教程创建一个 Anaconda 环境。打开 Anaconda 命令提示符,并运行 conda create -n myenv python=3.10 pandas jupyter seaborn scikit-learn keras tensorflow 以创建一个名为 myenv 的环境。有关创建和管理 Anaconda 环境的更多信息,请参阅 Anaconda 文档

  2. 接下来,在方便的位置创建一个文件夹作为教程的 VS Code 工作区,将其命名为 hello_ds

  3. 通过运行 VS Code 并使用 文件 > 打开文件夹 命令在 VS Code 中打开项目文件夹。您可以安全地信任打开文件夹,因为它是您创建的。

  4. VS Code 启动后,创建一个将用于教程的 Jupyter 笔记本。打开命令面板 (⇧⌘P (Windows、Linux Ctrl+Shift+P)),然后选择 创建:新建 Jupyter 笔记本

    Creating a new Jupyter Notebook

    注意:或者,从 VS Code 文件资源管理器中,您可以使用新建文件图标创建一个名为 hello.ipynb 的笔记本文件。

  5. 使用 文件 > 另存为... 将文件保存为 hello.ipynb

  6. 创建文件后,您应该会在笔记本编辑器中看到打开的 Jupyter 笔记本。有关 VS Code 中原生 Jupyter 笔记本支持的更多信息,您可以阅读 Jupyter 笔记本 主题。

    Viewing a new Jupyter Notebook

  7. 现在,选择笔记本右上角的 选择内核

    Selecting a Jupyter Notebook Kernel

  8. 选择您上面创建的用于运行内核的 Python 环境。

    Choose a kernel from created environment

  9. 要从 VS Code 的集成终端管理您的环境,请使用 (⌃` (Windows、Linux Ctrl+`)) 打开它。如果您的环境未激活,您可以像在终端中一样执行此操作 (conda activate myenv)。

准备数据

本教程使用 泰坦尼克号数据集,该数据集可在 OpenML.org 上获得,该数据集来自范德比尔特大学的生物统计学系 https://hbiostat.org/data。泰坦尼克号数据提供了有关泰坦尼克号乘客生存状况的信息,以及有关乘客的特征,例如年龄和票务等级。使用这些数据,本教程将建立一个模型来预测给定乘客是否会在泰坦尼克号沉没时幸存下来。本节介绍如何在 Jupyter 笔记本中加载和操作数据。

  1. 首先,从 hbiostat.org 下载泰坦尼克号数据作为 CSV 文件 (右上角的下载链接),命名为 titanic3.csv 并将其保存到您在上一节中创建的 hello_ds 文件夹中。

  2. 如果您尚未在 VS Code 中打开文件,请通过转到 文件 > 打开文件夹 来打开 hello_ds 文件夹和 Jupyter 笔记本 (hello.ipynb)。

  3. 在您的 Jupyter 笔记本中,首先导入 pandasnumpy 库,这两个库是用于操作数据的两个常用库,并将泰坦尼克号数据加载到 pandas DataFrame 中。为此,将下面的代码复制到笔记本的第一个单元格中。有关在 VS Code 中使用 Jupyter 笔记本的更多指导,请参阅 使用 Jupyter 笔记本 文档。

    import pandas as pd
    import numpy as np
    data = pd.read_csv('titanic3.csv')
    
  4. 现在,使用运行单元格图标或 Shift+Enter 快捷方式运行单元格。

    Running a Jupyter notebook cell

  5. 单元格运行完毕后,您可以使用变量资源管理器和数据查看器查看已加载的数据。首先,选择笔记本工具栏上部的 变量 图标。

    Select Variables icon

  6. 一个 JUPYTER:变量 面板将在 VS Code 的底部打开。它包含一个列表,其中包含在运行内核中到目前为止定义的变量。

    Variables pane

  7. 要查看之前加载的 Pandas DataFrame 中的数据,请选择 data 变量左侧的数据查看器图标。

    Select Data Viewer icon

  8. 使用数据查看器来查看、排序和筛选数据行。在查看数据后,可以对数据的某些方面进行绘图以帮助可视化不同变量之间的关系。

    Data viewer and variable explorer

    或者,您可以使用其他扩展提供的数据查看体验,例如 Data Wrangler。Data Wrangler 扩展提供了一个丰富的用户界面来显示有关数据的见解,并帮助您执行数据分析、质量检查、转换等等。详细了解我们的文档中的 Data Wrangler 扩展

  9. 在将数据绘制成图表之前,您需要确保数据本身没有问题。如果您查看 Titanic CSV 文件,您会注意到使用问号(“?”)来标识数据不可用的单元格。

    虽然 Pandas 可以将此值读入 DataFrame,但对于像 **age** 这样的列,结果是其数据类型将被设置为 **object** 而不是数值数据类型,这对绘图来说是个问题。

    可以通过将问号替换为 Pandas 能够理解的缺失值来解决此问题。将以下代码添加到笔记本中的下一个单元格中,以将 **age** 和 **fare** 列中的问号替换为 numpy NaN 值。请注意,我们还需要在替换值后更新列的数据类型。

    提示:要添加新单元格,可以使用现有单元格左下角的插入单元格图标。或者,您也可以使用 Esc 进入命令模式,然后按 B 键。

    data.replace('?', np.nan, inplace= True)
    data = data.astype({"age": np.float64, "fare": np.float64})
    

    注意:如果您需要查看用于某一列的数据类型,可以使用 DataFrame dtypes 属性。

  10. 现在数据已经完善,您可以使用 seabornmatplotlib 查看数据集的某些列与存活率之间的关系。将以下代码添加到笔记本中的下一个单元格中并运行它以查看生成的图表。

    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])
    

    Graphing the titanic data

    提示:要快速复制图表,您可以将鼠标悬停在图表右上角,然后单击出现的 **复制到剪贴板** 按钮。您也可以通过单击 **展开图像** 按钮来更好地查看图表详细信息。

    Plot Viewer Buttons

  11. 这些图表有助于查看存活率与数据输入变量之间的一些关系,但也可以使用 **pandas** 计算相关性。为此,所有使用的变量都需要是数值的,以便进行相关性计算,而目前性别存储为字符串。要将这些字符串值转换为整数,请添加并运行以下代码。

    data.replace({'male': 1, 'female': 0}, inplace=True)
    
  12. 现在,您可以分析所有输入变量之间的相关性,以识别最适合作为机器学习模型输入的特征。值越接近 1,该值与结果之间的相关性就越高。使用以下代码来关联所有变量与存活率之间的关系。

    data.corr(numeric_only=True).abs()[["survived"]]
    

    Determining the correlation between input variables and survival

  13. 查看相关性结果,您会注意到一些变量(如性别)与存活率有相当高的相关性,而另一些变量(如亲属关系 (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"]]
    

    Determining the correlation between having relatives and survival

  14. 您会注意到,实际上从一个人是否有亲属的角度来看,而不是有多少个亲属,与存活率的相关性更高。有了这些信息,您现在可以从数据集中删除低价值的 **sibsp** 和 **parch** 列,以及所有具有 **NaN** 值的行,最终得到一个可以用于训练模型的数据集。

    data = data[['sex', 'pclass','age','relatives','fare','survived']].dropna()
    

    注意:虽然年龄的直接相关性很低,但它被保留了,因为似乎年龄可能仍然与其他输入一起具有相关性。

训练和评估模型

数据准备好后,您现在可以开始创建模型。在本节中,您将使用 scikit-learn 库(因为它提供了一些有用的辅助函数)来对数据集进行预处理,训练一个分类模型来确定泰坦尼克号上的存活率,然后使用该模型与测试数据来确定其准确性。

  1. 训练模型的一个常见第一步是将数据集分成训练数据和验证数据。这使您可以使用一部分数据来训练模型,并使用一部分数据来测试模型。如果您使用所有数据来训练模型,您将无法估计它在尚未见过的数据上的实际表现如何。scikit-learn 库的优势在于它提供了一种专门用于将数据集分成训练数据和测试数据的方法。

    在笔记本中添加并运行一个包含以下代码的单元格以拆分数据。

    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)
    
  2. 接下来,您将对输入进行归一化,以便所有特征都被平等对待。例如,在数据集中,年龄的值范围约为 0-100,而性别仅为 1 或 0。通过对所有变量进行归一化,您可以确保所有值的范围都相同。在新的代码单元格中使用以下代码来缩放输入值。

    from sklearn.preprocessing import StandardScaler
    sc = StandardScaler()
    X_train = sc.fit_transform(x_train)
    X_test = sc.transform(x_test)
    
  3. 您可以从许多不同的机器学习算法中选择来对数据建模。scikit-learn 库也提供了对其中许多 算法 的支持,以及一个 图表 来帮助您选择适合您场景的算法。现在,使用 朴素贝叶斯算法,这是一种用于分类问题的常见算法。添加一个包含以下代码的单元格来创建和训练算法。

    from sklearn.naive_bayes import GaussianNB
    model = GaussianNB()
    model.fit(X_train, y_train)
    
  4. 有了训练好的模型,您现在就可以使用从训练中保留的测试数据集来测试它。添加并运行以下代码以预测测试数据的结果并计算模型的准确性。

    from sklearn import metrics
    predict_test = model.predict(X_test)
    print(metrics.accuracy_score(y_test, predict_test))
    

    Running the trained model against test data

    查看测试数据的结果,您会发现经过训练的算法在估计存活率方面有约 75% 的成功率。

(可选) 使用神经网络

神经网络是一种模型,它使用权重和激活函数来模拟人类神经元的某些方面,以根据提供的输入来确定结果。与您之前查看的机器学习算法不同,神经网络是一种深度学习形式,在其中您无需事先了解适合您的问题集的理想算法。它可以用于许多不同的场景,分类就是其中之一。在本节中,您将使用 Keras 库与 TensorFlow 来构建神经网络,并探索它如何处理泰坦尼克号数据集。

  1. 第一步是导入所需的库并创建模型。在本例中,您将使用 Sequential 神经网络,这是一种分层的网络,其中有多个层按顺序相互馈送。

    from keras.models import Sequential
    from keras.layers import Dense
    
    model = Sequential()
    
  2. 定义模型后,下一步是添加神经网络的层。现在,让我们保持简单,只使用三层。添加以下代码以创建神经网络的层。

    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 个维度,因为您有 5 个输入:性别、pclass、年龄、亲属关系和票价。
    • 最后一层必须输出 1,因为您想要一个一维输出,指示乘客是否会存活。
    • 中间层保持在 5 维是为了简单起见,尽管该值可以不同。

    整流线性单元 (relu) 激活函数被用作前两层的良好通用激活函数,而 sigmoid 激活函数是最后一层所必需的,因为您想要的输出(乘客是否存活)需要在 0-1 范围内进行缩放(乘客存活的概率)。

    您也可以使用以下代码行查看所构建模型的摘要

    model.summary()
    

    Viewing a summary of the sequential neural network

  3. 创建模型后,需要对其进行编译。作为此操作的一部分,您需要定义要使用哪种优化器、如何计算损失以及要优化的指标。添加以下代码以构建和训练模型。您会注意到,训练完成后,准确率约为 61%。

    注意:此步骤可能需要几秒钟到几分钟才能完成,具体取决于您的机器。

    model.compile(optimizer="adam", loss='binary_crossentropy', metrics=['accuracy'])
    model.fit(X_train, y_train, batch_size=32, epochs=50)
    

    Build and train the neural network

  4. 现在模型已经构建并训练完成,我们可以看看它对测试数据的效果如何。

    y_pred = np.rint(model.predict(X_test).flatten())
    print(metrics.accuracy_score(y_test, y_pred))
    

    Evaluate the neural network

    与训练类似,您会注意到您现在在预测乘客存活率方面的准确率达到了 79%。使用这个简单的网络,结果比之前尝试的朴素贝叶斯分类器的 75% 准确率要好。

后续步骤

现在您已经熟悉了在 Visual Studio Code 中执行机器学习的基础知识,这里有一些其他 Microsoft 资源和教程可以供您查看。