本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

在 VS Code 中进行数据科学教程

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

先决条件

完成本教程所需的以下安装。如果没有,请确保安装它们。

  • 视觉工作室代码

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

  • 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 扩展为数据科学场景提供了一个出色的编辑器。通过与 Anaconda 的原生支持,Jupyter 笔记本的使用变得非常简单。在本节中,您将创建一个用于教程的工作区,创建一个包含教程所需数据科学模块的 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 教程的工作区,命名它你好_ds输入:.

  3. 在 VS Code 中打开项目文件夹,运行 VS Code 并使用 文件 > 打开文件夹 命令。由于是你创建的文件夹,你可以放心打开。

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

    创建一个新的 Jupyter Notebook

    注意:或者,从 VS Code 文件资源管理器中,您可以使用新建文件图标来创建一个名为 的 Notebook 文件你好.ipynb输入:.

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

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

    查看一个新的 Jupyter Notebook

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

    选择 Jupyter Notebook 内核

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

    从创建的环境中选择一个内核

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

准备数据

本教程使用了Titanic数据集,可在OpenML.org上获取,该数据集来源于Vanderbilt大学生物统计学系,网址为https://hbiostat.org/data。Titanic数据提供了关于泰坦尼克号乘客生存信息以及乘客的特征,如年龄和票价等级。利用这些数据,本教程将建立一个模型,以预测给定的乘客是否能在泰坦尼克号沉没时幸存下来。本节展示了如何在Jupyter notebook中加载和操作数据。

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

  2. 如果你还没有在 VS Code 中打开该文件,请打开你好_ds文件夹和Jupyter笔记本你好.ipynb),请转到文件 > 打开文件夹

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

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

    运行 Jupyter notebook 单元格

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

    选择变量图标

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

    变量面板

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

    选择数据查看器图标

  8. 使用数据查看器来查看、排序和过滤数据行。在查看完数据后,将某些数据绘制成图表可以帮助可视化不同变量之间的关系。

    数据查看器和变量浏览器

    或者,您可以使用其他扩展(如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 中的下一个单元格中添加以下代码并运行它以查看生成的图表。

    导入 seaborn  sns
    导入 matplotlib.pyplot  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=数据, 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 在影响生存率方面是相关的,并将它们组合成一个名为“relatives”的新列,以查看它们的组合是否与生存率有更高的相关性。为此,您将检查对于给定的乘客,sibspparch 的数量是否大于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. 训练模型的常见第一步是将数据集分为训练数据和验证数据。这样可以让你使用部分数据来训练模型,并使用另一部分数据来测试模型。如果你使用所有数据来训练模型,就没有办法估计模型在尚未见过的数据上的实际表现。sklearn库的一个好处是它提供了一个专门的方法来将数据集分为训练数据和测试数据。

    在笔记本中添加并运行以下代码以拆分数据。

     sklearn.model_selection 导入 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。通过对所有变量进行归一化处理,您可以确保所有取值范围都是一样的。在新的代码单元格中使用以下代码来缩放输入值。

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

     sklearn.naive_bayes 导入 GaussianNB
    模型 = GaussianNB()
    模型.拟合(X_train, y_train)
    
  4. 有了训练好的模型,现在你可以用保留下来的测试数据集来尝试模型。添加并运行以下代码来预测测试数据的结果并计算模型的准确率。

     sklearn 导入 metrics
     predict_test = model.predict(X_test)
    打印(metrics.accuracy_score(y_test, predict_test))
    

    将训练好的模型应用于测试数据

    查看测试数据的结果,你会发现训练后的算法在预测生存率方面有约75%的成功率。

(可选)使用神经网络

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

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

     keras.models 导入 Sequential
     keras.layers 导入 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()
    

    查看序列神经网络的摘要

  3. 一旦模型创建完成,就需要编译。作为其中的一部分,你需要定义将使用什么类型的优化器、如何计算损失以及应优化什么指标。在代码中添加以下内容以构建和训练模型。训练完成后,你会发现准确率约为61%。

    注意:这一步可能需要几秒到几分钟不等,具体取决于您的机器。

    model.compile(优化器="adam", 损失函数='二元交叉熵', 指标=['准确率'])
    model.fit(X_train, y_train, 批次大小=32, 轮数=50)
    

    构建和训练神经网络

  4. 既然模型已经建立并训练完成,我们可以看看它在测试数据上的表现如何。

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

    评估神经网络

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

下一步

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