VS Code 中的数据科学教程

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

前提条件

完成本教程需完成以下安装。如果你还没安装,记得去安装。

  • Visual Studio Code

  • Visual Studio Marketplace 上的 VS Code Python 扩展VS Code 的 Jupyter 扩展。有关安装扩展的更多细节,请参见扩展市场。这两个扩展均由Microsoft发布。

  • Miniconda 使用最新 Python

    注意:如果你已经安装了完整的 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 笔记本的原生支持和 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 笔记本

    创建新的Jupyter笔记本

    注意:或者,在 VS Code 文件资源管理器中,你可以使用新文件图标创建一个名为你好。ipynb.

  5. 将文件保存为你好。ipynb使用文件>另存为......

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

    查看新的Jupyter笔记本

  7. 现在选择笔记本右上角的“选择内核”。

    选择Jupyter笔记本内核

  8. 选择你上面创建的Python环境来运行内核。

    从创建环境中选择内核

  9. 要通过VS Code集成终端管理环境,打开时使用(⌃',Windows,Linux Ctrl+')。如果你的环境没有被激活,你可以像在终端里一样作 (Conda 激活 Myenv).

准备数据

本教程使用了 OpenML.org 上可用的泰坦尼克号数据集,该数据集来自范德堡大学生物统计系,https://hbiostat.org/data 年。泰坦尼克号数据提供了有关泰坦尼克号乘客生还情况的信息,以及乘客的年龄和票务等级等特征。利用这些数据,教程将建立一个模型,预测某位乘客是否能在泰坦尼克号沉没时幸存。本节展示了如何在你的Jupyter笔记本中加载和作数据。

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

  2. 如果你还没在VS Code里打开文件,请打开hello_ds文件夹和Jupyter笔记本(你好。ipynb),通过进入文件>打开文件夹即可。

  3. 在你的Jupyter笔记本中,先导入pandasnumpy库,这两种常用来处理数据的库,然后将Titanic数据加载到pandas的数据帧中。要做到这一点,请将下面的代码复制到笔记本的第一个单元格中。关于在 VS Code 中使用 Jupyter 笔记本的更多指导,请参见 Working with Jupyter Notebooks 文档。

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

    运行Jupyter笔记本单元

  5. 单元运行完成后,你可以使用变量浏览器和数据查看器查看加载的数据。首先选择笔记本上方工具栏中的变量图标。

    选择变量图标

  6. 一个 JUPYTER: VARIABLES 面板会在 VS Code 底部打开。它包含了你运行内核中已定义的变量列表。

    变量面板

  7. 要查看之前加载的 Pandas DataFrame 中的数据,请选择数据变数。

    选择数据查看器图标

  8. 使用数据查看器查看、排序和过滤数据行。在审查完数据后,绘制一些数据的图表有助于可视化不同变量之间的关系。

    数据查看器与变量浏览器

    或者,你也可以使用像Data Wrangler这样其他扩展提供的数据查看体验。Data Wrangler 扩展提供了丰富的用户界面,展示对数据的洞察,并帮助你进行数据分析、质量检查、转换等作。在我们的文档中了解更多关于Data Wrangler扩展的信息。

  9. 在数据绘制图之前,你需要确保没有任何问题。如果你看泰坦尼克号的csv文件,你会注意到一个问号(“?”)用来标识数据无法获取的单元格。

    虽然Panda可以将该值读入DataFrame,但对于像年代这样的列,其数据类型会被设置为对象,而不是数字数据类型,这在绘图时存在问题。

    这个问题可以通过用熊猫能理解的缺失值替换问号来纠正。在笔记本的下一个单元格添加以下代码,用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])
    

    泰坦尼克号数据绘制图

    提示:要快速复制图表,可以将鼠标悬停在图表右上角,点击出现的“复制到剪贴板”按钮。你也可以通过点击“展开图片”按钮更好地查看图表的详细信息。

    剧情查看按钮

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

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

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

    确定输入变量与生存率之间的相关性

  13. 查看相关性结果,你会发现一些变量如性别与生存率有相当高的相关性,而其他变量如亲属(sibsp = 兄弟姐妹或配偶,parch = 父母或子女)似乎相关性很小。

    假设sibspparch在影响生存率方面相关,并将其归入一个称为“亲属”的新列,看看它们的组合是否与生存率相关性更高。为此,你需要检查某位乘客的sibspparch数量是否大于0,如果大于0,就可以说他们机上有亲属。

    请使用以下代码在名为亲属再检查一次相关性。

    data['relatives'] = data.apply (lambda row: int((row['sibsp'] + row['parch']) > 0), axis=1)
    data.corr(numeric_only=True).abs()[["survived"]]
    

    确定有亲属与生存率之间的相关性

  14. 你会发现,实际上从一个人是否有亲属和亲属数量的角度来看,生存的相关性更高。有了这些信息,你现在可以从数据集中删除低值的 sibspparch 列,以及任何具有 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))
    

    将训练好的模型与测试数据进行运行

    查看测试数据结果,你会发现训练好的算法在估计存活率上有~75%。

(可选)使用神经网络

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

  1. 第一步是导入所需的库并创建模型。在这种情况下,你会使用顺序神经网络,这是一种分层神经网络,由多个层次依次相互输入。

    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)激活函数作为前两层的通用激活函数,而最后一层则需要S形激活函数,因为你想要的输出(乘客是否存活)需要在0-1(乘客存活概率)范围内缩放。

    你也可以用这行代码查看你构建模型的摘要:

    model.summary()
    

    查看顺序神经网络的摘要

  3. 模型创建后,需要进行编译。在此过程中,你需要定义将使用哪种类型的优化器,如何计算损耗,以及应针对哪些指标进行优化。添加以下代码来构建和训练模型。你会注意到训练后,准确率是~61%。

    注意:这一步根据你的机器不同,可能需要几秒钟到几分钟不等。

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

    构建和训练神经网络

  4. 现在模型已经构建并训练完成,我们可以看到它如何与测试数据相匹配。

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

    评估神经网络

    与训练类似,你会发现现在预测乘客生存的准确率达到了79%。使用这个简单的神经网络,结果优于之前尝试的朴素贝叶斯分类器75%的准确率。

下一步

既然你已经熟悉了在Visual Studio Code中进行机器学习的基础,这里还有一些Microsoft的其他资源和教程值得参考。