VS Code 中的数据科学教程
本教程演示如何使用 Visual Studio Code 和 Microsoft Python 扩展以及常见的数据科学库来探索基本的数据科学场景。具体来说,使用泰坦尼克号的乘客数据,您将学习如何设置数据科学环境、导入和清理数据、创建用于预测泰坦尼克号生存的机器学习模型,以及评估生成模型的准确性。
先决条件
完成本教程需要进行以下安装。如果尚未安装,请确保安装它们。
-
来自 Visual Studio Marketplace 的VS Code 的 Python 扩展和VS Code 的 Jupyter 扩展。有关安装扩展的更多详细信息,请参阅扩展市场。这两个扩展均由 Microsoft 发布。
-
注意:如果您已经安装了完整的 Anaconda 发行版,则无需安装 Miniconda。或者,如果您不想使用 Anaconda 或 Miniconda,您可以创建一个 Python 虚拟环境并使用 pip 安装本教程所需的包。如果您选择这条路线,则需要安装以下软件包:pandas、jupyter、seaborn、scikit-learn、keras 和 tensorflow。
建立数据科学环境
Visual Studio Code 和 Python 扩展为数据科学场景提供了一个出色的编辑器。凭借对 Jupyter 笔记本的本机支持与 Anaconda 的结合,可以轻松上手。在本部分中,您将为本教程创建一个工作区,使用本教程所需的数据科学模块创建 Anaconda 环境,并创建一个用于创建机器学习模型的 Jupyter 笔记本。
-
首先为数据科学教程创建 Anaconda 环境。打开 Anaconda 命令提示符并运行以创建名为myenv
conda create -n myenv python=3.10 pandas jupyter seaborn scikit-learn keras tensorflow
的环境。有关创建和管理 Anaconda 环境的更多信息,请参阅Anaconda 文档。 -
接下来,在方便的位置创建一个文件夹作为教程的 VS Code 工作区,将其命名为
hello_ds
. -
通过运行 VS Code 并使用“文件” > “打开文件夹”命令在 VS Code 中打开项目文件夹。您可以放心地打开该文件夹,因为它是您创建的。
-
VS Code 启动后,创建将用于本教程的 Jupyter 笔记本。打开命令面板 ( ⇧⌘P (Windows、Linux Ctrl+Shift+P ) ) 并选择创建:新建 Jupyter Notebook。
注意:或者,您可以从 VS Code 文件资源管理器中使用“新建文件”图标来创建名为 的 Notebook 文件
hello.ipynb
。 -
hello.ipynb
使用“文件” > “另存为...”将文件另存为。 -
创建文件后,您应该在笔记本编辑器中看到打开的Jupyter 笔记本。有关本机 Jupyter 笔记本支持的更多信息,您可以阅读Jupyter 笔记本主题。
-
现在选择笔记本右上角的选择内核。
-
选择上面创建的用于运行内核的 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 中打开该文件,请转到“文件” > “打开文件夹
hello_ds
”,打开该文件夹和 Jupyter 笔记本 ( ) 。hello.ipynb
-
在 Jupyter Notebook 中,首先导入pandas和numpy库(两个用于操作数据的常用库),并将泰坦尼克号数据加载到 pandas DataFrame中。为此,请将以下代码复制到笔记本的第一个单元格中。有关在 VS Code 中使用 Jupyter 笔记本的更多指南,请参阅使用 Jupyter 笔记本文档。
import pandas as pd import numpy as np data = pd.read_csv('titanic3.csv')
-
现在,使用“运行单元格”图标或Shift+Enter快捷键运行单元格。
-
单元完成运行后,您可以使用变量资源管理器和数据查看器查看加载的数据。首先选择笔记本上部工具栏中的“变量”图标。
-
JUPYTER : VARIABLES窗格将在 VS Code 底部打开。它包含迄今为止在运行的内核中定义的变量列表。
-
要查看先前加载的 Pandas DataFrame 中的数据,请选择变量左侧的数据查看器图标
data
。 -
使用数据查看器查看、排序和过滤数据行。查看数据后,将数据的某些方面绘制成图表可能会有所帮助,以帮助可视化不同变量之间的关系。
-
在将数据绘制成图表之前,您需要确保数据不存在任何问题。如果您查看泰坦尼克号 csv 文件,您会注意到一件事是使用问号(“?”)来标识数据不可用的单元格。
虽然 Pandas 可以将此值读取到 DataFrame 中,但像年龄这样的列的结果是其数据类型将设置为对象而不是数字数据类型,这对于绘图来说是有问题的。
这个问题可以通过用 pandas 能够理解的缺失值替换问号来解决。将以下代码添加到笔记本中的下一个单元格,以将年龄和票价列中的问号替换为numpy NaN值。请注意,替换值后我们还需要更新列的数据类型。
提示:要添加新单元格,您可以使用现有单元格左下角的插入单元格图标。或者,您也可以使用Esc进入命令模式,然后按B键。
data.replace('?', np.nan, inplace= True) data = data.astype({"age": np.float64, "fare": np.float64})
注意:如果您需要查看列所使用的数据类型,可以使用DataFrame dtypes属性。
-
现在数据状况良好,您可以使用seaborn和matplotlib来查看数据集的某些列与生存性的关系。将以下代码添加到笔记本中的下一个单元格并运行它以查看生成的绘图。
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])
提示:要快速复制图表,您可以将鼠标悬停在图表的右上角,然后单击出现的复制到剪贴板按钮。您还可以通过单击展开图像按钮更好地查看图表的详细信息。
-
这些图表有助于查看生存与数据输入变量之间的一些关系,但也可以使用pandas来计算相关性。为此,相关性计算中使用的所有变量都必须是数字,并且当前性别存储为字符串。要将这些字符串值转换为整数,请添加并运行以下代码。
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 库的一个好处是它提供了一种专门用于将数据集拆分为训练数据和测试数据的方法。
将包含以下代码的单元添加并运行到笔记本中以分割数据。
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 库还提供对其中许多库的支持,并提供一个图表来帮助选择最适合您的场景的库。现在,使用朴素贝叶斯算法,这是一种用于分类问题的常见算法。添加包含以下代码的单元格以创建和训练算法。
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%。
(可选)使用神经网络
神经网络是一种使用权重和激活函数对人类神经元进行建模的模型,根据提供的输入确定结果。与您之前看到的机器学习算法不同,神经网络是深度学习的一种形式,您不需要提前知道适合您的问题集的理想算法。它可以用于许多不同的场景,分类就是其中之一。在本部分中,您将使用Keras库和TensorFlow来构建神经网络,并探索它如何处理泰坦尼克号数据集。
-
第一步是导入所需的库并创建模型。在本例中,您将使用顺序神经网络,它是一种分层神经网络,其中有多个层按顺序相互馈送。
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,因为您有五个输入:性别、pclass、年龄、亲属和票价。
- 最后一层必须输出 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 资源和教程可供查看。
- 数据科学配置文件模板-使用一组精选的扩展、设置和片段创建新的配置文件。
- 详细了解如何在 Visual Studio Code 中使用Jupyter Notebook (视频)。
- 开始使用适用于 VS Code 的 Azure 机器学习,利用 Azure 的强大功能来部署和优化模型。
- 在Azure 开放数据集上查找更多数据以进行探索。