🚀 在 VS Code 中

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 Notebook 的原生支持以及 Anaconda,入门非常容易。在本节中,您将为本教程创建一个工作区,创建一个包含本教程所需的数据科学模块的 Anaconda 环境,并创建一个 Jupyter Notebook,您将使用它来创建机器学习模型。

  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 Notebook。打开命令面板 (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 并选择创建:新建 Jupyter Notebook

    Creating a new Jupyter Notebook

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

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

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

    Viewing a new Jupyter Notebook

  7. 现在,选择 Notebook 右上角的选择 Kernel

    Selecting a Jupyter Notebook Kernel

  8. 选择您在上面创建的 Python 环境,以在其中运行您的 Kernel。

    Choose a kernel from created environment

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

准备数据

本教程使用 泰坦尼克号数据集,该数据集可在 OpenML.org 上找到,该数据集从范德堡大学生物统计学系 https://hbiostat.org/data 获取。泰坦尼克号数据提供了泰坦尼克号乘客的生存信息以及乘客的特征,例如年龄和船票等级。使用此数据,本教程将建立一个模型,用于预测给定乘客是否会在泰坦尼克号沉没事件中幸存下来。本节介绍如何在 Jupyter Notebook 中加载和操作数据。

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

  2. 如果您尚未在 VS Code 中打开该文件,请转到文件 > 打开文件夹,打开 hello_ds 文件夹和 Jupyter Notebook (hello.ipynb)。

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

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

    Running a Jupyter notebook cell

  5. 单元格运行完成后,您可以使用“变量资源管理器”和“数据查看器”查看加载的数据。首先,选择 Notebook 顶部工具栏中的变量图标。

    Select Variables icon

  6. JUPYTER:变量窗格将在 VS Code 底部打开。它包含到目前为止在您运行的 Kernel 中定义的变量列表。

    Variables pane

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

    Select Data Viewer icon

  8. 使用“数据查看器”查看、排序和筛选数据行。查看数据后,绘制数据的某些方面以帮助可视化不同变量之间的关系可能会很有帮助。

    Data viewer and variable explorer

    或者,您可以使用其他扩展程序(如 Data Wrangler)提供的数据查看体验。“Data Wrangler”扩展程序提供了一个丰富的用户界面,用于显示有关您的数据的见解,并帮助您执行数据分析、质量检查、转换等。在我们的文档中了解有关 Data Wrangler 扩展程序的更多信息

  9. 在绘制数据之前,您需要确保数据没有任何问题。如果您查看泰坦尼克号 csv 文件,您会注意到一件事,即问号 (“?”) 用于标识数据不可用的单元格。

    虽然 Pandas 可以将此值读取到 DataFrame 中,但对于像 age 这样的列,其数据类型将设置为 object 而不是数字数据类型,这对于绘图来说是有问题的。

    可以通过将问号替换为 pandas 能够理解的缺失值来纠正此问题。将以下代码添加到 Notebook 的下一个单元格中,以将 agefare 列中的问号替换为 numpy NaN 值。请注意,在替换值后,我们还需要更新列的数据类型。

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

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

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

  10. 现在数据状况良好,您可以使用 seabornmatplotlib 来查看数据集的某些列如何与生存率相关。将以下代码添加到 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])
    

    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 = 父母或子女))似乎与生存率的相关性很小。

    让我们假设 sibspparch 在它们如何影响生存率方面是相关的,并将它们分组到一个名为“亲属”的新列中,以查看它们的组合是否与生存率具有更高的相关性。为此,您将检查对于给定的乘客,sibspparch 的数量是否大于 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. 您会注意到,实际上,从一个人是否有亲属的角度来看,与有多少亲属相比,与生存率的相关性更高。掌握了这些信息,您现在可以从数据集中删除低值 sibspparch 列,以及任何具有 NaN 值的行,从而得到可用于训练模型的数据集。

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

    注意:虽然年龄的直接相关性较低,但由于年龄似乎可能与其他输入结合使用时仍具有相关性,因此保留了年龄。

训练和评估模型

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

  1. 训练模型的常见第一步是将数据集划分为训练数据和验证数据。这使您可以使用一部分数据来训练模型,并使用一部分数据来测试模型。如果您使用所有数据来训练模型,您将无法估计它在模型尚未见过的数据上的实际表现。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)
    
  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 个维度,因为您有五个输入:性别、船票等级、年龄、亲属和票价。
    • 最后一层必须输出 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 资源和教程供您查看。